File indexing completed on 2024-04-14 14:32:07

0001 /***************************************************************************
0002                           csession.cpp  -  basis of multi-world support
0003                               -------------------
0004     begin                : Pi nov 15 2002
0005     copyright            : (C) 2002 by Tomas Mecir
0006     email                : kmuddy@kmuddy.com
0007  ***************************************************************************/
0008 
0009 /***************************************************************************
0010  *                                                                         *
0011  *   This program is free software; you can redistribute it and/or modify  *
0012  *   it under the terms of the GNU General Public License as published by  *
0013  *   the Free Software Foundation; either version 2 of the License, or     *
0014  *   (at your option) any later version.                                   *
0015  *                                                                         *
0016  ***************************************************************************/
0017 
0018 #include "csession.h"
0019 
0020 #include "cansiparser.h"
0021 #include "ccmdparser.h"
0022 #include "ccmdprocessor.h"
0023 #include "ccmdqueues.h"
0024 #include "cconnection.h"
0025 #include "cgaugebar.h"
0026 #include "cglobalsettings.h"
0027 #include "cinputline.h"
0028 #include "cmultiinputline.h"
0029 #include "coutput.h"
0030 #include "cprompt.h"
0031 #include "cscriptapi.h"
0032 #include "cscripteval.h"
0033 #include "cstatus.h"
0034 #include "ctelnet.h"
0035 #include "ctextprocessor.h"
0036 #include "ctranscript.h"
0037 
0038 #ifdef HAVE_MXP
0039 #include "cmxpmanager.h"
0040 #endif  //HAVE_MXP
0041 
0042 // for variable change reporting
0043 #include "clistmanager.h"
0044 #include "cgaugelist.h"
0045 #include "cstatusvarlist.h"
0046 
0047 #include <KLocalizedString>
0048 
0049 #include <QHBoxLayout>
0050 #include <QPushButton>
0051 #include <QStatusBar>
0052 #include <QToolTip>
0053 #include <QVBoxLayout>
0054 
0055 cSession::cSession (int sess, QWidget *parent) : QWidget (parent), cActionBase ("session", sess)
0056 {
0057   _flashing = false;
0058   defaultName = true;
0059 
0060   //create objects
0061   _telnet = new cTelnet (sess);
0062 #ifdef HAVE_MXP
0063   _mxpmanager = new cMXPManager (sess);
0064 #endif
0065   _ansiparser = new cANSIParser (sess);
0066   _parser = new cCmdParser (sess);
0067   _cmdproc = new cCmdProcessor (sess);
0068   _cmdqueues = new cCmdQueues (sess);
0069   _textproc = new cTextProcessor (sess);
0070   _connection = new cConnection (sess);
0071 
0072   _output = new cOutput (sess, this);
0073   
0074   QWidget *promptinput = new QWidget (this);
0075   _prompt = new cPrompt (sess, promptinput);
0076   
0077   _inputline = new cInputLine (sess, "inputline", promptinput);
0078   _inputline->initialize ();
0079   
0080   _multiinputline = new cMultiInputLine (sess, promptinput);
0081   _multiinputline->hide ();
0082   _multiinputline->setToolTip (i18n ("Ctrl+Enter adds new line, unless changed in settings"));
0083   
0084   QPushButton *switchlinebutton = new QPushButton (promptinput);
0085   switchlinebutton->setIcon (QIcon::fromTheme ("format-justify-center"));
0086   switchlinebutton->setToolTip (i18n ("Switches between standard and multi-line input line."));
0087   
0088   //the button should take as few space as possible
0089   switchlinebutton->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Minimum);
0090   switchlinebutton->setFocusPolicy (Qt::NoFocus);
0091  
0092   _auxinputline = new cInputLine (sess, "auxinputline", this);
0093   _auxinputline->initialize ();
0094   _auxinputline->hide ();
0095   
0096   _gaugebar = new cGaugeBar (sess, this);
0097   _gaugebar->hide();
0098 
0099   QStatusBar *statusbar = new QStatusBar (this);
0100   _status = new cStatus (sess, statusbar);
0101 
0102   QHBoxLayout *playout = new QHBoxLayout (promptinput);
0103   playout->setSpacing (1);
0104   playout->setMargin (1);
0105   playout->addWidget (_prompt);
0106   playout->addWidget (_inputline);
0107   playout->addWidget (_multiinputline);
0108   playout->addWidget (switchlinebutton);
0109 
0110   QVBoxLayout *layout = new QVBoxLayout (this);
0111   layout->setSpacing (1);
0112   layout->setMargin (1);
0113   layout->addWidget (_output);
0114   layout->addWidget (promptinput);
0115   layout->addWidget (_auxinputline);
0116   layout->addWidget (_gaugebar);
0117   layout->addWidget (statusbar);
0118 
0119   _transcript = new cTranscript (sess);
0120   _scripteval = new cScriptEval (sess);
0121   _scriptapi = new cScriptAPI (sess);
0122   _scripteval->addObject ("kmuddy", _scriptapi);
0123 
0124   //the button switches between standard input and multi-line input
0125   connect (switchlinebutton, &QPushButton::clicked, this, &cSession::switchInputLines);
0126 
0127   addGlobalEventHandler ("global-settings-changed", 50, PT_NOTHING);
0128   
0129   addEventHandler ("var-changed", 50, PT_STRING);
0130 }
0131 
0132 cSession::~cSession ()
0133 {
0134   removeGlobalEventHandler ("global-settings-changed");
0135   
0136   removeEventHandler ("var-changed");
0137 
0138   delete _scripteval;
0139   //transcript must be deleted before the console!
0140   delete _transcript;
0141 
0142   delete _status;  //this also destroys the statusbar
0143   delete _multiinputline;
0144   delete _auxinputline;
0145   delete _inputline;
0146   delete _output;
0147   delete _prompt;
0148 
0149   delete _connection;
0150   delete _textproc;
0151   delete _cmdqueues;
0152   delete _cmdproc;
0153   delete _parser;
0154   delete _ansiparser;
0155 #ifdef HAVE_MXP
0156   delete _mxpmanager;
0157 #endif
0158   delete _telnet;
0159 }
0160 
0161 QString cSession::actionNothingHandler (QString action, int)
0162 {
0163   if (action == "name")
0164     return name();
0165 
0166   return QString();
0167 }
0168 
0169 void cSession::eventNothingHandler (QString event, int)
0170 {
0171   if (event == "global-settings-changed") {
0172     cGlobalSettings *gs = cGlobalSettings::self();
0173     setAuxInput (gs->getBool ("aux-input"));
0174   }
0175 }
0176 
0177 void cSession::eventStringHandler (QString event, int /*session*/,
0178     QString &par1, const QString &)
0179 {
0180   // pass variable changes to lists that need them
0181   // this is a bit of a hack, necessary because lists cannot react on events
0182   // ultimately the affected lists (gauges, statusvars) should move
0183   // to plugins, and the plugin should handle these events
0184 
0185   if (event == "var-changed") {
0186     cListManager *lm = cListManager::self();
0187     cGaugeList *gl = (cGaugeList *) lm->getList (sess(), "gauges");
0188     cStatusVarList *svl = (cStatusVarList *) lm->getList (sess(), "statusvars");
0189 
0190     if (gl) gl->variableChanged (par1);
0191     if (svl) svl->variableChanged (par1);
0192   }
0193 }
0194 
0195 void cSession::setName (const QString &name, bool defName)
0196 {
0197   //don't overwrite non-default name with a default one
0198   if (defName && (!defaultName))
0199     return;
0200   
0201   _name = name;
0202   defaultName = defName;
0203 }
0204 
0205 void cSession::setAuxInput (bool val)
0206 {
0207   val ? _auxinputline->show () : _auxinputline->hide ();
0208 }
0209 
0210 void cSession::switchInputLines ()
0211 {
0212   if (_inputline->isVisible())
0213   {
0214     _inputline->hide();
0215     _multiinputline->show();
0216     _multiinputline->setFocus ();
0217   }
0218   else
0219   {
0220     _multiinputline->hide();
0221     _inputline->show();
0222     _inputline->setFocus ();
0223   }
0224 }
0225 
0226 #include "moc_csession.cpp"