1b56e7d1d1c54b7fae24b30353c585d27f9d30ee
[vuplus_dvbapp] / lib / python / Plugins / Extensions / HbbTV / browser.py
1 from Screens.Screen import Screen
2 from Screens.HelpMenu import HelpableScreen
3 from Screens.ChoiceBox import ChoiceBox
4 from Screens.MessageBox import MessageBox
5 from Screens.VirtualKeyBoard import VirtualKeyBoard
6 from Components.ActionMap import ActionMap, HelpableActionMap
7 from Components.ConfigList import ConfigListScreen
8 from Components.Label import Label, MultiColorLabel
9 from Components.Language import language
10 from Components.MenuList import MenuList
11 from Components.Pixmap import Pixmap
12 from Components.Sources.StaticText import StaticText
13 from Components.config import ConfigText, ConfigSelection, ConfigSlider, getConfigListEntry
14
15 import os, vbcfg
16
17 from enigma import fbClass, eRCInput, eTimer, getDesktop
18
19 from __init__ import _
20 from bookmark import BookmarkManager, BookmarkData, CategoryData
21 from vbipc import VBController
22
23 strIsEmpty = lambda x: x is None or len(x) == 0
24
25 class BrowserSetting:
26         def __init__(self):
27                 self._settingFileName = '%s/home/setting.ini' % vbcfg.APPROOT
28                 self._start = None
29                 self._type = None
30                 self._keymap = None
31                 self._read()
32
33         def _read(self):
34                 if not os.path.exists(self._settingFileName):
35                         self.getDefault()
36                         return
37
38                 f = open(self._settingFileName)
39                 for line in f.readlines():
40                         if line.startswith('start='):
41                                 tmp = line[6:len(line)-1].split()
42                                 self._start = tmp[0]
43                                 if len(tmp) > 1:
44                                         self._type = int(tmp[1])
45                                 else:   self._type = 0
46                         elif line.startswith('keymap='):
47                                 self._keymap = line[7:len(line)-1]
48                 f.close()
49
50         def _write(self):
51                 tmpstr = []
52                 tmpstr.append('start=%s %d\n' % (self._start, self._type))
53                 tmpstr.append('keymap=%s\n' % (self._keymap))
54                 f = open(self._settingFileName, 'w')
55                 f.writelines(tmpstr)
56                 f.close()
57
58         def getDefault(self):
59                 self._start = 'http://vuplus.com'
60                 self._type = 0
61                 self._keymap = 'us-rc'
62
63         def setData(self, start, types=0, keymap="us-rc"):
64                 self._start = start
65                 self._type = types
66                 self._keymap = keymap
67                 self._write()
68
69         def getData(self):
70                 return {
71                         'start':self._start,
72                         'type':self._type,
73                         'keymap':self._keymap,
74                 }
75
76 class BrowserPositionSetting:
77         def __init__(self):
78                 self._positionFileName = '%s/home/position.cfg' % vbcfg.APPROOT
79                 self._left = 0
80                 self._width = 0
81                 self._top = 0
82                 self._height = 0
83                 self._read()
84
85         def _read(self):
86                 if not os.path.exists(self._positionFileName):
87                         self.getDefault()
88                         return
89
90                 f = open(self._positionFileName)
91                 str = f.read()
92                 f.close()
93
94                 pos = str.split();
95                 self._left = int(pos[0])
96                 self._width = int(pos[1])
97                 self._top = int(pos[2])
98                 self._height = int(pos[3])
99
100         def _write(self):
101                 tmpstr = "%d %d %d %d\n" % (self._left, self._width, self._top, self._height)
102                 f = open(self._positionFileName, 'w')
103                 f.write(tmpstr)
104                 f.close()
105
106         def getDefault(self):
107                 self._left = 0
108                 self._top = 0
109                 self._width = 720
110                 self._height = 576
111
112         def setPosition(self, params):
113                 self._left = params[0]
114                 self._width = params[1]
115                 self._top = params[2]
116                 self._height = params[3]
117                 self._write()
118
119         def getPosition(self):
120                 return (self._left, self._width, self._top, self._height)
121
122 class BrowserPositionWindow(Screen, ConfigListScreen):
123         skin =  """
124                 <screen position="0,0" size="%d,%d" title="Browser Position Setup" backgroundColor="#27d8dee2" >
125                         <ePixmap pixmap="skin_default/buttons/red.png" position="%d,%d" size="140,40" alphatest="on" />
126                         <ePixmap pixmap="skin_default/buttons/green.png" position="%d,%d" size="140,40" alphatest="on" />"
127
128                         <widget source="key_red" render="Label" position="%d,%d" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
129                         <widget source="key_green" render="Label" position="%d,%d" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
130
131                         <widget name="config" zPosition="2" position="%d,%d" size="500,200" scrollbarMode="showOnDemand" foregroundColor="#1c1c1c" transparent="1" />
132                 </screen>
133                 """
134         def __init__(self, session):
135                 w,h   = session.desktop.size().width(), session.desktop.size().height()
136                 cw,ch = w/2, h/2
137                 #                             btn_red        btn_green     lb_red         lb_green      config
138                 self.skin = self.skin % (w,h, cw-190,ch-110, cw+50,ch-110, cw-190,ch-110, cw+50,ch-110, cw-250,ch-50)
139
140                 Screen.__init__(self,session)
141                 self.session = session
142                 self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions" ],
143                 {
144                         "ok": self.keyOk,
145                         "cancel": self.keyCancel,
146                         "red": self.keyCancel,
147                         "green": self.keyOk,
148                 }, -2)
149                 self.list = []
150                 ConfigListScreen.__init__(self, self.list, session = self.session)
151
152                 self["key_red"] = StaticText(_("Cancel"))
153                 self["key_green"] = StaticText(_("Save"))
154                 self["current"] = StaticText(_(" "))
155                 vbcfg.g_position = vbcfg.getPosition()
156                 self.createSetup()
157
158         def createSetup(self):
159                 self.list = []
160
161                 params = BrowserPositionSetting().getPosition()
162                 vbcfg.setPosition(params)
163
164                 left   = params[0]
165                 width  = params[1]
166                 top    = params[2]
167                 height = params[3]
168
169                 self.dst_left   = ConfigSlider(default = left, increment = 5, limits = (0, 720))
170                 self.dst_width  = ConfigSlider(default = width, increment = 5, limits = (0, 720))
171                 self.dst_top    = ConfigSlider(default = top, increment = 5, limits = (0, 576))
172                 self.dst_height = ConfigSlider(default = height, increment = 5, limits = (0, 576))
173
174                 self.dst_left_entry   = getConfigListEntry(_("left"), self.dst_left)
175                 self.dst_width_entry  = getConfigListEntry(_("width"), self.dst_width)
176                 self.dst_top_entry    = getConfigListEntry(_("top"), self.dst_top)
177                 self.dst_height_entry = getConfigListEntry(_("height"), self.dst_height)
178
179                 self.list.append(self.dst_left_entry)
180                 self.list.append(self.dst_width_entry)
181                 self.list.append(self.dst_top_entry)
182                 self.list.append(self.dst_height_entry)
183
184                 self["config"].list = self.list
185                 self["config"].l.setList(self.list)
186
187         def resetDisplay(self):
188                 for entry in self["config"].getList():
189                         self["config"].l.invalidateEntry(self["config"].getList().index(entry))
190
191         def adjustBorder(self):
192                 if self["config"].getCurrent() == self.dst_left_entry:
193                         if self.dst_left.value + self.dst_width.value >720:
194                                 self.dst_width.setValue(720-self.dst_left.value)
195                                 self.resetDisplay()
196                 elif self["config"].getCurrent() == self.dst_width_entry:
197                         if self.dst_left.value + self.dst_width.value >720:
198                                 self.dst_left.setValue(720-self.dst_width.value)
199                                 self.resetDisplay()
200                 elif self["config"].getCurrent() == self.dst_top_entry:
201                         if self.dst_top.value + self.dst_height.value >576:
202                                 self.dst_height.setValue(576-self.dst_top.value)
203                                 self.resetDisplay()
204                 elif self["config"].getCurrent() == self.dst_height_entry:
205                         if self.dst_top.value + self.dst_height.value >576:
206                                 self.dst_top.setValue(576-self.dst_height.value)
207                                 self.resetDisplay()
208
209         def keyLeft(self):
210                 ConfigListScreen.keyLeft(self)
211                 self.adjustBorder()
212                 params = (int(self.dst_left.value), int(self.dst_width.value), int(self.dst_top.value), int(self.dst_height.value))
213                 vbcfg.setPosition(params)
214
215         def keyRight(self):
216                 ConfigListScreen.keyRight(self)
217                 self.adjustBorder()
218                 params = (int(self.dst_left.value), int(self.dst_width.value), int(self.dst_top.value), int(self.dst_height.value))
219                 vbcfg.setPosition(params)
220
221         def keyOk(self):
222                 params = (int(self.dst_left.value), int(self.dst_width.value), int(self.dst_top.value), int(self.dst_height.value))
223                 BrowserPositionSetting().setPosition(params)
224                 vbcfg.setPosition(vbcfg.g_position)
225                 self.close()
226
227         def keyCancel(self):
228                 if self["config"].isChanged():
229                         self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"))
230                 else:
231                         vbcfg.setPosition(vbcfg.g_position)
232                         self.close()
233
234         def cancelConfirm(self,ret):
235                 if ret:
236                         vbcfg.setPosition(vbcfg.g_position)
237                         self.close()
238
239
240 class BrowserPreferenceWindow(ConfigListScreen, Screen):
241         skin = """
242                 <screen position="center,120" size="600,350" title="Preference">
243                         <widget name="url" position="5,0" size="590,100" valign="center" font="Regular;20" />
244                         <widget name="config" position="0,100" size="600,200" scrollbarMode="showOnDemand" />
245
246                         <ePixmap pixmap="skin_default/buttons/red.png" position="310,310" size="140,40" alphatest="on" />
247                         <ePixmap pixmap="skin_default/buttons/green.png" position="150,310" size="140,40" alphatest="on" />
248
249                         <widget source="key_red" render="Label" position="310,310" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
250                         <widget source="key_green" render="Label" position="150,310" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
251                 </screen>
252                 """
253         def __init__(self, session, currentUrl):
254                 self.session = session
255                 Screen.__init__(self, session)
256
257                 self.menulist = []
258                 ConfigListScreen.__init__(self, self.menulist)
259
260                 self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", ], {
261                         "red"    : self.keyRed,
262                         "green"  : self.keyGreen,
263                         "ok"     : self.keyOK,
264                         "cancel" : self.keyRed
265                 }, -2)
266                 self["key_red"] = StaticText(_("Cancel"))
267                 self["key_green"] = StaticText(_("Save"))
268                 self["url"] = Label()
269
270                 self._currentPageUrl = currentUrl
271                 if self._currentPageUrl is None:
272                         self._currentPageUrl = ''
273                 self._startPageUrl = None
274                 self._keymapType = None
275                 self.makeMenuEntry()
276                 self.onLayoutFinish.append(self.layoutFinished)
277
278         def layoutFinished(self):
279                 self.setTitle(_('Preference'))
280
281         def updateStartPageUrl(self):
282                 if self.menuItemStartpage.value == "startpage":
283                         self["url"].setText(self._startPageUrl)
284                 elif self.menuItemStartpage.value == "current":
285                         self["url"].setText(self._currentPageUrl)
286                 elif self.menuItemStartpage.value == "direct":
287                         self["url"].setText('')
288
289         def keyGreen(self):
290                 url = self["url"].getText()
291                 if strIsEmpty(url):
292                         self.session.open(MessageBox, _('Invalid URL!!(Empty)\nPlease, Input to the URL.'), type = MessageBox.TYPE_INFO)
293                         return
294                 mode = 0
295                 if url.find('/usr/local/manual') > 0:
296                         mode = 1
297                 self._keymapType = self.menuItemKeyboardLayout.value
298                 BrowserSetting().setData(url, mode, self._keymapType)
299                 # send contorller
300                 #command_util = getCommandUtil()
301                 #command_util.sendCommand('OP_BROWSER_NEED_RELOAD_KEYMAP')
302                 self.close()
303
304         def keyRed(self):
305                 self.close()
306
307         def keyOK(self):
308                 def _cb_directInputUrl(data):
309                         if strIsEmpty(data):
310                                 return
311                         self["url"].setText(data)
312                 if self["config"].l.getCurrentSelectionIndex() == 0 and self.menuItemStartpage.value == "direct":
313                         self.session.openWithCallback(_cb_directInputUrl, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
314
315         def keyLeft(self):
316                 ConfigListScreen.keyLeft(self)
317                 self.updateStartPageUrl()
318
319         def keyRight(self):
320                 ConfigListScreen.keyRight(self)
321                 self.updateStartPageUrl()
322
323         def getKeymapTypeList(self):
324                 types = []
325                 for f in os.listdir("%s/keymap" % vbcfg.APPROOT):
326                         filesplit = f.split('.')
327                         if len(filesplit) < 2:
328                                 continue
329                         types.append((filesplit[1], filesplit[1]))
330                 types.sort()
331                 return types
332
333         def makeMenuEntry(self):
334                 l = []
335                 l.append(("startpage", _("Start Page")))
336                 if not strIsEmpty(self._currentPageUrl):
337                         l.append(("current", _("Current Page")))
338                 l.append(("direct", _("Direct Input")))
339                 self.menuItemStartpage = ConfigSelection(default="startpage", choices = l)
340                 self.menuEntryStartpage = getConfigListEntry(_("Startpage"), self.menuItemStartpage)
341
342                 kl = self.getKeymapTypeList()
343
344                 try:
345                         d = BrowserSetting().getData()
346                         self._startPageUrl = d['start']
347                         self._keymapType = d['keymap']
348                         #d['type']
349                 except: self._startPageUrl = 'http://vuplus.com'
350                 self.updateStartPageUrl()
351
352                 if self._keymapType is None or len(self._keymapType) == 0:
353                         self._keymapType = "us-rc"
354                 self.menuItemKeyboardLayout = ConfigSelection(default=self._keymapType, choices = kl)
355                 self.menuEntryKeyboardLayout = getConfigListEntry(_("Keyboard Layout"), self.menuItemKeyboardLayout)
356                 self.resetMenuList()
357
358         def resetMenuList(self):
359                 self.menulist = []
360                 self.menulist.append(self.menuEntryStartpage)
361                 self.menulist.append(self.menuEntryKeyboardLayout)
362
363                 self["config"].list = self.menulist
364                 self["config"].l.setList(self.menulist)
365
366 class BookmarkEditWindow(ConfigListScreen, Screen):
367         CATEGORY,BOOKMARK = 0,1
368         skin = """
369                 <screen position="center,center" size="600,140" title="Bookmark Edit">
370                         <widget name="config" position="0,0" size="600,100" scrollbarMode="showOnDemand" />
371
372                         <ePixmap pixmap="skin_default/buttons/red.png" position="310,100" size="140,40" alphatest="on" />
373                         <ePixmap pixmap="skin_default/buttons/green.png" position="150,100" size="140,40" alphatest="on" />
374
375                         <widget source="key_red" render="Label" position="310,100" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
376                         <widget source="key_green" render="Label" position="150,100" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
377
378                         <widget name="VKeyIcon" pixmap="skin_default/buttons/key_text.png" position="0,100" zPosition="10" size="35,25" transparent="1" alphatest="on" />
379
380                 </screen>
381                 """
382         def __init__(self, session, _mode, _type, _data, _bm):
383                 self.mMode = _mode
384                 self.mType = _type
385                 self.mData = _data
386                 self.mSession = session
387                 self.mBookmarkManager = _bm
388
389                 if _data is not None:
390                         vbcfg.DEBUG("0x%x" % _data.mId)
391
392                 Screen.__init__(self, session)
393
394                 self.menulist = []
395                 ConfigListScreen.__init__(self, self.menulist)
396
397                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions",], {
398                         "ok"     : self.keyGreen,
399                         "green"  : self.keyGreen,
400                         "red"    : self.keyRed,
401                         "cancel" : self.keyRed,
402                 }, -2)
403
404                 self["VKeyIcon"] = Pixmap()
405                 self["key_red"] = StaticText(_("Cancel"))
406                 self["key_green"] = StaticText(_("Save"))
407
408                 self.menuItemTitle = None
409                 self.menuItemUrl   = None
410                 self.menuItemName  = None
411
412                 self.menuEntryName = None
413                 self.menuEntryTitle = None
414                 self.menuEntryUrl = None
415
416                 self.makeConfigList()
417                 self.onLayoutFinish.append(self.layoutFinished)
418
419         def layoutFinished(self):
420                 self.setTitle(_('Bookmark') + ' ' + self.mMode)
421
422         def selectedItem(self):
423                 currentPosition = self["config"].getCurrent()
424                 if self.mType == BookmarkEditWindow.CATEGORY:
425                         return (_("Name"), self.menuItemName)
426                 else:
427                         if currentPosition == self.menuEntryTitle:
428                                 return (_("Title"), self.menuItemTitle)
429                         elif currentPosition == self.menuEntryUrl:
430                                 return (_("Url"), self.menuItemUrl)
431                 return None
432
433         def showMessageBox(self, text):
434                 msg = _("Invalid ") + text + _("!!(Empty)\nPlease, Input to the") + " " + text + "."
435                 self.mSession.openWithCallback(self.showVKeyWindow, MessageBox, msg, MessageBox.TYPE_INFO)
436                 return False
437
438         def showVKeyWindow(self, data=None):
439                 itemTitle = ""
440                 itemValue = ""
441                 selected = self.selectedItem()
442                 if selected is not None:
443                         itemValue = selected[1].value
444                         if strIsEmpty(itemValue):
445                                 itemValue = ""
446                         itemTitle = selected[0]
447
448                 self.session.openWithCallback(self.cbVKeyWindow, VirtualKeyBoard, title=itemTitle, text=itemValue)
449
450         def cbVKeyWindow(self, data=None):
451                 if data is not None:
452                         selected = self.selectedItem()
453                         if selected is not None:
454                                 selected[1].setValue(data)
455
456         def saveData(self):
457                 if self.mType == BookmarkEditWindow.CATEGORY:
458                         if self.mMode == _('Add'):
459                                 categoryName = self.menuItemName.value
460                                 if strIsEmpty(categoryName):
461                                         return self.showMessageBox(_("Category Name"))
462                                 self.mBookmarkManager.addCategory(categoryName)
463                         else:
464                                 if strIsEmpty(self.menuItemName.value):
465                                         return self.showMessageBox(_("Category Name"))
466                                 self.mData.mName = self.menuItemName.value
467                                 self.mBookmarkManager.updateCategory(self.mData)
468                 else:
469                         if self.mMode == _('Add'):
470                                 bookmarkTitle = self.menuItemTitle.value
471                                 bookmarkUrl = self.menuItemUrl.value
472                                 if strIsEmpty(bookmarkTitle):
473                                         self["config"].setCurrentIndex(0)
474                                         return self.showMessageBox(_("Bookmark Title"))
475                                 if strIsEmpty(bookmarkUrl):
476                                         self["config"].setCurrentIndex(1)
477                                         return self.showMessageBox(_("Bookmark URL"))
478                                 self.mBookmarkManager.addBookmark(bookmarkTitle, bookmarkUrl, self.mData.mParent, 0)
479                         else:
480                                 if strIsEmpty(self.menuItemTitle.value):
481                                         self["config"].setCurrentIndex(0)
482                                         return self.showMessageBox(_("Bookmark Title"))
483                                 if strIsEmpty(self.menuItemUrl.value):
484                                         self["config"].setCurrentIndex(1)
485                                         return self.showMessageBox(_("Bookmark URL"))
486                                 self.mData.mTitle = self.menuItemTitle.value
487                                 self.mData.mUrl = self.menuItemUrl.value
488                                 self.mBookmarkManager.updateBookmark(self.mData)
489                 return True
490
491         def keyGreen(self):
492                 if not self.saveData():
493                         return
494                 self.close(True)
495
496         def keyRed(self):
497                 self.close(False)
498
499         def keyLeft(self):
500                 ConfigListScreen.keyLeft(self)
501
502         def keyRight(self):
503                 ConfigListScreen.keyRight(self)
504
505         def makeConfigList(self):
506                 self.menulist = []
507
508                 if self.mType == BookmarkEditWindow.CATEGORY:
509                         self.menuItemName = ConfigText(default=self.mData.mName, visible_width=65, fixed_size=False)
510
511                         self.menuEntryName = getConfigListEntry(_("Name"), self.menuItemName)
512
513                         self.menulist.append(self.menuEntryName)
514                 else:
515                         self.menuItemTitle = ConfigText(default=self.mData.mTitle, visible_width=65, fixed_size=False)
516                         self.menuItemUrl   = ConfigText(default=self.mData.mUrl, visible_width=65, fixed_size=False)
517
518                         self.menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
519                         self.menuEntryUrl = getConfigListEntry(_("Url"), self.menuItemUrl)
520
521                         self.menulist.append(self.menuEntryTitle)
522                         self.menulist.append(self.menuEntryUrl)
523
524                 self["config"].list = self.menulist
525                 self["config"].l.setList(self.menulist)
526
527 class BrowserBookmarkWindow(Screen):
528         skin = """
529                 <screen name="BrowserBookmarkWindow" position="center,120" size="600,400" title="Bookmark" >
530                         <widget name="bookmarklist" position="0,0" size="600,200" zPosition="10" scrollbarMode="showOnDemand" />
531
532                         <ePixmap pixmap="skin_default/buttons/key_0.png" position="556,330" size="35,30" alphatest="on" />
533                         <widget source="key_0" render="Label" position="258,330" zPosition="1" size="300,30" font="Regular;20" halign="right" valign="center"/>
534
535                         <ePixmap pixmap="skin_default/buttons/red.png" position="5,360" size="140,40" alphatest="on" />
536                         <ePixmap pixmap="skin_default/buttons/green.png" position="155,360" size="140,40" alphatest="on" />
537                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,360" size="140,40" alphatest="on" />
538                         <ePixmap pixmap="skin_default/buttons/blue.png" position="450,360" size="140,40" alphatest="on" />
539
540                         <widget source="key_red" render="Label" position="5,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
541                         <widget source="key_green" render="Label" position="155,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
542                         <widget source="key_yellow" render="Label" position="305,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
543                         <widget source="key_blue" render="Label" position="450,360" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
544                 </screen>
545                 """
546
547         def __init__(self, _session, _url=None, _title=None):
548                 self.mUrl = _url
549                 self.mTitle = _title
550                 self.mBookmarkManager = BookmarkManager.getInstance()
551                 self.mSession = _session
552                 Screen.__init__(self, _session)
553                 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions","ColorActions", "NumberActions"], {
554                                 "ok"    : self.keyOK,
555                                 "cancel": self.keyCancel,
556                                 "red"   : self.keyRed,
557                                 "green" : self.keyGreen,
558                                 "yellow": self.keyYellow,
559                                 "blue"  : self.keyBlue,
560                                 "0" : self.keyNumber,
561                         },-2)
562
563                 self["key_red"]    = StaticText(_("Exit"))
564                 self["key_green"]  = StaticText(_("Add"))
565                 self["key_yellow"] = StaticText(_("Edit"))
566                 self["key_blue"]   = StaticText(_("Delete"))
567                 self["key_0"]      = StaticText(_("Set as Startpage"))
568
569                 self.mBookmarkList = self.setBookmarkList()
570                 self["bookmarklist"] = MenuList(self.mBookmarkList)
571
572                 self.onLayoutFinish.append(self.layoutFinished)
573
574         def layoutFinished(self):
575                 self.setTitle(_('Bookmark'))
576
577         def setBookmarkList(self):
578                 l = []
579                 #self.mBookmarkManager.dump()
580                 cd = self.mBookmarkManager.getBookmarkRoot()
581                 for ck in cd.iterkeys():
582                         l.append(('# ' + cd[ck].mName, cd[ck]))
583                         bd = cd[ck].mBookmarks
584                         for bk in bd.iterkeys():
585                                 l.append(('    - ' + bd[bk].mTitle, bd[bk]))
586                 return l
587
588         def updateBookmarkList(self):
589                 self.mBookmarkList = self.setBookmarkList()
590                 self["bookmarklist"].setList(self.mBookmarkList)
591
592         def cbEditWindow(self, ret=False):
593                 if not ret:
594                         return
595                 self.updateBookmarkList()
596
597         def getParentCategory(self):
598                 idx = self["bookmarklist"].getSelectedIndex()
599                 try:
600                         while idx >= 0:
601                                 data = self.mBookmarkList[idx][0].strip()
602                                 if data[0] == '#':
603                                         return self.mBookmarkList[idx][1]
604                                 idx -= 1
605                 except: pass
606                 return None
607
608         def isCategoryItem(self):
609                 try:
610                         head = self["bookmarklist"].getCurrent()[0].strip()
611                         if head[0] == '#':
612                                 return True
613                 except: pass
614                 return False
615
616         def keyNumber(self):
617                 if self.isCategoryItem(): return
618
619                 data = self["bookmarklist"].getCurrent()[1]
620                 if strIsEmpty(data.mUrl):
621                         msg = _("Invalid URL. Please check again!!")
622                         self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
623                         return
624                 def cbSetStartpage(ret=None):
625                         if ret is None: return
626                         if ret:
627                                 data = self["bookmarklist"].getCurrent()[1]
628                                 BrowserSetting().setData(data.mUrl, data.mType)
629                 msg = _("Do you want to set selected url to the Startpage?")
630                 self.mSession.openWithCallback(cbSetStartpage, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
631
632         def keyGreen(self):
633                 def cbGreen(data):
634                         if data is None:
635                                 return
636                         if data[1] == 1:
637                                 parent = self.getParentCategory()
638                                 if parent is None:
639                                         return
640                                 if strIsEmpty(self.mTitle):
641                                         return
642                                 retAdd = self.mBookmarkManager.addBookmark(self.mTitle, self.mUrl, parent.mId, 0)
643                                 if not retAdd:
644                                         msg = _("Current page is already exist.")
645                                         self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
646                                 self.cbEditWindow(True)
647                         elif data[1] == 2:
648                                 parent = self.getParentCategory()
649                                 if parent is None:
650                                         return
651                                 b = BookmarkData(0, '', '', parent.mId, 0)
652                                 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.BOOKMARK, b, self.mBookmarkManager)
653                         elif data[1] == 3:
654                                 c = CategoryData(0, '')
655                                 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.CATEGORY, c, self.mBookmarkManager)
656                 if strIsEmpty(self.mUrl):
657                         l = [(_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
658                 else:   l = [(_('Currentpage(Bookmark)'),1,), (_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
659                 self.mSession.openWithCallback(cbGreen, ChoiceBox, title=_("Please choose."), list=l)
660
661         def keyYellow(self):
662                 data = self["bookmarklist"].getCurrent()[1]
663                 if self.isCategoryItem():
664                         self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.CATEGORY, data, self.mBookmarkManager)
665                 else:   self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.BOOKMARK, data, self.mBookmarkManager)
666
667         def keyBlue(self):
668                 def cbBlue(ret=None):
669                         if not ret: return
670                         data = self["bookmarklist"].getCurrent()[1]
671                         if self.isCategoryItem():
672                                 self.mBookmarkManager.deleteCategory(data.mId)
673                         else:   self.mBookmarkManager.deleteBookmark(data.mId)
674                         self.updateBookmarkList()
675                 if self.isCategoryItem():
676                         msg = _("Do you want to delete the category and the bookmarks?")
677                 else:   msg = _("Do you want to delete the bookmark?")
678                 self.mSession.openWithCallback(cbBlue, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
679
680         def keyOK(self):
681                 if self.isCategoryItem(): return
682
683                 data = self["bookmarklist"].getCurrent()[1]
684                 url = data.mUrl.strip()
685                 if len(url) == 0:
686                         self.session.open(MessageBox, _("Can't open selected bookmark.\n   - URL data is empty!!"), type = MessageBox.TYPE_INFO)
687                         return
688                 mode = data.mType
689                 if mode:
690                         lang = language.getLanguage()
691                         if os.path.exists(vbcfg.MANUALROOT + '/' + lang):
692                                 url = vbcfg.MANUALROOT + '/' + lang + '/main.html'
693                 self.close((url, mode))
694
695         def keyRed(self):
696                 self.keyCancel()
697
698         def keyCancel(self):
699                 self.close()
700
701 class BrowserHelpWindow(Screen, HelpableScreen):
702         MODE_GLOBAL,MODE_KEYBOARD,MODE_MOUSE = 1,2,3
703         skin = """
704                 <screen name="BrowserHelpWindow" position="center,center" size="600,40" title="Browser Help" >
705                         <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
706                         <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
707                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
708                         <ePixmap pixmap="skin_default/buttons/blue.png" position="450,0" size="140,40" alphatest="on" />
709
710                         <widget source="key_red" render="Label" position="5,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
711                         <widget source="key_green" render="Label" position="155,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
712                         <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
713                         <widget source="key_blue" render="Label" position="450,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
714                 </screen>
715                 """
716         def __init__(self, session):
717                 Screen.__init__(self, session)
718                 HelpableScreen.__init__(self)
719
720                 self["key_red"]    = StaticText(_("Exit"))
721                 self["key_green"]  = StaticText(_("Global"))
722                 self["key_yellow"] = StaticText(_("Mouse"))
723                 self["key_blue"]   = StaticText(_("Keyboard"))
724
725                 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions","ColorActions"], {
726                                 "ok"    : self.keyRed,
727                                 "cancel": self.keyRed,
728                                 "red"   : self.keyRed,
729                                 "green" : self.keyGreen,
730                                 "yellow": self.keyYellow,
731                                 "blue"  : self.keyBlue,
732                         },-2)
733
734                 self.showHelpTimer = eTimer()
735                 self.showHelpTimer.callback.append(self.cbShowHelpTimerClosed)
736                 self.showHelpTimer.start(500)
737
738                 self.onLayoutFinish.append(self.layoutFinished)
739
740         def layoutFinished(self):
741                 self.setTitle(_('Browser Help'))
742
743         def cbShowHelpTimerClosed(self):
744                 self.showHelpTimer.stop()
745                 self.setHelpModeActions(self.MODE_GLOBAL)
746
747         def setHelpModeActions(self, _mode=0):
748                 self.helpList = []
749                 if _mode == self.MODE_GLOBAL:
750                         self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
751                                 "cancel" : (self.keyPass, _("Exit the Browser.")),
752                         })
753                         self["MenuActions"] = HelpableActionMap(self, "MenuActions", {
754                                 "menu" : (self.keyPass, _("Show the Menu window.")),
755                         })
756                         self["ColorActions"] = HelpableActionMap(self, "ColorActions", {
757                                 "green"  : (self.keyPass, _("Enter Key")),
758                                 "yellow" : (self.keyPass, _("Show the Virtual keyboard window.")),
759                                 "blue"   : (self.keyPass, _("Backspace Key")),
760                         })
761                         self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
762                                 "info" : (self.keyPass, _("Switch to keyboard/mouse mode.")),
763                         })
764
765                 elif _mode == self.MODE_MOUSE:
766                         self["DirectionActions"] = HelpableActionMap(self, "DirectionActions", {
767                                 "up"    : (self.keyPass, _("It will move the mouse pointer up.")),
768                                 "down"  : (self.keyPass, _("It will move the mouse pointer down.")),
769                                 "left"  : (self.keyPass, _("It will move the mouse pointer left.")),
770                                 "right" : (self.keyPass, _("It will move the mouse pointer right.")),
771                         })
772                         self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
773                                 "ok" : (self.keyPass, _("Left Mouse Button")),
774                         })
775                         self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
776                                 "nextBouquet" : (self.keyPass, _("Right Mouse Button")),
777                                 "nextService" : (self.keyPass, _("Left Key")),
778                                 "prevService" : (self.keyPass, _("Right Key")),
779                         })
780                 elif _mode == self.MODE_KEYBOARD:
781                         self["DirectionActions"] = HelpableActionMap(self, "DirectionActions", {
782                                 "up"    : (self.keyPass, _("Up Key")),
783                                 "down"  : (self.keyPass, _("Down Key")),
784                                 "left"  : (self.keyPass, _("Left Key")),
785                                 "right" : (self.keyPass, _("Right Key")),
786                         })
787                         self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
788                                 "ok" : (self.keyPass, _("Enter Key")),
789                         })
790                         self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
791                                 "nextBouquet" : (self.keyPass, _("PageUp Key")),
792                                 "prevBouquet" : (self.keyPass, _("PageDown Key")),
793                                 "nextService" : (self.keyPass, _("Go to previous page.")),
794                                 "prevService" : (self.keyPass, _("Go to next page.")),
795                         })
796
797                 if _mode > 0:
798                         self.showHelp()
799
800         def keyPass(self):
801                 pass
802
803         def keyRed(self):
804                 self.close()
805
806         def keyGreen(self):
807                 self.setHelpModeActions(self.MODE_GLOBAL)
808
809         def keyYellow(self):
810                 self.setHelpModeActions(self.MODE_MOUSE)
811
812         def keyBlue(self):
813                 self.setHelpModeActions(self.MODE_KEYBOARD)
814
815 class Browser(Screen):
816         MENU_ITEM_WIDTH  = 150
817         MENU_ITEM_HEIGHT = 30
818         MENULIST_WIDTH   = 200
819         MENULIST_HEIGHT  = 25
820
821         # menulist->position->y : MENU_ITEM_HEIGHT+30
822         # menulist->size->x     : MENULIST_WIDTH
823
824         size = getDesktop(0).size()
825         WIDTH  = int(size.width())
826         HEIGHT = int(size.height())
827         skin =  """
828                 <screen name="OperaBrowser" position="0,0" size="%(width)d,%(height)d" backgroundColor="transparent" flags="wfNoBorder" title="Opera Browser">
829                         <widget name="topArea" zPosition="-1" position="0,0" size="1280,60" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
830                         <widget name="menuitemFile" position="30,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
831                         <widget name="menuitemTool" position="180,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
832                         <widget name="menuitemHelp" position="330,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
833                         <widget name="menulist" position="50,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
834                         <widget name="submenulist" position="252,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
835                         <widget name="bottomArea" position="0,%(bottom_pos_y)d" size="%(bottom_size_x)d,80" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
836                 </screen>
837                 """ % { 'width'  :WIDTH,
838                         'height' :HEIGHT,
839                         'bottom_pos_y'  :HEIGHT-80,
840                         'bottom_size_x' :WIDTH }
841
842         MENULIST_ITEMS = []
843         COMMAND_MAP = {}
844         def __init__(self, session, url=None, is_webapp=False):
845                 Screen.__init__(self, session)
846                 self["actions"] = ActionMap(["DirectionActions", "MenuActions", "OkCancelActions"], {
847                          "cancel"      : self.keyCancel
848                         ,"ok"          : self.keyOK
849                         ,"left"        : self.keyLeft
850                         ,"right"       : self.keyRight
851                         ,"up"          : self.keyUp
852                         ,"down"        : self.keyDown
853                         ,"menu"        : self.keyMenu
854                 }, -2)
855
856                 self._cb_update_language()
857
858                 self.idx_menu = 0
859                 self.is_browser_opened = False
860                 self.is_show_top = True
861                 self.is_show_menu = False
862
863                 self._current_url = None
864                 self._current_title = None
865
866                 self["topArea"]    = Label()
867                 self["bottomArea"] = Label()
868
869                 self["menuitemFile"] = MultiColorLabel()
870                 self["menuitemTool"] = MultiColorLabel()
871                 self["menuitemHelp"] = MultiColorLabel()
872
873                 self.top_menus = [self["menuitemFile"], self["menuitemTool"], self["menuitemHelp"]]
874
875                 self["menulist"] = MenuList(self.get_menulist_items(self.idx_menu))
876                 self["submenulist"] = MenuList(None)
877
878                 self.onLayoutFinish.append(self.layoutFinished)
879
880                 self._close_timer = eTimer()
881                 self._close_timer.callback.append(self._cb_stop_browser)
882
883                 self.m_url = url
884                 self.m_webapp = is_webapp
885                 language.addCallback(self._cb_update_language)
886
887         def layoutFinished(self):
888                 self["menuitemFile"].setText(_("File"))
889                 self["menuitemTool"].setText(_("Tools"))
890                 self["menuitemHelp"].setText(_("Help"))
891
892                 self["menulist"].hide()
893                 self["submenulist"].hide()
894
895                 self["bottomArea"].setText(_("Opera Web Browser Plugin v2.0"))
896                 self.setTitle(_("BrowserMain"))
897                 self.set_menu_item()
898                 vbcfg.LOG("Starting Browser")
899
900                 if self.m_url is not None:
901                         self.keyMenu()
902                         if self.m_webapp:
903                                 self._cb_start_browser(self.m_url, 1, 'YOUTUBETV_OPENURL')
904                         else:
905                                 self._cb_start_browser(self.m_url, 1)
906
907         def _cb_update_language(self):
908                 self.MENULIST_ITEMS = [
909                         [(_('Open Startpage'), None), (_('Open URL'), None), (_('Start/Stop'),None), (_('Exit'), None)],
910                         [(_('Bookmark'), None), (_('Preference'), None), (_('Position Setup'), None)],
911                         [(_('About'), None), (_('Help'), None)]
912                 ]
913                 self.COMMAND_MAP = {}
914                 self.COMMAND_MAP[_('Open Startpage')] = self._cmd_OpenStartpage
915                 self.COMMAND_MAP[_('Open URL')] = self._cmd_OpenURL
916                 self.COMMAND_MAP[_('Start/Stop')] = self._cmd_StartStop
917                 self.COMMAND_MAP[_('Exit')] = self._cmd_Exit
918                 self.COMMAND_MAP[_('Bookmark')] = self._cmd_Bookmark
919                 self.COMMAND_MAP[_('Preference')] = self._cmd_Preference
920                 self.COMMAND_MAP[_('Position Setup')] = self._cmd_Position
921                 self.COMMAND_MAP[_('About')] = self._cmd_About
922                 self.COMMAND_MAP[_('Help')] = self._cmd_Help
923                 self.COMMAND_MAP[_('Return')] = self._cmd_Return
924
925         def _cb_set_title(self, title=None):
926                 vbcfg.LOG("page title: %s" % title)
927                 if title is None:
928                         return
929                 self.setTitle(title)
930
931         def _cb_close_window(self):
932                 self._close_timer.start(1000)
933
934         def _cb_start_browser(self, data=None, mode=0, opcode='BROWSER_OPENURL'):
935                 if not vbcfg.g_main.check_browser():
936                         if self.m_url is not None:
937                                 if vbcfg.g_service:
938                                         self.session.nav.playService(vbcfg.g_service)
939                         return
940                 vbcfg.LOG("open url: %s %d" % (data, mode))
941                 if strIsEmpty(data):
942                         return
943
944                 try:
945                         if self._cb_set_title not in vbcfg.g_main.vbhandler.onSetTitleCB:
946                                 vbcfg.g_main.vbhandler.onSetTitleCB.append(self._cb_set_title)
947                 except Exception:
948                         pass
949
950                 try:
951                         if self._cb_close_window not in vbcfg.g_main.vbhandler.onCloseCB:
952                                 vbcfg.g_main.vbhandler.onCloseCB.append(self._cb_close_window)
953                 except Exception:
954                         pass
955
956                 vbcfg.g_position = vbcfg.getPosition()
957                 fbClass.getInstance().lock()
958                 eRCInput.getInstance().lock()
959
960                 self.toggle_top()
961                 ret = VBController.command(opcode, data)
962                 self._current_url = data
963                 if ret:
964                         self.is_browser_opened = True
965                 else:
966                         self.is_browser_opened = False
967                         vbcfg.ERR("Failed to open url: %s" % data)
968
969                 vbcfg.g_main.vbhandler.soft_volume = -1
970
971         def _cb_stop_browser(self):
972                 self._close_timer.stop()
973
974                 try:
975                         if self._cb_set_title in vbcfg.g_main.vbhandler.onSetTitleCB:
976                                 vbcfg.g_main.vbhandler.onSetTitleCB.remove(self._cb_set_title)
977                 except Exception:
978                         pass
979
980                 try:
981                         if self._cb_close_window in vbcfg.g_main.vbhandler.onCloseCB:
982                                 vbcfg.g_main.vbhandler.onCloseCB.remove(self._cb_close_window)
983                 except Exception:
984                         pass
985
986                 self.toggle_top()
987
988                 from enigma import getDesktop, gMainDC
989                 desktop_size = getDesktop(0).size()
990                 gMainDC.getInstance().setResolution(desktop_size.width(), desktop_size.height())
991                 vbcfg.setPosition(vbcfg.g_position)
992
993                 fbClass.getInstance().unlock()
994                 eRCInput.getInstance().unlock()
995                 self.is_browser_opened = False
996
997                 vbcfg.LOG("Stop Browser")
998                 self.setTitle(_("BrowserMain"))
999                 if self.m_url is not None:
1000                         self.keyCancel()
1001                         if vbcfg.g_service:
1002                                 self.session.nav.playService(vbcfg.g_service)
1003                 else:
1004                         self.keyRight()
1005                         self.keyLeft()
1006
1007         def _cb_update_bookmark(self, data=None):
1008                 if data is None:
1009                         return
1010                 if not vbcfg.g_main.check_browser():
1011                         message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1012                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1013                         return
1014                 (url, mode) = data
1015                 self._cb_start_browser(url, mode)
1016
1017         def _cmd_OpenStartpage(self):
1018                 if not vbcfg.g_main.check_browser():
1019                         message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1020                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1021                         return
1022                 mode = 0
1023                 #startpage = 'http://vuplus.com'
1024                 try:
1025                         d = BrowserSetting().getData()
1026                         start = d['start']
1027                         mode = d['type']
1028                 except:
1029                         pass
1030                 self._cb_start_browser(start, mode)
1031
1032         def _cmd_OpenURL(self):
1033                 if not vbcfg.g_main.check_browser():
1034                         message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1035                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1036                         return
1037                 self.session.openWithCallback(self._cb_start_browser, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
1038
1039         def _cmd_StartStop(self):
1040                 if vbcfg.g_main is None:
1041                         return
1042                 vbcfg.g_main.menu_toggle_browser(self.keyMenu())
1043
1044         def _cmd_Exit(self):
1045                 self.close()
1046
1047         def _cmd_Bookmark(self):
1048                 url = self._current_url
1049                 if url is None:
1050                         url = ''
1051                 title = self._current_title
1052                 if title is None:
1053                         title = ''
1054                 self.session.openWithCallback(self._cb_update_bookmark, BrowserBookmarkWindow, url, title)
1055
1056         def _cmd_Preference(self):
1057                 url = self._current_url
1058                 if url is None:
1059                         url = ''
1060                 self.session.open(BrowserPreferenceWindow, url)
1061
1062         def _cmd_Position(self):
1063                 self.session.open(BrowserPositionWindow)
1064
1065         def _cmd_About(self):
1066                 self.session.open(MessageBox, _('Opera Web Browser Plugin v2.0'), type = MessageBox.TYPE_INFO)
1067
1068         def _cmd_Help(self):
1069                 self.session.open(BrowserHelpWindow)
1070
1071         def _cmd_Return(self):
1072                 self.keyCancel()
1073
1074         def do_command(self, command):
1075                 try:
1076                         self.COMMAND_MAP[command]()
1077                 except Exception, ErrMsg:
1078                         vbcfg.ERR(ErrMsg)
1079
1080         def get_menulist_items(self, idx=0):
1081                 l = self.MENULIST_ITEMS[idx]
1082                 if self.is_browser_opened and idx == 0:
1083                         l = [(_("Return"), None)]
1084                 return l
1085
1086         def set_menu_item(self):
1087                 self["menuitemFile"].setForegroundColorNum(0)
1088                 self["menuitemTool"].setForegroundColorNum(0)
1089                 self["menuitemHelp"].setForegroundColorNum(0)
1090                 self.top_menus[self.idx_menu].setForegroundColorNum(1)
1091
1092         def toggle_top(self):
1093                 if self.is_show_top:
1094                         self.hide()
1095                 else:
1096                         self.show()
1097                 self.is_show_top = not self.is_show_top
1098
1099         def toggle_menulist(self):
1100                 if self.is_show_menu:
1101                         self["menulist"].hide()
1102                 else:
1103                         self["menulist"].show()
1104                 self.is_show_menu = not self.is_show_menu
1105
1106         def toggle_browser(self, url=None, title=None):
1107                 self._current_url = url
1108                 if title is None:
1109                         idx = len(url)
1110                         if idx > 10:
1111                                 idx = 10
1112                         title = url[:idx]
1113                 self._current_title = title
1114                 if self._current_url:
1115                         vbcfg.DEBUG(self._current_url)
1116
1117                 self.toggle_top()
1118
1119                 self["menulist"].pageUp()
1120                 self.keyUp()
1121                 self.keyDown()
1122
1123         def keyCancel(self):
1124                 if self.is_browser_opened:
1125                         fbClass.getInstance().lock()
1126                         eRCInput.getInstance().lock()
1127                         self.toggle_top()
1128
1129                         VBController.command("BROWSER_MENU_CLOSE")
1130                         return
1131                 self._cmd_Exit()
1132
1133         def keyOK(self):
1134                 if not self.is_show_top:
1135                         self.keyMenu()
1136                         return
1137                 if not self.is_show_menu:
1138                         self.keyDown()
1139                         return
1140                 if self["menulist"].getCurrent()[1] is None:
1141                         self.do_command(self["menulist"].getCurrent()[0])
1142                         return
1143                 self.keyRight()
1144
1145         def keyLeft(self):
1146                 if self.idx_menu == 0:
1147                         self.idx_menu = 2
1148                 else:
1149                         self.idx_menu = self.idx_menu - 1
1150
1151                 if self.is_show_menu:
1152                         self["menulist"].pageUp()
1153                         self.keyUp()
1154                         self.keyDown()
1155                 self.set_menu_item()
1156
1157         def keyRight(self):
1158                 if self.idx_menu == 2:
1159                         self.idx_menu = 0
1160                 else:
1161                         self.idx_menu = self.idx_menu + 1
1162
1163                 if self.is_show_menu:
1164                         self["menulist"].pageUp()
1165                         self.keyUp()
1166                         self.keyDown()
1167                 self.set_menu_item()
1168
1169         def keyUp(self):
1170                 if self.is_show_menu and self["menulist"].getSelectedIndex() == 0:
1171                         self.toggle_menulist()
1172                         return
1173                 self["menulist"].up()
1174
1175         def keyDown(self):
1176                 if not self.is_show_menu:
1177                         self["menulist"].setList(self.get_menulist_items(self.idx_menu))
1178                         self["menulist"].resize(self.MENULIST_WIDTH, self.MENULIST_HEIGHT*len(self.get_menulist_items(self.idx_menu))+5)
1179                         self["menulist"].move(self.MENU_ITEM_WIDTH*self.idx_menu+50,self.MENU_ITEM_HEIGHT+30)
1180                         self.toggle_menulist()
1181                         return
1182                 self["menulist"].down()
1183
1184         def keyMenu(self):
1185                 self.toggle_top()