Source Code (Use browser search to find items of interest.)

Class Index

ksysv'KSVGui (./kdeadmin/ksysv/OldView.h:40)

class KSVGui : public QWidget
{
  Q_OBJECT

public:
  KSVGui(QWidget* parent = 0, const char* name = 0);
  ~KSVGui();

protected:
  friend class KSVTopLevel;
  QSplitter* panner;
  QWidget* content;
  KSVDragList* startRL[7];
  KSVDragList* stopRL[7];
  KSVDragList* scripts;
  QLabel* avaiL;
  QLabel* servL;
  QLabel* rlL[7];
  QLabel* stopL[7];
  QLabel* startL[7];
  QPopupMenu* normalPM;
  QPopupMenu* backPM;
  QPopupMenu* scriptPM;
  KSVTrash* trash;
  QMultiLineEdit* textDisplay;
  KIconLoader* kil;
  KSVConfig* conf;

  void initLList();
  void initLayout();
  void initScripts();
  void initRunlevels();
  void info2Widget( QFileInfo* info, int index );
  void writeToDisk( KSVDragData* _w, int _rl,int _index, bool _start );
  void clearRL( int _rl );
  void initAccel();
  void initPopupMenus();

public:
  inline KSVDragList* getOrigin();
  QString getLog() const;

public slots:
  void slotDropAction( KDNDDropZone* _zone );
  void slotWriteSysV();
  void reInit();
  void infoOnData(KSVDragData* data);
  void setDisplayScriptOutput(bool val);
  void slotScriptProperties( KSVDragData* data, QPoint _pos );

protected slots:
  void slotChanged();
  void startW();
  void stopW();
  void restartW();
  void slotOutput( KProcess* _p, char* _buffer, int _buflen );
  void slotErr( KProcess* _p, char* _buffer, int _buflen );
  void slotExitedProcess(KProcess* proc);
  void slotToggleOut();
  void slotScriptsNotRemovable();
  inline void slotDoubleClick( KSVDragData* _data, QPoint _pos );
  void slotExitDuringRestart(KProcess* proc);
  void calcSizeOnce();
  inline void setLog(QString _txt);
  inline void appendLog(QString txt);
  inline void fwdCannotGenerateNumber();
  void updatePanningFactor();
  inline void fwdSelected( const KSVDragData* );
  inline void fwdSelectedScripts( const KSVDragData* );
  inline void reSortRL();
  void pasteAppend();
  
signals:
  void sigChanged();
  void sigUpdateParent();
  void sigRun(QString _name);
  void sigStop();
  void sigNotRemovable();
  void progress(int val);
  void advance(int steps);
  void initProgress(int max, QString label );
  void endProgress();
  void cannotGenerateNumber();
  void selected( const KSVDragData* );
  void selectedScripts( const KSVDragData* );
};

ksysv'KSVGui::KSVGui() (./kdeadmin/ksysv/OldView.cpp:68)

KSVGui::KSVGui(QWidget* parent, const char* name)
  : QWidget(parent, name),
    normalPM(0),
    backPM(0),
    scriptPM(0),
    kil(KGlobal::iconLoader()),
    conf(KSVCore::config())
{
  // main content window
  panner = new QSplitter(QSplitter::Horizontal, this, "splitter");
  content = new KSVContent(panner);
  // check panner when content is resized
  connect(content, SIGNAL(sizeChanged()), this, SLOT(updatePanningFactor()));

  KDNDDropZone* dz = new KDNDDropZone(this, DndText);
  connect( dz, SIGNAL(dropAction(KDNDDropZone*)),
	   this, SLOT(slotDropAction(KDNDDropZone*)));

  trash = new KSVTrash(content, "Trash");

  initLList();
  initPopupMenus();
  initLayout();

  calcSizeOnce();
}


ksysv'KSVGui::~KSVGui() (./kdeadmin/ksysv/OldView.cpp:95)

KSVGui::~KSVGui() {
  delete normalPM;
  delete backPM;
  delete scriptPM;
}


ksysv'KSVGui::slotDropAction() (./kdeadmin/ksysv/OldView.cpp:101)

void KSVGui::slotDropAction( KDNDDropZone* ) {
  // nothing
}


ksysv'KSVGui::initLList() (./kdeadmin/ksysv/OldView.cpp:105)

