Merge remote branch 'origin/trunk' into trac-8658
[xbmc:xbmc-antiquated.git] / xbmc / GUIDialogSelect.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 #include "GUIDialogSelect.h"
23 #include "GUIWindowManager.h"
24 #include "FileItem.h"
25 #include "LocalizeStrings.h"
26
27 #define CONTROL_HEADING       1
28 #define CONTROL_LIST          3
29 #define CONTROL_NUMBEROFFILES 2
30 #define CONTROL_BUTTON        5
31 #define CONTROL_DETAILS       6
32
33 CGUIDialogSelect::CGUIDialogSelect(void)
34     : CGUIDialogBoxBase(WINDOW_DIALOG_SELECT, "DialogSelect.xml")
35 {
36   m_bButtonEnabled = false;
37   m_useDetails = false;
38   m_vecListInternal = new CFileItemList;
39   m_selectedItem = new CFileItem;
40   m_vecList = m_vecListInternal;
41 }
42
43 CGUIDialogSelect::~CGUIDialogSelect(void)
44 {
45   delete m_vecListInternal;
46   delete m_selectedItem;
47 }
48
49 bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
50 {
51   switch ( message.GetMessage() )
52   {
53   case GUI_MSG_WINDOW_DEINIT:
54     {
55       CGUIDialog::OnMessage(message);
56       m_viewControl.Reset();
57       Reset();
58       return true;
59     }
60     break;
61
62   case GUI_MSG_WINDOW_INIT:
63     {
64       m_bButtonPressed = false;
65       CGUIDialog::OnMessage(message);
66       m_iSelected = -1;
67
68       return true;
69     }
70     break;
71
72
73   case GUI_MSG_CLICKED:
74     {
75       int iControl = message.GetSenderId();
76       if (m_viewControl.HasControl(CONTROL_LIST))
77       {
78         int iAction = message.GetParam1();
79         if (ACTION_SELECT_ITEM == iAction || ACTION_MOUSE_LEFT_CLICK == iAction)
80         {
81           m_iSelected = m_viewControl.GetSelectedItem();
82           if(m_iSelected >= 0 && m_iSelected < (int)m_vecList->Size())
83           {
84             *m_selectedItem = *m_vecList->Get(m_iSelected);
85             Close();
86           }
87           else
88             m_iSelected = -1;
89         }
90       }
91       if (CONTROL_BUTTON == iControl)
92       {
93         m_iSelected = -1;
94         m_bButtonPressed = true;
95         Close();
96       }
97     }
98     break;
99   case GUI_MSG_SETFOCUS:
100     {
101       if (m_viewControl.HasControl(message.GetControlId()) && m_viewControl.GetCurrentControl() != message.GetControlId())
102       {
103         m_viewControl.SetFocused();
104         return true;
105       }
106     }
107     break;
108   }
109
110   return CGUIDialog::OnMessage(message);
111 }
112
113 void CGUIDialogSelect::Reset()
114 {
115   m_bButtonEnabled = false;
116   m_useDetails = false;
117   m_vecListInternal->Clear();
118   m_vecList = m_vecListInternal;
119 }
120
121 void CGUIDialogSelect::Add(const CStdString& strLabel)
122 {
123   CFileItemPtr pItem(new CFileItem(strLabel));
124   m_vecListInternal->Add(pItem);
125 }
126
127 void CGUIDialogSelect::Add(const CFileItemList& items)
128 {
129   for (int i=0;i<items.Size();++i)
130   {
131     CFileItemPtr item = items[i];
132     Add(item.get());
133   }
134 }
135
136 void CGUIDialogSelect::Add(const CFileItem* pItem)
137 {
138   CFileItemPtr item(new CFileItem(*pItem));
139   m_vecListInternal->Add(item);
140 }
141
142 void CGUIDialogSelect::SetItems(CFileItemList* pList)
143 {
144   m_vecList = pList;
145 }
146
147 int CGUIDialogSelect::GetSelectedLabel() const
148 {
149   return m_iSelected;
150 }
151
152 const CFileItem& CGUIDialogSelect::GetSelectedItem()
153 {
154   return *m_selectedItem;
155 }
156
157 const CStdString& CGUIDialogSelect::GetSelectedLabelText()
158 {
159   return m_selectedItem->GetLabel();
160 }
161
162 void CGUIDialogSelect::EnableButton(bool enable, int string)
163 {
164   m_bButtonEnabled = enable;
165   CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), CONTROL_BUTTON);
166   msg.SetLabel(string);
167   OnMessage(msg);
168 }
169
170 bool CGUIDialogSelect::IsButtonPressed()
171 {
172   return m_bButtonPressed;
173 }
174
175 void CGUIDialogSelect::Sort(bool bSortOrder /*=true*/)
176 {
177   m_vecList->Sort(SORT_METHOD_LABEL,bSortOrder?SORT_ORDER_ASC:SORT_ORDER_DESC);
178 }
179
180 void CGUIDialogSelect::SetSelected(int iSelected)
181 {
182   if (iSelected < 0 || iSelected >= (int)m_vecList->Size()) return;
183   m_iSelected = iSelected;
184 }
185
186 void CGUIDialogSelect::SetUseDetails(bool useDetails)
187 {
188   m_useDetails = useDetails;
189 }
190
191 CGUIControl *CGUIDialogSelect::GetFirstFocusableControl(int id)
192 {
193   if (m_viewControl.HasControl(id))
194     id = m_viewControl.GetCurrentControl();
195   return CGUIDialogBoxBase::GetFirstFocusableControl(id);
196 }
197
198 void CGUIDialogSelect::OnWindowLoaded()
199 {
200   CGUIDialogBoxBase::OnWindowLoaded();
201   m_viewControl.Reset();
202   m_viewControl.SetParentWindow(GetID());
203   m_viewControl.AddView(GetControl(CONTROL_LIST));
204   m_viewControl.AddView(GetControl(CONTROL_DETAILS));
205 }
206
207 void CGUIDialogSelect::OnInitWindow()
208 {
209   m_viewControl.SetItems(*m_vecList);
210   m_viewControl.SetCurrentView(m_useDetails ? CONTROL_DETAILS : CONTROL_LIST);
211
212   CStdString items;
213   items.Format("%i %s", m_vecList->Size(), g_localizeStrings.Get(127).c_str());
214   SET_CONTROL_LABEL(CONTROL_NUMBEROFFILES, items);
215
216   if (m_bButtonEnabled)
217   {
218     CGUIMessage msg2(GUI_MSG_VISIBLE, GetID(), CONTROL_BUTTON);
219     g_windowManager.SendMessage(msg2);
220   }
221   else
222   {
223     CGUIMessage msg2(GUI_MSG_HIDDEN, GetID(), CONTROL_BUTTON);
224     g_windowManager.SendMessage(msg2);
225   }
226   CGUIDialogBoxBase::OnInitWindow();
227
228   if (m_iSelected >= 0)
229     m_viewControl.SetSelectedItem(m_iSelected);
230 }