~ubuntu-branches/ubuntu/intrepid/htop/intrepid

« back to all changes in this revision

Viewing changes to ColumnsPanel.c

  • Committer: Bazaar Package Importer
  • Author(s): Bartosz Fenski
  • Date: 2006-08-14 13:03:15 UTC
  • mfrom: (1.1.6 upstream) (2.1.2 etch)
  • Revision ID: james.westby@ubuntu.com-20060814130315-mm00h2owyqz2zr2j
Tags: 0.6.3-1
* New upstream version.
  - allows to rekill tagged group of processes (Closes: #375219)
* Bumped Standards-Version to 3.7.2 (no changes needed).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include "ColumnsPanel.h"
 
3
 
 
4
#include "Panel.h"
 
5
#include "Settings.h"
 
6
#include "ScreenManager.h"
 
7
 
 
8
#include "debug.h"
 
9
#include <assert.h>
 
10
 
 
11
/*{
 
12
 
 
13
typedef struct ColumnsPanel_ {
 
14
   Panel super;
 
15
 
 
16
   Settings* settings;
 
17
   ScreenManager* scr;
 
18
} ColumnsPanel;
 
19
 
 
20
}*/
 
21
 
 
22
ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr) {
 
23
   ColumnsPanel* this = (ColumnsPanel*) malloc(sizeof(ColumnsPanel));
 
24
   Panel* super = (Panel*) this;
 
25
   Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
 
26
   ((Object*)this)->delete = ColumnsPanel_delete;
 
27
 
 
28
   this->settings = settings;
 
29
   this->scr = scr;
 
30
   super->eventHandler = ColumnsPanel_eventHandler;
 
31
   Panel_setHeader(super, "Active Columns");
 
32
 
 
33
   ProcessField* fields = this->settings->pl->fields;
 
34
   for (; *fields; fields++) {
 
35
      Panel_add(super, (Object*) ListItem_new(Process_fieldNames[*fields], 0));
 
36
   }
 
37
   return this;
 
38
}
 
39
 
 
40
void ColumnsPanel_delete(Object* object) {
 
41
   Panel* super = (Panel*) object;
 
42
   ColumnsPanel* this = (ColumnsPanel*) object;
 
43
   Panel_done(super);
 
44
   free(this);
 
45
}
 
46
 
 
47
void ColumnsPanel_update(Panel* super) {
 
48
   ColumnsPanel* this = (ColumnsPanel*) super;
 
49
   int size = Panel_getSize(super);
 
50
   this->settings->changed = true;
 
51
   // FIXME: this is crappily inefficient
 
52
   free(this->settings->pl->fields);
 
53
   this->settings->pl->fields = (ProcessField*) malloc(sizeof(ProcessField) * (size+1));
 
54
   for (int i = 0; i < size; i++) {
 
55
      char* text = ((ListItem*) Panel_get(super, i))->value;
 
56
      for (int j = 1; j <= LAST_PROCESSFIELD; j++) {
 
57
         if (String_eq(text, Process_fieldNames[j])) {
 
58
            this->settings->pl->fields[i] = j;
 
59
            break;
 
60
         }
 
61
      }
 
62
   }
 
63
   this->settings->pl->fields[size] = 0;
 
64
}
 
65
 
 
66
HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) {
 
67
   
 
68
   int selected = Panel_getSelectedIndex(super);
 
69
   HandlerResult result = IGNORED;
 
70
   int size = Panel_getSize(super);
 
71
 
 
72
   switch(ch) {
 
73
      case KEY_F(7):
 
74
      case '[':
 
75
      case '-':
 
76
      {
 
77
         if (selected < size - 1)
 
78
            Panel_moveSelectedUp(super);
 
79
         result = HANDLED;
 
80
         break;
 
81
      }
 
82
      case KEY_F(8):
 
83
      case ']':
 
84
      case '+':
 
85
      {
 
86
         if (selected < size - 2) 
 
87
            Panel_moveSelectedDown(super);
 
88
         result = HANDLED;
 
89
         break;
 
90
      }
 
91
      case KEY_F(9):
 
92
      case KEY_DC:
 
93
      {
 
94
         if (selected < size - 1) {
 
95
            Panel_remove(super, selected);
 
96
         }
 
97
         result = HANDLED;
 
98
         break;
 
99
      }
 
100
   }
 
101
   if (result == HANDLED)
 
102
      ColumnsPanel_update(super);
 
103
   return result;
 
104
}