void KSVGui::initLList() {

  avaiL = new QLabel( i18n("Available"), content );
  servL = new QLabel( i18n("&Services"), content );

  // provide quickhelp
  QWhatsThis::add(avaiL,
		  i18n("These are the <bold>available services</bold>\n" \
		       "To start a service, drag it to the <bold>\"Start\"</bold>" \
		       "section of a runlevel.\n\n" \
		       "To stop one, do the same for the <bold>\"Stop\"</bold> section."));
  QWhatsThis::add(servL,
		  i18n("These are the <bold>available services</bold>\n" \
		       "To start a service, drag it to the <bold>\"Start\"</bold>" \
		       "section of a runlevel.\n\n" \
		       "To stop one, do the same for the <bold>\"Stop\"</bold> section."));

  QFont bold_font = QFont(KGlobal::generalFont());
  bold_font.setBold(TRUE);

  servL->setFont(bold_font);

  scripts = new ROWidgetList(content, "Scripts");
  scripts->setDefaultIcon("exec");

  // setBuddy
  servL->setBuddy(scripts);

  // doubleclick
  connect( scripts, SIGNAL(sigDoubleClick(KSVDragData*, QPoint)),
	   this, SLOT(slotScriptProperties(KSVDragData*, QPoint)));

  // for cut & copy
  connect( scripts, SIGNAL(selected(const KSVDragData*)),
	   this, SLOT(fwdSelectedScripts(const KSVDragData*)));

  for(int i = 0; i<7; ++i) {

    // create QString for label
    QString _label;
    _label = i18n("Runlevel &%1").arg(i);
    // and for the name
    QString _name;
    _name = i18n("Runlevel %1").arg(i);

    rlL[i] = new QLabel(_label, content);
    startL[i] = new QLabel(i18n("Start"), content);

    rlL[i]->setFont(bold_font);

    // create the "START" list:
    startRL[i] = new KSVDragList(content, (_name + " START").data());
    startRL[i]->setDefaultIcon("start");

    stopL[i] = new QLabel(i18n("Stop"), content);

    // create the "STOP" list:
    stopRL[i] = new KSVDragList(content, (_name + " STOP").data());
    stopRL[i]->setDefaultIcon("stop");

    // set the buddy widget for the "Runlevel %i" label... => the corresponding runlevel
    rlL[i]->setBuddy(startRL[i]);

    // when a DragWidget is moved to another WidgetList, it gets removed & deleted correctly
    // if you connect the following signals and slots:

    connect( startRL[i], SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	     scripts, SLOT(slotRemoveAfterDrop(QString, KSVDragData*)));
    connect( stopRL[i], SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	     scripts, SLOT(slotRemoveAfterDrop(QString, KSVDragData*)));
    connect( trash, SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	     startRL[i], SLOT(slotRemoveAfterDrop(QString, KSVDragData*)));
    connect( trash, SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	     stopRL[i], SLOT(slotRemoveAfterDrop(QString, KSVDragData*)));

    // for cut & copy
    connect( startRL[i], SIGNAL(selected(const KSVDragData*)),
	     this, SLOT(fwdSelected(const KSVDragData*)));
    connect( stopRL[i], SIGNAL(selected(const KSVDragData*)),
	     this, SLOT(fwdSelected(const KSVDragData*)));

    // otherwise some canvases won't be redrawn correctly
    startRL[i]->show();
    stopRL[i]->show();
  }


  // add text-diplay widget
  textDisplay = new QMultiLineEdit(panner, "TextDisplayWidget");
  textDisplay->setReadOnly(TRUE);
  textDisplay->setAutoUpdate(TRUE);
  textDisplay->setFocusPolicy(NoFocus);

  for (int i = 0; i < 7; ++i) {
    for (int j = 0; j < 7; ++j) {
      connect( startRL[i], SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	       startRL[j], SLOT(slotRemoveAfterDrop(QString, KSVDragData*)) );
      connect( startRL[i], SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	       stopRL[j], SLOT(slotRemoveAfterDrop(QString, KSVDragData*)) );
      connect( stopRL[i], SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	       startRL[j], SLOT(slotRemoveAfterDrop(QString, KSVDragData*)) );
      connect( stopRL[i], SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	       stopRL[j], SLOT(slotRemoveAfterDrop(QString, KSVDragData*)) );

      // capturing mouse moves
      connect( startRL[i], SIGNAL(mouseMove(int,int)), startRL[j], SLOT(autoScroll(int,int)) );
      connect( startRL[i], SIGNAL(mouseMove(int,int)), stopRL[j], SLOT(autoScroll(int,int)) );
      connect( stopRL[i], SIGNAL(mouseMove(int,int)), startRL[j], SLOT(autoScroll(int,int)) );
      connect( stopRL[i], SIGNAL(mouseMove(int,int)), stopRL[j], SLOT(autoScroll(int,int)) );

      // connect origin sigs & slots
      if (i != j)
	connect( startRL[i], SIGNAL(sigOrigin(bool)), startRL[j], SLOT(setOrigin(bool)) );
      connect( startRL[i], SIGNAL(sigOrigin(bool)), stopRL[j], SLOT(setOrigin(bool)) );
      connect( stopRL[i], SIGNAL(sigOrigin(bool)), startRL[j], SLOT(setOrigin(bool)) );
      if (i != j)
	connect( stopRL[i], SIGNAL(sigOrigin(bool)), stopRL[j], SLOT(setOrigin(bool)) );
    }

    // capturing mouse moves ... also for "Scripts"
    connect( scripts, SIGNAL(mouseMove(int,int)), startRL[i], SLOT(autoScroll(int,int)) );
    connect( scripts, SIGNAL(mouseMove(int,int)), stopRL[i], SLOT(autoScroll(int,int)) );

    // connecting origin things for "Scripts", too
    connect( scripts, SIGNAL(sigOrigin(bool)), startRL[i], SLOT(setOrigin(bool)));
    connect( scripts, SIGNAL(sigOrigin(bool)), stopRL[i], SLOT(setOrigin(bool)));
    connect( startRL[i], SIGNAL(sigOrigin(bool)), scripts, SLOT(setOrigin(bool)));
    connect( stopRL[i], SIGNAL(sigOrigin(bool)), scripts, SLOT(setOrigin(bool)));

    // doubleclick
    connect( startRL[i], SIGNAL(sigDoubleClick(KSVDragData*, QPoint)),
	     this, SLOT(slotDoubleClick(KSVDragData*, QPoint)));
    connect( stopRL[i], SIGNAL(sigDoubleClick(KSVDragData*, QPoint)),
	     this, SLOT(slotDoubleClick(KSVDragData*, QPoint)));

    // something changed
    connect( startRL[i], SIGNAL(sigChanged()), this, SLOT(slotChanged()));
    connect( stopRL[i], SIGNAL(sigChanged()), this, SLOT(slotChanged()));

    // cannot generate sorting number
    connect( startRL[i], SIGNAL(cannotGenerateNumber()),
	     this, SLOT(fwdCannotGenerateNumber()) );
    connect( stopRL[i], SIGNAL(cannotGenerateNumber()),
	     this, SLOT(fwdCannotGenerateNumber()) );

    // use this loop for setting tooltips
    QToolTip::add(startRL[i], i18n("Drag here to start services\nwhen entering Runlevel %1").arg(i));
    QToolTip::add(stopRL[i], i18n("Drag here to stop services\nwhen entering Runlevel %1").arg(i));
  }

  // scripts should delete drops on trash -- aehm whatever
  connect( trash, SIGNAL(sigDroppedFrom(QString, KSVDragData*)),
	   scripts, SLOT(slotRemoveAfterDrop(QString, KSVDragData*)));
}


