[Vbrowser] imported.
[vuplus_dvbapp] / lib / python / Plugins / Extensions / Vbrowser / 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="VuplusBrowser" position="0,0" size="%(width)d,%(height)d" backgroundColor="transparent" flags="wfNoBorder" title="Vuplus 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(_("Vuplus Web Browser Plugin v1.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_vbrowser():
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         def _cb_stop_browser(self):
970                 self._close_timer.stop()
971
972                 try:
973                         if self._cb_set_title in vbcfg.g_main.vbhandler.onSetTitleCB:
974                                 vbcfg.g_main.vbhandler.onSetTitleCB.remove(self._cb_set_title)
975                 except Exception:
976                         pass
977
978                 try:
979                         if self._cb_close_window in vbcfg.g_main.vbhandler.onCloseCB:
980                                 vbcfg.g_main.vbhandler.onCloseCB.remove(self._cb_close_window)
981                 except Exception:
982                         pass
983
984                 self.toggle_top()
985
986                 from enigma import getDesktop, gMainDC
987                 desktop_size = getDesktop(0).size()
988                 gMainDC.getInstance().setResolution(desktop_size.width(), desktop_size.height())
989                 vbcfg.setPosition(vbcfg.g_position)
990
991                 fbClass.getInstance().unlock()
992                 eRCInput.getInstance().unlock()
993                 self.is_browser_opened = False
994
995                 vbcfg.LOG("Stop Browser")
996                 self.setTitle(_("BrowserMain"))
997                 if self.m_url is not None:
998                         self.keyCancel()
999                         if vbcfg.g_service:
1000                                 self.session.nav.playService(vbcfg.g_service)
1001                 else:
1002                         self.keyRight()
1003                         self.keyLeft()
1004
1005         def _cb_update_bookmark(self, data=None):
1006                 if data is None:
1007                         return
1008                 if not vbcfg.g_main.check_vbrowser():
1009                         message = _("Vuplus Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1010                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1011                         return
1012                 (url, mode) = data
1013                 self._cb_start_browser(url, mode)
1014
1015         def _cmd_OpenStartpage(self):
1016                 if not vbcfg.g_main.check_vbrowser():
1017                         message = _("Vuplus Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1018                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1019                         return
1020                 mode = 0
1021                 #startpage = 'http://vuplus.com'
1022                 try:
1023                         d = BrowserSetting().getData()
1024                         start = d['start']
1025                         mode = d['type']
1026                 except:
1027                         pass
1028                 self._cb_start_browser(start, mode)
1029
1030         def _cmd_OpenURL(self):
1031                 if not vbcfg.g_main.check_vbrowser():
1032                         message = _("Vuplus Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1033                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1034                         return
1035                 self.session.openWithCallback(self._cb_start_browser, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
1036
1037         def _cmd_StartStop(self):
1038                 if vbcfg.g_main is None:
1039                         return
1040                 vbcfg.g_main.menu_toggle_vbrowser(self.keyMenu())
1041
1042         def _cmd_Exit(self):
1043                 self.close()
1044
1045         def _cmd_Bookmark(self):
1046                 url = self._current_url
1047                 if url is None:
1048                         url = ''
1049                 title = self._current_title
1050                 if title is None:
1051                         title = ''
1052                 self.session.openWithCallback(self._cb_update_bookmark, BrowserBookmarkWindow, url, title)
1053
1054         def _cmd_Preference(self):
1055                 url = self._current_url
1056                 if url is None:
1057                         url = ''
1058                 self.session.open(BrowserPreferenceWindow, url)
1059
1060         def _cmd_Position(self):
1061                 self.session.open(BrowserPositionWindow)
1062
1063         def _cmd_About(self):
1064                 self.session.open(MessageBox, _('Vuplus Web Browser Plugin v1.0'), type = MessageBox.TYPE_INFO)
1065
1066         def _cmd_Help(self):
1067                 self.session.open(BrowserHelpWindow)
1068
1069         def _cmd_Return(self):
1070                 self.keyCancel()
1071
1072         def do_command(self, command):
1073                 try:
1074                         self.COMMAND_MAP[command]()
1075                 except Exception, ErrMsg:
1076                         vbcfg.ERR(ErrMsg)
1077
1078         def get_menulist_items(self, idx=0):
1079                 l = self.MENULIST_ITEMS[idx]
1080                 if self.is_browser_opened and idx == 0:
1081                         l = [(_("Return"), None)]
1082                 return l
1083
1084         def set_menu_item(self):
1085                 self["menuitemFile"].setForegroundColorNum(0)
1086                 self["menuitemTool"].setForegroundColorNum(0)
1087                 self["menuitemHelp"].setForegroundColorNum(0)
1088                 self.top_menus[self.idx_menu].setForegroundColorNum(1)
1089
1090         def toggle_top(self):
1091                 if self.is_show_top:
1092                         self.hide()
1093                 else:
1094                         self.show()
1095                 self.is_show_top = not self.is_show_top
1096
1097         def toggle_menulist(self):
1098                 if self.is_show_menu:
1099                         self["menulist"].hide()
1100                 else:
1101                         self["menulist"].show()
1102                 self.is_show_menu = not self.is_show_menu
1103
1104         def toggle_browser(self, url=None, title=None):
1105                 self._current_url = url
1106                 if title is None:
1107                         idx = len(url)
1108                         if idx > 10:
1109                                 idx = 10
1110                         title = url[:idx]
1111                 self._current_title = title
1112                 if self._current_url:
1113                         vbcfg.DEBUG(self._current_url)
1114
1115                 self.toggle_top()
1116
1117                 self["menulist"].pageUp()
1118                 self.keyUp()
1119                 self.keyDown()
1120
1121         def keyCancel(self):
1122                 if self.is_browser_opened:
1123                         fbClass.getInstance().lock()
1124                         eRCInput.getInstance().lock()
1125                         self.toggle_top()
1126
1127                         VBController.command("BROWSER_MENU_CLOSE")
1128                         return
1129                 self._cmd_Exit()
1130
1131         def keyOK(self):
1132                 if not self.is_show_top:
1133                         self.keyMenu()
1134                         return
1135                 if not self.is_show_menu:
1136                         self.keyDown()
1137                         return
1138                 if self["menulist"].getCurrent()[1] is None:
1139                         self.do_command(self["menulist"].getCurrent()[0])
1140                         return
1141                 self.keyRight()
1142
1143         def keyLeft(self):
1144                 if self.idx_menu == 0:
1145                         self.idx_menu = 2
1146                 else:
1147                         self.idx_menu = self.idx_menu - 1
1148
1149                 if self.is_show_menu:
1150                         self["menulist"].pageUp()
1151                         self.keyUp()
1152                         self.keyDown()
1153                 self.set_menu_item()
1154
1155         def keyRight(self):
1156                 if self.idx_menu == 2:
1157                         self.idx_menu = 0
1158                 else:
1159                         self.idx_menu = self.idx_menu + 1
1160
1161                 if self.is_show_menu:
1162                         self["menulist"].pageUp()
1163                         self.keyUp()
1164                         self.keyDown()
1165                 self.set_menu_item()
1166
1167         def keyUp(self):
1168                 if self.is_show_menu and self["menulist"].getSelectedIndex() == 0:
1169                         self.toggle_menulist()
1170                         return
1171                 self["menulist"].up()
1172
1173         def keyDown(self):
1174                 if not self.is_show_menu:
1175                         self["menulist"].setList(self.get_menulist_items(self.idx_menu))
1176                         self["menulist"].resize(self.MENULIST_WIDTH, self.MENULIST_HEIGHT*len(self.get_menulist_items(self.idx_menu))+5)
1177                         self["menulist"].move(self.MENU_ITEM_WIDTH*self.idx_menu+50,self.MENU_ITEM_HEIGHT+30)
1178                         self.toggle_menulist()
1179                         return
1180                 self["menulist"].down()
1181
1182         def keyMenu(self):
1183                 self.toggle_top()