00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
#include <stdlib.h>
00020
00021
#include <qapplication.h>
00022
#include <qprocess.h>
00023
#include <qtimer.h>
00024
#include <qvariant.h>
00025
00026
#include <kdebug.h>
00027
#include <kwin.h>
00028
#include <kwinmodule.h>
00029
#include <kprocess.h>
00030
00031
#include "document.h"
00032
#include "view.h"
00033
#include "kneditfactory.h"
00034
00035 namespace KNEdit
00036 {
00037
00038
00039
00040 static const char*
hlModes[] = {
"Plain",
"Ada",
"Awk",
"C++",
"C",
"CSS",
"Csh",
00041
"Fortran",
"Java",
"JavaScript",
"LaTeX",
"Lex",
"Makefile",
00042
"Matlab",
"NEdit Macro",
"Pascal",
"Perl",
"PostScript",
00043
"Python",
"Regex",
"SGML HTML",
"SQL",
"Sh Ksh Bash",
"Tcl",
00044
"VHDL",
"Verilog",
"XML",
"X Resources",
"Yacc", 0 };
00045 static const uint
hlMCount = 29;
00046
00047 Document::Document(
bool bReadOnly,
bool bSingleView,
QWidget *parentWidget,
const char *widgetName,
00048
QObject *parent,
const char *name) : KTextEditor::
Document (parent, name)
00049 {
00050
m_isReady =
false;
00051
activeView = 0;
00052
m_wid = 0;
00053
m_singleView = bSingleView;
00054
m_readOnly = bReadOnly;
00055
m_kwm =
new KWinModule(
this );
00056
m_timer =
new QTimer(
this,
"NEdit Timer" );
00057 connect(
m_timer, SIGNAL(timeout()),
this, SLOT(
checkForNEditServer()) );
00058
00059 setInstance( KNEditFactory::instance() );
00060
00061
00063
m_serverName = QString::fromLatin1(
"ktexteditor_nedit_" + QString::number(
documentNumber() ) );
00064
00065
00066
proc =
new QProcess( QString::fromLatin1(
"nedit" ),
this,
"nedit process" );
00067
proc->addArgument(
"-server" );
00068
proc->addArgument(
"-svrname" );
00069
proc->addArgument(
m_serverName );
00070 connect(
proc, SIGNAL(
processExited()),
this, SLOT(
processExited()));
00071 connect(
m_kwm, SIGNAL(windowAdded(WId)),
this, SLOT(
launchFinished(WId)) );
00072
if ( !
proc->launch(
QByteArray() ) ) {
00073
kdDebug() <<
"cannot start NEdit server" <<
endl;
00074
delete proc;
00075
proc = 0;
00076 }
00077
00078
if ( bSingleView ) {
00079
KTextEditor::View *v =
createView( parentWidget, widgetName );
00080 v->show();
00081 setWidget( v );
00082 }
00083 }
00084
00085 Document::~Document()
00086 {
00087
kdDebug() <<
"Document::~Document" <<
endl;
00088 }
00089
00090 KTextEditor::View *Document::createView(
QWidget *parent,
const char *name )
00091 {
00092
return new View(
this, parent, name );
00093 }
00094
00095 bool Document::openFile()
00096 {
00097
invokeNC( QString::null,
true );
00098
return true;
00099 }
00100
00101 bool Document::saveFile()
00102 {
00103
invokeNC(
"-do \"save()\"",
true);
00104
return true;
00105 }
00106
00107 void Document::addView(
KTextEditor::View *view)
00108 {
00109
_views.append( view );
00110
activeView = view;
00111 }
00112
00113 void Document::removeView(
KTextEditor::View *view)
00114 {
00115
if (
activeView == view)
00116
activeView = 0;
00117
00118
_views.removeRef( view );
00119 }
00120
00121 void Document::invokeNC(
const QString& command,
bool appendFilename )
00122 {
00123
QString cmd = command;
00124
if ( appendFilename )
00125
#if (KDE_VERSION > 305)
00126
cmd +=
" " + KProcess::quote(m_file);
00127
#else
00128
cmd +=
" " + KShellProcess::quote(m_file);
00129
#endif
00130
00131
if ( !
m_isReady ) {
00132
00133
m_commands += cmd;
00134 }
else {
00135
#if (KDE_VERSION > 305)
00136
cmd =
"nc -noask -svrname " + KProcess::quote(
serverName()) +
" " + cmd;
00137
#else
00138
cmd =
"nc -noask -svrname " + KShellProcess::quote(
serverName()) +
" " + cmd;
00139
#endif
00140
system( cmd );
00141 }
00142 }
00143
00144
00145 void Document::processCommands()
00146 {
00147
while ( !
m_commands.isEmpty() ) {
00148
invokeNC(
m_commands.first(),
false );
00149
m_commands.pop_front();
00150 }
00151 }
00152
00153
00154
00155 void Document::serverReady( WId wid )
00156 {
00157
if (
m_isReady )
00158
return;
00159
00160 disconnect(
m_kwm, SIGNAL(windowAdded(WId)),
this, SLOT(
launchFinished(WId)) );
00161
00162
m_wid = wid;
00163
m_isReady =
true;
00164
00165
if (
activeView ) {
00166
View* aView = (
View*)
activeView->qt_cast(
"KNEdit::View" );
00167
if ( aView ) {
00168 aView->
embedNEdit( wid );
00169 }
00170 }
00171
00172
processCommands();
00173 }
00174
00175
00176 void Document::launchFinished( WId wid )
00177 {
00178
if (
m_isReady ) {
00179
return;
00180 }
00181
00182
KWin::Info inf = KWin::info( wid );
00183
kdDebug() <<
"launchFinished: " << wid <<
" " << inf.
pid <<
" " << inf.
name <<
" || " << inf.
visibleName <<
endl;
00184
00185
if ( inf.
name.startsWith(
"-" +
m_serverName +
"-" ) ) {
00186
00187
serverReady( wid );
00188 }
else {
00189
00190
00191
m_widCache += wid;
00192
if ( !
m_timer->isActive() ) {
00193
m_timer->start( 200,
false );
00194 }
00195 }
00196 }
00197
00198
00199 void Document::checkForNEditServer()
00200 {
00201
QValueList<WId>::iterator it;
00202
for ( it =
m_widCache.begin(); it !=
m_widCache.end(); ++it ) {
00203
KWin::Info inf = KWin::info( *it );
00204
if ( inf.
name.startsWith(
"-" +
m_serverName +
"-" ) ) {
00205
00206
m_timer->stop();
00207 disconnect(
m_timer, SIGNAL(timeout()),
this, SLOT(
checkForNEditServer()) );
00208
00209
serverReady( *it );
00210
m_widCache.clear();
00211
return;
00212 }
00213 }
00214 }
00215
00216
00217 void Document::processExited()
00218 {
00219
00220
m_isReady =
false;
00221
delete proc;
00222
proc = 0;
00223
00225
00226
kdDebug() <<
"Process Exited" <<
endl;
00227
00228
00229 deleteLater();
00230 }
00231
00232 uint Document::hlMode ()
00233 {
00234
return 0;
00235 }
00236
00237 bool Document::setHlMode (uint mode)
00238 {
00239
if ( ( mode <
hlMCount ) ) {
00240
invokeNC(
"-do \"set_language_mode(\\\"" + QString::fromLatin1(
hlModes[mode]) +
"\\\")\"",
true);
00241 }
00242
return false;
00243 }
00244
00245 uint Document::hlModeCount ()
00246 {
00247
return hlMCount;
00248 }
00249
00250 QString Document::hlModeName (uint mode)
00251 {
00252
if ( mode <
hlMCount )
00253
return QString::fromLatin1(
hlModes[mode] );
00254
return QString::null;
00255 }
00256
00257 QString Document::hlModeSectionName (uint mode)
00258 {
00259
return QString::null;
00260 }
00261
00262 };
00263
00264
#include "document.moc"
00265