ksysv'KSVGui::initScripts() (./kdeadmin/ksysv/OldView.cpp:260)

void KSVGui::initScripts() {
  QDir scriptDir = QDir(conf->getScriptPath());
  if (!scriptDir.exists())
	return;

  scriptDir.setFilter( QDir::Files | QDir::Hidden |
		       QDir::NoSymLinks | QDir::Executable);

  scriptDir.setSorting( QDir::Name );

  const QFileInfoList *scriptList = scriptDir.entryInfoList();
  QFileInfoListIterator it( *scriptList ); 			                             // create list iterator
  QFileInfo* fi; 							                     // pointer for traversing
  while ( (fi=it.current()) ) {           			                             // for each file...
    scripts->initItem(fi->fileName(),
		      IOCore::relToAbs(conf->getScriptPath(),
				       fi->dirPath(FALSE)),
		      fi->fileName(), 0);
    ++it;        						                             // goto next list element

    // keep GUI alive
    qApp->processEvents();

  }
}


ksysv'KSVGui::initRunlevels() (./kdeadmin/ksysv/OldView.cpp:286)

void KSVGui::initRunlevels() {
  for (int i = 0; i < 7; ++i) {
    QString _path = conf->getRLPath();
    _path += QString("/rc%1.d").arg(i);
    if (!QDir(_path).exists())
	continue;

    QDir d = QDir(_path);
    d.setFilter( QDir::Files );
    d.setSorting( QDir::Name );

    const QFileInfoList *rlList = d.entryInfoList();
    QFileInfoListIterator it( *rlList );	 			                     // create list iterator
    QFileInfo* fi; 							                     // pointer for traversing

    // progress
    //    emit progress( 2*i + 17 );
    emit advance(1);

    while ( (fi=it.current()) ) {           			                             // for each file...
      info2Widget( fi, i);
      ++it;        						                             // goto next list element
      // keep GUI alive
      qApp->processEvents();
    }

    // progress
    // emit progress(2*i + 18);
    emit advance(1);
  }
}


