1 /***************************************************************************
2     begin       : Mon Feb 15 2010
3     copyright   : (C) 2010 by Martin Preuss
4     email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 
11 #include <gwen-gui-cpp/cppwidget.hpp>
12 
13 
14 class Qt4_W_ListBox: public Qt4_W_Widget {
15 public:
Qt4_W_ListBox(GWEN_WIDGET * w)16   Qt4_W_ListBox(GWEN_WIDGET *w):Qt4_W_Widget(w) {
17   }
18 
19 
20 
~Qt4_W_ListBox()21   ~Qt4_W_ListBox() {
22   }
23 
24 
25 
setup()26   virtual int setup() {
27     QTreeWidget *qw;
28     uint32_t flags;
29     GWEN_WIDGET *wParent;
30     QSizePolicy::Policy hpolicy=QSizePolicy::Minimum;
31     QSizePolicy::Policy vpolicy=QSizePolicy::Minimum;
32     QT4_GuiDialog *qtDialog;
33 
34     flags=GWEN_Widget_GetFlags(_widget);
35     wParent=GWEN_Widget_Tree_GetParent(_widget);
36 
37     qw=new QTreeWidget();
38     qw->setAllColumnsShowFocus(true);
39     qw->setSortingEnabled(true);
40     qw->setRootIsDecorated(false);
41     qw->setItemsExpandable(false);
42     qw->setSelectionBehavior(QAbstractItemView::SelectRows);
43 
44     /* handle flags */
45     if (flags & GWEN_WIDGET_FLAGS_FILLX)
46       hpolicy=QSizePolicy::Expanding;
47     if (flags & GWEN_WIDGET_FLAGS_FILLY)
48       vpolicy=QSizePolicy::Expanding;
49     qw->setSizePolicy(hpolicy, vpolicy);
50 
51     GWEN_Widget_SetImplData(_widget, QT4_DIALOG_WIDGET_REAL, (void*) qw);
52 
53     qtDialog=dynamic_cast<QT4_GuiDialog*>(getDialog());
54     assert(qtDialog);
55 
56     qw->connect(qw, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
57                 qtDialog->getMainWindow(),
58                 SLOT(slotActivated()));
59 
60     if (wParent)
61       GWEN_Widget_AddChildGuiWidget(wParent, _widget);
62     return 0;
63   }
64 
65 
66 
setIntProperty(GWEN_DIALOG_PROPERTY prop,int index,int value,int doSignal)67   int setIntProperty(GWEN_DIALOG_PROPERTY prop,
68                      int index,
69                      int value,
70                      int doSignal) {
71     QTreeWidget *qw;
72 
73     qw=(QTreeWidget*) GWEN_Widget_GetImplData(_widget, QT4_DIALOG_WIDGET_REAL);
74     assert(qw);
75 
76     switch(prop) {
77     case GWEN_DialogProperty_ClearValues:
78       qw->clear();
79       return 0;
80 
81     case GWEN_DialogProperty_Value: {
82       QTreeWidgetItem *item;
83 
84       item=qw->topLevelItem(index);
85 
86       if (item==NULL) {
87         DBG_ERROR(GWEN_LOGDOMAIN, "Value %d out of range", value);
88         return GWEN_ERROR_INVALID;
89       }
90 
91       qw->setCurrentItem(item);
92       return 0;
93     }
94 
95     case GWEN_DialogProperty_ColumnWidth:
96       qw->setColumnWidth(index, value);
97       return 0;
98 
99     case GWEN_DialogProperty_SelectionMode:
100       switch(value) {
101       case GWEN_Dialog_SelectionMode_None:
102         qw->setSelectionMode(QAbstractItemView::NoSelection);
103         return 0;
104       case GWEN_Dialog_SelectionMode_Single:
105         qw->setSelectionMode(QAbstractItemView::SingleSelection);
106         return 0;
107       case GWEN_Dialog_SelectionMode_Multi:
108         qw->setSelectionMode(QAbstractItemView::ExtendedSelection);
109         return 0;
110         ;
111       }
112       DBG_ERROR(GWEN_LOGDOMAIN, "Unknown SelectionMode %d", value);
113       return GWEN_ERROR_INVALID;
114 
115     case GWEN_DialogProperty_SortDirection:
116       switch(value) {
117       case GWEN_DialogSortDirection_None:
118         qw->sortByColumn(-1, Qt::AscendingOrder);
119         break;
120       case GWEN_DialogSortDirection_Up:
121         qw->sortByColumn(index, Qt::AscendingOrder);
122         break;
123       case GWEN_DialogSortDirection_Down:
124         qw->sortByColumn(index, Qt::DescendingOrder);
125         break;
126       }
127       return 0;
128 
129     case GWEN_DialogProperty_Sort: {
130       int c;
131 
132       c=qw->sortColumn();
133       if (c!=-1) {
134         QHeaderView *h;
135 
136         h=qw->header();
137         qw->sortItems(c, h->sortIndicatorOrder());
138       }
139       return 0;
140     }
141 
142     default:
143       return Qt4_W_Widget::setIntProperty(prop, index, value, doSignal);
144     }
145   };
146 
147 
148 
getIntProperty(GWEN_DIALOG_PROPERTY prop,int index,int defaultValue)149   int getIntProperty(GWEN_DIALOG_PROPERTY prop,
150                      int index,
151                      int defaultValue) {
152     QTreeWidget *qw;
153 
154     qw=(QTreeWidget*) GWEN_Widget_GetImplData(_widget, QT4_DIALOG_WIDGET_REAL);
155     assert(qw);
156 
157     switch(prop) {
158     case GWEN_DialogProperty_Value: {
159       QTreeWidgetItem *item;
160       int i=-1;
161 
162       item=qw->currentItem();
163       while(item) {
164         item=qw->itemAbove(item);
165         i++;
166       }
167 
168       return i;
169     }
170 
171     case GWEN_DialogProperty_ColumnWidth:
172       return qw->columnWidth(index);
173 
174     case GWEN_DialogProperty_SelectionMode:
175       switch(qw->selectionMode()) {
176       case QAbstractItemView::NoSelection:
177         return GWEN_Dialog_SelectionMode_None;
178       case QAbstractItemView::SingleSelection:
179         return GWEN_Dialog_SelectionMode_Single;
180       case QAbstractItemView::ExtendedSelection:
181         return GWEN_Dialog_SelectionMode_Multi;
182       default:
183         break;
184       }
185       DBG_ERROR(GWEN_LOGDOMAIN, "Unknown SelectionMode %d",
186                 qw->selectionMode());
187       return GWEN_ERROR_INVALID;
188 
189     case GWEN_DialogProperty_SortDirection:
190       if (qw->sortColumn()!=index)
191         return GWEN_DialogSortDirection_None;
192       else {
193         switch(qw->header()->sortIndicatorOrder()) {
194         case Qt::AscendingOrder:
195           return GWEN_DialogSortDirection_Up;
196         case Qt::DescendingOrder:
197           return GWEN_DialogSortDirection_Down;
198         default:
199           return GWEN_DialogSortDirection_None;
200         }
201       }
202       break;
203 
204     default:
205       return Qt4_W_Widget::getIntProperty(prop, index, defaultValue);
206     }
207   };
208 
209 
210 
setCharProperty(GWEN_DIALOG_PROPERTY prop,int index,const char * value,int doSignal)211   int setCharProperty(GWEN_DIALOG_PROPERTY prop,
212                       int index,
213                       const char *value,
214                       int doSignal) {
215     QTreeWidget *qw;
216     QString text;
217 
218     qw=(QTreeWidget*) GWEN_Widget_GetImplData(_widget, QT4_DIALOG_WIDGET_REAL);
219     assert(qw);
220 
221     if (value)
222       text=QT4_Gui::extractHtml(value);
223 
224     switch(prop) {
225     case GWEN_DialogProperty_Title: {
226       QString str;
227       QString t;
228       QStringList sl;
229       int n=0;
230 
231       /* remove all columns */
232       qw->header()->reset();
233 
234       str=text;
235       while(!(t=str.section('\t', n, n)).isEmpty()) {
236         sl+=t;
237         n++;
238       }
239       qw->setHeaderLabels(sl);
240       return 0;
241     }
242 
243     case GWEN_DialogProperty_ClearValues:
244       qw->clear();
245       return 0;
246 
247     case GWEN_DialogProperty_AddValue: {
248       QString t;
249       int n=0;
250       QStringList sl;
251 
252       QString str=text;
253       while(!(t=str.section('\t', n, n)).isEmpty()) {
254         sl+=t;
255         n++;
256       }
257       (void)new QTreeWidgetItem(qw, sl);
258       return 0;
259     }
260 
261     default:
262       return Qt4_W_Widget::setCharProperty(prop, index, value, doSignal);
263     }
264   };
265 
266 
267 
getCharProperty(GWEN_DIALOG_PROPERTY prop,int index,const char * defaultValue)268   const char *getCharProperty(GWEN_DIALOG_PROPERTY prop,
269                               int index,
270                               const char *defaultValue) {
271     QTreeWidget *qw;
272     QString str;
273 
274     qw=(QTreeWidget*) GWEN_Widget_GetImplData(_widget, QT4_DIALOG_WIDGET_REAL);
275     assert(qw);
276 
277     switch(prop) {
278     case GWEN_DialogProperty_Title: {
279       QTreeWidgetItem *item;
280 
281       item=qw->headerItem();
282       if (item) {
283         int i;
284 
285         for (i=0; i<qw->columnCount(); i++) {
286           if (i)
287             str+='\t';
288           str+=item->text(i);
289         }
290         if (str.isEmpty())
291           return defaultValue;
292         else {
293           GWEN_Widget_SetText(_widget, QT4_DIALOG_STRING_TITLE, str.toUtf8());
294           return GWEN_Widget_GetText(_widget, QT4_DIALOG_STRING_TITLE);
295         }
296       }
297       return defaultValue;
298     }
299 
300     case GWEN_DialogProperty_Value: {
301       QTreeWidgetItem *item;
302       int i;
303 
304       item=qw->topLevelItem(index);
305 
306       if (item==NULL) {
307         DBG_ERROR(GWEN_LOGDOMAIN, "Value %d out of range", index);
308         return defaultValue;
309       }
310 
311       for (i=0; i<qw->columnCount(); i++) {
312         if (i)
313           str+='\t';
314         str+=item->text(i);
315       }
316       if (str.isEmpty())
317         return defaultValue;
318       else {
319         GWEN_Widget_SetText(_widget, QT4_DIALOG_STRING_VALUE, str.toUtf8());
320         return GWEN_Widget_GetText(_widget, QT4_DIALOG_STRING_VALUE);
321       }
322     }
323 
324     default:
325       return Qt4_W_Widget::getCharProperty(prop, index, defaultValue);
326     }
327   };
328 
329 };
330 
331 
332 
333 
334 
335 
336 
337