Kate
insertfileplugin.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "insertfileplugin.h"
00020 #include "insertfileplugin.moc"
00021
00022 #include <ktexteditor/document.h>
00023 #include <ktexteditor/viewcursorinterface.h>
00024 #include <ktexteditor/editinterface.h>
00025
00026 #include <assert.h>
00027 #include <kio/job.h>
00028 #include <kaction.h>
00029 #include <kfiledialog.h>
00030 #include <kgenericfactory.h>
00031 #include <klocale.h>
00032 #include <kmessagebox.h>
00033 #include <kpushbutton.h>
00034 #include <ktempfile.h>
00035 #include <kurl.h>
00036
00037 #include <qfile.h>
00038 #include <qtextstream.h>
00039
00040 K_EXPORT_COMPONENT_FACTORY( ktexteditor_insertfile, KGenericFactory<InsertFilePlugin>( "ktexteditor_insertfile" ) )
00041
00042
00043
00044 InsertFilePlugin::InsertFilePlugin( QObject *parent, const char* name, const QStringList& )
00045 : KTextEditor::Plugin ( (KTextEditor::Document*) parent, name )
00046 {
00047 }
00048
00049 InsertFilePlugin::~InsertFilePlugin()
00050 {
00051 }
00052
00053 void InsertFilePlugin::addView(KTextEditor::View *view)
00054 {
00055 InsertFilePluginView *nview = new InsertFilePluginView (view, "Insert File Plugin");
00056 m_views.append (nview);
00057 }
00058
00059 void InsertFilePlugin::removeView(KTextEditor::View *view)
00060 {
00061 for (uint z=0; z < m_views.count(); z++)
00062 if (m_views.at(z)->parentClient() == view)
00063 {
00064 InsertFilePluginView *nview = m_views.at(z);
00065 m_views.remove (nview);
00066 delete nview;
00067 }
00068 }
00069
00070
00071
00072 InsertFilePluginView::InsertFilePluginView( KTextEditor::View *view, const char *name )
00073 : QObject( view, name ),
00074 KXMLGUIClient( view )
00075 {
00076 view->insertChildClient( this );
00077 setInstance( KGenericFactory<InsertFilePlugin>::instance() );
00078 _job = 0;
00079 (void) new KAction( i18n("Insert File..."), 0, this, SLOT(slotInsertFile()), actionCollection(), "tools_insert_file" );
00080 setXMLFile( "ktexteditor_insertfileui.rc" );
00081 }
00082
00083 void InsertFilePluginView::slotInsertFile()
00084 {
00085 KFileDialog dlg("::insertfile", "", (QWidget*)parent(), "filedialog", true);
00086 dlg.setOperationMode( KFileDialog::Opening );
00087
00088 dlg.setCaption(i18n("Choose File to Insert"));
00089 dlg.okButton()->setText(i18n("&Insert"));
00090 dlg.setMode( KFile::File );
00091 dlg.exec();
00092
00093 _file = dlg.selectedURL().url();
00094 if ( _file.isEmpty() ) return;
00095
00096 if ( _file.isLocalFile() ) {
00097 _tmpfile = _file.path();
00098 insertFile();
00099 }
00100 else {
00101 KTempFile tempFile( QString::null );
00102 _tmpfile = tempFile.name();
00103
00104 KURL destURL;
00105 destURL.setPath( _tmpfile );
00106 _job = KIO::file_copy( _file, destURL, 0600, true, false, true );
00107 connect( _job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotFinished ( KIO::Job * ) ) );
00108 }
00109 }
00110
00111 void InsertFilePluginView::slotFinished( KIO::Job *job )
00112 {
00113 assert( job == _job );
00114 _job = 0;
00115 if ( job->error() )
00116 KMessageBox::error( (QWidget*)parent(), i18n("Failed to load file:\n\n") + job->errorString(), i18n("Insert File Error") );
00117 else
00118 insertFile();
00119 }
00120
00121 void InsertFilePluginView::insertFile()
00122 {
00123 QString error;
00124 if ( _tmpfile.isEmpty() )
00125 return;
00126
00127 QFileInfo fi;
00128 fi.setFile( _tmpfile );
00129 if (!fi.exists() || !fi.isReadable())
00130 error = i18n("<p>The file <strong>%1</strong> does not exist or is not readable, aborting.").arg(_file.fileName());
00131
00132 QFile f( _tmpfile );
00133 if ( !f.open(IO_ReadOnly) )
00134 error = i18n("<p>Unable to open file <strong>%1</strong>, aborting.").arg(_file.fileName());
00135
00136 if ( ! error.isEmpty() ) {
00137 KMessageBox::sorry( (QWidget*)parent(), error, i18n("Insert File Error") );
00138 return;
00139 }
00140
00141
00142 QTextStream stream(&f);
00143 QString str, tmp;
00144 uint numlines = 0;
00145 uint len = 0;
00146 while (!stream.eof()) {
00147 if ( numlines )
00148 str += "\n";
00149 tmp = stream.readLine();
00150 str += tmp;
00151 len = tmp.length();
00152 numlines++;
00153 }
00154 f.close();
00155
00156 if ( str.isEmpty() )
00157 error = i18n("<p>File <strong>%1</strong> had no contents.").arg(_file.fileName());
00158 if ( ! error.isEmpty() ) {
00159 KMessageBox::sorry( (QWidget*)parent(), error, i18n("Insert File Error") );
00160 return;
00161 }
00162
00163
00164 KTextEditor::EditInterface *ei;
00165 KTextEditor::ViewCursorInterface *ci;
00166 KTextEditor::View *v = (KTextEditor::View*)parent();
00167 ei = KTextEditor::editInterface( v->document() );
00168 ci = KTextEditor::viewCursorInterface( v );
00169 uint line, col;
00170 ci->cursorPositionReal( &line, &col );
00171 ei->insertText( line, col, str );
00172
00173
00174 ci->setCursorPositionReal( line + numlines - 1, numlines > 1 ? len : col + len );
00175
00176
00177 _file = KURL ();
00178 _tmpfile.truncate( 0 );
00179 v = 0;
00180 ei = 0;
00181 ci = 0;
00182 }
00183
00184
00185