SVN commit 1146719 by beschow:
[kate:kate1.git] / part / dialogs / katedialogs.cpp
1 /* This file is part of the KDE libraries
2    Copyright (C) 2002, 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
3    Copyright (C) 2003 Christoph Cullmann <cullmann@kde.org>
4    Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
5    Copyright (C) 2006 Dominik Haumann <dhdev@gmx.de>
6    Copyright (C) 2007 Mirko Stocker <me@misto.ch>
7    Copyright (C) 2009 Michel Ludwig <michel.ludwig@kdemail.net>
8    Copyright (C) 2009 Erlend Hamberg <ehamberg@gmail.com>
9
10    Based on work of:
11      Copyright (C) 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de>
12
13    This library is free software; you can redistribute it and/or
14    modify it under the terms of the GNU Library General Public
15    License version 2 as published by the Free Software Foundation.
16
17    This library is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    Library General Public License for more details.
21
22    You should have received a copy of the GNU Library General Public License
23    along with this library; see the file COPYING.LIB.  If not, write to
24    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25    Boston, MA 02110-1301, USA.
26 */
27
28 //BEGIN Includes
29 #include "katedialogs.h"
30 #include "katedialogs.moc"
31
32 #include "kateautoindent.h"
33 #include "katebuffer.h"
34 #include "kateconfig.h"
35 #include "katedocument.h"
36 #include "kateglobal.h"
37 #include "kateviglobal.h"
38 #include "katevikeyparser.h"
39 #include "kateschema.h"
40 #include "katesyntaxdocument.h"
41 #include "katemodeconfigpage.h"
42 #include "kateview.h"
43 #include "katepartpluginmanager.h"
44 #include "kpluginselector.h"
45 #include "spellcheck/spellcheck.h"
46
47 // auto generated ui files
48 #include "ui_modonhdwidget.h"
49 #include "ui_appearanceconfigwidget.h"
50 #include "ui_cursorconfigwidget.h"
51 #include "ui_editconfigwidget.h"
52 #include "ui_indentationconfigwidget.h"
53 #include "ui_completionconfigtab.h"
54 #include "ui_opensaveconfigwidget.h"
55 #include "ui_opensaveconfigadvwidget.h"
56 #include "ui_viinputmodeconfigwidget.h"
57 #include "ui_spellcheckconfigwidget.h"
58
59 #include <ktexteditor/plugin.h>
60
61 #include <kio/job.h>
62 #include <kio/jobclasses.h>
63 #include <kio/netaccess.h>
64
65 #include <kapplication.h>
66 #include <kcharsets.h>
67 #include <kcolorbutton.h>
68 #include <kcolorcombo.h>
69 #include <kcolordialog.h>
70 #include <kcombobox.h>
71 #include <kconfig.h>
72 #include <kdebug.h>
73 #include <kfontdialog.h>
74 #include <kglobal.h>
75 #include <kglobalsettings.h>
76 #include <kiconloader.h>
77 #include <kshortcutsdialog.h>
78 #include <klineedit.h>
79 #include <klocale.h>
80 #include <kmessagebox.h>
81 #include <kmimetypechooser.h>
82 #include <knuminput.h>
83 #include <kmenu.h>
84 #include <kprocess.h>
85 #include <krun.h>
86 #include <kseparator.h>
87 #include <kstandarddirs.h>
88 #include <ktemporaryfile.h>
89 #include <kpushbutton.h>
90 #include <kvbox.h>
91 #include <kactioncollection.h>
92 #include <kplugininfo.h>
93 #include <ktabwidget.h>
94
95 //#include <knewstuff/knewstuff.h>
96 #include <QtGui/QCheckBox>
97 #include <QtGui/QComboBox>
98 #include <QtGui/QDialog>
99 #include <QtCore/QFile>
100 #include <QtGui/QGroupBox>
101 #include <QtGui/QLabel>
102 #include <QtGui/QLayout>
103 #include <QtCore/QMap>
104 #include <QtCore/QObject>
105 #include <QtGui/QPainter>
106 #include <QtGui/QRadioButton>
107 #include <QtGui/QSlider>
108 #include <QtCore/QStringList>
109 #include <QtGui/QTabWidget>
110 #include <QtCore/QTextCodec>
111 #include <QtCore/QTextStream>
112 #include <QtGui/QToolButton>
113 #include <QtGui/QWhatsThis>
114 #include <QtGui/QKeyEvent>
115 #include <QtXml/QDomDocument>
116
117 // trailing slash is important
118 #define HLDOWNLOADPATH "http://kate.kde.org/syntax/"
119
120 //END
121
122 //BEGIN KateConfigPage
123 KateConfigPage::KateConfigPage ( QWidget *parent, const char * )
124   : KTextEditor::ConfigPage (parent)
125   , m_changed (false)
126 {
127   connect (this, SIGNAL(changed()), this, SLOT(somethingHasChanged ()));
128 }
129
130 KateConfigPage::~KateConfigPage ()
131 {
132 }
133
134 void KateConfigPage::slotChanged()
135 {
136   emit changed();
137 }
138
139 void KateConfigPage::somethingHasChanged ()
140 {
141   m_changed = true;
142   kDebug (13000) << "TEST: something changed on the config page: " << this;
143 }
144 //END KateConfigPage
145
146 //BEGIN KateIndentConfigTab
147 KateIndentConfigTab::KateIndentConfigTab(QWidget *parent)
148   : KateConfigPage(parent)
149 {
150   // This will let us have more separation between this page and
151   // the KTabWidget edge (ereslibre)
152   QVBoxLayout *layout = new QVBoxLayout;
153   QWidget *newWidget = new QWidget(this);
154
155   ui = new Ui::IndentationConfigWidget();
156   ui->setupUi( newWidget );
157
158   ui->cmbMode->addItems (KateAutoIndent::listModes());
159
160   ui->label->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard);
161   connect(ui->label, SIGNAL(linkActivated(const QString&)), this, SLOT(showWhatsThis(const QString&)));
162
163   // What's This? help can be found in the ui file
164
165   reload ();
166
167   //
168   // after initial reload, connect the stuff for the changed () signal
169   //
170
171   connect(ui->cmbMode, SIGNAL(activated(int)), this, SLOT(slotChanged()));
172
173   connect(ui->chkKeepExtraSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
174   connect(ui->chkIndentPaste, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
175   connect(ui->chkBackspaceUnindents, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
176
177   connect(ui->sbIndentWidth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
178
179   connect(ui->rbTabAdvances, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
180   connect(ui->rbTabIndents, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
181   connect(ui->rbTabSmart, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
182
183   layout->addWidget(newWidget);
184   setLayout(layout);
185 }
186
187 KateIndentConfigTab::~KateIndentConfigTab()
188 {
189   delete ui;
190 }
191
192 void KateIndentConfigTab::showWhatsThis(const QString& text)
193 {
194   QWhatsThis::showText(QCursor::pos(), text);
195 }
196
197 void KateIndentConfigTab::apply ()
198 {
199   // nothing changed, no need to apply stuff
200   if (!hasChanged())
201     return;
202   m_changed = false;
203
204   KateDocumentConfig::global()->configStart ();
205
206   KateDocumentConfig::global()->setKeepExtraSpaces(ui->chkKeepExtraSpaces->isChecked());
207   KateDocumentConfig::global()->setBackspaceIndents(ui->chkBackspaceUnindents->isChecked());
208   KateDocumentConfig::global()->setIndentPastedText(ui->chkIndentPaste->isChecked());
209   KateDocumentConfig::global()->setIndentationWidth(ui->sbIndentWidth->value());
210   KateDocumentConfig::global()->setIndentationMode(KateAutoIndent::modeName(ui->cmbMode->currentIndex()));
211
212   if (ui->rbTabAdvances->isChecked())
213     KateDocumentConfig::global()->setTabHandling( KateDocumentConfig::tabInsertsTab );
214   else if (ui->rbTabIndents->isChecked())
215     KateDocumentConfig::global()->setTabHandling( KateDocumentConfig::tabIndents );
216   else
217     KateDocumentConfig::global()->setTabHandling( KateDocumentConfig::tabSmart );
218
219   KateDocumentConfig::global()->configEnd ();
220 }
221
222 void KateIndentConfigTab::reload ()
223 {
224   ui->sbIndentWidth->setSuffix(ki18np(" character", " characters"));
225   ui->sbIndentWidth->setValue(KateDocumentConfig::global()->indentationWidth());
226   ui->chkKeepExtraSpaces->setChecked(KateDocumentConfig::global()->keepExtraSpaces());
227   ui->chkIndentPaste->setChecked(KateDocumentConfig::global()->indentPastedText());
228   ui->chkBackspaceUnindents->setChecked(KateDocumentConfig::global()->backspaceIndents());
229
230   ui->rbTabAdvances->setChecked( KateDocumentConfig::global()->tabHandling() == KateDocumentConfig::tabInsertsTab );
231   ui->rbTabIndents->setChecked( KateDocumentConfig::global()->tabHandling() == KateDocumentConfig::tabIndents );
232   ui->rbTabSmart->setChecked( KateDocumentConfig::global()->tabHandling() == KateDocumentConfig::tabSmart );
233
234   ui->cmbMode->setCurrentIndex (KateAutoIndent::modeNumber (KateDocumentConfig::global()->indentationMode()));
235 }
236 //END KateIndentConfigTab
237
238 //BEGIN KateCompletionConfigTab
239 KateCompletionConfigTab::KateCompletionConfigTab(QWidget *parent)
240   : KateConfigPage(parent)
241 {
242   // This will let us have more separation between this page and
243   // the KTabWidget edge (ereslibre)
244   QVBoxLayout *layout = new QVBoxLayout;
245   QWidget *newWidget = new QWidget(this);
246
247   ui = new Ui::CompletionConfigTab ();
248   ui->setupUi( newWidget );
249
250   // What's This? help can be found in the ui file
251
252   reload ();
253
254   //
255   // after initial reload, connect the stuff for the changed () signal
256   //
257
258   connect(ui->chkAutoCompletionEnabled, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
259   connect(ui->gbWordCompletion, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
260   connect(ui->minimalWordLength, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
261
262   layout->addWidget(newWidget);
263   setLayout(layout);
264 }
265
266 KateCompletionConfigTab::~KateCompletionConfigTab()
267 {
268   delete ui;
269 }
270
271 void KateCompletionConfigTab::showWhatsThis(const QString& text)
272 {
273   QWhatsThis::showText(QCursor::pos(), text);
274 }
275
276 void KateCompletionConfigTab::apply ()
277 {
278   // nothing changed, no need to apply stuff
279   if (!hasChanged())
280     return;
281   m_changed = false;
282
283   KateViewConfig::global()->configStart ();
284   KateViewConfig::global()->setAutomaticCompletionInvocation (ui->chkAutoCompletionEnabled->isChecked());
285   KateViewConfig::global()->setWordCompletion (ui->gbWordCompletion->isChecked());
286   KateViewConfig::global()->setWordCompletionMinimalWordLength (ui->minimalWordLength->value());
287   KateViewConfig::global()->configEnd ();
288 }
289
290 void KateCompletionConfigTab::reload ()
291 {
292   ui->chkAutoCompletionEnabled->setChecked( KateViewConfig::global()->automaticCompletionInvocation () );
293   ui->gbWordCompletion->setChecked( KateViewConfig::global()->wordCompletion () );
294   ui->minimalWordLength->setValue (KateViewConfig::global()->wordCompletionMinimalWordLength ());
295 }
296 //END KateCompletionConfigTab
297
298 //BEGIN KateViInputModeConfigTab
299 KateViInputModeConfigTab::KateViInputModeConfigTab(QWidget *parent)
300   : KateConfigPage(parent)
301 {
302   // This will let us have more separation between this page and
303   // the KTabWidget edge (ereslibre)
304   QVBoxLayout *layout = new QVBoxLayout;
305   QWidget *newWidget = new QWidget(this);
306
307   ui = new Ui::ViInputModeConfigWidget ();
308   ui->setupUi( newWidget );
309
310   // What's This? help can be found in the ui file
311
312   reload ();
313
314   //
315   // after initial reload, connect the stuff for the changed () signal
316   //
317
318   connect(ui->chkViInputModeDefault, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
319   connect(ui->chkViCommandsOverride, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
320   connect(ui->chkViStatusBarHide, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
321   connect(ui->tblNormalModeMappings, SIGNAL(cellChanged(int, int)), this, SLOT(slotChanged()));
322   connect(ui->btnAddNewNormal, SIGNAL(clicked()), this, SLOT(addNewNormalModeMappingRow()));
323   connect(ui->btnRemoveSelectedNormal, SIGNAL(clicked()), this, SLOT(removeSelectedNormalMappingRow()));
324
325   layout->addWidget(newWidget);
326   setLayout(layout);
327 }
328
329 KateViInputModeConfigTab::~KateViInputModeConfigTab()
330 {
331   delete ui;
332 }
333
334 void KateViInputModeConfigTab::showWhatsThis(const QString& text)
335 {
336   QWhatsThis::showText(QCursor::pos(), text);
337 }
338
339 void KateViInputModeConfigTab::apply ()
340 {
341   // nothing changed, no need to apply stuff
342   if (!hasChanged())
343     return;
344   m_changed = false;
345
346   KateViewConfig::global()->configStart ();
347   KateViewConfig::global()->setViInputMode (ui->chkViInputModeDefault->isChecked());
348   KateViewConfig::global()->setViInputModeStealKeys (ui->chkViCommandsOverride->isChecked());
349   KateViewConfig::global()->setViInputModeHideStatusBar (ui->chkViStatusBarHide->isChecked());
350   KateGlobal::self()->viInputModeGlobal()->clearMappings( NormalMode );
351   for ( int i = 0; i < ui->tblNormalModeMappings->rowCount(); i++ ) {
352     QTableWidgetItem* from = ui->tblNormalModeMappings->item( i, 0 );
353     QTableWidgetItem* to = ui->tblNormalModeMappings->item( i, 1 );
354
355     if ( from && to ) {
356       KateGlobal::self()->viInputModeGlobal()->addMapping( NormalMode, from->text(), to->text() );
357     }
358   }
359   KateViewConfig::global()->configEnd ();
360 }
361
362 void KateViInputModeConfigTab::reload ()
363 {
364   ui->chkViInputModeDefault->setChecked( KateViewConfig::global()->viInputMode () );
365   ui->chkViCommandsOverride->setChecked( KateViewConfig::global()->viInputModeStealKeys () );
366   ui->chkViStatusBarHide->setChecked( KateViewConfig::global()->viInputModeHideStatusBar () );
367
368   ui->chkViCommandsOverride->setEnabled(ui->chkViInputModeDefault->isChecked());
369   ui->chkViStatusBarHide->setEnabled(ui->chkViInputModeDefault->isChecked());
370
371   QStringList l = KateGlobal::self()->viInputModeGlobal()->getMappings( NormalMode );
372   ui->tblNormalModeMappings->setRowCount( l.size() );
373
374   // make the two columns fill the entire table width
375   ui->tblNormalModeMappings->setColumnWidth( 0, ui->tblNormalModeMappings->width()/3 );
376   ui->tblNormalModeMappings->horizontalHeader()->setStretchLastSection( true );
377
378   int i = 0;
379   foreach( const QString &f, l ) {
380     QTableWidgetItem *from
381       = new QTableWidgetItem( KateViKeyParser::getInstance()->decodeKeySequence( f ) );
382     QString s = KateGlobal::self()->viInputModeGlobal()->getMapping( NormalMode, f );
383     QTableWidgetItem *to =
384       new QTableWidgetItem( KateViKeyParser::getInstance()->decodeKeySequence( s ) );
385
386     ui->tblNormalModeMappings->setItem(i, 0, from);
387     ui->tblNormalModeMappings->setItem(i++, 1, to);
388   }
389 }
390
391 void KateViInputModeConfigTab::addNewNormalModeMappingRow()
392 {
393   int rows = ui->tblNormalModeMappings->rowCount();
394   ui->tblNormalModeMappings->insertRow( rows );
395   ui->tblNormalModeMappings->setCurrentCell( rows, 0 );
396   ui->tblNormalModeMappings->editItem( ui->tblNormalModeMappings->currentItem() );
397 }
398
399 void KateViInputModeConfigTab::removeSelectedNormalMappingRow()
400 {
401   QList<QTableWidgetSelectionRange> l = ui->tblNormalModeMappings->selectedRanges();
402
403   foreach( const QTableWidgetSelectionRange &range, l ) {
404     for ( int i = 0; i < range.bottomRow()-range.topRow()+1; i++ ) {
405       ui->tblNormalModeMappings->removeRow( range.topRow() );
406     }
407   }
408 }
409 //END KateViInputModeConfigTab
410
411 //BEGIN KateSpellCheckConfigTab
412 KateSpellCheckConfigTab::KateSpellCheckConfigTab(QWidget *parent)
413   : KateConfigPage(parent)
414 {
415   // This will let us have more separation between this page and
416   // the KTabWidget edge (ereslibre)
417   QVBoxLayout *layout = new QVBoxLayout;
418   QWidget *newWidget = new QWidget(this);
419
420   ui = new Ui::SpellCheckConfigWidget();
421   ui->setupUi(newWidget);
422
423   // What's This? help can be found in the ui file
424   reload();
425
426   //
427   // after initial reload, connect the stuff for the changed () signal
428
429   m_sonnetConfigWidget = new Sonnet::ConfigWidget(KGlobal::config().data(), this);
430   connect(m_sonnetConfigWidget, SIGNAL(configChanged()), this, SLOT(slotChanged()));
431   layout->addWidget(m_sonnetConfigWidget);
432
433   layout->addWidget(newWidget);
434   setLayout(layout);
435 }
436
437 KateSpellCheckConfigTab::~KateSpellCheckConfigTab()
438 {
439   delete ui;
440 }
441
442 void KateSpellCheckConfigTab::showWhatsThis(const QString& text)
443 {
444   QWhatsThis::showText(QCursor::pos(), text);
445 }
446
447 void KateSpellCheckConfigTab::apply()
448 {
449   if (!hasChanged()) {
450     // nothing changed, no need to apply stuff
451     return;
452   }
453   m_changed = false;
454
455   KateDocumentConfig::global()->configStart();
456   m_sonnetConfigWidget->save();
457   KateDocumentConfig::global()->configEnd();
458   foreach (KateDocument *doc, KateGlobal::self()->kateDocuments()) {
459     doc->refreshOnTheFlyCheck();
460   }
461 }
462
463 void KateSpellCheckConfigTab::reload()
464 {
465   // does nothing
466 }
467 //END KateSpellCheckConfigTab
468
469 //BEGIN KateSelectConfigTab
470 KateSelectConfigTab::KateSelectConfigTab(QWidget *parent)
471   : KateConfigPage(parent)
472 {
473   // This will let us having more separation between this page and
474   // the KTabWidget edge (ereslibre)
475   QVBoxLayout *layout = new QVBoxLayout;
476   QWidget *newWidget = new QWidget(this);
477
478   ui = new Ui::CursorConfigWidget();
479   ui->setupUi( newWidget );
480
481   // What's This? Help is in the ui-files
482
483   reload ();
484
485   //
486   // after initial reload, connect the stuff for the changed () signal
487   //
488
489   connect(ui->rbNormal, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
490   connect(ui->rbPersistent, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
491   connect(ui->chkSmartHome, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
492   connect(ui->chkWrapCursor, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
493   connect(ui->chkPagingMovesCursor, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
494   connect(ui->sbAutoCenterCursor, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
495
496   layout->addWidget(newWidget);
497   setLayout(layout);
498 }
499
500 KateSelectConfigTab::~KateSelectConfigTab()
501 {
502   delete ui;
503 }
504
505 void KateSelectConfigTab::apply ()
506 {
507   // nothing changed, no need to apply stuff
508   if (!hasChanged())
509     return;
510   m_changed = false;
511
512   KateViewConfig::global()->configStart ();
513   KateDocumentConfig::global()->configStart ();
514
515   KateDocumentConfig::global()->setSmartHome(ui->chkSmartHome->isChecked());
516   KateDocumentConfig::global()->setWrapCursor(ui->chkWrapCursor->isChecked());
517
518   KateViewConfig::global()->setAutoCenterLines(qMax(0, ui->sbAutoCenterCursor->value()));
519   KateDocumentConfig::global()->setPageUpDownMovesCursor(ui->chkPagingMovesCursor->isChecked());
520
521   KateViewConfig::global()->setPersistentSelection (ui->rbPersistent->isChecked());
522
523   KateDocumentConfig::global()->configEnd ();
524   KateViewConfig::global()->configEnd ();
525 }
526
527 void KateSelectConfigTab::reload ()
528 {
529   ui->rbNormal->setChecked( ! KateViewConfig::global()->persistentSelection() );
530   ui->rbPersistent->setChecked( KateViewConfig::global()->persistentSelection() );
531
532   ui->chkSmartHome->setChecked(KateDocumentConfig::global()->smartHome());
533   ui->chkWrapCursor->setChecked(KateDocumentConfig::global()->wrapCursor());
534   ui->chkPagingMovesCursor->setChecked(KateDocumentConfig::global()->pageUpDownMovesCursor());
535   ui->sbAutoCenterCursor->setValue(KateViewConfig::global()->autoCenterLines());
536 }
537 //END KateSelectConfigTab
538
539 //BEGIN KateEditGeneralConfigTab
540 KateEditGeneralConfigTab::KateEditGeneralConfigTab(QWidget *parent)
541   : KateConfigPage(parent)
542 {
543   QVBoxLayout *layout = new QVBoxLayout;
544   QWidget *newWidget = new QWidget(this);
545   ui = new Ui::EditConfigWidget();
546   ui->setupUi( newWidget );
547
548   reload();
549
550   connect( ui->chkReplaceTabs, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
551   connect(ui->chkShowTabs, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
552   connect(ui->chkShowSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
553   connect(ui->sbTabWidth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
554   connect(ui->chkStaticWordWrap, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
555   connect(ui->chkShowStaticWordWrapMarker, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
556   connect(ui->sbWordWrap, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
557   connect( ui->chkRemoveTrailingSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
558   connect(ui->chkAutoBrackets, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
559   connect(ui->chkSmartCopyCut, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
560   connect(ui->chkScrollPastEnd, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
561
562   // "What's this?" help is in the ui-file
563
564   layout->addWidget(newWidget);
565   setLayout(layout);
566 }
567
568 KateEditGeneralConfigTab::~KateEditGeneralConfigTab()
569 {
570   delete ui;
571 }
572
573 void KateEditGeneralConfigTab::apply ()
574 {
575   // nothing changed, no need to apply stuff
576   if (!hasChanged())
577     return;
578   m_changed = false;
579
580   KateViewConfig::global()->configStart ();
581   KateDocumentConfig::global()->configStart ();
582
583   KateDocumentConfig::global()->setAutoBrackets(ui->chkAutoBrackets->isChecked());
584   KateDocumentConfig::global()->setShowTabs(ui->chkShowTabs->isChecked());
585   KateDocumentConfig::global()->setShowSpaces(ui->chkShowSpaces->isChecked());
586   KateDocumentConfig::global()->setReplaceTabsDyn(ui->chkReplaceTabs->isChecked());
587   KateDocumentConfig::global()->setRemoveTrailingDyn(ui->chkRemoveTrailingSpaces->isChecked());
588
589   KateDocumentConfig::global()->setWordWrapAt(ui->sbWordWrap->value());
590   KateDocumentConfig::global()->setWordWrap(ui->chkStaticWordWrap->isChecked());
591   KateDocumentConfig::global()->setTabWidth(ui->sbTabWidth->value());
592
593   KateRendererConfig::global()->setWordWrapMarker (ui->chkShowStaticWordWrapMarker->isChecked());
594
595   KateDocumentConfig::global()->configEnd ();
596   KateViewConfig::global()->setSmartCopyCut(ui->chkSmartCopyCut->isChecked());
597   KateViewConfig::global()->setScrollPastEnd(ui->chkScrollPastEnd->isChecked());
598   KateViewConfig::global()->configEnd ();
599 }
600
601 void KateEditGeneralConfigTab::reload ()
602 {
603   ui->chkReplaceTabs->setChecked( KateDocumentConfig::global()->replaceTabsDyn() );
604   ui->chkShowTabs->setChecked( KateDocumentConfig::global()->showTabs() );
605   ui->chkShowSpaces->setChecked( KateDocumentConfig::global()->showSpaces() );
606   ui->sbTabWidth->setSuffix(ki18np(" character", " characters"));
607   ui->sbTabWidth->setValue( KateDocumentConfig::global()->tabWidth() );
608   ui->chkStaticWordWrap->setChecked(KateDocumentConfig::global()->wordWrap());
609   ui->chkShowStaticWordWrapMarker->setChecked( KateRendererConfig::global()->wordWrapMarker() );
610   ui->sbWordWrap->setSuffix(ki18np(" character", " characters"));
611   ui->sbWordWrap->setValue( KateDocumentConfig::global()->wordWrapAt() );
612   ui->chkRemoveTrailingSpaces->setChecked( KateDocumentConfig::global()->removeTrailingDyn() );
613   ui->chkAutoBrackets->setChecked( KateDocumentConfig::global()->autoBrackets() );
614   ui->chkSmartCopyCut->setChecked( KateViewConfig::global()->smartCopyCut() );
615   ui->chkScrollPastEnd->setChecked( KateViewConfig::global()->scrollPastEnd() );
616 }
617 //END KateEditGeneralConfigTab
618
619
620 //BEGIN KateEditConfigTab
621 KateEditConfigTab::KateEditConfigTab(QWidget *parent)
622   : KateConfigPage(parent)
623   , editConfigTab(new KateEditGeneralConfigTab(this))
624   , selectConfigTab(new KateSelectConfigTab(this))
625   , indentConfigTab(new KateIndentConfigTab(this))
626   , completionConfigTab (new KateCompletionConfigTab(this))
627   , viInputModeConfigTab(new KateViInputModeConfigTab(this))
628   , spellCheckConfigTab(new KateSpellCheckConfigTab(this))
629 {
630   QVBoxLayout *layout = new QVBoxLayout;
631   layout->setMargin(0);
632   KTabWidget *tabWidget = new KTabWidget(this);
633
634   // add all tabs
635   tabWidget->insertTab(0, editConfigTab, i18n("General"));
636   tabWidget->insertTab(1, selectConfigTab, i18n("Cursor && Selection"));
637   tabWidget->insertTab(2, indentConfigTab, i18n("Indentation"));
638   tabWidget->insertTab(3, completionConfigTab, i18n("Auto Completion"));
639   tabWidget->insertTab(4, viInputModeConfigTab, i18n("Vi Input Mode"));
640   tabWidget->insertTab(5, spellCheckConfigTab, i18n("Spellcheck"));
641
642   connect(editConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
643   connect(selectConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
644   connect(indentConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
645   connect(completionConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
646   connect(viInputModeConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
647   connect(spellCheckConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
648
649   layout->addWidget(tabWidget);
650   setLayout(layout);
651 }
652
653 KateEditConfigTab::~KateEditConfigTab()
654 {
655 }
656
657 void KateEditConfigTab::apply ()
658 {
659   // try to update the rest of tabs
660   editConfigTab->apply();
661   selectConfigTab->apply();
662   indentConfigTab->apply();
663   completionConfigTab->apply();
664   viInputModeConfigTab->apply();
665   spellCheckConfigTab->apply();
666 }
667
668 void KateEditConfigTab::reload ()
669 {
670   editConfigTab->reload();
671   selectConfigTab->reload();
672   indentConfigTab->reload();
673   completionConfigTab->reload();
674   viInputModeConfigTab->reload();
675   spellCheckConfigTab->reload();
676 }
677
678 void KateEditConfigTab::reset ()
679 {
680   editConfigTab->reset();
681   selectConfigTab->reset();
682   indentConfigTab->reset();
683   completionConfigTab->reset();
684   viInputModeConfigTab->reset();
685   spellCheckConfigTab->reset();
686 }
687
688 void KateEditConfigTab::defaults ()
689 {
690   editConfigTab->defaults();
691   selectConfigTab->defaults();
692   indentConfigTab->defaults();
693   completionConfigTab->defaults();
694   viInputModeConfigTab->defaults();
695   spellCheckConfigTab->defaults();
696 }
697 //END KateEditConfigTab
698
699 //BEGIN KateViewDefaultsConfig
700 KateViewDefaultsConfig::KateViewDefaultsConfig(QWidget *parent)
701   :KateConfigPage(parent)
702 {
703   ui = new Ui::AppearanceConfigWidget();
704   ui->setupUi( this );
705
706   if (KateDocument::simpleMode ())
707     ui->gbSortBookmarks->hide ();
708
709   ui->cmbDynamicWordWrapIndicator->addItem( i18n("Off") );
710   ui->cmbDynamicWordWrapIndicator->addItem( i18n("Follow Line Numbers") );
711   ui->cmbDynamicWordWrapIndicator->addItem( i18n("Always On") );
712
713   // hide power user mode if activated anyway
714   if (!KateGlobal::self()->simpleMode ())
715     ui->chkDeveloperMode->hide ();
716
717   // What's This? help is in the ui-file
718
719   reload();
720
721   //
722   // after initial reload, connect the stuff for the changed () signal
723   //
724
725   connect(ui->gbWordWrap, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
726   connect(ui->cmbDynamicWordWrapIndicator, SIGNAL(activated(int)), this, SLOT(slotChanged()));
727   connect(ui->sbDynamicWordWrapDepth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
728   connect(ui->chkIconBorder, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
729   connect(ui->chkScrollbarMarks, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
730   connect(ui->chkLineNumbers, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
731   connect(ui->chkShowFoldingMarkers, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
732   connect(ui->rbSortBookmarksByPosition, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
733   connect(ui->rbSortBookmarksByCreation, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
734   connect(ui->chkShowIndentationLines, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
735   connect(ui->chkShowWholeBracketExpression, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
736   connect(ui->chkDeveloperMode, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
737 }
738
739 KateViewDefaultsConfig::~KateViewDefaultsConfig()
740 {
741   delete ui;
742 }
743
744 void KateViewDefaultsConfig::apply ()
745 {
746   // nothing changed, no need to apply stuff
747   if (!hasChanged())
748     return;
749   m_changed = false;
750
751   KateViewConfig::global()->configStart ();
752   KateRendererConfig::global()->configStart ();
753
754   KateViewConfig::global()->setDynWordWrap (ui->gbWordWrap->isChecked());
755   KateViewConfig::global()->setDynWordWrapIndicators (ui->cmbDynamicWordWrapIndicator->currentIndex ());
756   KateViewConfig::global()->setDynWordWrapAlignIndent(ui->sbDynamicWordWrapDepth->value());
757   KateViewConfig::global()->setLineNumbers (ui->chkLineNumbers->isChecked());
758   KateViewConfig::global()->setIconBar (ui->chkIconBorder->isChecked());
759   KateViewConfig::global()->setScrollBarMarks (ui->chkScrollbarMarks->isChecked());
760   KateViewConfig::global()->setFoldingBar (ui->chkShowFoldingMarkers->isChecked());
761
762   KateViewConfig::global()->setBookmarkSort (ui->rbSortBookmarksByPosition->isChecked()?0:1);
763   KateRendererConfig::global()->setShowIndentationLines(ui->chkShowIndentationLines->isChecked());
764   KateRendererConfig::global()->setShowWholeBracketExpression(ui->chkShowWholeBracketExpression->isChecked());
765
766   // warn user that he needs restart the application
767   if (!ui->chkDeveloperMode->isChecked() != KateDocumentConfig::global()->allowSimpleMode())
768   {
769     // inform...
770     KMessageBox::information(
771                 this,
772                 i18n("Changing the power user mode affects only newly opened / created documents. In KWrite a restart is recommended."),
773                 i18n("Power user mode changed"));
774
775     KateDocumentConfig::global()->setAllowSimpleMode (!ui->chkDeveloperMode->isChecked());
776   }
777
778   KateRendererConfig::global()->configEnd ();
779   KateViewConfig::global()->configEnd ();
780 }
781
782 void KateViewDefaultsConfig::reload ()
783 {
784   ui->gbWordWrap->setChecked(KateViewConfig::global()->dynWordWrap());
785   ui->cmbDynamicWordWrapIndicator->setCurrentIndex( KateViewConfig::global()->dynWordWrapIndicators() );
786   ui->sbDynamicWordWrapDepth->setValue(KateViewConfig::global()->dynWordWrapAlignIndent());
787   ui->chkLineNumbers->setChecked(KateViewConfig::global()->lineNumbers());
788   ui->chkIconBorder->setChecked(KateViewConfig::global()->iconBar());
789   ui->chkScrollbarMarks->setChecked(KateViewConfig::global()->scrollBarMarks());
790   ui->chkShowFoldingMarkers->setChecked(KateViewConfig::global()->foldingBar());
791   ui->rbSortBookmarksByPosition->setChecked(KateViewConfig::global()->bookmarkSort()==0);
792   ui->rbSortBookmarksByCreation->setChecked(KateViewConfig::global()->bookmarkSort()==1);
793   ui->chkShowIndentationLines->setChecked(KateRendererConfig::global()->showIndentationLines());
794   ui->chkShowWholeBracketExpression->setChecked(KateRendererConfig::global()->showWholeBracketExpression());
795   ui->chkDeveloperMode->setChecked(!KateDocumentConfig::global()->allowSimpleMode());
796 }
797
798 void KateViewDefaultsConfig::reset () {;}
799
800 void KateViewDefaultsConfig::defaults (){;}
801 //END KateViewDefaultsConfig
802
803 //BEGIN KateSaveConfigTab
804 KateSaveConfigTab::KateSaveConfigTab( QWidget *parent )
805   : KateConfigPage( parent )
806   , modeConfigPage( new ModeConfigPage( this ) )
807 {
808   // FIXME: Is really needed to move all this code below to another class,
809   // since it is another tab itself on the config dialog. This means we should
810   // initialize, add and work with as we do with modeConfigPage (ereslibre)
811   QVBoxLayout *layout = new QVBoxLayout;
812   layout->setMargin(0);
813   KTabWidget *tabWidget = new KTabWidget(this);
814
815   QWidget *tmpWidget = new QWidget(tabWidget);
816   QVBoxLayout *internalLayout = new QVBoxLayout;
817   QWidget *newWidget = new QWidget(tabWidget);
818   ui = new Ui::OpenSaveConfigWidget();
819   ui->setupUi( newWidget );
820
821   QWidget *tmpWidget2 = new QWidget(tabWidget);
822   QVBoxLayout *internalLayout2 = new QVBoxLayout;
823   QWidget *newWidget2 = new QWidget(tabWidget);
824   uiadv = new Ui::OpenSaveConfigAdvWidget();
825   uiadv->setupUi( newWidget2 );
826
827   // What's this help is added in ui/opensaveconfigwidget.ui
828   reload();
829
830   //
831   // after initial reload, connect the stuff for the changed () signal
832   //
833
834   connect( ui->cmbEncoding, SIGNAL(activated(int)), this, SLOT(slotChanged()));
835   connect( ui->cmbEncodingDetection, SIGNAL(activated(int)), this, SLOT(slotChanged()));
836   connect( ui->cmbEncodingFallback, SIGNAL(activated(int)), this, SLOT(slotChanged()));
837   connect( ui->cmbEOL, SIGNAL(activated(int)), this, SLOT(slotChanged()));
838   connect( ui->chkDetectEOL, SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
839   connect( ui->chkEnableBOM, SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
840   connect( ui->chkRemoveTrailingSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
841   connect( uiadv->chkBackupLocalFiles, SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
842   connect( uiadv->chkBackupRemoteFiles, SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
843   connect( uiadv->sbConfigFileSearchDepth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
844   connect( uiadv->edtBackupPrefix, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotChanged() ) );
845   connect( uiadv->edtBackupSuffix, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotChanged() ) );
846
847   internalLayout->addWidget(newWidget);
848   tmpWidget->setLayout(internalLayout);
849   internalLayout2->addWidget(newWidget2);
850   tmpWidget2->setLayout(internalLayout2);
851
852   // add all tabs
853   tabWidget->insertTab(0, tmpWidget, i18n("General"));
854   tabWidget->insertTab(1, tmpWidget2, i18n("Advanced"));
855   tabWidget->insertTab(2, modeConfigPage, i18n("Modes && Filetypes"));
856
857   connect(modeConfigPage, SIGNAL(changed()), this, SLOT(slotChanged()));
858
859   layout->addWidget(tabWidget);
860   setLayout(layout);
861 }
862
863 KateSaveConfigTab::~KateSaveConfigTab()
864 {
865   delete ui;
866 }
867
868 void KateSaveConfigTab::apply()
869 {
870   modeConfigPage->apply();
871
872   // nothing changed, no need to apply stuff
873   if (!hasChanged())
874     return;
875   m_changed = false;
876
877   KateGlobalConfig::global()->configStart ();
878   KateDocumentConfig::global()->configStart ();
879
880   if ( uiadv->edtBackupSuffix->text().isEmpty() && uiadv->edtBackupPrefix->text().isEmpty() ) {
881     KMessageBox::information(
882                 this,
883                 i18n("You did not provide a backup suffix or prefix. Using default suffix: '~'"),
884                 i18n("No Backup Suffix or Prefix")
885                         );
886     uiadv->edtBackupSuffix->setText( "~" );
887   }
888
889   uint f( 0 );
890   if ( uiadv->chkBackupLocalFiles->isChecked() )
891     f |= KateDocumentConfig::LocalFiles;
892   if ( uiadv->chkBackupRemoteFiles->isChecked() )
893     f |= KateDocumentConfig::RemoteFiles;
894
895   KateDocumentConfig::global()->setBackupFlags(f);
896   KateDocumentConfig::global()->setBackupPrefix(uiadv->edtBackupPrefix->text());
897   KateDocumentConfig::global()->setBackupSuffix(uiadv->edtBackupSuffix->text());
898
899   KateDocumentConfig::global()->setSearchDirConfigDepth(uiadv->sbConfigFileSearchDepth->value());
900
901   KateDocumentConfig::global()->setRemoveSpaces(ui->chkRemoveTrailingSpaces->isChecked());
902
903   // set both standard and fallback encoding
904   KateDocumentConfig::global()->setEncoding((ui->cmbEncoding->currentIndex() == 0) ? "" : KGlobal::charsets()->encodingForName(ui->cmbEncoding->currentText()));
905
906   KateGlobalConfig::global()->setProberType((KEncodingProber::ProberType)ui->cmbEncodingDetection->currentIndex());
907   KateGlobalConfig::global()->setFallbackEncoding(KGlobal::charsets()->encodingForName(ui->cmbEncodingFallback->currentText()));
908
909   KateDocumentConfig::global()->setEol(ui->cmbEOL->currentIndex());
910   KateDocumentConfig::global()->setAllowEolDetection(ui->chkDetectEOL->isChecked());
911   KateDocumentConfig::global()->setBom(ui->chkEnableBOM->isChecked());
912
913   KateDocumentConfig::global()->configEnd ();
914   KateGlobalConfig::global()->configEnd ();
915 }
916
917 void KateSaveConfigTab::reload()
918 {
919   modeConfigPage->reload();
920
921   // encodings
922   ui->cmbEncoding->clear ();
923   ui->cmbEncoding->addItem (i18n("KDE Default"));
924   ui->cmbEncoding->setCurrentIndex(0);
925   ui->cmbEncodingFallback->clear ();
926   QStringList encodings (KGlobal::charsets()->descriptiveEncodingNames());
927   int insert = 1;
928   for (int i=0; i < encodings.count(); i++)
929   {
930     bool found = false;
931     QTextCodec *codecForEnc = KGlobal::charsets()->codecForName(KGlobal::charsets()->encodingForName(encodings[i]), found);
932
933     if (found)
934     {
935       ui->cmbEncoding->addItem (encodings[i]);
936       ui->cmbEncodingFallback->addItem (encodings[i]);
937
938       if ( codecForEnc->name() == KateDocumentConfig::global()->encoding() )
939       {
940         ui->cmbEncoding->setCurrentIndex(insert);
941       }
942
943       if ( codecForEnc == KateGlobalConfig::global()->fallbackCodec() )
944       {
945         // adjust index for fallback config, has no default!
946         ui->cmbEncodingFallback->setCurrentIndex(insert-1);
947       }
948
949       insert++;
950     }
951   }
952
953   // encoding detection
954   ui->cmbEncodingDetection->clear ();
955   bool found = false;
956   for (int i = 0; !KEncodingProber::nameForProberType ((KEncodingProber::ProberType) i).isEmpty(); ++i) {
957     ui->cmbEncodingDetection->addItem (KEncodingProber::nameForProberType ((KEncodingProber::ProberType) i));
958     if (i == KateGlobalConfig::global()->proberType()) {
959       ui->cmbEncodingDetection->setCurrentIndex(ui->cmbEncodingDetection->count()-1);
960       found = true;
961     }
962   }
963   if (!found)
964       ui->cmbEncodingDetection->setCurrentIndex(KEncodingProber::Universal);
965
966
967   // eol
968   ui->cmbEOL->setCurrentIndex(KateDocumentConfig::global()->eol());
969   ui->chkDetectEOL->setChecked(KateDocumentConfig::global()->allowEolDetection());
970   ui->chkEnableBOM->setChecked(KateDocumentConfig::global()->bom());
971
972   ui->chkRemoveTrailingSpaces->setChecked(KateDocumentConfig::global()->removeSpaces());
973   uiadv->sbConfigFileSearchDepth->setValue(KateDocumentConfig::global()->searchDirConfigDepth());
974
975   // other stuff
976   uint f ( KateDocumentConfig::global()->backupFlags() );
977   uiadv->chkBackupLocalFiles->setChecked( f & KateDocumentConfig::LocalFiles );
978   uiadv->chkBackupRemoteFiles->setChecked( f & KateDocumentConfig::RemoteFiles );
979   uiadv->edtBackupPrefix->setText( KateDocumentConfig::global()->backupPrefix() );
980   uiadv->edtBackupSuffix->setText( KateDocumentConfig::global()->backupSuffix() );
981 }
982
983 void KateSaveConfigTab::reset()
984 {
985   modeConfigPage->reset();
986 }
987
988 void KateSaveConfigTab::defaults()
989 {
990   modeConfigPage->defaults();
991
992   uiadv->chkBackupLocalFiles->setChecked( true );
993   uiadv->chkBackupRemoteFiles->setChecked( false );
994   uiadv->edtBackupPrefix->setText( "" );
995   uiadv->edtBackupSuffix->setText( "~" );
996 }
997
998 //END KateSaveConfigTab
999
1000 //BEGIN KatePartPluginConfigPage
1001 KatePartPluginConfigPage::KatePartPluginConfigPage (QWidget *parent)
1002   : KateConfigPage (parent, "")
1003   , scriptConfigPage (new KateScriptConfigPage(this))
1004 {
1005   // FIXME: Is really needed to move all this code below to another class,
1006   // since it is another tab itself on the config dialog. This means we should
1007   // initialize, add and work with as we do with scriptConfigPage (ereslibre)
1008   QVBoxLayout *generalLayout = new QVBoxLayout;
1009   generalLayout->setMargin(0);
1010   KTabWidget *tabWidget = new KTabWidget(this);
1011
1012   QWidget *tmpWidget = new QWidget(tabWidget);
1013   QVBoxLayout *internalLayout = new QVBoxLayout;
1014   QWidget *newWidget = new QWidget(tabWidget);
1015   QVBoxLayout *layout = new QVBoxLayout;
1016   newWidget->setLayout(layout);
1017   layout->setMargin(0);
1018
1019   plugins.clear();
1020
1021   int i = 0;
1022   foreach (const KatePartPluginInfo &info, KatePartPluginManager::self()->pluginList())
1023   {
1024     KPluginInfo it(info.service());
1025     it.setPluginEnabled(info.load);
1026     plugins.append(it);
1027     i++;
1028   }
1029
1030   selector = new KPluginSelector(0);
1031
1032   connect(selector, SIGNAL(changed(bool)), this, SLOT(slotChanged()));
1033   connect(selector, SIGNAL(configCommitted(QByteArray)), this, SLOT(slotChanged()));
1034
1035   selector->addPlugins(plugins, KPluginSelector::IgnoreConfigFile, i18n("Editor Plugins"), "Editor");
1036   layout->addWidget(selector);
1037
1038   internalLayout->addWidget(newWidget);
1039   tmpWidget->setLayout(internalLayout);
1040
1041   // add all tabs
1042   tabWidget->insertTab(0, tmpWidget, i18n("Plugins"));
1043   tabWidget->insertTab(1, scriptConfigPage, i18n("Scripts"));
1044
1045   generalLayout->addWidget(tabWidget);
1046   setLayout(generalLayout);
1047 }
1048
1049 KatePartPluginConfigPage::~KatePartPluginConfigPage ()
1050 {
1051 }
1052
1053 void KatePartPluginConfigPage::apply ()
1054 {
1055   scriptConfigPage->apply();
1056
1057   selector->updatePluginsState();
1058
1059   KatePartPluginList &katePluginList = KatePartPluginManager::self()->pluginList();
1060   for (int i=0; i < plugins.count(); i++) {
1061     if (plugins[i].isPluginEnabled()) {
1062       if (!katePluginList[i].load) {
1063         KatePartPluginManager::self()->loadPlugin(katePluginList[i]);
1064         KatePartPluginManager::self()->enablePlugin(katePluginList[i]);
1065       }
1066     } else {
1067       if (katePluginList[i].load) {
1068         KatePartPluginManager::self()->disablePlugin(katePluginList[i]);
1069         KatePartPluginManager::self()->unloadPlugin(katePluginList[i]);
1070       }
1071     }
1072   }
1073 }
1074
1075 void KatePartPluginConfigPage::reload ()
1076 {
1077   scriptConfigPage->reload();
1078
1079   selector->load();
1080 }
1081
1082 void KatePartPluginConfigPage::reset ()
1083 {
1084   scriptConfigPage->reset();
1085
1086   selector->load();
1087 }
1088
1089 void KatePartPluginConfigPage::defaults ()
1090 {
1091   scriptConfigPage->defaults();
1092
1093   selector->defaults();
1094 }
1095 //END KatePartPluginConfigPage
1096
1097 class KateScriptNewStuff {};
1098
1099 /*
1100 class KateScriptNewStuff: public KNewStuff {
1101   public:
1102     KateScriptNewStuff(QWidget *parent):KNewStuff("kate/scripts",parent) {}
1103     virtual ~KateScriptNewStuff() {}
1104     virtual bool install( const QString &fileName ) {return false;}
1105     virtual bool createUploadFile( const QString &fileName ) {return false;}
1106 };
1107 */
1108 //BEGIN KateScriptConfigPage
1109 KateScriptConfigPage::KateScriptConfigPage(QWidget *parent): KateConfigPage(parent,""), m_newStuff(new KateScriptNewStuff())
1110 {
1111   // TODO: Please look at KateSelectConfigTab or ModeConfigPage to add
1112   // a layout like we do there, to be consistent and have on all config
1113   // pages the same distance to the KTabWidget edge (ereslibre)
1114
1115   //m_newStuff->download();
1116 }
1117
1118 KateScriptConfigPage::~KateScriptConfigPage()
1119 {
1120   delete m_newStuff;
1121   m_newStuff=0;
1122 }
1123
1124 void KateScriptConfigPage::apply () {
1125 }
1126 void KateScriptConfigPage::reload () {
1127 }
1128
1129 //END KateScriptConfigPage
1130
1131 //BEGIN KateHlDownloadDialog
1132 KateHlDownloadDialog::KateHlDownloadDialog(QWidget *parent, const char *name, bool modal)
1133   : KDialog( parent )
1134 {
1135   setCaption( i18n("Highlight Download") );
1136   setButtons( User1 | Close );
1137   setButtonGuiItem( User1, KGuiItem(i18n("&Install")) );
1138   setDefaultButton( User1 );
1139   setObjectName( name );
1140   setModal( modal );
1141
1142   KVBox* vbox = new KVBox(this);
1143   setMainWidget(vbox);
1144   vbox->setSpacing(-1);
1145   new QLabel(i18n("Select the syntax highlighting files you want to update:"), vbox);
1146   list = new QTreeWidget(vbox);
1147   list->setColumnCount(4);
1148   list->setHeaderLabels(QStringList() << "" << i18n("Name") << i18n("Installed") << i18n("Latest"));
1149   list->setSelectionMode(QAbstractItemView::MultiSelection);
1150   list->setAllColumnsShowFocus(true);
1151   list->setRootIsDecorated(false);
1152   list->setColumnWidth(0, 22);
1153
1154   new QLabel(i18n("<b>Note:</b> New versions are selected automatically."), vbox);
1155   setButtonIcon(User1, KIcon("dialog-ok"));
1156
1157   transferJob = KIO::get(
1158     KUrl(QString(HLDOWNLOADPATH)
1159        + QString("update-")
1160        + KateGlobal::katePartVersion()
1161        + QString(".xml")), KIO::Reload );
1162   connect(transferJob, SIGNAL(data(KIO::Job *, const QByteArray &)),
1163     this, SLOT(listDataReceived(KIO::Job *, const QByteArray &)));
1164 //        void data( KIO::Job *, const QByteArray &data);
1165   resize(450, 400);
1166   connect(this,SIGNAL(user1Clicked()),this,SLOT(slotUser1()));
1167 }
1168
1169 KateHlDownloadDialog::~KateHlDownloadDialog(){}
1170
1171 void KateHlDownloadDialog::listDataReceived(KIO::Job *, const QByteArray &data)
1172 {
1173   if (!transferJob || transferJob->isErrorPage())
1174   {
1175     enableButton( User1, false );
1176     if (data.size()==0)
1177       KMessageBox::error(this,i18n("The list of highlightings could not be found on / retrieved from the server"));
1178     return;
1179   }
1180
1181   listData+=QString(data);
1182   kDebug(13000)<<QString("CurrentListData: ")<<listData;
1183   kDebug(13000)<<QString("Data length: %1").arg(data.size());
1184   kDebug(13000)<<QString("listData length: %1").arg(listData.length());
1185   if (data.size()==0)
1186   {
1187     if (listData.length()>0)
1188     {
1189       QString installedVersion;
1190       KateHlManager *hlm=KateHlManager::self();
1191       QDomDocument doc;
1192       doc.setContent(listData);
1193       QDomElement DocElem=doc.documentElement();
1194       QDomNode n=DocElem.firstChild();
1195       KateHighlighting *hl = 0;
1196
1197       if (n.isNull()) kDebug(13000)<<"There is no usable childnode";
1198       while (!n.isNull())
1199       {
1200         installedVersion="    --";
1201
1202         QDomElement e=n.toElement();
1203         if (!e.isNull())
1204         kDebug(13000)<<QString("NAME: ")<<e.tagName()<<QString(" - ")<<e.attribute("name");
1205         n=n.nextSibling();
1206
1207         QString Name=e.attribute("name");
1208
1209         for (int i=0;i<hlm->highlights();i++)
1210         {
1211           hl=hlm->getHl(i);
1212           if (hl && hl->name()==Name)
1213           {
1214             installedVersion="    "+hl->version();
1215             break;
1216           }
1217           else hl = 0;
1218         }
1219
1220         // autoselect entry if new or updated.
1221         QTreeWidgetItem* entry = new QTreeWidgetItem(list);
1222         entry->setText(0, "");
1223         entry->setText(1, e.attribute("name"));
1224         entry->setText(2, installedVersion);
1225         entry->setText(3, e.attribute("version"));
1226         entry->setText(4, e.attribute("url"));
1227
1228         if (!hl || hl->version() < e.attribute("version"))
1229         {
1230           entry->treeWidget()->setItemSelected(entry, true);
1231           entry->setIcon(0, SmallIcon(("get-hot-new-stuff")));
1232         }
1233       }
1234       list->resizeColumnToContents(1);
1235     }
1236   }
1237 }
1238
1239 void KateHlDownloadDialog::slotUser1()
1240 {
1241   QString destdir=KGlobal::dirs()->saveLocation("data","katepart/syntax/");
1242   foreach (QTreeWidgetItem *it, list->selectedItems())
1243   {
1244     KUrl src(it->text(4));
1245     QString filename=src.fileName(KUrl::ObeyTrailingSlash);
1246     QString dest = destdir+filename;
1247
1248     KIO::NetAccess::download(src,dest, this);
1249   }
1250
1251   // update Config !!
1252   // this rewrites the cache....
1253   KateSyntaxDocument doc (KateHlManager::self()->getKConfig(), true);
1254 }
1255 //END KateHlDownloadDialog
1256
1257 //BEGIN KateGotoBar
1258 KateGotoBar::KateGotoBar(KTextEditor::View *view, QWidget *parent)
1259   : KateViewBarWidget( true, parent )
1260   , m_view( view )
1261 {
1262   Q_ASSERT( m_view != 0 );  // this bar widget is pointless w/o a view
1263
1264   QHBoxLayout *topLayout = new QHBoxLayout( centralWidget() );
1265   topLayout->setMargin(0);
1266   gotoRange = new KIntSpinBox(centralWidget());
1267
1268   QLabel *label = new QLabel(i18n("&Go to line:"), centralWidget() );
1269   label->setBuddy(gotoRange);
1270
1271   QToolButton *btnOK = new QToolButton(centralWidget());
1272   btnOK->setAutoRaise(true);
1273   btnOK->setIcon(QIcon(SmallIcon("go-jump")));
1274   btnOK->setText(i18n("Go"));
1275   btnOK->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
1276   connect(btnOK, SIGNAL(clicked()), this, SLOT(gotoLine()));
1277
1278   topLayout->addWidget(label);
1279   topLayout->addWidget(gotoRange, 1);
1280   topLayout->setStretchFactor( gotoRange, 0 );
1281   topLayout->addWidget(btnOK);
1282   topLayout->addStretch();
1283 }
1284
1285 void KateGotoBar::updateData()
1286 {
1287   gotoRange->setMaximum(m_view->document()->lines());
1288   if (!isVisible())
1289   {
1290     gotoRange->setValue(m_view->cursorPosition().line() + 1);
1291     gotoRange->adjustSize(); // ### does not respect the range :-(
1292   }
1293   gotoRange->setFocus(Qt::OtherFocusReason);
1294   gotoRange->selectAll();
1295 }
1296
1297 void KateGotoBar::keyPressEvent(QKeyEvent* event)
1298 {
1299   int key = event->key();
1300   if (key == Qt::Key_Return || key == Qt::Key_Enter) {
1301     gotoLine();
1302     return;
1303   }
1304   KateViewBarWidget::keyPressEvent(event);
1305 }
1306
1307 void KateGotoBar::gotoLine()
1308 {
1309   m_view->setCursorPosition( KTextEditor::Cursor(gotoRange->value() - 1, 0) );
1310   m_view->setFocus();
1311   emit hideMe();
1312 }
1313 //END KateGotoBar
1314
1315 //BEGIN KateDictionaryBar
1316 KateDictionaryBar::KateDictionaryBar(KateView* view, QWidget *parent)
1317   : KateViewBarWidget( true, parent )
1318   , m_view( view )
1319 {
1320   Q_ASSERT(m_view != 0); // this bar widget is pointless w/o a view
1321
1322   QHBoxLayout *topLayout = new QHBoxLayout(centralWidget());
1323   topLayout->setMargin(0);
1324   //topLayout->setSpacing(spacingHint());
1325   m_dictionaryComboBox = new Sonnet::DictionaryComboBox(centralWidget());
1326   connect(m_dictionaryComboBox, SIGNAL(dictionaryChanged(const QString&)),
1327           this, SLOT(dictionaryChanged(const QString&)));
1328   connect(view->doc(), SIGNAL(defaultDictionaryChanged(KateDocument*)),
1329           this, SLOT(updateData()));
1330   QLabel *label = new QLabel(i18n("Dictionary:"), centralWidget());
1331   label->setBuddy(m_dictionaryComboBox);
1332
1333   topLayout->addWidget(label);
1334   topLayout->addWidget(m_dictionaryComboBox, 1);
1335   topLayout->setStretchFactor(m_dictionaryComboBox, 0);
1336   topLayout->addStretch();
1337 }
1338
1339 KateDictionaryBar::~KateDictionaryBar()
1340 {
1341 }
1342
1343 void KateDictionaryBar::updateData()
1344 {
1345   KateDocument *document = m_view->doc();
1346   QString dictionary = document->defaultDictionary();
1347   if(dictionary.isEmpty()) {
1348     dictionary = Sonnet::Speller().defaultLanguage();
1349   }
1350   m_dictionaryComboBox->setCurrentByDictionary(dictionary);
1351 }
1352
1353 void KateDictionaryBar::dictionaryChanged(const QString& dictionary)
1354 {
1355   KTextEditor::Range selection = m_view->selectionRange();
1356   if(selection.isValid() && !selection.isEmpty()) {
1357     m_view->doc()->setDictionary(dictionary, selection);
1358   }
1359   else {
1360     m_view->doc()->setDefaultDictionary(dictionary);
1361   }
1362 }
1363
1364 //END KateGotoBar
1365
1366
1367 //BEGIN KateModOnHdPrompt
1368 KateModOnHdPrompt::KateModOnHdPrompt( KateDocument *doc,
1369                                       KTextEditor::ModificationInterface::ModifiedOnDiskReason modtype,
1370                                       const QString &reason,
1371                                       QWidget *parent )
1372   : KDialog( parent ),
1373     m_doc( doc ),
1374     m_modtype ( modtype ),
1375     m_proc( 0 ),
1376     m_diffFile( 0 )
1377 {
1378   setButtons( Ok | Apply | Cancel | User1 );
1379
1380   QString title, btnOK, whatisok;
1381   if ( modtype == KTextEditor::ModificationInterface::OnDiskDeleted )
1382   {
1383     title = i18n("File Was Deleted on Disk");
1384     btnOK = i18n("&Save File As...");
1385     whatisok = i18n("Lets you select a location and save the file again.");
1386   } else {
1387     title = i18n("File Changed on Disk");
1388     btnOK = i18n("&Reload File");
1389     whatisok = i18n("Reload the file from disk. If you have unsaved changes, "
1390         "they will be lost.");
1391   }
1392
1393   setButtonText( Ok, btnOK );
1394   setButtonText( Apply, i18n("&Ignore") );
1395
1396   setButtonWhatsThis( Ok, whatisok );
1397   setButtonWhatsThis( Apply, i18n("Ignore the changes. You will not be prompted again.") );
1398   setButtonWhatsThis( Cancel, i18n("Do nothing. Next time you focus the file, "
1399       "or try to save it or close it, you will be prompted again.") );
1400
1401   setCaption( title );
1402
1403   QWidget *w = new QWidget(this);
1404   ui = new Ui::ModOnHdWidget();
1405   ui->setupUi( w );
1406   setMainWidget( w );
1407
1408   ui->lblIcon->setPixmap( DesktopIcon("dialog-warning" ) );
1409   ui->lblText->setText( reason + "\n\n" + i18n("What do you want to do?") );
1410
1411   // If the file isn't deleted, present a diff button, and a overwrite action.
1412   if ( modtype != KTextEditor::ModificationInterface::OnDiskDeleted )
1413   {
1414     setButtonText( User1, i18n("Overwrite") );
1415     setButtonWhatsThis( User1, i18n("Overwrite the disk file with the editor content.") );
1416     connect( ui->btnDiff, SIGNAL(clicked()), this, SLOT(slotDiff()) );
1417   }
1418   else
1419   {
1420     ui->chkIgnoreWhiteSpaces->setVisible( false );
1421     ui->btnDiff->setVisible( false );
1422     showButton( User1, false );
1423   }
1424 }
1425
1426 KateModOnHdPrompt::~KateModOnHdPrompt()
1427 {
1428   delete m_proc;
1429   m_proc = 0;
1430   if (m_diffFile) {
1431     m_diffFile->setAutoRemove(true);
1432     delete m_diffFile;
1433     m_diffFile = 0;
1434   }
1435   delete ui;
1436 }
1437
1438 void KateModOnHdPrompt::slotDiff()
1439 {
1440   if (m_diffFile)
1441     return;
1442
1443   m_diffFile = new KTemporaryFile();
1444   m_diffFile->open();
1445
1446   // Start a KProcess that creates a diff
1447   m_proc = new KProcess( this );
1448   m_proc->setOutputChannelMode( KProcess::MergedChannels );
1449   *m_proc << "diff" << QString(ui->chkIgnoreWhiteSpaces->isChecked() ? "-ub" : "-u")
1450      << "-" <<  m_doc->url().toLocalFile();
1451   connect( m_proc, SIGNAL(readyRead()), this, SLOT(slotDataAvailable()) );
1452   connect( m_proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotPDone()) );
1453
1454   setCursor( Qt::WaitCursor );
1455   // disable the button and checkbox, to hinder the user to run it twice.
1456   ui->chkIgnoreWhiteSpaces->setEnabled( false );
1457   ui->btnDiff->setEnabled( false );
1458
1459   m_proc->start();
1460
1461   QTextStream ts(m_proc);
1462   int lastln = m_doc->lines();
1463   for ( int l = 0; l < lastln; ++l )
1464     ts << m_doc->line( l ) << '\n';
1465   ts.flush();
1466   m_proc->closeWriteChannel();
1467 }
1468
1469 void KateModOnHdPrompt::slotDataAvailable()
1470 {
1471   m_diffFile->write(m_proc->readAll());
1472 }
1473
1474 void KateModOnHdPrompt::slotPDone()
1475 {
1476   setCursor( Qt::ArrowCursor );
1477   ui->chkIgnoreWhiteSpaces->setEnabled( true );
1478   ui->btnDiff->setEnabled( true );
1479
1480   const QProcess::ExitStatus es = m_proc->exitStatus();
1481   delete m_proc;
1482   m_proc = 0;
1483
1484   if ( es != QProcess::NormalExit )
1485   {
1486     KMessageBox::sorry( this,
1487                         i18n("The diff command failed. Please make sure that "
1488                              "diff(1) is installed and in your PATH."),
1489                         i18n("Error Creating Diff") );
1490     delete m_diffFile;
1491     m_diffFile = 0;
1492     return;
1493   }
1494
1495   if ( m_diffFile->size() == 0 )
1496   {
1497     KMessageBox::information( this,
1498                               i18n("Besides white space changes, the files are identical."),
1499                               i18n("Diff Output") );
1500     delete m_diffFile;
1501     m_diffFile = 0;
1502     return;
1503   }
1504
1505   m_diffFile->setAutoRemove(false);
1506   KUrl url = KUrl::fromPath(m_diffFile->fileName());
1507   delete m_diffFile;
1508   m_diffFile = 0;
1509
1510   // KRun::runUrl should delete the file, once the client exits
1511   KRun::runUrl( url, "text/x-patch", this, true );
1512 }
1513
1514 void KateModOnHdPrompt::slotButtonClicked(int button)
1515 {
1516   switch(button)
1517   {
1518     case Default:
1519     case Ok:
1520       done( (m_modtype == KTextEditor::ModificationInterface::OnDiskDeleted) ?
1521             Save : Reload );
1522       break;
1523     case Apply:
1524     {
1525       if ( KMessageBox::warningContinueCancel(
1526            this,
1527            i18n("Ignoring means that you will not be warned again (unless "
1528            "the disk file changes once more): if you save the document, you "
1529            "will overwrite the file on disk; if you do not save then the disk "
1530            "file (if present) is what you have."),
1531            i18n("You Are on Your Own"),
1532            KStandardGuiItem::cont(),
1533            KStandardGuiItem::cancel(),
1534            "kate_ignore_modonhd" ) != KMessageBox::Continue )
1535         return;
1536       done( Ignore );
1537       break;
1538     }
1539     case User1:
1540       done( Overwrite );
1541       break;
1542     default:
1543       KDialog::slotButtonClicked(button);
1544   }
1545 }
1546
1547 //END KateModOnHdPrompt
1548
1549 // kate: space-indent on; indent-width 2; replace-tabs on;