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.
197 lines
5.3 KiB
197 lines
5.3 KiB
11 years ago
|
/*
|
||
|
mstatstab.cpp - A statistics dialog
|
||
|
Copyright (C) 2003 Konrad Twardowski <kdtonline@poczta.onet.pl>
|
||
|
|
||
|
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; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*/
|
||
|
|
||
|
#include "configuration.h"
|
||
|
#include "mmainwindow.h"
|
||
|
#include "miscutils.h"
|
||
|
#include "mstatstab.h"
|
||
|
|
||
|
#include <qcheckbox.h>
|
||
|
#include <qprocess.h>
|
||
|
#include <qregexp.h>
|
||
|
#include <qtextedit.h>
|
||
|
#include <qvbox.h>
|
||
|
#include <qvgroupbox.h>
|
||
|
#include <qwhatsthis.h>
|
||
|
|
||
|
#include <kiconloader.h>
|
||
|
#include <klocale.h>
|
||
|
#include <kpushbutton.h>
|
||
|
|
||
|
// public
|
||
|
|
||
|
MStatsTab *MStatsTab::_instance = 0;
|
||
|
|
||
|
MStatsTab::MStatsTab()
|
||
|
: KDialogBase(
|
||
|
ks_main,
|
||
|
"MStatsTab",
|
||
|
false, // modeless
|
||
|
i18n("Statistics"),
|
||
|
Close | Details,
|
||
|
Close // default button
|
||
|
),
|
||
|
_buf(QString::null)
|
||
|
{
|
||
|
_process = new QProcess(this);
|
||
|
connect(_process, SIGNAL(processExited()), SLOT(slotProcessExit()));
|
||
|
connect(_process, SIGNAL(readyReadStdout()), SLOT(slotReadStdout()));
|
||
|
|
||
|
QVBox *main = new QVBox(this);
|
||
|
setMainWidget(main);
|
||
|
|
||
|
// output
|
||
|
te_output = new QTextEdit(main, "QTextEdit::te_output");
|
||
|
te_output->setMinimumSize(640, 320);
|
||
|
te_output->setPaletteBackgroundColor(white);
|
||
|
te_output->setPaletteForegroundColor(black);
|
||
|
te_output->setReadOnly(true);
|
||
|
te_output->setTextFormat(RichText); // allow HTML tags
|
||
|
te_output->setWordWrap(QTextEdit::NoWrap);
|
||
|
// based on the "Linux User's Manual" (man w)
|
||
|
QWhatsThis::add(
|
||
|
te_output,
|
||
|
MiscUtils::HTML(i18n(
|
||
|
"This view displays information about the users currently on the " \
|
||
|
"machine, and their processes.<br>" \
|
||
|
"The header shows how long the system has been running."
|
||
|
))
|
||
|
);
|
||
|
|
||
|
QHBox *buttons = new QHBox(main);
|
||
|
// refresh
|
||
|
b_refresh = new KPushButton(SmallIcon("reload"), i18n("Refresh"), buttons, "KPushButton::b_refresh");
|
||
|
connect(b_refresh, SIGNAL(clicked()), SLOT(slotRefresh()));
|
||
|
|
||
|
// options
|
||
|
QVGroupBox *options = new QVGroupBox(i18n("Options"), main);
|
||
|
// long format
|
||
|
c_longFormat = new QCheckBox(i18n("More information"), options);
|
||
|
c_longFormat->setChecked(kshutdownrc->statsLongFormat);
|
||
|
connect(c_longFormat, SIGNAL(clicked()), SLOT(slotRefresh()));
|
||
|
MiscUtils::setHint(c_longFormat, i18n("Show login time, JCPU and PCPU times."));
|
||
|
// toggle from field
|
||
|
c_toggleFromField = new QCheckBox(i18n("Toggle \"FROM\""), options);
|
||
|
c_toggleFromField->setChecked(kshutdownrc->statsToggleFromField);
|
||
|
MiscUtils::setHint(c_toggleFromField, i18n("Toggle the \"FROM\" (remote hostname) field."));
|
||
|
connect(c_toggleFromField, SIGNAL(clicked()), SLOT(slotRefresh()));
|
||
|
|
||
|
setButtonGuiItem(Details, KStdGuiItem::configure());
|
||
|
setDetailsWidget(options);
|
||
|
adjustSize();
|
||
|
}
|
||
|
|
||
|
MStatsTab::~MStatsTab()
|
||
|
{
|
||
|
killProcess();
|
||
|
}
|
||
|
|
||
|
// protected
|
||
|
|
||
|
void MStatsTab::keyPressEvent(QKeyEvent *e) {
|
||
|
// Ctrl+R, F5 = Refresh
|
||
|
if (
|
||
|
b_refresh->isEnabled() &&
|
||
|
(
|
||
|
((e->key() == Key_F5) && (e->state() == 0)) ||
|
||
|
((e->key() == Key_R) && (e->state() == ControlButton))
|
||
|
)
|
||
|
) {
|
||
|
slotRefresh();
|
||
|
e->accept();
|
||
|
}
|
||
|
else {
|
||
|
KDialogBase::keyPressEvent(e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// private
|
||
|
|
||
|
void MStatsTab::killProcess() const
|
||
|
{
|
||
|
// kill previous process (if any)
|
||
|
if (_process && _process->isRunning())
|
||
|
_process->kill();
|
||
|
}
|
||
|
|
||
|
// private slots
|
||
|
|
||
|
void MStatsTab::slotProcessExit() {
|
||
|
_buf.replace("\n", "<br>");
|
||
|
_buf.replace(" ", " ");
|
||
|
|
||
|
#define KS_HEADER(text) \
|
||
|
_buf.replace(text, "<font color=\"#a0a0a0\">" text "</font>");
|
||
|
|
||
|
#define KS_WARNING(text) \
|
||
|
_buf.replace(QRegExp("\\b" text "\\b"), "<font color=\"#ff0000\">" text "</font>");
|
||
|
|
||
|
// underline header
|
||
|
KS_HEADER("USER")
|
||
|
KS_HEADER("TTY")
|
||
|
KS_HEADER("FROM")
|
||
|
KS_HEADER("LOGIN@")
|
||
|
KS_HEADER("JCPU")
|
||
|
KS_HEADER("PCPU")
|
||
|
KS_HEADER("IDLE")
|
||
|
KS_HEADER("WHAT")
|
||
|
// highlight some important words
|
||
|
// TODO: 2.0: add more keywords (e.g. backup)
|
||
|
KS_WARNING("root")
|
||
|
KS_WARNING("ssh")
|
||
|
KS_WARNING("su")
|
||
|
KS_WARNING("sudo")
|
||
|
KS_WARNING("telnet")
|
||
|
|
||
|
_buf.prepend("<pre style=\"font-family: " + KGlobalSettings::fixedFont().family() + "\"><b>");
|
||
|
_buf.append("</b></pre>");
|
||
|
|
||
|
te_output->setText(MiscUtils::HTML(_buf));
|
||
|
b_refresh->setEnabled(true);
|
||
|
}
|
||
|
|
||
|
void MStatsTab::slotReadStdout() {
|
||
|
_buf.append(_process->readStdout());
|
||
|
}
|
||
|
|
||
|
void MStatsTab::slotRefresh()
|
||
|
{
|
||
|
b_refresh->setEnabled(false);
|
||
|
|
||
|
// update config
|
||
|
kshutdownrc->statsLongFormat = c_longFormat->isChecked();
|
||
|
kshutdownrc->statsToggleFromField = c_toggleFromField->isChecked();
|
||
|
|
||
|
_buf = "";
|
||
|
killProcess();
|
||
|
_process->clearArguments();
|
||
|
_process->addArgument("w");
|
||
|
if (!kshutdownrc->statsLongFormat)
|
||
|
_process->addArgument("-s"); // -s - short format
|
||
|
if (kshutdownrc->statsToggleFromField)
|
||
|
_process->addArgument("-f"); // -f - toggle "from" field
|
||
|
if (!_process->start()) {
|
||
|
_buf = "<b><font color=\"#ff0000\">" + i18n("Error") + "</font><br><br>";
|
||
|
_buf.append(i18n("Command: %1").arg(_process->arguments().join(" ")));
|
||
|
_buf.append("</b>");
|
||
|
te_output->setText(_buf);
|
||
|
b_refresh->setEnabled(true);
|
||
|
}
|
||
|
}
|