You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeadmin/kpackage/kpTerm.cpp

235 lines
5.4 KiB

/*
** Copyright (C) 1999,2000 Toivo Pedaste <toivo@ucs.uwa.edu.au>
**
*/
/*
** 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 in a file called COPYING; if not, write to
** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA 02110-1301, USA.
*/
/*
** Bug reports and questions can be sent to kde-devel@kde.org
*/
#include "../config.h"
#include <tqvbox.h>
#include <kglobalsettings.h>
#include <kdebug.h>
#include <kpTerm.h>
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
kpTerm::kpTerm(kpPty *pt, TQWidget * parent, const char * name ) :
TQTextEdit(parent,name)
{
pty = pt;
setFont(KGlobalSettings::fixedFont());
// setMinimumWidth(fontMetrics().maxWidth()*80 +
// tqminimumSizeHint().width());
setWordWrap(NoWrap);
setReadOnly(TRUE);
}
void kpTerm::doConnect()
{
connect(pty, TQT_SIGNAL(textIn(const TQString &, bool)), this,
TQT_SLOT(textIn(const TQString &, bool)));
connect(pty,TQT_SIGNAL(result(TQStringList &, int)),
this,TQT_SLOT(slotResult(TQStringList &, int)));
connect(this, TQT_SIGNAL(keyOut(char)), pty,
TQT_SLOT(keyOut(char)));
}
void kpTerm::doUnconnect()
{
disconnect(pty, TQT_SIGNAL(textIn(const TQString &, bool)), this,
TQT_SLOT(textIn(const TQString &, bool)));
disconnect(pty,TQT_SIGNAL(result(TQStringList &, int)),
this,TQT_SLOT(slotResult(TQStringList &, int)));
disconnect(this, TQT_SIGNAL(keyOut(char)), pty,
TQT_SLOT(keyOut(char)));
}
bool kpTerm::run(const TQString &cmd, TQStringList &r)
{
setReadOnly(FALSE);
setFocus();
if (pty->startSession(TRUE)) {
doConnect();
r = pty->run(cmd,FALSE);
return TRUE;
} else {
return FALSE;
}
}
void kpTerm::cancel() {
emit keyOut('\03');
}
void kpTerm::done()
{
clear();
doUnconnect();
setReadOnly(TRUE);
clearFocus();
}
void kpTerm::keyPressEvent ( TQKeyEvent * e )
{
// kdDebug() << "K=" << e->ascii() << "," << e->ascii() << "\n";
if (e->ascii()) {
emit keyOut(e->ascii());
} else {
TQTextEdit::keyPressEvent (e);
}
setCursorPosition(9999,9999);
}
void kpTerm::textIn(const TQString &stext, bool bNewLine)
{
TQRegExp chrs("[\\010\\012\\015]");
TQString del = "\010";
// kdDebug() << "Tin=[" << stext << "]\n";
if (stext.find(chrs) < 0) {
insert( stext );
} else {
int p;
int op = 0;
while ((p = stext.find(chrs,op)) >= 0) {
if (p != op) {
insert( stext.mid(op, p-op));
}
if (stext[p] == '\b') {
doKeyboardAction(ActionBackspace);
} else if (stext[p] == '\r') {
moveCursor(MoveLineStart, false);
} else if (stext[p] == '\n') {
moveCursor(MoveEnd, false);
doKeyboardAction(ActionReturn);
}
op = p + 1;
}
if ((signed int)stext.length() > op)
insert( stext.right(stext.length()-op));
}
if (bNewLine) {
moveCursor(MoveEnd, false);
doKeyboardAction(ActionReturn);
}
moveCursor(MoveEnd, false);
}
void kpTerm::insert ( const TQString & str, bool) {
int x,y;
getCursorPosition(&y,&x);
if (str.length() > 0) {
// kdDebug() << "ins:" << y << "," << x << str <<":" << str.length() << "\n";
if (x == 0 && str != "\n") {
doKeyboardAction(ActionKill);
getCursorPosition(&y,&x);
// kdDebug() << "k=" << y << "," << x <<"\n";
}
TQTextEdit::insert(str,(bool)FALSE);
}
}
void kpTerm::slotResult(TQStringList &rlist, int ret)
{
emit result(rlist, ret);
doUnconnect();
}
//////////////////////////////////////////////////////////////////////////////
//
// Dialog window for password prompt
//
//////////////////////////////////////////////////////////////////////////////
kpRun::kpRun( TQWidget *parent)
: KDialogBase(parent, "kpRun", true, TQString(),
Cancel, Cancel, true )
{
TQVBox *page = makeVBoxMainWidget();
title = new TQLabel("", page);
TQFont f( KGlobalSettings::generalFont());
f.setBold(true);
f.setPointSize(f.pointSize()+4);
title->setFont(f);
term = new kpTerm(kpty,page);
resize(600, 300);
connect(term,TQT_SIGNAL(result(TQStringList &, int)),
this,TQT_SLOT(slotResult(TQStringList &, int)));
hide();
}
bool kpRun::run(TQString cmd, TQString msg)
{
TQStringList r;
title->setText(msg);
if (!cmd.isEmpty()) {
return term->run(cmd, r);
} else {
term->doConnect();
term->setReadOnly(FALSE);
term->setFocus();
return true;
}
}
void kpRun::addText(const TQStringList &ret)
{
int last = ret.count()-1;
int i = 0;
for ( TQStringList::ConstIterator it = ret.begin(); it != ret.end(); ++it, ++i ) {
// kdDebug() << "ks=" << *it << "\n";
term->textIn(*it, (i != last));
}
}
void kpRun::slotResult(TQStringList &, int ret)
{
if (ret == 0 || ret == 666) {
term->clear();
if (ret == 0)
accept();
else
reject();
}
}
void kpRun::slotCancel()
{
term->clear();
term->cancel();
accept();
}
#include "kpTerm.moc"