/* KSysGuard, the KDE System Guard Copyright (c) 1999, 2000 Chris Schlaeger 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 . Please do not commit any changes without consulting me first. Thanks! */ #ifndef _ProcessList_h_ #define _ProcessList_h_ #include #include #include #include #include #include #include #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 TDEListViewItem { public: ProcessLVI(TQListView* lv) : TDEListViewItem(lv) { } ProcessLVI(TQListViewItem* lvi) : TDEListViewItem(lvi) { } virtual int compare( TQListViewItem *item, int column, bool ) const; }; class TQPopupMenu; /** * This class implementes a table filled with information about the running * processes. The table is derived from TQListView. */ class ProcessList : public TDEListView { 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& 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 &pids, int niceValue); void listModified(bool); protected: void keyPressEvent(TQKeyEvent *e); void keyReleaseEvent(TQKeyEvent *e); 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* 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; bool ctrlKeyDown; bool shiftKeyDown; /* The following lists are primarily used to store table specs between * load() and the actual table creation in addColumn(). */ TQValueList savedWidth; TQValueList currentWidth; TQValueList index; TQPtrList pl; TQStringList mColumnTypes; TQDict columnDict; TQValueList selectedPIds; TQValueList closedSubTrees; TQStringList selectedAsStrings; static TQDict aliases; TQDict iconCache; TQPopupMenu* headerPM; }; #endif