ksysv'KSVGui::info2Widget() (./kdeadmin/ksysv/OldView.cpp:318)

void KSVGui::info2Widget( QFileInfo* info, int index ) {
  if (!info->exists())
    return;

  QString l_name = info->readLink();
  QString f_name = info->fileName();

  QFileInfo link_info = QFileInfo(l_name);
  QString l_base = link_info.fileName();

  QString l_path = IOCore::relToAbs(conf->getScriptPath(), link_info.dirPath(FALSE));

  QString name;
  int number;
  IOCore::dissectFilename( f_name, name, number );

  // finally insert the items...
  if ( f_name.left(1) == "S" )
    startRL[index]->initItem( l_base, l_path, name, number );
  else
    stopRL[index]->initItem( l_base, l_path, name, number );
}


ksysv'KSVGui::slotWriteSysV() (./kdeadmin/ksysv/OldView.cpp:341)

void KSVGui::slotWriteSysV() {
  appendLog(i18n("** WRITING CONFIGURATION **\n"));

  for (int i = 0; i < 7; ++i) {
    appendLog(i18n("** RUNLEVEL %1 **\n")
				.arg(i));

    clearRL(i); // rm changed/deleted entries

    // process "Start"
    int maxIndex = startRL[i]->count();

    for (int j = 0; j < maxIndex; ++j) {
      KSVDragData* cur_w = startRL[i]->at(j);

      if (cur_w->isChanged() || cur_w->isNew())
	writeToDisk(cur_w, i, j, TRUE);
    }

    // process "Stop"
    maxIndex = stopRL[i]->count();

    for (int j = 0; j < maxIndex; ++j) {
      KSVDragData* cur_w = stopRL[i]->at(j);

      if (cur_w->isChanged() || cur_w->isNew())
	writeToDisk(cur_w, i, j, FALSE);
    }

    // an extra blank line
    appendLog("\n");
  }

  // an extra blank line
  appendLog("\n");
}


ksysv'KSVGui::writeToDisk() (./kdeadmin/ksysv/OldView.cpp:378)

void KSVGui::writeToDisk(KSVDragData* _w, int _rl, int /* _index */, bool _start) {
  appendLog(IOCore::makeSymlink(_w, _rl, _start));
}


ksysv'KSVGui::clearRL() (./kdeadmin/ksysv/OldView.cpp:382)

void KSVGui::clearRL(int _rl) {
  QString path = conf->getRLPath();
  path += QString("/rc%i.d").arg(_rl);

  QDir d (path);

  KSVList del_start = startRL[_rl]->getDeletedItems();
  KSVList del_stop = stopRL[_rl]->getDeletedItems();

  int max_start = del_start.count();

  for (int i = 0; i < max_start; ++i) {
    KSVDragData* data = del_start.at(i);

    // ugly hack -> donīt try to delete if entry is new (i.e. not save to disk)
    if (data->isNew())
      break;

    QFileInfo tmp (path + QString().sprintf("/S%.2i%s", data->number(), data->currentName().data()));

    appendLog(IOCore::removeFile(&tmp, d));

    int nr = data->number();
    QString name = data->currentName();
    bool remove = FALSE;

    if (data->isNumChanged()) {
      nr = data->oldNumber();
      remove = TRUE;
    }
    if (data->isNameChanged()) {
      name = data->oldName();
      remove = TRUE;
    }

    if (remove) {
      tmp = QFileInfo(path + QString().sprintf("/S%.2i%s", nr, name.data()));
      appendLog(IOCore::removeFile(&tmp, d));
    }
  }


  // keep GUI alive
  qApp->processEvents();

  int max_stop = del_stop.count();

  for (int i = 0; i < max_stop; ++i) {
    KSVDragData* data = del_stop.at(i);

    // ugly, too
    if (data->isNew())
      break;

    QFileInfo tmp (path + QString().sprintf("/K%.2i%s", data->number(), data->currentName().data()));

    appendLog(IOCore::removeFile(&tmp, d));

    if (data->isChanged()) {
      int nr = data->number();
      QString name = data->currentName();

      if (data->isNumChanged())
	nr = data->oldNumber();
      if (data->isNameChanged())
	name = data->oldName();

      tmp = QFileInfo(path + QString().sprintf("/K%.2i%s", nr, name.data()));
 //      tmp = QFileInfo(path + QString().sprintf("/K%.2i%s", data->oldNumber(), data->oldName().data()));
      appendLog(IOCore::removeFile(&tmp, d));
    }
  }

  // keep GUI alive
  qApp->processEvents();

  max_start = startRL[_rl]->count();

  for (int i = 0; i < max_start; ++i) {
    KSVDragData* data = startRL[_rl]->at(i);

    if (data->isNew())
      break;

    if (data->isChanged()) {
      int nr = data->number();
      QString name = data->currentName();

      if (data->isNumChanged())
	nr = data->oldNumber();
      if (data->isNameChanged())
	name = data->oldName();

      QFileInfo tmp = QFileInfo(path + QString().sprintf("/S%.2i%s", nr, name.data()));

      appendLog(IOCore::removeFile(&tmp, d));
    }
  }

  // keep GUI alive
  qApp->processEvents();

  max_stop = stopRL[_rl]->count();

  for (int i = 0; i < max_stop; ++i) {
    KSVDragData* data = stopRL[_rl]->at(i);

    if (data->isNew())
      break;

    if (data->isChanged()) {
      int nr = data->number();
      QString name = data->currentName();

      if (data->isNumChanged())
	nr = data->oldNumber();
      if (data->isNameChanged())
	name = data->oldName();

      QFileInfo tmp = QFileInfo(path + QString().sprintf("/K%.2i%s", nr, name.data()));
      appendLog(IOCore::removeFile(&tmp, d));
    }
  }

  // keep GUI alive
  qApp->processEvents();

}


