1 #include <lib/service/listboxservice.h>
2 #include <lib/service/service.h>
3 #include <lib/gdi/font.h>
4 #include <lib/dvb/epgcache.h>
6 void eListboxServiceContent::setRoot(const eServiceReference &root)
11 assert(m_service_center);
13 ePtr<iListableService> lst;
14 if (m_service_center->list(m_root, lst))
15 eDebug("no list available!");
17 if (lst->getContent(m_list))
18 eDebug("getContent failed");
20 m_size = m_list.size();
24 m_listbox->entryReset();
27 void eListboxServiceContent::setCurrent(const eServiceReference &ref)
30 for (list::iterator i(m_list.begin()); i != m_list.end(); ++i, ++index)
34 m_cursor_number = index;
39 void eListboxServiceContent::getCurrent(eServiceReference &ref)
44 ref = eServiceReference();
47 int eListboxServiceContent::getNextBeginningWithChar(char c)
49 // printf("Char: %c\n", c);
51 for (list::iterator i(m_list.begin()); i != m_list.end(); ++i, ++index)
54 ePtr<iStaticServiceInformation> service_info;
55 m_service_center->info(*i, service_info);
56 service_info->getName(*i, text);
57 // printf("%c\n", text.c_str()[0]);
58 if (text.c_str()[0] == c)
64 void eListboxServiceContent::initMarked()
69 void eListboxServiceContent::addMarked(const eServiceReference &ref)
73 m_listbox->entryChanged(lookupService(ref));
76 void eListboxServiceContent::removeMarked(const eServiceReference &ref)
80 m_listbox->entryChanged(lookupService(ref));
83 int eListboxServiceContent::isMarked(const eServiceReference &ref)
85 return m_marked.find(ref) != m_marked.end();
88 void eListboxServiceContent::markedQueryStart()
90 m_marked_iterator = m_marked.begin();
93 int eListboxServiceContent::markedQueryNext(eServiceReference &ref)
95 if (m_marked_iterator == m_marked.end())
97 ref = *m_marked_iterator++;
101 int eListboxServiceContent::lookupService(const eServiceReference &ref)
103 /* shortcut for cursor */
104 if (ref == *m_cursor)
105 return m_cursor_number;
106 /* otherwise, search in the list.. */
108 for (list::const_iterator i(m_list.begin()); i != m_list.end(); ++i, ++index);
110 /* this is ok even when the index was not found. */
114 void eListboxServiceContent::setVisualMode(int mode)
116 m_visual_mode = mode;
118 if (m_visual_mode == visModeSimple)
120 m_element_position[celServiceName] = eRect(ePoint(0, 0), m_itemsize);
121 m_element_font[celServiceName] = new gFont("Arial", 23);
122 m_element_position[celServiceNumber] = eRect();
123 m_element_font[celServiceNumber] = 0;
124 m_element_position[celIcon] = eRect();
125 m_element_position[celServiceInfo] = eRect();
126 m_element_font[celServiceInfo] = 0;
130 void eListboxServiceContent::setElementPosition(int element, eRect where)
132 if ((element >= 0) && (element < celElements))
133 m_element_position[element] = where;
136 void eListboxServiceContent::setElementFont(int element, gFont *font)
138 if ((element >= 0) && (element < celElements))
139 m_element_font[element] = font;
142 void eListboxServiceContent::sort()
144 ePtr<iListableService> lst;
145 if (!m_service_center->list(m_root, lst))
147 m_list.sort(iListableServiceCompare(lst));
148 /* FIXME: is this really required or can we somehow keep the current entry? */
151 m_listbox->entryReset();
155 DEFINE_REF(eListboxServiceContent);
157 eListboxServiceContent::eListboxServiceContent()
158 :epgcache(eEPGCache::getInstance()), m_visual_mode(visModeSimple), m_size(0), m_current_marked(false), m_numberoffset(0)
161 eServiceCenter::getInstance(m_service_center);
164 void eListboxServiceContent::cursorHome()
166 if (m_current_marked && m_saved_cursor == m_list.end())
168 while (m_cursor_number)
170 std::iter_swap(m_cursor--, m_cursor);
172 if (m_listbox && m_cursor_number)
173 m_listbox->entryChanged(m_cursor_number);
178 m_cursor = m_list.begin();
183 void eListboxServiceContent::cursorEnd()
185 if (m_current_marked && m_saved_cursor == m_list.end())
187 while (m_cursor != m_list.end())
189 list::iterator prev = m_cursor++;
191 if ( prev != m_list.end() && m_cursor != m_list.end() )
193 std::iter_swap(m_cursor, prev);
195 m_listbox->entryChanged(m_cursor_number);
201 m_cursor = m_list.end();
202 m_cursor_number = m_size;
206 int eListboxServiceContent::setCurrentMarked(bool state)
208 bool prev = m_current_marked;
209 m_current_marked = state;
211 if (state != prev && m_listbox)
213 m_listbox->entryChanged(m_cursor_number);
216 ePtr<iListableService> lst;
217 if (m_service_center->list(m_root, lst))
218 eDebug("no list available!");
221 ePtr<iMutableServiceList> list;
222 if (lst->startEdit(list))
223 eDebug("no editable list");
226 eServiceReference ref;
229 eDebug("no valid service selected");
232 int pos = cursorGet();
233 eDebugNoNewLine("move %s to %d ", ref.toString().c_str(), pos);
234 if (list->moveService(ref, cursorGet()))
247 int eListboxServiceContent::cursorMove(int count)
249 int prev = m_cursor_number, last = m_cursor_number + count;
252 while(count && m_cursor != m_list.end())
254 list::iterator prev_it = m_cursor++;
255 if ( m_current_marked && m_cursor != m_list.end() && m_saved_cursor == m_list.end() )
257 std::iter_swap(prev_it, m_cursor);
258 if ( m_listbox && prev != m_cursor_number && last != m_cursor_number )
259 m_listbox->entryChanged(m_cursor_number);
264 } else if (count < 0)
266 while (count && m_cursor != m_list.begin())
268 list::iterator prev_it = m_cursor--;
269 if ( m_current_marked && m_cursor != m_list.end() && prev_it != m_list.end() && m_saved_cursor == m_list.end() )
271 std::iter_swap(prev_it, m_cursor);
272 if ( m_listbox && prev != m_cursor_number && last != m_cursor_number )
273 m_listbox->entryChanged(m_cursor_number);
282 int eListboxServiceContent::cursorValid()
284 return m_cursor != m_list.end();
287 int eListboxServiceContent::cursorSet(int n)
295 int eListboxServiceContent::cursorGet()
297 return m_cursor_number;
300 void eListboxServiceContent::cursorSave()
302 m_saved_cursor = m_cursor;
303 m_saved_cursor_number = m_cursor_number;
306 void eListboxServiceContent::cursorRestore()
308 m_cursor = m_saved_cursor;
309 m_cursor_number = m_saved_cursor_number;
310 m_saved_cursor = m_list.end();
313 int eListboxServiceContent::size()
318 void eListboxServiceContent::setSize(const eSize &size)
321 setVisualMode(m_visual_mode);
324 void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected)
326 painter.clip(eRect(offset, m_itemsize));
328 if (m_current_marked && selected)
329 style.setStyle(painter, eWindowStyle::styleListboxMarked);
330 else if (cursorValid() && isMarked(*m_cursor))
331 style.setStyle(painter, eWindowStyle::styleListboxMarked);
333 style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal);
338 /* get service information */
339 ePtr<iStaticServiceInformation> service_info;
340 m_service_center->info(*m_cursor, service_info);
342 for (int e = 0; e < celElements; ++e)
344 if (!m_element_font[e])
346 int flags=gPainter::RT_VALIGN_CENTER;
348 eRect area = m_element_position[e];
350 std::string text = "<n/a>";
355 // render icon here...
357 case celServiceNumber:
360 sprintf(bla, "%d", m_numberoffset + m_cursor_number + 1);
362 flags|=gPainter::RT_HALIGN_RIGHT;
368 service_info->getName(*m_cursor, text);
373 ePtr<eServiceEvent> evt;
375 if ( !epgcache->lookupEventTime(*m_cursor, t, evt) )
376 text = '(' + evt->getEventName() + ')';
383 eTextPara *para = new eTextPara(area);
385 para->setFont(m_element_font[e]);
386 para->renderString(text);
388 if (e == celServiceName)
390 eRect bbox = para->getBoundBox();
391 int name_width = bbox.width()+10;
392 m_element_position[celServiceInfo].setLeft(area.left()+name_width);
393 m_element_position[celServiceInfo].setTop(area.top());
394 m_element_position[celServiceInfo].setWidth(area.width()-name_width);
395 m_element_position[celServiceInfo].setHeight(area.height());
398 if (flags & gPainter::RT_HALIGN_RIGHT)
399 para->realign(eTextPara::dirRight);
400 else if (flags & gPainter::RT_HALIGN_CENTER)
401 para->realign(eTextPara::dirCenter);
402 else if (flags & gPainter::RT_HALIGN_BLOCK)
403 para->realign(eTextPara::dirBlock);
405 ePoint offs = offset;
407 if (flags & gPainter::RT_VALIGN_CENTER)
409 eRect bbox = para->getBoundBox();
410 int vcentered_top = (area.height() - bbox.height()) / 2;
411 int correction = vcentered_top - bbox.top();
412 offs += ePoint(0, correction);
415 painter.renderPara(para, offs);
419 style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry);