fixed: Go to parent folder froms keyboard overruns the directory base
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / GUIWindowTV.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 /* Standart includes */
23 #include "Application.h"
24 #include "GUIWindowManager.h"
25 #include "URL.h"
26 #include "MediaManager.h"
27 #include "LocalizeStrings.h"
28 #include "utils/log.h"
29 #include "GUISettings.h"
30 #include "Settings.h"
31 #include "FileSystem/File.h"
32 #include "Picture.h"
33 #include "MediaManager.h"
34
35 /* Dialog windows includes */
36 #include "GUIDialogFileBrowser.h"
37 #include "GUIDialogProgress.h"
38 #include "GUIDialogYesNo.h"
39 #include "GUIDialogOK.h"
40 #include "GUIDialogNumeric.h"
41 #include "GUIDialogKeyboard.h"
42 #include "GUIDialogPVRGuideInfo.h"
43 #include "GUIDialogPVRRecordingInfo.h"
44 #include "GUIDialogPVRTimerSettings.h"
45 #include "GUIDialogPVRGroupManager.h"
46 #include "GUIDialogPVRGuideSearch.h"
47 #include "GUIUserMessages.h"
48 #include "GUIEPGGridContainer.h"
49
50 /* self include */
51 #include "GUIWindowTV.h"
52
53 /* TV control */
54 #include "PVRManager.h"
55
56
57 using namespace std;
58
59 #define CONTROL_LIST_TIMELINE        10
60 #define CONTROL_LIST_CHANNELS_TV     11
61 #define CONTROL_LIST_CHANNELS_RADIO  12
62 #define CONTROL_LIST_RECORDINGS      13
63 #define CONTROL_LIST_TIMERS          14
64 #define CONTROL_LIST_GUIDE_CHANNEL   15
65 #define CONTROL_LIST_GUIDE_NOW_NEXT  16
66 #define CONTROL_LIST_SEARCH          17
67
68 #define CONTROL_LABELHEADER          29
69 #define CONTROL_LABELGROUP           30
70
71 #define CONTROL_BTNGUIDE             31
72 #define CONTROL_BTNCHANNELS_TV       32
73 #define CONTROL_BTNCHANNELS_RADIO    33
74 #define CONTROL_BTNRECORDINGS        34
75 #define CONTROL_BTNTIMERS            35
76 #define CONTROL_BTNSEARCH            36
77 #define CONTROL_BTNGUIDE_CHANNEL     37
78 #define CONTROL_BTNGUIDE_NOW         38
79 #define CONTROL_BTNGUIDE_NEXT        39
80 #define CONTROL_BTNGUIDE_TIMELINE    40
81
82 #define GUIDE_VIEW_CHANNEL          0
83 #define GUIDE_VIEW_NOW              1
84 #define GUIDE_VIEW_NEXT             2
85 #define GUIDE_VIEW_TIMELINE         3
86
87 /**
88  * \brief Class constructor
89  */
90 CGUIWindowTV::CGUIWindowTV(void) : CGUIMediaWindow(WINDOW_TV, "MyTV.xml")
91 {
92   m_iCurrSubTVWindow              = TV_WINDOW_UNKNOWN;
93   m_iSavedSubTVWindow             = TV_WINDOW_UNKNOWN;
94   m_iSelected_GUIDE               = 0;
95   m_iSelected_CHANNELS_TV         = 0;
96   m_iSelected_CHANNELS_RADIO      = 0;
97   m_iSelected_RECORDINGS          = 0;
98   m_iSelected_RECORDINGS_Path     = "pvr://recordings/";
99   m_iSelected_TIMERS              = 0;
100   m_iSelected_SEARCH              = 0;
101   m_iCurrentTVGroup               = -1;
102   m_iCurrentRadioGroup            = -1;
103   m_bShowHiddenChannels           = false;
104   m_bSearchStarted                = false;
105   m_bSearchConfirmed              = false;
106   m_iGuideView                    = GUIDE_VIEW_CHANNEL;
107   m_guideGrid                     = NULL;
108   m_iSortOrder_SEARCH             = SORT_ORDER_ASC;
109   m_iSortMethod_SEARCH            = SORT_METHOD_DATE;
110 }
111
112 CGUIWindowTV::~CGUIWindowTV()
113 {
114 }
115
116 bool CGUIWindowTV::OnMessage(CGUIMessage& message)
117 {
118   unsigned int iControl = 0;
119   unsigned int iMessage = message.GetMessage();
120
121   if (iMessage == GUI_MSG_FOCUSED)
122   {
123     /* Get the focused control Identifier */
124     iControl = message.GetControlId();
125
126     /* Process Identifier for focused Subwindow select buttons or list item.
127      * If a new conrol becomes highlighted load his subwindow data
128      */
129     if (iControl == CONTROL_BTNGUIDE || m_iSavedSubTVWindow == TV_WINDOW_TV_PROGRAM)
130     {
131       if (m_iCurrSubTVWindow != TV_WINDOW_TV_PROGRAM)
132         UpdateGuide();
133       else
134         m_iSelected_GUIDE = m_viewControl.GetSelectedItem();
135
136       m_iCurrSubTVWindow = TV_WINDOW_TV_PROGRAM;
137     }
138     else if (iControl == CONTROL_BTNCHANNELS_TV || m_iSavedSubTVWindow == TV_WINDOW_CHANNELS_TV)
139     {
140       if (m_iCurrSubTVWindow != TV_WINDOW_CHANNELS_TV)
141         UpdateChannelsTV();
142       else
143         m_iSelected_CHANNELS_TV = m_viewControl.GetSelectedItem();
144
145       m_iCurrSubTVWindow = TV_WINDOW_CHANNELS_TV;
146     }
147     else if (iControl == CONTROL_BTNCHANNELS_RADIO || m_iSavedSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
148     {
149       if (m_iCurrSubTVWindow != TV_WINDOW_CHANNELS_RADIO)
150         UpdateChannelsRadio();
151       else
152         m_iSelected_CHANNELS_RADIO = m_viewControl.GetSelectedItem();
153
154       m_iCurrSubTVWindow = TV_WINDOW_CHANNELS_RADIO;
155     }
156     else if (iControl == CONTROL_BTNRECORDINGS || m_iSavedSubTVWindow == TV_WINDOW_RECORDINGS)
157     {
158       if (m_iCurrSubTVWindow != TV_WINDOW_RECORDINGS)
159         UpdateRecordings();
160       else
161       {
162         m_iSelected_RECORDINGS_Path = m_vecItems->m_strPath;
163         m_iSelected_RECORDINGS = m_viewControl.GetSelectedItem();
164       }
165
166       m_iCurrSubTVWindow = TV_WINDOW_RECORDINGS;
167     }
168     else if (iControl == CONTROL_BTNTIMERS || m_iSavedSubTVWindow == TV_WINDOW_TIMERS)
169     {
170       if (m_iCurrSubTVWindow != TV_WINDOW_TIMERS)
171         UpdateTimers();
172       else
173         m_iSelected_TIMERS =  m_viewControl.GetSelectedItem();
174
175       m_iCurrSubTVWindow = TV_WINDOW_TIMERS;
176     }
177     else if (iControl == CONTROL_BTNSEARCH || m_iSavedSubTVWindow == TV_WINDOW_SEARCH)
178     {
179       if (m_iCurrSubTVWindow != TV_WINDOW_SEARCH)
180         UpdateSearch();
181       else
182         m_iSelected_SEARCH = m_viewControl.GetSelectedItem();
183
184       m_iCurrSubTVWindow = TV_WINDOW_SEARCH;
185     }
186
187     if (m_iSavedSubTVWindow != TV_WINDOW_UNKNOWN)
188       m_iSavedSubTVWindow = TV_WINDOW_UNKNOWN;
189   }
190   else if (iMessage == GUI_MSG_CLICKED)
191   {
192     iControl = message.GetSenderId();
193
194     if (iControl == CONTROL_BTNGUIDE)
195     {
196       m_iGuideView++;
197
198       if (m_iGuideView > GUIDE_VIEW_TIMELINE)
199       {
200         m_iGuideView = 0;
201       }
202
203       UpdateGuide();
204       return true;
205     }
206     else if (iControl == CONTROL_BTNGUIDE_CHANNEL)
207     {
208       m_iGuideView = GUIDE_VIEW_CHANNEL;
209       UpdateGuide();
210       return true;
211     }
212     else if (iControl == CONTROL_BTNGUIDE_NOW)
213     {
214       m_iGuideView = GUIDE_VIEW_NOW;
215       UpdateGuide();
216       return true;
217     }
218     else if (iControl == CONTROL_BTNGUIDE_NEXT)
219     {
220       m_iGuideView = GUIDE_VIEW_NEXT;
221       UpdateGuide();
222       return true;
223     }
224     else if (iControl == CONTROL_BTNGUIDE_TIMELINE)
225     {
226       m_iGuideView = GUIDE_VIEW_TIMELINE;
227       UpdateGuide();
228       return true;
229     }
230     else if (iControl == CONTROL_BTNCHANNELS_TV)
231     {
232       m_iCurrentTVGroup = PVRChannelGroups.GetNextGroupID(m_iCurrentTVGroup);
233       UpdateChannelsTV();
234       return true;
235     }
236     else if (iControl == CONTROL_BTNCHANNELS_RADIO)
237     {
238       m_iCurrentRadioGroup = PVRChannelGroups.GetNextGroupID(m_iCurrentRadioGroup);
239       UpdateChannelsRadio();
240       return true;
241     }
242     else if (iControl == CONTROL_BTNRECORDINGS)
243     {
244       g_PVRManager.TriggerRecordingsUpdate();
245       UpdateRecordings();
246       return true;
247     }
248     else if (iControl == CONTROL_BTNTIMERS)
249     {
250       PVRTimers.Update();
251       UpdateTimers();
252       return true;
253     }
254     else if (iControl == CONTROL_BTNSEARCH)
255     {
256       ShowSearchResults();
257     }
258     else if (iControl == CONTROL_LIST_TIMELINE ||
259              iControl == CONTROL_LIST_GUIDE_CHANNEL ||
260              iControl == CONTROL_LIST_GUIDE_NOW_NEXT)
261     {
262       int iAction = message.GetParam1();
263       int iItem = m_viewControl.GetSelectedItem();
264
265       /* Check file item is in list range and get his pointer */
266       if (iItem < 0 || iItem >= (int)m_vecItems->Size()) return true;
267
268       CFileItemPtr pItem = m_vecItems->Get(iItem);
269
270       /* Process actions */
271       if ((iAction == ACTION_SELECT_ITEM) || (iAction == ACTION_SHOW_INFO || iAction == ACTION_MOUSE_LEFT_CLICK))
272       {
273         /* Show information Dialog */
274         ShowEPGInfo(pItem.get());
275         return true;
276       }
277       else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK)
278       {
279         /* Show Contextmenu */
280         OnPopupMenu(iItem);
281         return true;
282       }
283       else if (iAction == ACTION_RECORD)
284       {
285         if (pItem->GetEPGInfoTag()->ChannelNumber() != -1)
286         {
287           if (pItem->GetEPGInfoTag()->Timer() == NULL)
288           {
289             // prompt user for confirmation of channel record
290             CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
291             if (!pDialog)
292               return false;
293
294             pDialog->SetHeading(264);
295             pDialog->SetLine(0, "");
296             pDialog->SetLine(1, pItem->GetEPGInfoTag()->Title());
297             pDialog->SetLine(2, "");
298             pDialog->DoModal();
299
300             if (!pDialog->IsConfirmed())
301               return true;
302
303             cPVRTimerInfoTag newtimer(*pItem.get());
304             CFileItem *item = new CFileItem(newtimer);
305
306             if (cPVRTimers::AddTimer(*item))
307               cPVREpgs::SetVariableData(m_vecItems);
308           }
309           else
310           {
311             CGUIDialogOK::ShowAndGetInput(19033,19034,0,0);
312           }
313         }
314       }
315       else if (iAction == ACTION_PLAY)
316       {
317         CStdString filename;
318         if (!pItem->GetEPGInfoTag()->IsRadio())
319           filename.Format("pvr://channels/tv/all/%i.pvr", pItem->GetEPGInfoTag()->ChannelNumber());
320         else
321           filename.Format("pvr://channels/radio/all/%i.pvr", pItem->GetEPGInfoTag()->ChannelNumber());
322
323         if (!g_application.PlayFile(CFileItem(cPVRChannels::GetByPath(filename))))
324         {
325           CGUIDialogOK::ShowAndGetInput(19033,0,19035,0);
326           return false;
327         }
328         return true;
329       }
330     }
331     else if ((iControl == CONTROL_LIST_CHANNELS_TV) || (iControl == CONTROL_LIST_CHANNELS_RADIO))
332     {
333       /* Get currently performed action */
334       int iAction = message.GetParam1();
335
336       /* Get currently selected item from file list */
337       int iItem = m_viewControl.GetSelectedItem();
338
339       /* Check file item is in list range and get his pointer */
340       if (iItem < 0 || iItem >= (int)m_vecItems->Size()) return true;
341
342       CFileItemPtr pItem = m_vecItems->Get(iItem);
343
344       /* Process actions */
345       if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)
346       {
347         /* Check if "Add channel..." entry is pressed by OK, if yes
348            create a new channel and open settings dialog, otherwise
349            open channel with player */
350         if (pItem->m_strPath == "pvr://channels/.add.channel")
351         {
352           CGUIDialogOK::ShowAndGetInput(19033,0,19038,0);
353         }
354         else
355         {
356           if (iControl == CONTROL_LIST_CHANNELS_TV)
357             g_PVRManager.SetPlayingGroup(m_iCurrentTVGroup);
358           if (iControl == CONTROL_LIST_CHANNELS_RADIO)
359             g_PVRManager.SetPlayingGroup(m_iCurrentRadioGroup);
360
361           /* Open tv channel by Player and return */
362           return PlayFile(pItem.get());
363         }
364       }
365       else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK)
366       {
367         //contextmenu
368         OnPopupMenu(iItem);
369         return true;
370       }
371       else if (iAction == ACTION_SHOW_INFO)
372       {
373         /* Show information Dialog */
374         ShowEPGInfo(pItem.get());
375         return true;
376       }
377       else if (iAction == ACTION_DELETE_ITEM)
378       {
379         /* Check if entry is a valid deleteable channel */
380         int iChannel = pItem->GetPVRChannelInfoTag()->Number();
381
382         if (iChannel != -1)
383         {
384           CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
385
386           if (pDialog)
387           {
388             pDialog->SetHeading(19039);
389             pDialog->SetLine(0, "");
390             pDialog->SetLine(1, pItem->GetPVRChannelInfoTag()->Name());
391             pDialog->SetLine(2, "");
392             pDialog->DoModal();
393
394             if (!pDialog->IsConfirmed()) return false;
395
396             if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
397             {
398               PVRChannelsTV.HideChannel(pItem->GetPVRChannelInfoTag()->Number());
399               UpdateChannelsTV();
400             }
401             else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
402             {
403               PVRChannelsRadio.HideChannel(pItem->GetPVRChannelInfoTag()->Number());
404               UpdateChannelsRadio();
405             }
406           }
407           return true;
408         }
409       }
410     }
411     else if (iControl == CONTROL_LIST_RECORDINGS)
412     {
413       /* Get currently performed action */
414       int iAction = message.GetParam1();
415
416       /* Get currently selected item from file list */
417       int iItem = m_viewControl.GetSelectedItem();
418
419       /* Check file item is in list range and get his pointer */
420       if (iItem < 0 || iItem >= (int)m_vecItems->Size()) return true;
421
422       CFileItemPtr pItem = m_vecItems->Get(iItem);
423       if (pItem->m_bIsFolder || pItem->IsParentFolder())
424         return OnClick(iItem);
425
426       /* Process actions */
427       if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)
428       {
429         /* Open recording with Player and return */
430         return PlayFile(pItem.get());
431       }
432       else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK)
433       {
434         //contextmenu
435         OnPopupMenu(iItem);
436         return true;
437       }
438       else if (iAction == ACTION_SHOW_INFO)
439       {
440         /* Show information Dialog */
441         ShowRecordingInfo(pItem.get());
442         return true;
443       }
444       else if (iAction == ACTION_DELETE_ITEM)
445       {
446         /* Check if entry is a valid deleteable record */
447         if (pItem->GetPVRRecordingInfoTag()->ClientIndex() != -1)
448         {
449           // prompt user for confirmation of record deletion
450           CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
451           if (!pDialog)
452             return false;
453
454           pDialog->SetHeading(122);
455           pDialog->SetLine(0, 19043);
456           pDialog->SetLine(1, "");
457           pDialog->SetLine(2, pItem->GetPVRRecordingInfoTag()->Title());
458           pDialog->DoModal();
459
460           if (pDialog->IsConfirmed())
461           {
462             if (cPVRRecordings::DeleteRecording(*pItem))
463             {
464               PVRRecordings.Update(true);
465               UpdateRecordings();
466             }
467           }
468           return true;
469         }
470       }
471     }
472     else if (iControl == CONTROL_LIST_TIMERS)
473     {
474       /* Get currently performed action */
475       int iAction = message.GetParam1();
476
477       /* Get currently selected item from file list */
478       int iItem = m_viewControl.GetSelectedItem();
479
480       /* Check file item is in list range and get his pointer */
481       if (iItem < 0 || iItem >= (int)m_vecItems->Size()) return true;
482
483       CFileItemPtr pItem = m_vecItems->Get(iItem);
484
485       /* Process actions */
486       if (iAction == ACTION_SHOW_INFO || iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)
487       {
488         /* Check if "Add timer..." entry is pressed by OK, if yes
489            create a new timer and open settings dialog, otherwise
490            open settings for selected timer entry */
491         if (pItem->m_strPath == "pvr://timers/add.timer")
492         {
493           cPVRTimerInfoTag newtimer(true);
494           CFileItem *item = new CFileItem(newtimer);
495
496           if (ShowTimerSettings(item))
497           {
498             /* Add timer to backend */
499             cPVRTimers::AddTimer(*item);
500             UpdateTimers();
501           }
502         }
503         else
504         {
505           CFileItem fileitem(*pItem);
506
507           if (ShowTimerSettings(&fileitem))
508           {
509             /* Update timer on pvr backend */
510             cPVRTimers::UpdateTimer(fileitem);
511             UpdateTimers();
512           }
513         }
514
515         return true;
516       }
517       else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK)
518       {
519         //contextmenu
520         OnPopupMenu(iItem);
521         return true;
522       }
523       else if (iAction == ACTION_DELETE_ITEM)
524       {
525         /* Check if entry is a valid deleteable timer */
526         if (pItem->GetPVRTimerInfoTag()->ClientIndex() != -1)
527         {
528           // prompt user for confirmation of timer deletion
529           CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
530           if (!pDialog)
531             return false;
532
533           pDialog->SetHeading(122);
534           pDialog->SetLine(0, 19040);
535           pDialog->SetLine(1, "");
536           pDialog->SetLine(2, pItem->GetPVRTimerInfoTag()->Title());
537           pDialog->DoModal();
538
539           if (pDialog->IsConfirmed())
540           {
541             cPVRTimers::DeleteTimer(*pItem);
542             UpdateTimers();
543           }
544           return true;
545         }
546       }
547     }
548     else if (iControl == CONTROL_LIST_SEARCH)
549     {
550       /* Get currently performed action */
551       int iAction = message.GetParam1();
552
553       /* Get currently selected item from file list */
554       int iItem = m_viewControl.GetSelectedItem();
555
556       /* Check file item is in list range and get his pointer */
557       if (iItem < 0 || iItem >= (int)m_vecItems->Size()) return true;
558
559       CFileItemPtr pItem = m_vecItems->Get(iItem);
560
561       /* Process actions */
562       if (iAction == ACTION_SHOW_INFO || iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)
563       {
564         if (pItem->m_strPath == "pvr://guide/searchresults/empty.epg")
565           ShowSearchResults();
566         else
567           ShowEPGInfo(pItem.get());
568
569         return true;
570       }
571       else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK)
572       {
573         /* Show context menu */
574         OnPopupMenu(iItem);
575         return true;
576       }
577       else if (iAction == ACTION_RECORD)
578       {
579         if (pItem->GetEPGInfoTag()->ChannelNumber() != -1)
580         {
581           if (pItem->GetEPGInfoTag()->Timer() == NULL)
582           {
583             // prompt user for confirmation of channel record
584             CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
585             if (!pDialog)
586               return false;
587
588             pDialog->SetHeading(264);
589             pDialog->SetLine(0, "");
590             pDialog->SetLine(1, pItem->GetEPGInfoTag()->Title());
591             pDialog->SetLine(2, "");
592             pDialog->DoModal();
593
594             if (!pDialog->IsConfirmed())
595               return true;
596
597             cPVRTimerInfoTag newtimer(*pItem.get());
598             CFileItem *item = new CFileItem(newtimer);
599
600             if (cPVRTimers::AddTimer(*item))
601               cPVREpgs::SetVariableData(m_vecItems);
602           }
603           else
604             CGUIDialogOK::ShowAndGetInput(19033,19034,0,0);
605         }
606       }
607     }
608   }
609   return CGUIMediaWindow::OnMessage(message);
610 }
611
612 bool CGUIWindowTV::OnAction(const CAction &action)
613 {
614   if (action.id == ACTION_PREVIOUS_MENU)
615   {
616     g_windowManager.PreviousWindow();
617     return true;
618   }
619   else if (action.id == ACTION_PARENT_DIR)
620   {
621     if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS && m_vecItems->m_strPath != "pvr://recordings/")
622       GoParentFolder();
623     return true;
624   }
625   return CGUIMediaWindow::OnAction(action);
626 }
627
628 void CGUIWindowTV::OnWindowLoaded()
629 {
630   CGUIMediaWindow::OnWindowLoaded();
631   m_viewControl.Reset();
632   m_viewControl.SetParentWindow(GetID());
633   m_viewControl.AddView(GetControl(CONTROL_LIST_TIMELINE));
634   m_viewControl.AddView(GetControl(CONTROL_LIST_CHANNELS_TV));
635   m_viewControl.AddView(GetControl(CONTROL_LIST_CHANNELS_RADIO));
636   m_viewControl.AddView(GetControl(CONTROL_LIST_RECORDINGS));
637   m_viewControl.AddView(GetControl(CONTROL_LIST_TIMERS));
638   m_viewControl.AddView(GetControl(CONTROL_LIST_GUIDE_CHANNEL));
639   m_viewControl.AddView(GetControl(CONTROL_LIST_GUIDE_NOW_NEXT));
640   m_viewControl.AddView(GetControl(CONTROL_LIST_SEARCH));
641 }
642
643 void CGUIWindowTV::OnWindowUnload()
644 {
645   /* Save current Subwindow selected list position */
646   if (m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM)
647     m_iSelected_GUIDE = m_viewControl.GetSelectedItem();
648   else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
649     m_iSelected_CHANNELS_TV = m_viewControl.GetSelectedItem();
650   else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
651     m_iSelected_CHANNELS_RADIO = m_viewControl.GetSelectedItem();
652   else if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS)
653   {
654     m_iSelected_RECORDINGS_Path = m_vecItems->m_strPath;
655     m_iSelected_RECORDINGS = m_viewControl.GetSelectedItem();
656   }
657   else if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS)
658     m_iSelected_TIMERS = m_viewControl.GetSelectedItem();
659   else if (m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
660     m_iSelected_SEARCH = m_viewControl.GetSelectedItem();
661
662   m_iSavedSubTVWindow = m_iCurrSubTVWindow;
663   m_iCurrSubTVWindow  = TV_WINDOW_UNKNOWN;
664
665   m_viewControl.Reset();
666   CGUIMediaWindow::OnWindowUnload();
667   return;
668 }
669
670 void CGUIWindowTV::OnInitWindow()
671 {
672   /* Make sure we have active running clients, otherwise return to
673    * Previous Window.
674    */
675   if (!g_PVRManager.HaveActiveClients())
676   {
677     g_windowManager.PreviousWindow();
678     CGUIDialogOK::ShowAndGetInput(19033,0,19045,19044);
679     return;
680   }
681
682   /* This is a bad way but the SetDefaults function use the first and last
683    * epg date which is not available on construction time, thats why we
684    * but it to Window initialization.
685    */
686   if (!m_bSearchStarted)
687   {
688     m_bSearchStarted = true;
689     m_searchfilter.SetDefaults();
690   }
691
692   if (m_iSavedSubTVWindow == TV_WINDOW_TV_PROGRAM)
693     m_viewControl.SetCurrentView(CONTROL_LIST_GUIDE_CHANNEL);
694   else if (m_iSavedSubTVWindow == TV_WINDOW_CHANNELS_TV)
695     m_viewControl.SetCurrentView(CONTROL_LIST_CHANNELS_TV);
696   else if (m_iSavedSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
697     m_viewControl.SetCurrentView(CONTROL_LIST_CHANNELS_RADIO);
698   else if (m_iSavedSubTVWindow == TV_WINDOW_RECORDINGS)
699     m_viewControl.SetCurrentView(CONTROL_LIST_RECORDINGS);
700   else if (m_iSavedSubTVWindow == TV_WINDOW_TIMERS)
701     m_viewControl.SetCurrentView(CONTROL_LIST_TIMERS);
702   else if (m_iSavedSubTVWindow == TV_WINDOW_SEARCH)
703     m_viewControl.SetCurrentView(CONTROL_LIST_SEARCH);
704
705   CGUIMediaWindow::OnInitWindow();
706   return;
707 }
708
709 void CGUIWindowTV::GetContextButtons(int itemNumber, CContextButtons &buttons)
710 {
711   /* Check file item is in list range and get his pointer */
712   if (itemNumber < 0 || itemNumber >= (int)m_vecItems->Size()) return;
713
714   CFileItemPtr pItem = m_vecItems->Get(itemNumber);
715
716   if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV || m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
717   {
718     if (itemNumber < 0 || itemNumber >= m_vecItems->Size())
719       return;
720
721     /* check that file item is in list and get his pointer*/
722     if (pItem->m_strPath == "pvr://channels/.add.channel")
723     {
724       /* If yes show only "New Channel" on context menu */
725       buttons.Add(CONTEXT_BUTTON_ADD, 19046);               /* Add new channel */
726     }
727     else
728     {
729       buttons.Add(CONTEXT_BUTTON_INFO, 19047);              /* Channel info button */
730       buttons.Add(CONTEXT_BUTTON_FIND, 19003);              /* Find similar program */
731       buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19000);         /* switch to channel */
732       buttons.Add(CONTEXT_BUTTON_SET_THUMB, 20019);         /* Set icon */
733       buttons.Add(CONTEXT_BUTTON_GROUP_MANAGER, 19048);     /* Group managment */
734       buttons.Add(CONTEXT_BUTTON_HIDE, m_bShowHiddenChannels ? 19049 : 19054);        /* HIDE CHANNEL */
735
736       if (m_vecItems->Size() > 1 && !m_bShowHiddenChannels)
737         buttons.Add(CONTEXT_BUTTON_MOVE, 116);              /* Move channel up or down */
738
739       if ((m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV && PVRChannelsTV.GetNumHiddenChannels() > 0) ||
740           (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO && PVRChannelsRadio.GetNumHiddenChannels() > 0) ||
741           m_bShowHiddenChannels)
742         buttons.Add(CONTEXT_BUTTON_SHOW_HIDDEN, m_bShowHiddenChannels ? 19050 : 19051);  /* SHOW HIDDEN CHANNELS */
743
744       CGUIMediaWindow::GetContextButtons(itemNumber, buttons);
745     }
746   }
747   else if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS)           /* Add recordings context buttons */
748   {
749     buttons.Add(CONTEXT_BUTTON_INFO, 19053);              /* Get Information of this recording */
750     buttons.Add(CONTEXT_BUTTON_FIND, 19003);              /* Find similar program */
751     buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 12021);         /* Play this recording */
752 //            buttons.Add(CONTEXT_BUTTON_RESUME_ITEM, 12022);
753     buttons.Add(CONTEXT_BUTTON_RENAME, 118);              /* Rename this recording */
754     buttons.Add(CONTEXT_BUTTON_DELETE, 117);              /* Delete this recording */
755   }
756   else if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS)           /* Add timer context buttons */
757   {
758     /* Check for a empty file item list, means only a
759         file item with the name "Add timer..." is present */
760     if (pItem->m_strPath == "pvr://timers/add.timer")
761     {
762       /* If yes show only "New Timer" on context menu */
763       buttons.Add(CONTEXT_BUTTON_ADD, 19056);             /* NEW TIMER */
764     }
765     else
766     {
767       /* If any timers are present show more */
768       buttons.Add(CONTEXT_BUTTON_EDIT, 19057);            /* Edit Timer */
769       buttons.Add(CONTEXT_BUTTON_ADD, 19056);             /* NEW TIMER */
770       buttons.Add(CONTEXT_BUTTON_ACTIVATE, 19058);        /* ON/OFF */
771       buttons.Add(CONTEXT_BUTTON_RENAME, 118);            /* Rename Timer */
772       buttons.Add(CONTEXT_BUTTON_DELETE, 117);            /* Delete Timer */
773     }
774   }
775   else if (m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM)
776   {
777     if (pItem->GetEPGInfoTag()->End() > CDateTime::GetCurrentDateTime())
778     {
779       if (pItem->GetEPGInfoTag()->Timer() == NULL)
780       {
781         if (pItem->GetEPGInfoTag()->Start() < CDateTime::GetCurrentDateTime())
782         {
783           buttons.Add(CONTEXT_BUTTON_START_RECORD, 264);             /* RECORD programme */
784         }
785         else
786         {
787           buttons.Add(CONTEXT_BUTTON_START_RECORD, 19061);
788         }
789       }
790       else
791       {
792         if (pItem->GetEPGInfoTag()->Start() < CDateTime::GetCurrentDateTime())
793         {
794           buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059);
795         }
796         else
797         {
798           buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060);
799         }
800       }
801     }
802
803     buttons.Add(CONTEXT_BUTTON_INFO, 658);               /* Epg info button */
804     buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19000);        /* Switch channel */
805     buttons.Add(CONTEXT_BUTTON_FIND, 19003);             /* Find similar program */
806     if (m_iGuideView == GUIDE_VIEW_TIMELINE)
807     {
808       buttons.Add(CONTEXT_BUTTON_BEGIN, 19063);          /* Go to begin */
809       buttons.Add(CONTEXT_BUTTON_END, 19064);            /* Go to end */
810     }
811   }
812   else if (m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
813   {
814     if (pItem->GetLabel() != g_localizeStrings.Get(19027))
815     {
816       if (pItem->GetEPGInfoTag()->End() > CDateTime::GetCurrentDateTime())
817       {
818         if (pItem->GetEPGInfoTag()->Timer() == NULL)
819         {
820           if (pItem->GetEPGInfoTag()->Start() < CDateTime::GetCurrentDateTime())
821             buttons.Add(CONTEXT_BUTTON_START_RECORD, 264);             /* RECORD programme */
822           else
823             buttons.Add(CONTEXT_BUTTON_START_RECORD, 19061);    /* Create a Timer */
824         }
825         else
826         {
827           if (pItem->GetEPGInfoTag()->Start() < CDateTime::GetCurrentDateTime())
828             buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059);     /* Stop recording */
829           else
830             buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060);     /* Delete Timer */
831         }
832       }
833
834       buttons.Add(CONTEXT_BUTTON_INFO, 658);              /* Epg info button */
835       buttons.Add(CONTEXT_BUTTON_USER1, 19062);           /* Sort by channel */
836       buttons.Add(CONTEXT_BUTTON_USER2, 103);             /* Sort by Name */
837       buttons.Add(CONTEXT_BUTTON_USER3, 104);             /* Sort by Date */
838       buttons.Add(CONTEXT_BUTTON_CLEAR, 20375);           /* Clear search results */
839     }
840   }
841 }
842
843 bool CGUIWindowTV::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
844 {
845   /* Check file item is in list range and get his pointer */
846   if (itemNumber < 0 || itemNumber >= (int)m_vecItems->Size()) return false;
847
848   CFileItemPtr pItem = m_vecItems->Get(itemNumber);
849
850   if (button == CONTEXT_BUTTON_PLAY_ITEM)
851   {
852     if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS)
853     {
854       return PlayFile(pItem.get());
855     }
856
857     if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV ||
858         m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
859     {
860       if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
861         g_PVRManager.SetPlayingGroup(m_iCurrentTVGroup);
862       if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
863         g_PVRManager.SetPlayingGroup(m_iCurrentRadioGroup);
864
865       return PlayFile(pItem.get());
866     }
867     else if (m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM)
868     {
869       CStdString filename;
870       if (!pItem->GetEPGInfoTag()->IsRadio())
871         filename.Format("pvr://channels/tv/all/%i.pvr", pItem->GetEPGInfoTag()->ChannelNumber());
872       else
873         filename.Format("pvr://channels/radio/all/%i.pvr", pItem->GetEPGInfoTag()->ChannelNumber());
874
875       if (!g_application.PlayFile(CFileItem(cPVRChannels::GetByPath(filename))))
876       {
877         CGUIDialogOK::ShowAndGetInput(19033,0,19035,0);
878         return false;
879       }
880     }
881   }
882   else if (button == CONTEXT_BUTTON_MOVE)
883   {
884     CStdString strIndex;
885     strIndex.Format("%i", pItem->GetPVRChannelInfoTag()->Number());
886     CGUIDialogNumeric::ShowAndGetNumber(strIndex, g_localizeStrings.Get(19052));
887     int newIndex = atoi(strIndex.c_str());
888
889     if (newIndex != pItem->GetPVRChannelInfoTag()->Number())
890     {
891       if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
892       {
893         PVRChannelsTV.MoveChannel(pItem->GetPVRChannelInfoTag()->Number(), newIndex);
894         UpdateChannelsTV();
895       }
896       else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
897       {
898         PVRChannelsRadio.MoveChannel(pItem->GetPVRChannelInfoTag()->Number(), newIndex);
899         UpdateChannelsRadio();
900       }
901     }
902   }
903   else if (button == CONTEXT_BUTTON_HIDE)
904   {
905     // prompt user for confirmation of channel hide
906     CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
907
908     if (pDialog)
909     {
910       pDialog->SetHeading(19039);
911       pDialog->SetLine(0, "");
912       pDialog->SetLine(1, pItem->GetPVRChannelInfoTag()->Name());
913       pDialog->SetLine(2, "");
914       pDialog->DoModal();
915
916       if (!pDialog->IsConfirmed()) return false;
917
918       if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
919       {
920         PVRChannelsTV.HideChannel(pItem->GetPVRChannelInfoTag()->Number());
921         UpdateChannelsTV();
922       }
923       else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
924       {
925         PVRChannelsRadio.HideChannel(pItem->GetPVRChannelInfoTag()->Number());
926         UpdateChannelsRadio();
927       }
928     }
929   }
930   else if (button == CONTEXT_BUTTON_SHOW_HIDDEN)
931   {
932     if (m_bShowHiddenChannels)
933       m_bShowHiddenChannels = false;
934     else
935       m_bShowHiddenChannels = true;
936
937     if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
938       UpdateChannelsTV();
939     else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
940       UpdateChannelsRadio();
941   }
942   else if (button == CONTEXT_BUTTON_SET_THUMB)
943   {
944     if (g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].canWriteSources() && !g_passwordManager.IsProfileLockUnlocked())
945       return false;
946     else if (!g_passwordManager.IsMasterLockUnlocked(true))
947       return false;
948
949     // setup our thumb list
950     CFileItemList items;
951
952     // add the current thumb, if available
953     if (!pItem->GetPVRChannelInfoTag()->Icon().IsEmpty())
954     {
955       CFileItemPtr current(new CFileItem("thumb://Current", false));
956       current->SetThumbnailImage(pItem->GetPVRChannelInfoTag()->Icon());
957       current->SetLabel(g_localizeStrings.Get(20016));
958       items.Add(current);
959     }
960     else if (pItem->HasThumbnail())
961     { // already have a thumb that the share doesn't know about - must be a local one, so we mayaswell reuse it.
962       CFileItemPtr current(new CFileItem("thumb://Current", false));
963       current->SetThumbnailImage(pItem->GetThumbnailImage());
964       current->SetLabel(g_localizeStrings.Get(20016));
965       items.Add(current);
966     }
967
968     // see if there's a local thumb for this item
969     CStdString folderThumb = pItem->GetFolderThumb();
970     if (XFILE::CFile::Exists(folderThumb))
971     { // cache it
972       if (CPicture::CreateThumbnail(folderThumb, pItem->GetCachedProgramThumb()))
973       {
974         CFileItemPtr local(new CFileItem("thumb://Local", false));
975         local->SetThumbnailImage(pItem->GetCachedProgramThumb());
976         local->SetLabel(g_localizeStrings.Get(20017));
977         items.Add(local);
978       }
979     }
980     // and add a "no thumb" entry as well
981     CFileItemPtr nothumb(new CFileItem("thumb://None", false));
982     nothumb->SetIconImage(pItem->GetIconImage());
983     nothumb->SetLabel(g_localizeStrings.Get(20018));
984     items.Add(nothumb);
985
986     CStdString strThumb;
987     VECSOURCES shares;
988     if (g_guiSettings.GetString("pvrmenu.iconpath") != "")
989     {
990       CMediaSource share1;
991       share1.strPath = g_guiSettings.GetString("pvrmenu.iconpath");
992       share1.strName = g_localizeStrings.Get(19018);
993       shares.push_back(share1);
994     }
995     g_mediaManager.GetLocalDrives(shares);
996     if (!CGUIDialogFileBrowser::ShowAndGetImage(items, shares, g_localizeStrings.Get(1030), strThumb))
997       return false;
998
999     if (strThumb == "thumb://Current")
1000       return true;
1001
1002     if (strThumb == "thumb://None")
1003       strThumb = "";
1004
1005     if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
1006     {
1007       PVRChannelsTV.SetChannelIcon(pItem->GetPVRChannelInfoTag()->Number(), strThumb);
1008       UpdateChannelsTV();
1009     }
1010     else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
1011     {
1012       PVRChannelsRadio.SetChannelIcon(pItem->GetPVRChannelInfoTag()->Number(), strThumb);
1013       UpdateChannelsRadio();
1014     }
1015
1016     return true;
1017   }
1018   else if (button == CONTEXT_BUTTON_EDIT)
1019   {
1020     if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS)
1021     {
1022       CFileItem fileitem(*pItem);
1023
1024       if (ShowTimerSettings(&fileitem))
1025       {
1026         cPVRTimers::UpdateTimer(fileitem);
1027         UpdateTimers();
1028       }
1029     }
1030
1031     return true;
1032   }
1033   else if (button == CONTEXT_BUTTON_ADD)
1034   {
1035     if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO ||
1036         m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
1037     {
1038       CGUIDialogOK::ShowAndGetInput(19033,0,19038,0);
1039     }
1040     else if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS)
1041     {
1042       cPVRTimerInfoTag newtimer(true);
1043       CFileItem *item = new CFileItem(newtimer);
1044
1045       if (ShowTimerSettings(item))
1046       {
1047         cPVRTimers::AddTimer(*item);
1048         UpdateTimers();
1049       }
1050
1051       return true;
1052     }
1053   }
1054   else if (button == CONTEXT_BUTTON_ACTIVATE)
1055   {
1056     int return_str_id;
1057
1058     if (pItem->GetPVRTimerInfoTag()->Active() == true)
1059     {
1060       pItem->GetPVRTimerInfoTag()->SetActive(false);
1061       return_str_id = 13106;
1062     }
1063     else
1064     {
1065       pItem->GetPVRTimerInfoTag()->SetActive(true);
1066       return_str_id = 305;
1067     }
1068
1069     CGUIDialogOK::ShowAndGetInput(19033, 19040, 0, return_str_id);
1070
1071     cPVRTimers::UpdateTimer(*pItem);
1072     UpdateTimers(); /** Force list update **/
1073     return true;
1074   }
1075   else if (button == CONTEXT_BUTTON_RENAME)
1076   {
1077     if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS)
1078     {
1079       CStdString strNewName = pItem->GetPVRTimerInfoTag()->Title();
1080       if (CGUIDialogKeyboard::ShowAndGetInput(strNewName, g_localizeStrings.Get(19042), false))
1081       {
1082         cPVRTimers::RenameTimer(*pItem, strNewName);
1083         UpdateTimers();
1084       }
1085
1086       return true;
1087     }
1088     else if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS)
1089     {
1090       CStdString strNewName = pItem->GetPVRRecordingInfoTag()->Title();
1091       if (CGUIDialogKeyboard::ShowAndGetInput(strNewName, g_localizeStrings.Get(19041), false))
1092       {
1093         if (cPVRRecordings::DeleteRecording(*pItem))
1094         {
1095           UpdateRecordings();
1096         }
1097       }
1098     }
1099   }
1100   else if (button == CONTEXT_BUTTON_DELETE)
1101   {
1102     if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS)
1103     {
1104       // prompt user for confirmation of timer deletion
1105       CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
1106
1107       if (pDialog)
1108       {
1109         pDialog->SetHeading(122);
1110         pDialog->SetLine(0, 19040);
1111         pDialog->SetLine(1, "");
1112         pDialog->SetLine(2, pItem->GetPVRTimerInfoTag()->Title());
1113         pDialog->DoModal();
1114
1115         if (!pDialog->IsConfirmed()) return false;
1116
1117         cPVRTimers::DeleteTimer(*pItem);
1118
1119         UpdateTimers();
1120       }
1121
1122       return true;
1123     }
1124     else if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS)
1125     {
1126       CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
1127
1128       if (pDialog)
1129       {
1130         pDialog->SetHeading(122);
1131         pDialog->SetLine(0, 19043);
1132         pDialog->SetLine(1, "");
1133         pDialog->SetLine(2, pItem->GetPVRRecordingInfoTag()->Title());
1134         pDialog->DoModal();
1135
1136         if (!pDialog->IsConfirmed()) return false;
1137
1138         if (cPVRRecordings::DeleteRecording(*pItem))
1139         {
1140           PVRRecordings.Update(true);
1141           UpdateRecordings();
1142         }
1143       }
1144
1145       return true;
1146     }
1147   }
1148   else if (button == CONTEXT_BUTTON_INFO)
1149   {
1150     if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV ||
1151         m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO ||
1152         m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM ||
1153         m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1154     {
1155
1156       if (m_iGuideView == GUIDE_VIEW_TIMELINE)
1157       {
1158         /* Get currently selected item from grid container */
1159         pItem = m_guideGrid->GetSelectedItemPtr();
1160
1161         if (!pItem) return false;
1162       }
1163
1164       ShowEPGInfo(pItem.get());
1165     }
1166     else if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS)
1167     {
1168       ShowRecordingInfo(pItem.get());
1169     }
1170   }
1171   else if (button == CONTEXT_BUTTON_START_RECORD)
1172   {
1173     if (m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM || m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1174     {
1175       int iChannel = pItem->GetEPGInfoTag()->ChannelNumber();
1176
1177       if (iChannel != -1)
1178       {
1179         if (pItem->GetEPGInfoTag()->Timer() == NULL)
1180         {
1181           // prompt user for confirmation of channel record
1182           CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO);
1183
1184           if (pDialog)
1185           {
1186             pDialog->SetHeading(264);
1187             pDialog->SetLine(0, pItem->GetEPGInfoTag()->ChannelName());
1188             pDialog->SetLine(1, "");
1189             pDialog->SetLine(2, pItem->GetEPGInfoTag()->Title());
1190             pDialog->DoModal();
1191
1192             if (pDialog->IsConfirmed())
1193             {
1194               cPVRTimerInfoTag newtimer(*pItem.get());
1195               CFileItem *item = new CFileItem(newtimer);
1196
1197               if (cPVRTimers::AddTimer(*item))
1198                 cPVREpgs::SetVariableData(m_vecItems);
1199             }
1200           }
1201         }
1202         else
1203         {
1204           CGUIDialogOK::ShowAndGetInput(19033,19034,0,0);
1205         }
1206       }
1207     }
1208   }
1209   else if (button == CONTEXT_BUTTON_STOP_RECORD)
1210   {
1211     if (m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM || m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1212     {
1213       int iChannel = pItem->GetEPGInfoTag()->ChannelNumber();
1214
1215       if (iChannel != -1)
1216       {
1217         if (pItem->GetEPGInfoTag()->Timer() != NULL)
1218         {
1219           CFileItemList timerlist;
1220
1221           if (PVRTimers.GetTimers(&timerlist) > 0)
1222           {
1223             for (int i = 0; i < timerlist.Size(); ++i)
1224             {
1225               if ((timerlist[i]->GetPVRTimerInfoTag()->Number() == pItem->GetEPGInfoTag()->ChannelNumber()) &&
1226                   (timerlist[i]->GetPVRTimerInfoTag()->Start() <= pItem->GetEPGInfoTag()->Start()) &&
1227                   (timerlist[i]->GetPVRTimerInfoTag()->Stop() >= pItem->GetEPGInfoTag()->End()) &&
1228                   (timerlist[i]->GetPVRTimerInfoTag()->IsRepeating() != true))
1229               {
1230                 if (cPVRTimers::DeleteTimer(*timerlist[i]))
1231                   cPVREpgs::SetVariableData(m_vecItems);
1232               }
1233             }
1234           }
1235         }
1236       }
1237     }
1238   }
1239   else if (button == CONTEXT_BUTTON_GROUP_MANAGER)
1240   {
1241     if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV)
1242       ShowGroupManager(false);
1243     else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO)
1244       ShowGroupManager(true);
1245   }
1246   else if (button == CONTEXT_BUTTON_RESUME_ITEM)
1247   {
1248
1249   }
1250   else if (button == CONTEXT_BUTTON_CLEAR)
1251   {
1252     if (m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1253     {
1254       m_bSearchStarted = false;
1255       m_bSearchConfirmed = false;
1256       m_searchfilter.SetDefaults();
1257       UpdateSearch();
1258     }
1259   }
1260   else if (button == CONTEXT_BUTTON_USER1)
1261   {
1262     if (m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1263     {
1264       if (m_iSortMethod_SEARCH != SORT_METHOD_CHANNEL)
1265       {
1266         m_iSortMethod_SEARCH = SORT_METHOD_CHANNEL;
1267         m_iSortOrder_SEARCH  = SORT_ORDER_ASC;
1268       }
1269       else
1270       {
1271         m_iSortOrder_SEARCH = m_iSortOrder_SEARCH == SORT_ORDER_ASC ? SORT_ORDER_DESC : SORT_ORDER_ASC;
1272       }
1273       UpdateSearch();
1274     }
1275   }
1276   else if (button == CONTEXT_BUTTON_USER2)
1277   {
1278     if (m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1279     {
1280       if (m_iSortMethod_SEARCH != SORT_METHOD_LABEL)
1281       {
1282         m_iSortMethod_SEARCH = SORT_METHOD_LABEL;
1283         m_iSortOrder_SEARCH  = SORT_ORDER_ASC;
1284       }
1285       else
1286       {
1287         m_iSortOrder_SEARCH = m_iSortOrder_SEARCH == SORT_ORDER_ASC ? SORT_ORDER_DESC : SORT_ORDER_ASC;
1288       }
1289       UpdateSearch();
1290     }
1291   }
1292   else if (button == CONTEXT_BUTTON_USER3)
1293   {
1294     if (m_iCurrSubTVWindow == TV_WINDOW_SEARCH)
1295     {
1296       if (m_iSortMethod_SEARCH != SORT_METHOD_DATE)
1297       {
1298         m_iSortMethod_SEARCH = SORT_METHOD_DATE;
1299         m_iSortOrder_SEARCH  = SORT_ORDER_ASC;
1300       }
1301       else
1302       {
1303         m_iSortOrder_SEARCH = m_iSortOrder_SEARCH == SORT_ORDER_ASC ? SORT_ORDER_DESC : SORT_ORDER_ASC;
1304       }
1305       UpdateSearch();
1306     }
1307   }
1308   else if (button == CONTEXT_BUTTON_BEGIN)
1309   {
1310     m_guideGrid->GoToBegin();
1311   }
1312   else if (button == CONTEXT_BUTTON_END)
1313   {
1314     m_guideGrid->GoToEnd();
1315   }
1316   else if (button == CONTEXT_BUTTON_FIND)
1317   {
1318     m_searchfilter.SetDefaults();
1319     if (pItem->IsEPG())
1320     {
1321       m_searchfilter.m_SearchString = "\"" + pItem->GetEPGInfoTag()->Title() + "\"";
1322     }
1323     else if (pItem->IsPVRChannel())
1324     {
1325       m_searchfilter.m_SearchString = "\"" + pItem->GetPVRChannelInfoTag()->NowTitle() + "\"";
1326     }
1327     else if (pItem->IsPVRRecording())
1328     {
1329       m_searchfilter.m_SearchString = "\"" + pItem->GetPVRRecordingInfoTag()->Title() + "\"";
1330     }
1331     m_bSearchConfirmed = true;
1332     SET_CONTROL_FOCUS(CONTROL_BTNSEARCH, 0);
1333     UpdateSearch();
1334     SET_CONTROL_FOCUS(CONTROL_LIST_SEARCH, 0);
1335   }
1336
1337   return CGUIMediaWindow::OnContextButton(itemNumber, button);
1338 }
1339
1340 void CGUIWindowTV::ShowEPGInfo(CFileItem *item)
1341 {
1342   /* Check item is TV epg or channel information tag */
1343   if (item->IsEPG())
1344   {
1345     /* Load programme info dialog */
1346     CGUIDialogPVRGuideInfo* pDlgInfo = (CGUIDialogPVRGuideInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_GUIDE_INFO);
1347     if (!pDlgInfo)
1348       return;
1349
1350     /* inform dialog about the file item */
1351     pDlgInfo->SetProgInfo(item);
1352     cPVREpgs::SetVariableData(m_vecItems);
1353
1354     /* Open dialog window */
1355     pDlgInfo->DoModal();
1356   }
1357   else if (item->IsPVRChannel())
1358   {
1359     cPVREpgsLock EpgsLock;
1360     cPVREpgs *s = (cPVREpgs *)cPVREpgs::EPGs(EpgsLock);
1361     if (s)
1362     {
1363       const cPVREPGInfoTag *epgnow = s->GetEPG(item->GetPVRChannelInfoTag(), true)->GetInfoTagNow();
1364       if (!epgnow)
1365       {
1366         CGUIDialogOK::ShowAndGetInput(19033,0,19055,0);
1367         return;
1368       }
1369
1370       CFileItem *itemNow  = new CFileItem(*epgnow);
1371
1372       /* Load programme info dialog */
1373       CGUIDialogPVRGuideInfo* pDlgInfo = (CGUIDialogPVRGuideInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_GUIDE_INFO);
1374       if (!pDlgInfo)
1375         return;
1376
1377       /* inform dialog about the file item */
1378       pDlgInfo->SetProgInfo(itemNow);
1379
1380       /* Open dialog window */
1381       pDlgInfo->DoModal();
1382     }
1383   }
1384   else
1385     CLog::Log(LOGERROR, "CGUIWindowTV: Can't open programme info dialog, no epg or channel info tag!");
1386 }
1387
1388 void CGUIWindowTV::ShowRecordingInfo(CFileItem *item)
1389 {
1390   /* Check item is TV record information tag */
1391   if (!item->IsPVRRecording())
1392   {
1393     CLog::Log(LOGERROR, "CGUIWindowTV: Can't open recording info dialog, no record info tag!");
1394     return;
1395   }
1396
1397   /* Load record info dialog */
1398   CGUIDialogPVRRecordingInfo* pDlgInfo = (CGUIDialogPVRRecordingInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_RECORDING_INFO);
1399
1400   if (!pDlgInfo)
1401     return;
1402
1403   /* inform dialog about the file item */
1404   pDlgInfo->SetRecording(item);
1405
1406   /* Open dialog window */
1407   pDlgInfo->DoModal();
1408
1409   /* Return to caller */
1410   return;
1411 }
1412
1413 bool CGUIWindowTV::ShowTimerSettings(CFileItem *item)
1414 {
1415   /* Check item is TV timer information tag */
1416   if (!item->IsPVRTimer())
1417   {
1418     CLog::Log(LOGERROR, "CGUIWindowTV: Can't open timer settings dialog, no timer info tag!");
1419     return false;
1420   }
1421
1422   /* Load timer settings dialog */
1423   CGUIDialogPVRTimerSettings* pDlgInfo = (CGUIDialogPVRTimerSettings*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_TIMER_SETTING);
1424
1425   if (!pDlgInfo)
1426     return false;
1427
1428   /* inform dialog about the file item */
1429   pDlgInfo->SetTimer(item);
1430
1431   /* Open dialog window */
1432   pDlgInfo->DoModal();
1433
1434   /* Get modify flag from window and return it to caller */
1435   return pDlgInfo->GetOK();
1436 }
1437
1438 void CGUIWindowTV::ShowGroupManager(bool IsRadio)
1439 {
1440   /* Load timer settings dialog */
1441   CGUIDialogPVRGroupManager* pDlgInfo = (CGUIDialogPVRGroupManager*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_GROUP_MANAGER);
1442
1443   if (!pDlgInfo)
1444     return;
1445
1446   pDlgInfo->SetRadio(IsRadio);
1447
1448   /* Open dialog window */
1449   pDlgInfo->DoModal();
1450
1451   return;
1452 }
1453
1454 void CGUIWindowTV::ShowSearchResults()
1455 {
1456   /* Load timer settings dialog */
1457   CGUIDialogPVRGuideSearch* pDlgInfo = (CGUIDialogPVRGuideSearch*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_GUIDE_SEARCH);
1458
1459   if (!pDlgInfo)
1460     return;
1461
1462   pDlgInfo->SetFilterData(&m_searchfilter);
1463
1464   /* Open dialog window */
1465   pDlgInfo->DoModal();
1466
1467   if (pDlgInfo->IsConfirmed())
1468   {
1469     m_bSearchConfirmed = true;
1470     UpdateSearch();
1471   }
1472
1473   return;
1474 }
1475
1476 void CGUIWindowTV::UpdateGuide()
1477 {
1478   bool RadioPlaying;
1479   int CurrentChannel;
1480   g_PVRManager.GetCurrentChannel(&CurrentChannel, &RadioPlaying);
1481
1482   m_vecItems->Clear();
1483
1484   if (m_iGuideView == GUIDE_VIEW_CHANNEL)
1485   {
1486     m_guideGrid = NULL;
1487     m_viewControl.SetCurrentView(CONTROL_LIST_GUIDE_CHANNEL);
1488
1489     CStdString strChannel;
1490     if (!RadioPlaying)
1491       strChannel = PVRChannelsTV.GetNameForChannel(CurrentChannel);
1492     else
1493       strChannel = PVRChannelsRadio.GetNameForChannel(CurrentChannel);
1494
1495     SET_CONTROL_LABEL(CONTROL_BTNGUIDE, g_localizeStrings.Get(19029));
1496     SET_CONTROL_LABEL(CONTROL_LABELGROUP, strChannel);
1497
1498     if (cPVREpgs::GetEPGChannel(CurrentChannel, m_vecItems, RadioPlaying) == 0)
1499     {
1500       CFileItemPtr item;
1501       item.reset(new CFileItem("pvr://guide/" + strChannel + "/empty.epg", false));
1502       item->SetLabel(g_localizeStrings.Get(19028));
1503       item->SetLabelPreformated(true);
1504       m_vecItems->Add(item);
1505     }
1506     m_viewControl.SetItems(*m_vecItems);
1507   }
1508   else if (m_iGuideView == GUIDE_VIEW_NOW)
1509   {
1510     m_guideGrid = NULL;
1511
1512     m_viewControl.SetCurrentView(CONTROL_LIST_GUIDE_NOW_NEXT);
1513
1514     SET_CONTROL_LABEL(CONTROL_BTNGUIDE, g_localizeStrings.Get(19029) + ": " + g_localizeStrings.Get(19030));
1515     SET_CONTROL_LABEL(CONTROL_LABELGROUP, g_localizeStrings.Get(19030));
1516
1517     if (cPVREpgs::GetEPGNow(m_vecItems, RadioPlaying) == 0)
1518     {
1519       CFileItemPtr item;
1520       item.reset(new CFileItem("pvr://guide/now/empty.epg", false));
1521       item->SetLabel(g_localizeStrings.Get(19028));
1522       item->SetLabelPreformated(true);
1523       m_vecItems->Add(item);
1524     }
1525     m_viewControl.SetItems(*m_vecItems);
1526   }
1527   else if (m_iGuideView == GUIDE_VIEW_NEXT)
1528   {
1529     m_guideGrid = NULL;
1530
1531     m_viewControl.SetCurrentView(CONTROL_LIST_GUIDE_NOW_NEXT);
1532
1533     SET_CONTROL_LABEL(CONTROL_BTNGUIDE, g_localizeStrings.Get(19029) + ": " + g_localizeStrings.Get(19031));
1534     SET_CONTROL_LABEL(CONTROL_LABELGROUP, g_localizeStrings.Get(19031));
1535
1536     if (cPVREpgs::GetEPGNext(m_vecItems, RadioPlaying) == 0)
1537     {
1538       CFileItemPtr item;
1539       item.reset(new CFileItem("pvr://guide/next/empty.epg", false));
1540       item->SetLabel(g_localizeStrings.Get(19028));
1541       item->SetLabelPreformated(true);
1542       m_vecItems->Add(item);
1543     }
1544     m_viewControl.SetItems(*m_vecItems);
1545   }
1546   else if (m_iGuideView == GUIDE_VIEW_TIMELINE)
1547   {
1548     SET_CONTROL_LABEL(CONTROL_BTNGUIDE, g_localizeStrings.Get(19029) + ": " + g_localizeStrings.Get(19032));
1549     SET_CONTROL_LABEL(CONTROL_LABELGROUP, g_localizeStrings.Get(19032));
1550
1551     if (cPVREpgs::GetEPGAll(m_vecItems, RadioPlaying) > 0)
1552     {
1553       CDateTime now = CDateTime::GetCurrentDateTime();
1554       CDateTime m_gridStart = now - CDateTimeSpan(0, 0, 0, (now.GetMinute() % 30) * 60 + now.GetSecond()) - CDateTimeSpan(0, g_guiSettings.GetInt("pvrmenu.lingertime") / 60, g_guiSettings.GetInt("pvrmenu.lingertime") % 60, 0);
1555       CDateTime m_gridEnd = m_gridStart + CDateTimeSpan(g_guiSettings.GetInt("pvrmenu.daystodisplay"), 0, 0, 0);
1556       m_guideGrid = (CGUIEPGGridContainer*)GetControl(CONTROL_LIST_TIMELINE);
1557       m_guideGrid->SetStartEnd(m_gridStart, m_gridEnd);
1558       m_viewControl.SetCurrentView(CONTROL_LIST_TIMELINE);
1559
1560 //      m_viewControl.SetSelectedItem(m_iSelected_GUIDE);
1561     }
1562   }
1563
1564   SET_CONTROL_LABEL(CONTROL_LABELHEADER, g_localizeStrings.Get(19029));
1565 }
1566
1567 void CGUIWindowTV::UpdateChannelsTV()
1568 {
1569   m_vecItems->Clear();
1570   m_viewControl.SetCurrentView(CONTROL_LIST_CHANNELS_TV);
1571   if (!m_bShowHiddenChannels)
1572     m_vecItems->m_strPath = "pvr://channels/tv/" + PVRChannelGroups.GetGroupName(m_iCurrentTVGroup) + "/";
1573   else
1574     m_vecItems->m_strPath = "pvr://channels/tv/.hidden/";
1575   Update(m_vecItems->m_strPath);
1576
1577   if (m_vecItems->Size() == 0)
1578   {
1579     if (m_bShowHiddenChannels)
1580     {
1581       m_bShowHiddenChannels = false;
1582       UpdateChannelsTV();
1583       return;
1584     }
1585     else if (m_iCurrentTVGroup != -1)
1586     {
1587       m_iCurrentTVGroup = PVRChannelGroups.GetNextGroupID(m_iCurrentTVGroup);
1588       UpdateChannelsTV();
1589       return;
1590     }
1591   }
1592
1593   m_viewControl.SetSelectedItem(m_iSelected_CHANNELS_TV);
1594
1595   SET_CONTROL_LABEL(CONTROL_LABELHEADER, g_localizeStrings.Get(19023));
1596   if (m_bShowHiddenChannels)
1597     SET_CONTROL_LABEL(CONTROL_LABELGROUP, g_localizeStrings.Get(19022));
1598   else
1599     SET_CONTROL_LABEL(CONTROL_LABELGROUP, PVRChannelGroups.GetGroupName(m_iCurrentTVGroup));
1600 }
1601
1602 void CGUIWindowTV::UpdateChannelsRadio()
1603 {
1604   m_vecItems->Clear();
1605   m_viewControl.SetCurrentView(CONTROL_LIST_CHANNELS_RADIO);
1606   if (!m_bShowHiddenChannels)
1607     m_vecItems->m_strPath = "pvr://channels/radio/" + PVRChannelGroups.GetGroupName(m_iCurrentTVGroup) + "/";
1608   else
1609     m_vecItems->m_strPath = "pvr://channels/radio/.hidden/";
1610   Update(m_vecItems->m_strPath);
1611
1612   if (m_vecItems->Size() == 0)
1613   {
1614     if (m_bShowHiddenChannels)
1615     {
1616       m_bShowHiddenChannels = false;
1617       UpdateChannelsRadio();
1618       return;
1619     }
1620     else if (m_iCurrentTVGroup != -1)
1621     {
1622       m_iCurrentTVGroup = PVRChannelGroups.GetNextGroupID(m_iCurrentTVGroup);
1623       UpdateChannelsRadio();
1624       return;
1625     }
1626   }
1627
1628   m_viewControl.SetSelectedItem(m_iSelected_CHANNELS_RADIO);
1629
1630   SET_CONTROL_LABEL(CONTROL_LABELHEADER, g_localizeStrings.Get(19024));
1631   if (m_bShowHiddenChannels)
1632     SET_CONTROL_LABEL(CONTROL_LABELGROUP, g_localizeStrings.Get(19022));
1633   else
1634     SET_CONTROL_LABEL(CONTROL_LABELGROUP, PVRChannelGroups.GetGroupName(m_iCurrentTVGroup));
1635 }
1636
1637 void CGUIWindowTV::UpdateRecordings()
1638 {
1639   m_vecItems->Clear();
1640   m_viewControl.SetCurrentView(CONTROL_LIST_RECORDINGS);
1641   m_vecItems->m_strPath = "pvr://recordings/";
1642   Update(m_iSelected_RECORDINGS_Path);
1643   m_viewControl.SetSelectedItem(m_iSelected_RECORDINGS);
1644
1645   SET_CONTROL_LABEL(CONTROL_LABELHEADER, g_localizeStrings.Get(19017));
1646   SET_CONTROL_LABEL(CONTROL_LABELGROUP, "");
1647 }
1648
1649 void CGUIWindowTV::UpdateTimers()
1650 {
1651   m_vecItems->Clear();
1652   m_viewControl.SetCurrentView(CONTROL_LIST_TIMERS);
1653   m_vecItems->m_strPath = "pvr://timers/";
1654   Update(m_vecItems->m_strPath);
1655   m_viewControl.SetSelectedItem(m_iSelected_TIMERS);
1656
1657   SET_CONTROL_LABEL(CONTROL_LABELHEADER, g_localizeStrings.Get(19025));
1658   SET_CONTROL_LABEL(CONTROL_LABELGROUP, "");
1659 }
1660
1661 void CGUIWindowTV::UpdateSearch()
1662 {
1663   m_vecItems->Clear();
1664   m_viewControl.SetCurrentView(CONTROL_LIST_SEARCH);
1665
1666   if (m_bSearchConfirmed)
1667   {
1668     CGUIDialogProgress* dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
1669     if (dlgProgress)
1670     {
1671       dlgProgress->SetHeading(194);
1672       dlgProgress->SetLine(0, m_searchfilter.m_SearchString);
1673       dlgProgress->SetLine(1, "");
1674       dlgProgress->SetLine(2, "");
1675       dlgProgress->StartModal();
1676       dlgProgress->Progress();
1677     }
1678
1679     cPVREpgs::GetEPGSearch(m_vecItems, m_searchfilter);
1680     if (dlgProgress)
1681       dlgProgress->Close();
1682
1683     if (m_vecItems->Size() == 0)
1684     {
1685       CGUIDialogOK::ShowAndGetInput(194, 284, 0, 0);
1686       m_bSearchConfirmed = false;
1687     }
1688   }
1689
1690   if (m_vecItems->Size() == 0)
1691   {
1692     CFileItemPtr item;
1693     item.reset(new CFileItem("pvr://guide/searchresults/empty.epg", false));
1694     item->SetLabel(g_localizeStrings.Get(19027));
1695     item->SetLabelPreformated(true);
1696     m_vecItems->Add(item);
1697   }
1698   else
1699   {
1700     m_vecItems->Sort(m_iSortMethod_SEARCH, m_iSortOrder_SEARCH);
1701   }
1702
1703   m_viewControl.SetItems(*m_vecItems);
1704   m_viewControl.SetSelectedItem(m_iSelected_SEARCH);
1705
1706   SET_CONTROL_LABEL(CONTROL_LABELHEADER, g_localizeStrings.Get(283));
1707   SET_CONTROL_LABEL(CONTROL_LABELGROUP, "");
1708 }
1709
1710 void CGUIWindowTV::UpdateButtons()
1711 {
1712 }
1713
1714 void CGUIWindowTV::UpdateData(TVWindow update)
1715 {
1716   if (m_iCurrSubTVWindow == TV_WINDOW_TV_PROGRAM && update == TV_WINDOW_TV_PROGRAM)
1717   {
1718
1719   }
1720   else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_TV && update == TV_WINDOW_CHANNELS_TV)
1721     UpdateChannelsTV();
1722   else if (m_iCurrSubTVWindow == TV_WINDOW_CHANNELS_RADIO && update == TV_WINDOW_CHANNELS_RADIO)
1723     UpdateChannelsRadio();
1724   else if (m_iCurrSubTVWindow == TV_WINDOW_RECORDINGS && update == TV_WINDOW_RECORDINGS)
1725     UpdateRecordings();
1726   else if (m_iCurrSubTVWindow == TV_WINDOW_TIMERS && update == TV_WINDOW_TIMERS)
1727     UpdateTimers();
1728
1729   UpdateButtons();
1730 }
1731
1732 bool CGUIWindowTV::PlayFile(CFileItem *item)
1733 {
1734   if (g_guiSettings.GetBool("pvrplayback.playminimized"))
1735   {
1736     if (item->m_strPath == g_application.CurrentFile())
1737     {
1738       CGUIMessage msg(GUI_MSG_FULLSCREEN, 0, GetID());
1739       g_windowManager.SendMessage(msg);
1740       return true;
1741     }
1742     else
1743     {
1744       g_stSettings.m_bStartVideoWindowed = true;
1745     }
1746   }
1747   if (!g_application.PlayFile(*item))
1748   {
1749     if (item->m_strPath.Left(17) == "pvr://recordings/")
1750       CGUIDialogOK::ShowAndGetInput(19033,0,19036,0);
1751     else
1752       CGUIDialogOK::ShowAndGetInput(19033,0,19035,0);
1753     return false;
1754   }
1755   return true;
1756 }