ksysv'KSVGui::reInit() (./kdeadmin/ksysv/OldView.cpp:511)

void KSVGui::reInit() {
  // update GUI
  qApp->processEvents();

  // override cursor
  kapp->setOverrideCursor(waitCursor);

  const int total = 2 * 2 * 7 + 2;
  emit initProgress(total, i18n("Reading configuration: "));

  // update GUI
  qApp->processEvents();

  // sleep for 0.05 seconds to allow windowmanager
  // gain control of progress dialog (won't work neccessarily,
  // but should in most cases (the faster the system, the better :)
  usleep(DELAY);

  // update GUI
  qApp->processEvents();

  int i = 0;
  for (i = 0; i < 7; ++i) {
    startRL[i]->clear();
    //emit progress(2*i + 1);
    emit advance(1);

    // keep GUI alive
    qApp->processEvents();
    usleep(DELAY);

    stopRL[i]->clear();
    //    emit progress(2*i+2);
    emit advance(1);

    // set new colors
    startRL[i]->setNewColor(conf->getNewColor());
    startRL[i]->setChangedColor(conf->getChangedColor());
    stopRL[i]->setNewColor(conf->getNewColor());
    stopRL[i]->setChangedColor(conf->getChangedColor());

    // keep GUI alive
    qApp->processEvents();
    usleep(DELAY);
  }

  scripts->clear();
  //  emit progress(2*i+1);
  emit advance(1);

  // keep GUI alive
  qApp->processEvents();
  usleep(DELAY);

  initScripts();
  //  emit progress(2*i + 2);
  emit advance(1);

  // keep GUI alive
  qApp->processEvents();
  usleep(DELAY);

  initRunlevels();

  // restore cursor
  kapp->restoreOverrideCursor();


  // refresh GUI
  qApp->processEvents();

  // end progress
  emit endProgress();

  // set focus to none
  scripts->setFocus();
}


ksysv'KSVGui::slotChanged() (./kdeadmin/ksysv/OldView.cpp:589)

void KSVGui::slotChanged() {
  emit sigChanged();
}


ksysv'KSVGui::infoOnData() (./kdeadmin/ksysv/OldView.cpp:593)

void KSVGui::infoOnData(KSVDragData* data) {
  KSVPropDlg prop( data, qApp->mainWidget(), "props" );

  connect( &prop, SIGNAL(changed(const KSVDragData*)),
	   this, SLOT(slotChanged()) );
  connect( &prop, SIGNAL(changed(const KSVDragData*)),
	   parent(), SLOT(redrawEntry(const KSVDragData*)) );
  connect( &prop, SIGNAL(numberChanged()),
	   this, SLOT(reSortRL()) );
//   connect( &prop, SIGNAL(nameChanged(QString)), this, SLOT(slotChanged()) );
//   connect( &prop, SIGNAL(numberChanged(int)), this, SLOT(slotChanged()) );
//   connect( &prop, SIGNAL(targetChanged(QString)), this, SLOT(slotChanged()) );

  prop.exec();
}


ksysv'KSVGui::stopW() (./kdeadmin/ksysv/OldView.cpp:609)

