summaryrefslogtreecommitdiffstats
path: root/kedit/kedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kedit/kedit.cpp')
-rw-r--r--kedit/kedit.cpp1377
1 files changed, 1377 insertions, 0 deletions
diff --git a/kedit/kedit.cpp b/kedit/kedit.cpp
new file mode 100644
index 0000000..a255cd9
--- /dev/null
+++ b/kedit/kedit.cpp
@@ -0,0 +1,1377 @@
+ /*
+
+ $Id$
+
+ Copyright (C) 1997 Bernd Johannes Wuebben
+ wuebben@math.cornell.edu
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <qlayout.h>
+#include <qtimer.h>
+#include <qpaintdevicemetrics.h>
+#include <qpainter.h>
+
+#include <kaboutdata.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kconfigdialog.h>
+#include <kcursor.h>
+#include <keditcl.h>
+#include <kfileitem.h>
+#include <kfontdialog.h>
+#include <kio/netaccess.h>
+#include <kmessagebox.h>
+#include <kprinter.h>
+#include <ksavefile.h>
+#include <kstatusbar.h>
+#include <kspell.h>
+#include <kurldrag.h>
+
+#include "ktextfiledlg.h"
+#include "kedit.h"
+#include "misc.h"
+#include "color.h"
+#include "prefs.h"
+
+#include <kdebug.h>
+
+
+QPtrList<TopLevel> *TopLevel::windowList = 0;
+
+int default_open = TopLevel::OPEN_READWRITE;
+
+TopLevel::TopLevel (QWidget *, const char *name)
+ : KMainWindow ( 0,name ), kspellconfigOptions(0),
+ eframe(0), newWindow(false), kspell(0)
+{
+ if (!windowList)
+ {
+ windowList = new QPtrList<TopLevel>;
+ windowList->setAutoDelete( FALSE );
+ }
+ windowList->append( this );
+
+ statusbar_timer = new QTimer(this);
+ connect(statusbar_timer, SIGNAL(timeout()),this,SLOT(timer_slot()));
+
+ connect(kapp,SIGNAL(kdisplayPaletteChanged()),this,SLOT(set_colors()));
+
+ setupStatusBar();
+ setupActions();
+
+ readSettings();
+
+ setupEditWidget();
+
+ if (!initialGeometrySet())
+ resize( QSize(550, 400).expandedTo(minimumSizeHint()));
+ setupGUI(ToolBar | Keys | StatusBar | Create);
+ setAutoSaveSettings();
+
+ setAcceptDrops(true);
+
+ setFileCaption();
+}
+
+
+TopLevel::~TopLevel ()
+{
+ windowList->remove( this );
+}
+
+
+void TopLevel::setupEditWidget()
+{
+ if (!eframe)
+ {
+ eframe = new KEdit (this, "eframe");
+ eframe->setOverwriteEnabled(true);
+
+ connect(eframe, SIGNAL(CursorPositionChanged()),this,
+ SLOT(statusbar_slot()));
+ connect(eframe, SIGNAL(toggle_overwrite_signal()),this,
+ SLOT(toggle_overwrite()));
+ connect(eframe, SIGNAL(gotUrlDrop(QDropEvent*)), this,
+ SLOT(urlDrop_slot(QDropEvent*)));
+ connect(eframe, SIGNAL(undoAvailable(bool)),undoAction,
+ SLOT(setEnabled(bool)));
+ connect(eframe, SIGNAL(redoAvailable(bool)),redoAction,
+ SLOT(setEnabled(bool)));
+ connect(eframe, SIGNAL(copyAvailable(bool)),cutAction,
+ SLOT(setEnabled(bool)));
+ connect(eframe, SIGNAL(copyAvailable(bool)),copyAction,
+ SLOT(setEnabled(bool)));
+ connect( eframe, SIGNAL(selectionChanged()),this,
+ SLOT(slotSelectionChanged()));
+ connect( eframe, SIGNAL(modificationChanged( bool)),
+ SLOT(setFileCaption()));
+
+ undoAction->setEnabled(false);
+ redoAction->setEnabled(false);
+ cutAction->setEnabled(false);
+ copyAction->setEnabled(false);
+
+ setCentralWidget(eframe);
+ eframe->setMinimumSize(200, 100);
+ }
+
+ if( Prefs::wrapMode() == Prefs::EnumWrapMode::FixedColumnWrap )
+ {
+ eframe->setWordWrap(QMultiLineEdit::FixedColumnWidth);
+ eframe->setWrapColumnOrWidth(Prefs::wrapColumn());
+ }
+ else if( Prefs::wrapMode() == Prefs::EnumWrapMode::SoftWrap )
+ {
+ eframe->setWordWrap(QMultiLineEdit::WidgetWidth);
+ }
+ else
+ {
+ eframe->setWordWrap(QMultiLineEdit::NoWrap);
+ }
+
+ eframe->setFont( Prefs::font() );
+ int w = eframe->fontMetrics().width("M");
+ eframe->setTabStopWidth(8*w);
+
+ eframe->setModified(false);
+
+ setSensitivity();
+
+ eframe->setFocus();
+
+ set_colors();
+
+ /*
+ right_mouse_button = new QPopupMenu;
+
+ right_mouse_button->insertItem (i18n("Open..."),
+ this, SLOT(file_open()));
+ right_mouse_button->insertItem (SmallIcon("filesave"),i18n("Save"),
+ this, SLOT(file_save()));
+ right_mouse_button->insertItem (SmallIcon("filesaveas"),i18n("Save As..."),
+ this, SLOT(file_save_as()));
+ right_mouse_button->insertSeparator(-1);
+ right_mouse_button->insertItem(i18n("Copy"),
+ this, SLOT(copy()));
+ right_mouse_button->insertItem(i18n("Paste"),
+ this, SLOT(paste()));
+ right_mouse_button->insertItem(i18n("Cut"),
+ this, SLOT(cut()));
+ right_mouse_button->insertItem(i18n("Select All"),
+ this, SLOT(select_all()));
+ eframe->installRBPopup(right_mouse_button);
+ */
+}
+
+
+void TopLevel::slotSelectionChanged()
+{
+ bool state = eframe->hasSelectedText();
+ cutAction->setEnabled( state );
+ copyAction->setEnabled( state );
+}
+
+
+void TopLevel::setupActions()
+{
+ // setup File menu
+ KStdAction::openNew(this, SLOT(file_new()), actionCollection());
+ KStdAction::open(this, SLOT(file_open()), actionCollection());
+ recent = KStdAction::openRecent(this, SLOT(openRecent(const KURL&)),
+ actionCollection());
+ KStdAction::save(this, SLOT(file_save()), actionCollection());
+ KStdAction::saveAs(this, SLOT(file_save_as()), actionCollection());
+ KStdAction::close(this, SLOT(file_close()), actionCollection());
+ KStdAction::print(this, SLOT(print()), actionCollection());
+ KStdAction::mail(this, SLOT(mail()), actionCollection());
+ KStdAction::quit(this, SLOT(close()), actionCollection());
+
+ // setup edit menu
+ undoAction = KStdAction::undo(this, SLOT(undo()), actionCollection());
+ redoAction = KStdAction::redo(this, SLOT(redo()), actionCollection());
+ cutAction = KStdAction::cut(this, SLOT(cut()), actionCollection());
+ copyAction = KStdAction::copy(this, SLOT(copy()), actionCollection());
+ KStdAction::pasteText(this, SLOT(paste()), actionCollection());
+ KStdAction::selectAll(this, SLOT(select_all()), actionCollection());
+ KStdAction::find(this, SLOT(search()), actionCollection());
+ KStdAction::findNext(this, SLOT(search_again()), actionCollection());
+ KStdAction::replace(this, SLOT(replace()), actionCollection());
+
+ (void)new KAction(i18n("&Insert File..."), 0, this, SLOT(file_insert()),
+ actionCollection(), "insert_file");
+ (void)new KAction(i18n("In&sert Date"), 0, this, SLOT(insertDate()),
+ actionCollection(), "insert_date");
+ (void)new KAction(i18n("Cl&ean Spaces"), 0, this, SLOT(clean_space()),
+ actionCollection(), "clean_spaces");
+
+ // setup Tools menu
+ KStdAction::spelling(this, SLOT(spellcheck()), actionCollection());
+
+ // setup Go menu
+ KStdAction::gotoLine(this, SLOT(gotoLine()), actionCollection());
+
+ KStdAction::preferences(this, SLOT(showSettings()), actionCollection());
+}
+
+void TopLevel::setupStatusBar()
+{
+ statusBar()->insertItem("", ID_GENERAL, 10 );
+ statusBar()->insertFixedItem( i18n("OVR"), ID_INS_OVR );
+ statusBar()->insertFixedItem( i18n("Line:000000 Col: 000"), ID_LINE_COLUMN );
+
+ statusBar()->setItemAlignment( ID_GENERAL, AlignLeft|AlignVCenter );
+ statusBar()->setItemAlignment( ID_LINE_COLUMN, AlignLeft|AlignVCenter );
+ statusBar()->setItemAlignment( ID_INS_OVR, AlignLeft|AlignVCenter );
+
+ statusBar()->changeItem( i18n("Line: 1 Col: 1"), ID_LINE_COLUMN );
+ statusBar()->changeItem( i18n("INS"), ID_INS_OVR );
+}
+
+
+void TopLevel::saveProperties(KConfig* config)
+{
+ if(m_url.isEmpty() && !eframe->isModified())
+ return;
+
+ config->writeEntry("url",m_url.url());
+ config->writeEntry("modified",eframe->isModified());
+
+ int line, col;
+ eframe->getCursorPosition(&line, &col);
+ config->writeEntry("current_line", line);
+ config->writeEntry("current_column", col);
+
+ if(eframe->isModified())
+ {
+ QString name = m_url.url();
+ if (name.isEmpty())
+ name = QString("kedit%1-%2").arg(getpid()).arg((long)this);
+ QString tmplocation = kapp->tempSaveName(m_url.url());
+ config->writeEntry("saved_to",tmplocation);
+ saveFile(tmplocation, false, m_url.fileEncoding());
+ }
+}
+
+
+void TopLevel::readProperties(KConfig* config){
+ KURL url = config->readPathEntry("url");
+ QString filename = config->readPathEntry("saved_to");
+
+ QString encoding = url.fileEncoding();
+ int modified = config->readNumEntry("modified",0);
+ int line = config->readNumEntry("current_line", 0);
+ int col = config->readNumEntry("current_column", 0);
+ int result = KEDIT_RETRY;
+
+ if(!filename.isEmpty())
+ {
+ if (modified)
+ {
+ result = openFile(filename, OPEN_READWRITE, url.fileEncoding());
+ }
+ else
+ {
+ result = openFile(filename, OPEN_READWRITE, url.fileEncoding());
+ }
+ }
+ else
+ {
+ openURL(url, OPEN_READWRITE);
+ modified = false;
+ result = KEDIT_OK;
+ }
+
+ if (result == KEDIT_OK)
+ {
+ m_url = url;
+ eframe->setModified(modified);
+ eframe->setCursorPosition(line, col);
+ setFileCaption();
+ statusbar_slot();
+ }
+}
+
+
+void TopLevel::undo()
+{
+ eframe->undo();
+}
+
+
+void TopLevel::redo()
+{
+ eframe->redo();
+}
+
+
+void TopLevel::copy()
+{
+ eframe->copy();
+}
+
+
+void TopLevel::select_all()
+{
+ eframe->selectAll();
+}
+
+
+void TopLevel::insertDate(){
+
+ int line, column;
+
+ QString string;
+ QDate dt = QDate::currentDate();
+ string = KGlobal::locale()->formatDate(dt);
+
+ eframe->getCursorPosition(&line,&column);
+ eframe->insertAt(string,line,column);
+ eframe->setModified(TRUE);
+
+ statusbar_slot();
+}
+
+void TopLevel::paste(){
+
+ eframe->paste();
+ eframe->setModified(TRUE);
+
+ statusbar_slot();
+}
+
+
+void TopLevel::cut(){
+
+ eframe->cut();
+ eframe->setModified(TRUE);
+ statusbar_slot();
+
+}
+
+
+void TopLevel::file_new()
+{
+ TopLevel *t = new TopLevel ();
+ t->show();
+ return;
+}
+
+void TopLevel::clean_space()
+{
+ eframe->cleanWhiteSpace();
+}
+
+void TopLevel::spellcheck()
+{
+ if (!eframe) return;
+
+ if (kspell) return; // In progress
+
+ statusBar()->changeItem(i18n("Spellcheck: Started."), ID_GENERAL);
+
+ initSpellConfig();
+ kspell = new KSpell(this, i18n("Spellcheck"), this,
+ SLOT( spell_started(KSpell *)), kspellconfigOptions);
+
+ connect (kspell, SIGNAL ( death()),
+ this, SLOT ( spell_finished( )));
+
+ connect (kspell, SIGNAL (progress (unsigned int)),
+ this, SLOT (spell_progress (unsigned int)));
+ connect (kspell, SIGNAL (misspelling (const QString &, const QStringList &, unsigned int)),
+ eframe, SLOT (misspelling (const QString &, const QStringList &, unsigned int)));
+ connect (kspell, SIGNAL (corrected (const QString &, const QString &, unsigned int)),
+ eframe, SLOT (corrected (const QString &, const QString &, unsigned int)));
+ connect (kspell, SIGNAL (done(const QString&)),
+ this, SLOT (spell_done(const QString&)));
+}
+
+
+void TopLevel::spell_started( KSpell *)
+{
+ eframe->spellcheck_start();
+ kspell->setProgressResolution(2);
+ kspell->check(eframe->text());
+}
+
+
+void TopLevel::spell_progress (unsigned int percent)
+{
+ QString s;
+ s = i18n("Spellcheck: %1% complete").arg(percent);
+
+ statusBar()->changeItem (s, ID_GENERAL);
+}
+
+
+void TopLevel::spell_done(const QString& newtext)
+{
+ eframe->spellcheck_stop();
+ if (kspell->dlgResult() == 0)
+ {
+ eframe->setText( newtext);
+ statusBar()->changeItem (i18n("Spellcheck: Aborted."), ID_GENERAL);
+ }
+ else
+ {
+ statusBar()->changeItem (i18n("Spellcheck: Complete."), ID_GENERAL);
+ }
+ kspell->cleanUp();
+}
+
+// Replace ISpell with the name of the actual spell checker.
+// TODO: Use %1 in the original string instead when string freeze is over.
+QString TopLevel::replaceISpell(QString msg, int client)
+{
+ switch(client)
+ {
+ case KS_CLIENT_ISPELL: msg.replace("ISpell", "<b>ispell</b>"); break;
+ case KS_CLIENT_ASPELL: msg.replace("ISpell", "<b>aspell</b>"); break;
+ case KS_CLIENT_HSPELL: msg.replace("ISpell", "<b>hspell</b>"); break;
+ }
+ msg.replace("\n", "<p>");
+ return "<qt>"+msg+"</qt>";
+}
+
+void TopLevel::spell_finished( )
+{
+ KSpell::spellStatus status = kspell->status();
+ int client = kspellconfigOptions->client();
+ delete kspell;
+ kspell = 0;
+ if (status == KSpell::Error)
+ {
+ KMessageBox::sorry(this, replaceISpell(i18n("ISpell could not be started.\n"
+ "Please make sure you have ISpell properly configured and in your PATH."), client));
+ }
+ else if (status == KSpell::Crashed)
+ {
+ eframe->spellcheck_stop();
+ statusBar()->changeItem (i18n("Spellcheck: Crashed."), ID_GENERAL);
+ KMessageBox::sorry(this, replaceISpell(i18n("ISpell seems to have crashed."), client));
+ }
+}
+
+
+void TopLevel::file_open( void )
+{
+
+ while( 1 )
+ {
+ KURL url = KTextFileDialog::getOpenURLwithEncoding(
+ QString::null, QString::null, this,
+ i18n("Open File"));
+ if( url.isEmpty() )
+ {
+ return;
+ }
+
+ KIO::UDSEntry entry;
+ KIO::NetAccess::stat(url, entry, this);
+ KFileItem fileInfo(entry, url);
+ if (fileInfo.size() > 2097152 && // 2MB large/small enough?
+ KMessageBox::warningContinueCancel(this,
+ i18n("The file you have requested is larger than KEdit is designed for. "
+ "Please ensure you have enough system resources available to safely load this file, "
+ "or consider using a program that is designed to handle large files such as KWrite."),
+ i18n("Attempting to Open Large File"),
+ KStdGuiItem::cont(), "attemptingToOpenLargeFile") == KMessageBox::Cancel)
+ {
+ return;
+ }
+
+ TopLevel *toplevel;
+ if( !m_url.isEmpty() || eframe->isModified() )
+ {
+ toplevel = new TopLevel();
+ if( toplevel == 0 )
+ {
+ return;
+ }
+ }
+ else
+ {
+ toplevel = this;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download( url, tmpfile, toplevel );
+
+ int result = toplevel->openFile( tmpfile, 0, url.fileEncoding());
+ KIO::NetAccess::removeTempFile( tmpfile );
+
+ if( result == KEDIT_OK )
+ {
+ if( toplevel != this ) { toplevel->show(); }
+ toplevel->m_url = url;
+ toplevel->setFileCaption();
+ recent->addURL( url );
+ toplevel->eframe->setModified(false);
+ toplevel->setGeneralStatusField(i18n("Done"));
+ toplevel->statusbar_slot();
+ break;
+ }
+ else if( result == KEDIT_RETRY )
+ {
+ if( toplevel != this ) { delete toplevel; }
+ }
+ else
+ {
+ if( toplevel != this ) { delete toplevel; }
+ break;
+ }
+ }
+
+}
+
+void TopLevel::file_insert()
+{
+ while( 1 )
+ {
+ KURL url = KTextFileDialog::getOpenURLwithEncoding(
+ QString::null, QString::null, this,
+ i18n("Insert File"), "", KStdGuiItem::insert().text());
+ if( url.isEmpty() )
+ {
+ return;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download( url, tmpfile, this );
+ int result = openFile( tmpfile, OPEN_INSERT, url.fileEncoding(), true );
+ KIO::NetAccess::removeTempFile( tmpfile );
+
+ if( result == KEDIT_OK )
+ {
+ recent->addURL( url );
+ eframe->setModified(true);
+ setGeneralStatusField(i18n("Done"));
+ statusbar_slot();
+ }
+ else if( result == KEDIT_RETRY )
+ {
+ continue;
+ }
+ return;
+ }
+}
+
+bool TopLevel::queryExit()
+{
+ // save recent files menu
+ config = kapp->config();
+ recent->saveEntries( config );
+ config->sync();
+
+ return true;
+}
+
+bool TopLevel::queryClose()
+{
+ queryExit();
+ int result;
+
+ if ( !eframe->isModified() )
+ return true;
+
+ QString msg = i18n(""
+ "This document has been modified.\n"
+ "Would you like to save it?" );
+ switch( KMessageBox::warningYesNoCancel( this, msg, QString::null,
+ KStdGuiItem::save(), KStdGuiItem::discard() ) )
+ {
+ case KMessageBox::Yes: // Save, then exit
+ if ( m_url.isEmpty())
+ {
+ file_save_as();
+ if ( eframe->isModified() )
+ return false; // Still modified? Don't exit!
+ }
+ else
+ {
+ result = saveURL(m_url);
+ if ( result == KEDIT_USER_CANCEL )
+ return false; // Don't exit.
+
+ if ( result != KEDIT_OK)
+ {
+ msg = i18n(""
+ "Could not save the file.\n"
+ "Exit anyways?");
+ switch( KMessageBox::warningContinueCancel( this, msg, QString::null, KStdGuiItem::quit() ) )
+ {
+ case KMessageBox::Continue:
+ return true; // Exit.
+ case KMessageBox::Cancel:
+ default:
+ return false; // Don't exit.
+ }
+ }
+ }
+
+ case KMessageBox::No: // Don't save but exit.
+ return true;
+
+ case KMessageBox::Cancel: // Don't save and don't exit.
+ default:
+ return false; // Don't exit...
+ }
+
+ return true; // Exit.
+}
+
+
+void TopLevel::openRecent(const KURL& url)
+{
+ if (!m_url.isEmpty() || eframe->isModified())
+ {
+ TopLevel *t = new TopLevel (0,0);
+ t->show();
+ t->openRecent(url);
+ return;
+ }
+ openURL( url, OPEN_READWRITE );
+}
+
+
+void TopLevel::file_close()
+{
+ if( eframe->isModified() )
+ {
+ QString msg = i18n("This document has been modified.\n"
+ "Would you like to save it?" );
+ switch( KMessageBox::warningYesNoCancel( this, msg, QString::null,
+ KStdGuiItem::save(), KStdGuiItem::discard() ) )
+ {
+ case KMessageBox::Yes: // Save, then close
+ file_save();
+ if (eframe->isModified())
+ return; // Error during save.
+ break;
+
+ case KMessageBox::No: // Don't save but close.
+ break;
+
+ case KMessageBox::Cancel: // Don't save and don't close.
+ return;
+ break;
+ }
+ }
+ eframe->clear();
+ eframe->setModified(false);
+ m_url = KURL();
+ setFileCaption();
+ statusbar_slot();
+}
+
+
+void TopLevel::file_save()
+{
+ if (m_url.isEmpty())
+ {
+ file_save_as();
+ return;
+ }
+
+ int result = KEDIT_OK;
+
+ result = saveURL(m_url); // error messages are handled by saveFile
+
+ if ( result == KEDIT_OK ){
+ QString string;
+ string = i18n("Wrote: %1").arg(m_caption);
+ setGeneralStatusField(string);
+ }
+}
+
+
+void TopLevel::setGeneralStatusField(const QString &text){
+
+ statusbar_timer->stop();
+
+ statusBar()->changeItem(text,ID_GENERAL);
+ statusbar_timer->start(10000,TRUE); // single shot
+
+}
+
+
+void TopLevel::file_save_as()
+{
+ KURL u;
+ while(true)
+ {
+ u = KTextFileDialog::getSaveURLwithEncoding(
+ m_url.url(), QString::null, this,
+ i18n("Save File As"),
+ m_url.fileEncoding());
+
+ if (u.isEmpty())
+ return;
+
+ if ( KIO::NetAccess::exists(u, false, this) )
+ {
+ int result = KMessageBox::warningContinueCancel( this,
+ i18n( "A file named \"%1\" already exists. "
+ "Are you sure you want to overwrite it?" ).arg( u.prettyURL() ),
+ i18n( "Overwrite File?" ),
+ i18n( "Overwrite" ) );
+
+ if (result != KMessageBox::Continue)
+ continue;
+ }
+ break;
+ }
+
+ int result = saveURL(u); // error messages are handled by saveFile
+
+ if ( result == KEDIT_OK )
+ {
+ m_url = u;
+ setFileCaption();
+ QString string = i18n("Saved as: %1").arg(m_caption);
+ setGeneralStatusField(string);
+ recent->addURL( u );
+ }
+}
+
+
+
+void TopLevel::mail()
+{
+ //
+ // Default subject string
+ //
+ QString defaultsubject = name();
+ int index = defaultsubject.findRev('/');
+ if( index != -1)
+ defaultsubject = defaultsubject.right(defaultsubject.length() - index - 1 );
+
+ kapp->invokeMailer( QString::null, QString::null, QString::null,
+ defaultsubject, eframe->text() );
+}
+
+/*
+void TopLevel::fancyprint(){
+
+ QPrinter prt;
+ char buf[200];
+ if ( prt.setup(0) ) {
+
+ int y =10;
+ QPainter p;
+ p.begin( &prt );
+ p.setFont( eframe->font() );
+ QFontMetrics fm = p.fontMetrics();
+
+ int numlines = eframe->numLines();
+ for(int i = 0; i< numlines; i++){
+ y += fm.ascent();
+ QString line;
+ line = eframe->textLine(i);
+ line.replace( QRegExp("\t"), " " );
+ strncpy(buf,line.local8Bit(),160);
+ for (int j = 0 ; j <150; j++){
+ if (!isprint(buf[j]))
+ buf[j] = ' ';
+ }
+ buf[line.length()] = '\0';
+ p.drawText( 10, y, buf );
+ y += fm.descent();
+ }
+
+ p.end();
+ }
+ return ;
+}
+*/
+
+void TopLevel::helpselected(){
+
+ kapp->invokeHelp( );
+
+}
+
+
+void TopLevel::search(){
+
+ eframe->search();
+ statusbar_slot();
+}
+
+void TopLevel::replace(){
+ eframe->replace();
+ statusbar_slot();
+}
+
+
+
+void TopLevel::showSettings()
+{
+ if(KConfigDialog::showDialog("settings"))
+ return;
+
+ initSpellConfig();
+ KConfigDialog* dialog = new SettingsDialog(this, "settings", Prefs::self(), kspellconfigOptions);
+
+ connect(dialog, SIGNAL(settingsChanged()), this, SLOT(updateSettings()));
+ dialog->show();
+}
+
+void TopLevel::initSpellConfig()
+{
+ if (!kspellconfigOptions)
+ kspellconfigOptions = new KSpellConfig(0 , "SpellingSettings", 0, false );
+}
+
+void TopLevel::search_again()
+{
+ eframe->repeatSearch();
+ statusbar_slot();
+}
+
+void TopLevel::setFileCaption()
+{
+ if (m_url.isEmpty())
+ {
+ m_caption = i18n("[New Document]");
+ }
+ else
+ {
+ if (m_url.isLocalFile())
+ {
+ if (QDir::currentDirPath() == m_url.directory())
+ m_caption = m_url.fileName();
+ else
+ m_caption = m_url.path();
+ }
+ else
+ {
+ KURL url(m_url);
+ url.setQuery(QString::null);
+ m_caption = url.prettyURL();
+ }
+ QString encoding = m_url.fileEncoding();
+ if (!encoding.isEmpty())
+ m_caption += QString(" (%1)").arg(encoding);
+ }
+ setCaption(m_caption, eframe->isModified());
+}
+
+
+void TopLevel::gotoLine() {
+ eframe->doGotoLine();
+}
+
+void TopLevel::statusbar_slot(){
+
+ QString linenumber;
+
+ linenumber = i18n("Line: %1 Col: %2")
+ .arg(eframe->currentLine() + 1)
+ .arg(eframe->currentColumn() +1);
+
+ statusBar()->changeItem(linenumber,ID_LINE_COLUMN);
+}
+
+void TopLevel::print()
+{
+ bool aborted = false;
+ QString headerLeft = i18n("Date: %1").arg(KGlobal::locale()->formatDate(QDate::currentDate(),true));
+ QString headerMid = i18n("File: %1").arg(m_caption);
+ QString headerRight;
+
+ QFont printFont = eframe->font();
+ QFont headerFont(printFont);
+ headerFont.setBold(true);
+
+ QFontMetrics printFontMetrics(printFont);
+ QFontMetrics headerFontMetrics(headerFont);
+
+ KPrinter *printer = new KPrinter;
+ if(printer->setup(this, i18n("Print %1").arg(m_caption))) {
+ // set up KPrinter
+ printer->setFullPage(false);
+ printer->setCreator("KEdit");
+ if ( !m_caption.isEmpty() )
+ printer->setDocName(m_caption);
+
+ QPainter *p = new QPainter;
+ p->begin( printer );
+
+ QPaintDeviceMetrics metrics( printer );
+
+ int dy = 0;
+
+ p->setFont(headerFont);
+ int w = printFontMetrics.width("M");
+ p->setTabStops(8*w);
+
+ int page = 1;
+ int lineCount = 0;
+ int maxLineCount = eframe->numLines();
+
+
+ while(true) {
+ headerRight = QString("#%1").arg(page);
+ dy = headerFontMetrics.lineSpacing();
+ QRect body( 0, dy*2, metrics.width(), metrics.height()-dy*2);
+
+ p->drawText(0, 0, metrics.width(), dy, Qt::AlignLeft, headerLeft);
+ p->drawText(0, 0, metrics.width(), dy, Qt::AlignHCenter, headerMid);
+ p->drawText(0, 0, metrics.width(), dy, Qt::AlignRight, headerRight);
+
+ QPen pen;
+ pen.setWidth(3);
+ p->setPen(pen);
+
+ p->drawLine(0, dy+dy/2, metrics.width(), dy+dy/2);
+
+ int y = dy*2;
+ while(lineCount < maxLineCount) {
+ QString text = eframe->textLine(lineCount);
+ if( text.isEmpty() )
+ text = " "; // don't ignore empty lines
+ QRect r = p->boundingRect(0, y, body.width(), body.height(),
+ QPainter::ExpandTabs | QPainter::WordBreak, text);
+
+ dy = r.height();
+
+ if (y+dy > metrics.height()) break;
+
+ p->drawText(0, y, metrics.width(), metrics.height() - y,
+ QPainter::ExpandTabs | QPainter::WordBreak, text);
+
+ y += dy;
+ lineCount++;
+ }
+ if (lineCount >= maxLineCount)
+ break;
+
+ printer->newPage();
+ page++;
+ }
+
+ p->end();
+ delete p;
+ }
+ delete printer;
+ if (aborted)
+ setGeneralStatusField(i18n("Printing aborted."));
+ else
+ setGeneralStatusField(i18n("Printing complete."));
+}
+
+
+
+void TopLevel::setSensitivity (){
+
+}
+
+
+int TopLevel::saveURL( const KURL& _url )
+{
+ if ( !_url.isValid() )
+ {
+ KMessageBox::sorry(this, i18n("Malformed URL"));
+ return KEDIT_RETRY;
+ }
+
+ // Just a usual file ?
+ if ( _url.isLocalFile() )
+ {
+ return saveFile( _url.path(), true, _url.fileEncoding() );
+ }
+
+ KTempFile tmpFile;
+ tmpFile.setAutoDelete(true);
+ eframe->setModified( true );
+ saveFile( tmpFile.name(), false, _url.fileEncoding() );
+
+ if (KIO::NetAccess::upload( tmpFile.name(), _url, this ) == false)
+ {
+ KMessageBox::error(this, "Could not save remote file");
+ return KEDIT_RETRY;
+ }
+
+ return true;
+}
+
+
+int TopLevel::openFile( const QString& _filename, int _mode, const QString &encoding, bool _undoAction )
+{
+ QFileInfo info(_filename);
+
+ if(info.isDir())
+ {
+ KMessageBox::sorry(this, i18n("You have specified a folder"));
+ return KEDIT_RETRY;
+ }
+
+ if(!info.exists() || !info.isFile())
+ {
+ if ((_mode & OPEN_NEW) != 0)
+ return KEDIT_OK;
+ KMessageBox::sorry(this, i18n("The specified file does not exist"));
+ return KEDIT_RETRY;
+ }
+
+ QFile file(_filename);
+
+ if(!file.open(IO_ReadOnly))
+ {
+ KMessageBox::sorry(this, i18n("You do not have read permission to this file."));
+ return KEDIT_RETRY;
+ }
+
+ QTextStream stream(&file);
+ QTextCodec *codec;
+ if (!encoding.isEmpty())
+ codec = QTextCodec::codecForName(encoding.latin1());
+ else
+ codec = QTextCodec::codecForLocale();
+ stream.setCodec(codec);
+
+ if ((_mode & OPEN_INSERT) == 0)
+ {
+ eframe->clear();
+ }
+ if ( ! _undoAction )
+ eframe->setUndoRedoEnabled(false);
+
+ eframe->insertText( &stream );
+ eframe->setModified(false);
+
+ if ( !_undoAction)
+ eframe->setUndoRedoEnabled(true);
+
+ return KEDIT_OK;
+
+}
+
+
+int TopLevel::saveFile( const QString& _filename, bool backup, const QString& encoding )
+{
+ QFileInfo info(_filename);
+ bool bSoftWrap = (Prefs::wrapMode() == Prefs::EnumWrapMode::SoftWrap);
+
+ if(info.isDir())
+ {
+ KMessageBox::sorry(this, i18n("You have specified a folder"));
+ return KEDIT_RETRY;
+ }
+
+ if (backup && Prefs::backupCopies() && QFile::exists(_filename))
+ {
+ if (!KSaveFile::backupFile(_filename))
+ {
+ KMessageBox::sorry(this, i18n("Unable to make a backup of the original file."));
+ }
+ }
+
+ // WABA: We don't use KSaveFile because it doesn't preserve hard/soft
+ // links when saving. Most applications don't care about this, but an
+ // editor is supposed to preserve such things.
+
+ QFile file(_filename);
+ if(!file.open(IO_WriteOnly))
+ {
+ KMessageBox::sorry(this, i18n("Unable to write to file."));
+ return KEDIT_RETRY;
+ }
+
+ QTextStream textStream(&file);
+ QTextCodec *codec;
+ if (!encoding.isEmpty())
+ codec = QTextCodec::codecForName(encoding.latin1());
+ else
+ codec = QTextCodec::codecForLocale();
+ textStream.setCodec(codec);
+
+ eframe->saveText( &textStream, bSoftWrap );
+ file.close();
+
+ if(file.status())
+ {
+ KMessageBox::sorry(this, i18n("Could not save file."));
+ return KEDIT_RETRY;
+ }
+ eframe->setModified(false);
+ return KEDIT_OK;
+}
+
+
+void TopLevel::openURL( const KURL& _url, int _mode )
+{
+ if ( !_url.isValid() )
+ {
+ QString string;
+ string = i18n( "Malformed URL\n%1").arg(_url.url());
+
+ KMessageBox::sorry(this, string);
+ return;
+ }
+
+ QString target;
+ int result = KEDIT_OK;
+ if (KIO::NetAccess::download(_url, target, this))
+ {
+ result = openFile(target, _mode, _url.fileEncoding());
+ }
+ else
+ {
+ if ((_mode & OPEN_NEW) == 0)
+ {
+ KMessageBox::error(this, i18n("Cannot download file."));
+ return;
+ }
+ }
+ if (result == KEDIT_OK)
+ {
+ m_url = _url;
+ setFileCaption();
+ recent->addURL(_url);
+ eframe->setModified(false);
+ setGeneralStatusField(i18n("Done"));
+ }
+}
+
+void TopLevel::urlDrop_slot(QDropEvent* e) {
+
+ dropEvent(e);
+}
+
+void TopLevel::dragEnterEvent(QDragEnterEvent* e)
+{
+ e->accept(KURLDrag::canDecode(e));
+}
+
+void TopLevel::dropEvent(QDropEvent* e)
+{
+
+ KURL::List list;
+
+ // This should never happen, but anyway...
+ if(!KURLDrag::decode(e, list))
+ return;
+
+ bool first = true;
+ for ( KURL::List::ConstIterator it = list.begin(); it != list.end(); ++it)
+ {
+ // Load the first file in this window
+ if ( first && !eframe->isModified() )
+ {
+ openURL( *it, OPEN_READWRITE );
+ }
+ else
+ {
+ setGeneralStatusField(i18n("New Window"));
+ TopLevel *t = new TopLevel ();
+ t->show ();
+ setGeneralStatusField(i18n("New Window Created"));
+ t->openURL( *it, OPEN_READWRITE );
+ setGeneralStatusField(i18n("Load Command Done"));
+ }
+ first = false;
+ }
+}
+
+void TopLevel::timer_slot(){
+
+ statusBar()->changeItem("",ID_GENERAL);
+
+}
+
+
+void TopLevel::set_colors()
+{
+ QPalette mypalette = (eframe->palette()).copy();
+
+ QColorGroup ncgrp( mypalette.active() );
+
+ if (Prefs::customColor())
+ {
+ ncgrp.setColor(QColorGroup::Text, Prefs::textColor());
+ ncgrp.setColor(QColorGroup::Base, Prefs::backgroundColor());
+ }
+ else
+ {
+ ncgrp.setColor(QColorGroup::Text, KGlobalSettings::textColor());
+ ncgrp.setColor(QColorGroup::Base, KGlobalSettings::baseColor());
+ }
+
+ mypalette.setActive(ncgrp);
+ mypalette.setDisabled(ncgrp);
+ mypalette.setInactive(ncgrp);
+
+ eframe->setPalette(mypalette);
+}
+
+
+void TopLevel::updateSettings( void )
+{
+ readSettings();
+ setupEditWidget();
+}
+
+void TopLevel::readSettings( void )
+{
+ recent->loadEntries( kapp->config() );
+}
+
+
+void TopLevel::toggle_overwrite(){
+
+ if(eframe->isOverwriteMode()){
+ statusBar()->changeItem("OVR",ID_INS_OVR);
+ }
+ else{
+ statusBar()->changeItem("INS",ID_INS_OVR);
+ }
+
+}
+
+static const char description[] = I18N_NOOP("KDE text editor");
+
+static const KCmdLineOptions options[] =
+{
+ { "encoding <encoding>", I18N_NOOP("Encoding to use for the following documents"), 0 },
+ { "+file", I18N_NOOP("File or URL to open"), 0 },
+ KCmdLineLastOption
+};
+
+extern "C" KDE_EXPORT int kdemain (int argc, char **argv)
+{
+ bool have_top_window = false;
+
+ KAboutData aboutData( "kedit", I18N_NOOP("KEdit"),
+ KEDITVERSION, description, KAboutData::License_GPL,
+ "(c) 1997-2000, Bernd Johannes Wuebben");
+ aboutData.addAuthor("Bernd Johannes Wuebben",0, "wuebben@kde.org");
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication a;
+ //CT KIO::Job::initStatic();
+ if ( a.isRestored() )
+ {
+ int n = 1;
+ while (TopLevel::canBeRestored(n))
+ {
+ TopLevel *tl = new TopLevel();
+ tl->restore(n);
+ n++;
+ have_top_window = true;
+ }
+ }
+ else
+ {
+ have_top_window = false;
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ const QString encoding = args->getOption("encoding");
+ const bool doEncoding = args->isSet("encoding") &&
+ QTextCodec::codecForName(encoding.latin1());
+
+ for(int i = 0; i < args->count(); i++)
+ {
+ TopLevel *t = new TopLevel;
+ t->show ();
+ have_top_window = true;
+
+ KURL url = args->url(i);
+
+ if(doEncoding)
+ url.setFileEncoding(encoding);
+
+ t->openURL( url, default_open | TopLevel::OPEN_NEW );
+ }
+ args->clear();
+ }
+
+ if(!have_top_window)
+ {
+ TopLevel *t = new TopLevel ();
+ t->show ();
+ }
+
+ return a.exec ();
+}
+
+SettingsDialog::SettingsDialog(QWidget *parent, const char *name,KConfigSkeleton *config, KSpellConfig *_spellConfig)
+ : KConfigDialog(parent, name, config),
+ spellConfig(_spellConfig), spellConfigChanged(false)
+{
+ // Font
+ QWidget *font = new QWidget(0, "FontSetting");
+ QVBoxLayout *topLayout = new QVBoxLayout(font, 0, KDialog::spacingHint());
+ KFontChooser *mFontChooser = new KFontChooser(font, "kcfg_Font", false, QStringList(), false, 6);
+ topLayout->addWidget(mFontChooser);
+ addPage(font, i18n("Font"), "fonts", i18n("Editor Font"));
+
+ // Color
+ Color *color = new Color(0, "ColorSettings");
+ addPage(color, i18n("Color"), "colorize", i18n("Text Color in Editor Area"));
+
+ // Spelling
+ addPage(spellConfig, i18n("Spelling"),
+ "spellcheck", i18n("Spelling Checker"));
+ connect(spellConfig, SIGNAL(configChanged()), this, SLOT(slotSpellConfigChanged()));
+
+ // Miscellaneous
+ Misc *miscOptions = new Misc(0, "MiscSettings");
+ addPage(miscOptions, i18n("Miscellaneous"), "misc");
+}
+
+void SettingsDialog::updateSettings()
+{
+ spellConfig->writeGlobalSettings();
+}
+
+void SettingsDialog::updateWidgets()
+{
+ spellConfig->readGlobalSettings();
+ spellConfigChanged = false;
+}
+
+void SettingsDialog::updateWidgetsDefault()
+{
+}
+
+bool SettingsDialog::hasChanged()
+{
+ return spellConfigChanged;
+}
+
+bool SettingsDialog::isDefault()
+{
+ return true;
+}
+
+void SettingsDialog::slotSpellConfigChanged()
+{
+ spellConfigChanged = true;
+ updateButtons();
+}
+
+#include "kedit.moc"
+