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.
tdebase/ksysguard/gui/SensorDisplayLib/ProcessList.h

271 lines
6.1 KiB

/*
KSysGuard, the KDE System Guard
Copyright (c) 1999, 2000 Chris Schlaeger <cs@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of version 2 of the GNU General Public
License as published by the Free Software Foundation.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
KSysGuard is currently maintained by Chris Schlaeger <cs@kde.org>.
Please do not commit any changes without consulting me
first. Thanks!
*/
#ifndef _ProcessList_h_
#define _ProcessList_h_
#include <tqdict.h>
#include <tqdom.h>
#include <tqstringlist.h>
#include <tqvaluelist.h>
#include <tqwidget.h>
#include <kiconloader.h>
#include <klistview.h>
#include "SensorClient.h"
typedef const char* (*KeyFunc)(const char*);
/**
* To support bi-directional sorting, and sorting of text, integers etc. we
* need a specialized version of TQListViewItem.
*/
class ProcessLVI : public KListViewItem
{
public:
ProcessLVI(TQListView* lv) : KListViewItem(lv) { }
ProcessLVI(TQListViewItem* lvi) : KListViewItem(lvi) { }
virtual int compare( TQListViewItem *item, int column, bool ) const;
};
class QPopupMenu;
/**
* This class implementes a table filled with information about the running
* processes. The table is derived from TQListView.
*/
class ProcessList : public KListView
{
Q_OBJECT
public:
// possible values for the filter mode
enum
{
FILTER_ALL = 0,
FILTER_SYSTEM,
FILTER_USER,
FILTER_OWN
};
enum ColumnType { Text, Int, Float, Time };
/// The constructor.
ProcessList(TQWidget* parent = 0, const char* name = 0);
/// The destructor.
~ProcessList();
void removeColumns();
void addColumn(const TQString& header, const TQString& type);
void setSortColumn(uint col, bool inc)
{
sortColumn = col;
increasing = inc;
setSorting(col, inc);
}
uint getSortColumn() const
{
return sortColumn;
}
bool getIncreasing() const
{
return increasing;
}
const TQValueList<int>& getSelectedPIds();
const TQStringList& getSelectedAsStrings();
/**
* The udpate function can be used to update the displayed process
* list. A current list of processes is requested from the OS. In
* case the list contains invalid or corrupted info, FALSE is
* returned.
*/
bool update(const TQString& list);
int columnType( uint col ) const;
void setSensorOk(bool ok);
void setKillSupported(bool supported)
{
killSupported = supported;
}
bool load(TQDomElement& el);
bool save(TQDomDocument& doc, TQDomElement& display);
public slots:
void setTreeView(bool tv);
/**
* This slot allows the filter mode to be set by other
* widgets. Possible values are FILTER_ALL, FILTER_SYSTEM,
* FILTER_USER and FILTER_OWN. This filter mechanism will be much
* more sophisticated in the future.
*/
void setFilterMode(int fm)
{
filterMode = fm;
setModified(true);
}
void sortingChanged(int col);
void handleRMBPressed(TQListViewItem* lvi, const TQPoint& p, int col);
void sizeChanged(int, int, int)
{
setModified(true);
}
void indexChanged(int, int, int)
{
setModified(true);
}
virtual void setModified(bool mfd)
{
if (mfd != modified)
{
modified = mfd;
emit listModified(modified);
}
}
signals:
// This signal is emitted when process pid should receive signal sig.
void killProcess(int pid, int sig);
// This signal is emitted when process pid should be reniced.
void reniceProcess(const TQValueList<int> &pids, int niceValue);
void listModified(bool);
private:
// items of table header RMB popup menu
enum
{
HEADER_REMOVE = 0,
HEADER_ADD,
HEADER_HELP
};
/**
* This function updates the lists of selected PID und the closed
* sub trees.
*/
void updateMetaInfo(void);
/**
* This function determines whether a process matches the current
* filter mode or not. If it machtes the criteria it returns true,
* false otherwise.
*/
bool matchesFilter(KSGRD::SensorPSLine* p) const;
/**
* This function constructs the list of processes for list
* mode. It's a straightforward appending operation to the
* TQListView widget.
*/
void buildList();
/**
* This function constructs the tree of processes for tree mode. It
* filters out leaf-sub-trees that contain no processes that match
* the filter criteria.
*/
void buildTree();
/**
* This function deletes the leaf-sub-trees that do not match the
* filter criteria.
*/
void deleteLeaves(void);
/**
* This function returns true if the process is a leaf process with
* respect to the other processes in the process list. It does not
* have to be a leaf process in the overall list of processes.
*/
bool isLeafProcess(int pid);
/**
* This function is used to recursively construct the tree by
* removing processes from the process list an inserting them into
* the tree.
*/
void extendTree(TQPtrList<KSGRD::SensorPSLine>* pl, ProcessLVI* parent, int ppid);
/**
* This function adds a process to the list/tree.
*/
void addProcess(KSGRD::SensorPSLine* p, ProcessLVI* pli);
private:
void selectAllItems(bool select);
void selectAllChilds(int pid, bool select);
bool modified;
int filterMode;
int sortColumn;
bool increasing;
int refreshRate;
int currColumn;
bool killSupported;
bool treeViewEnabled;
bool openAll;
/* The following lists are primarily used to store table specs between
* load() and the actual table creation in addColumn(). */
TQValueList<int> savedWidth;
TQValueList<int> currentWidth;
TQValueList<int> index;
TQPtrList<KSGRD::SensorPSLine> pl;
TQStringList mColumnTypes;
TQDict<TQString> columnDict;
TQValueList<int> selectedPIds;
TQValueList<int> closedSubTrees;
TQStringList selectedAsStrings;
static TQDict<TQString> aliases;
TQDict<TQPixmap> iconCache;
TQPopupMenu* headerPM;
};
#endif