void KSVGui::stopW() {
  KProcess *_proc = new KProcess();
  QString s_name = getOrigin()->selected()->filenameAndPath();
  _proc->clearArguments();

  *_proc << s_name << "stop";

  connect(_proc, SIGNAL(processExited(KProcess*)), this, SLOT(slotExitedProcess(KProcess*)));
  connect(_proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, SLOT(slotOutput(KProcess*, char*, int)));
  connect(_proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, SLOT(slotErr(KProcess*, char*, int)));

  // refresh textDisplay
  appendLog(i18n("** Stopping ") + s_name + " **\n");

  _proc->start(KProcess::NotifyOnExit, KProcess::AllOutput);

  // notify parent
  emit sigRun(s_name + i18n(" stop"));
}		


ksysv'KSVGui::startW() (./kdeadmin/ksysv/OldView.cpp:629)

void KSVGui::startW() {
  KProcess* _proc = new KProcess();
  QString s_name = getOrigin()->selected()->filenameAndPath();
  _proc->clearArguments();

  *_proc << s_name << "start";

  connect(_proc, SIGNAL(processExited(KProcess*)), this, SLOT(slotExitedProcess(KProcess*)));
  connect(_proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, SLOT(slotOutput(KProcess*, char*, int)));
  connect(_proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, SLOT(slotErr(KProcess*, char*, int)));

  // refresh textDisplay
  appendLog(i18n("** Starting ") + s_name + " **\n");

  _proc->start(KProcess::NotifyOnExit, KProcess::AllOutput);

  // notify parent
  emit sigRun(s_name + i18n(" start"));
}


ksysv'KSVGui::restartW() (./kdeadmin/ksysv/OldView.cpp:649)

void KSVGui::restartW()
{
  // stopping
  KProcess *_proc = new KProcess();
  QString s_name = getOrigin()->selected()->filenameAndPath();
  _proc->clearArguments();

  *_proc << s_name << "stop";

  connect(_proc, SIGNAL(processExited(KProcess*)), this, SLOT(slotExitDuringRestart(KProcess*)));
  connect(_proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, SLOT(slotOutput(KProcess*, char*, int)));
  connect(_proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, SLOT(slotErr(KProcess*, char*, int)));

  // refresh textDisplay
  appendLog(i18n("** Re-starting ") + s_name + " **\n");

  _proc->start(KProcess::NotifyOnExit, KProcess::AllOutput);

  // notify parent
  emit sigRun(s_name+ i18n(" restart"));
}	


ksysv'KSVGui::slotOutput() (./kdeadmin/ksysv/OldView.cpp:671)

void KSVGui::slotOutput( KProcess*, char* _buffer, int _buflen) {
  if (_buflen > 0) {
    QString buffer(QString::fromLocal8Bit( _buffer, _buflen ));
    appendLog(buffer);
  }
}


ksysv'KSVGui::slotErr() (./kdeadmin/ksysv/OldView.cpp:678)

void KSVGui::slotErr( KProcess*, char* _buffer, int _buflen) {
  if (_buflen > 0) {
    QString buffer(QString::fromLocal8Bit( _buffer, _buflen ));
    appendLog(buffer);
  }
}


ksysv'KSVGui::slotExitedProcess() (./kdeadmin/ksysv/OldView.cpp:685)

void KSVGui::slotExitedProcess( KProcess* proc ) {
  appendLog("---------------------\n");

  emit sigStop();
  delete proc;
}


ksysv'KSVGui::slotToggleOut() (./kdeadmin/ksysv/OldView.cpp:692)

void KSVGui::slotToggleOut() {
  const bool showOut = conf->getShowLog();
  conf->setShowLog(!showOut);

  if (showOut) {
    conf->setPanningFactor(panner->separatorPos());
    panner->setSeparatorPos(100);
  } else
    panner->setSeparatorPos(conf->getPanningFactor());

  const QSize tmp = size();
  resize(tmp.width(), tmp.height() - 1);
  resize(tmp);
}


ksysv'KSVGui::slotScriptsNotRemovable() (./kdeadmin/ksysv/OldView.cpp:707)

void KSVGui::slotScriptsNotRemovable() {
  emit sigNotRemovable();
}


ksysv'KSVGui::slotDoubleClick() (./kdeadmin/ksysv/OldView.cpp:711)

void KSVGui::slotDoubleClick( KSVDragData* _data, QPoint) {
  infoOnData(_data);
}


ksysv'KSVGui::slotScriptProperties() (./kdeadmin/ksysv/OldView.cpp:715)

void KSVGui::slotScriptProperties( KSVDragData* data, QPoint )
{
  KSVPropDlg prop( data, qApp->mainWidget(), "props" );
  prop.setEnabled(false);
  prop.exec();
}


ksysv'KSVGui::slotExitDuringRestart() (./kdeadmin/ksysv/OldView.cpp:722)

void KSVGui::slotExitDuringRestart( KProcess* proc ) {
  delete proc;
  proc = new KProcess(); // necessary because otherwise we still have some
  			 // signals connected that screw up our output
  proc->clearArguments();

  QString s_name = getOrigin()->selected()->filenameAndPath();
  *proc << s_name << "start";

  connect(proc, SIGNAL(processExited(KProcess*)), this, SLOT(slotExitedProcess(KProcess*)));
  connect(proc, SIGNAL(receivedStdout(KProcess*, char*, int)), this, SLOT(slotOutput(KProcess*, char*, int)));
  connect(proc, SIGNAL(receivedStderr(KProcess*, char*, int)), this, SLOT(slotErr(KProcess*, char*, int)));

  proc->start(KProcess::NotifyOnExit, KProcess::AllOutput);
}


ksysv'KSVGui::initLayout() (./kdeadmin/ksysv/OldView.cpp:738)

void KSVGui::initLayout() {
  QBoxLayout* realTopLayout = new QVBoxLayout(this);
  realTopLayout->addWidget(panner);
  panner->activate(content, textDisplay);
  realTopLayout->activate();

  QBoxLayout* topLayout = new QHBoxLayout(content);

  QBoxLayout* scriptLayout = new QVBoxLayout();
  topLayout->addLayout(scriptLayout, FULL);

  // scripts
  MIN_SIZE(avaiL);
  MIN_SIZE(servL);
  MIN_SIZE(scripts);
  MIN_SIZE(trash);
  trash->setFixedHeight(TRASH_HEIGHT);

  scriptLayout->addWidget(avaiL);
  scriptLayout->addWidget(servL);
  scriptLayout->addWidget(scripts, FULL);
  scriptLayout->addWidget(trash, FULL);

  // runlevels
  for (int i = 0; i < 7; ++i) {
    // a bit of extra spacing
    topLayout->addSpacing(1);

    QBoxLayout* rlLayout = new QVBoxLayout();
    topLayout->addLayout(rlLayout, FULL);

    MIN_SIZE(rlL[i]);
    MIN_SIZE(startL[i]);
    MIN_SIZE(startRL[i]);
    MIN_SIZE(stopL[i]);
    MIN_SIZE(stopRL[i]);

    rlLayout->addWidget(rlL[i]);
    rlLayout->addWidget(startL[i]);
    rlLayout->addWidget(startRL[i], FULL);
    rlLayout->addSpacing(HALF);
    rlLayout->addWidget(stopL[i]);
    rlLayout->addWidget(stopRL[i], FULL);
  }

  topLayout->activate();
}


ksysv'KSVGui::calcSizeOnce() (./kdeadmin/ksysv/OldView.cpp:786)

void KSVGui::calcSizeOnce() {
  // set minimum size
  const int minWidth = SPACING + MAX(avaiL->width(),
				     servL->width()) + SPACING + ( MAX( MAX(rlL[0]->width(), startL[0]->width()),
									stopL[0]->width() ) + SPACING ) * 7;

  setMinimumSize( minWidth, 200 );
}


ksysv'KSVGui::initAccel() (./kdeadmin/ksysv/OldView.cpp:795)

void KSVGui::initAccel() {
//   QAccel *a = new QAccel( this );        	// create accels for myWindow
//   a->connectItem( a->insertItem(CTRL+Key_P), 	// adds Ctrl+P accelerator
// 		  this,                  	// connected to myWindow's
// 		  SLOT( printDoc() ) );        	// printDoc() slot
}


ksysv'KSVGui::initPopupMenus() (./kdeadmin/ksysv/OldView.cpp:802)

void KSVGui::initPopupMenus() {
    normalPM = new QPopupMenu();
    normalPM->insertItem( i18n("C&ut"), parent(), SLOT(editCut()) );
    normalPM->setId(0, PopMenu::Cut);
    normalPM->insertItem( i18n("&Copy"), parent(), SLOT(editCopy()) );
    normalPM->setId(1, PopMenu::Copy);
    normalPM->insertItem( i18n("&Paste"), parent(), SLOT(editPaste()) );
    normalPM->setId(2, PopMenu::Paste);
    normalPM->insertSeparator();
    normalPM->insertItem( i18n("P&roperties..."), parent(), SLOT(properties()) );
    normalPM->setId(4, PopMenu::Properties);

    backPM = new QPopupMenu();
    backPM->insertItem( i18n("&Paste"), this, SLOT(pasteAppend()) );
    backPM->setId(0, PopMenu::Paste);

  for (int i = 0; i < 7; ++i) {
    startRL[i]->addPMenu(backPM);
    stopRL[i]->addPMenu(backPM);
    startRL[i]->addItemPMenu(normalPM);
    stopRL[i]->addItemPMenu(normalPM);
  }

  // menu for scripts
  scriptPM = new QPopupMenu();
  scriptPM->insertItem( i18n("&Copy"), parent(), SLOT(editCopy()) );
  scriptPM->setId(0, PopMenu::Copy);
  scriptPM->insertSeparator();
  scriptPM->insertItem( i18n("&Start"), this, SLOT(startW()) );
  scriptPM->insertItem( i18n("S&top"), this, SLOT(stopW()) );
  scriptPM->insertSeparator();
  scriptPM->insertItem( i18n("&Restart"), this, SLOT(restartW()) );
  scriptPM->insertSeparator();
  scriptPM->insertItem( i18n("&Properties..."), parent(), SLOT(scriptProperties()) );

  scripts->addItemPMenu(scriptPM);
}


ksysv'KSVGui::getOrigin() (./kdeadmin/ksysv/OldView.cpp:840)

KSVDragList* KSVGui::getOrigin() {
  KSVDragList* result = 0;

  for (int i = 0; i < 7; ++i) {
    result = startRL[i]->isOrigin() ? startRL[i] : result;
    result = stopRL[i]->isOrigin() ? stopRL[i] : result;
  }

  result = scripts->isOrigin() ? scripts : result;

  return result;
}


ksysv'KSVGui::setDisplayScriptOutput() (./kdeadmin/ksysv/OldView.cpp:853)

void KSVGui::setDisplayScriptOutput(bool val) {
  if (val)
    panner->setSeparatorPos(conf->getPanningFactor());
  else {
    conf->setPanningFactor(panner->separatorPos());
    panner->setSeparatorPos(100);
  }

  const QSize tmp = size();
  resize(tmp.width(), tmp.height() - 1);
  resize(tmp);
}


ksysv'KSVGui::setLog() (./kdeadmin/ksysv/OldView.cpp:866)

void KSVGui::setLog(QString _txt) {
  textDisplay->setAutoUpdate(FALSE);
  textDisplay->setText(_txt);
  textDisplay->setAutoUpdate(TRUE);
  textDisplay->setCursorPosition(textDisplay->numLines(), 0, FALSE);
  textDisplay->repaint();
}


ksysv'KSVGui::appendLog() (./kdeadmin/ksysv/OldView.cpp:874)

void KSVGui::appendLog(QString txt) {
  setLog(getLog() + txt);
}


ksysv'KSVGui::getLog() (./kdeadmin/ksysv/OldView.cpp:878)

QString KSVGui::getLog() const {
  return textDisplay->text();
}


ksysv'KSVGui::fwdCannotGenerateNumber() (./kdeadmin/ksysv/OldView.cpp:882)

void KSVGui::fwdCannotGenerateNumber() {
  emit cannotGenerateNumber();
}


ksysv'KSVGui::updatePanningFactor() (./kdeadmin/ksysv/OldView.cpp:886)

void KSVGui::updatePanningFactor() {
  if (conf->getShowLog() && conf->getPanningFactor() != panner->separatorPos())
    conf->setPanningFactor(panner->separatorPos());
}


ksysv'KSVGui::fwdSelected() (./kdeadmin/ksysv/OldView.cpp:891)

void KSVGui::fwdSelected( const KSVDragData* d )
{
  emit selected(d);
}


ksysv'KSVGui::fwdSelectedScripts() (./kdeadmin/ksysv/OldView.cpp:896)

void KSVGui::fwdSelectedScripts( const KSVDragData* d )
{
  emit selectedScripts(d);
}


ksysv'KSVGui::reSortRL() (./kdeadmin/ksysv/OldView.cpp:901)

void KSVGui::reSortRL()
{
  getOrigin()->reSort();
}


ksysv'KSVGui::pasteAppend() (./kdeadmin/ksysv/OldView.cpp:906)

void KSVGui::pasteAppend()
{
  KSVDragList* tmp = getOrigin();
  
  if (tmp)
    {	
      KSVDragData* o = CLIP->getClipboard();
      const int pos = tmp->count();
      
      if (o && (tmp->find(o) > NONE ? tmp->find(o)!=pos : TRUE))
	tmp->insertItem(o, pos, TRUE);
    }	
  else
    fatal("Bug: could not get origin of \"Paste\" event.\n" \
	  "Please notify the maintainer of this program,\n" \
	  "Peter Putzer <putzer@kde.org>.");
}