[hbbtv] revert keymap fixed.
[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
300                 VBController.command('CONTROL_RELOAD_KEYMAP')
301                 self.close()
302
303         def keyRed(self):
304                 self.close()
305
306         def keyOK(self):
307                 def _cb_directInputUrl(data):
308                         if strIsEmpty(data):
309                                 return
310                         self["url"].setText(data)
311                 if self["config"].l.getCurrentSelectionIndex() == 0 and self.menuItemStartpage.value == "direct":
312                         self.session.openWithCallback(_cb_directInputUrl, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
313
314         def keyLeft(self):
315                 ConfigListScreen.keyLeft(self)
316                 self.updateStartPageUrl()
317
318         def keyRight(self):
319                 ConfigListScreen.keyRight(self)
320                 self.updateStartPageUrl()
321
322         def getKeymapTypeList(self):
323                 types = []
324                 for f in os.listdir("%s/keymap" % vbcfg.APPROOT):
325                         filesplit = f.split('.')
326                         if len(filesplit) < 2:
327                                 continue
328                         types.append((filesplit[1], filesplit[1]))
329                 types.sort()
330                 return types
331
332         def makeMenuEntry(self):
333                 l = []
334                 l.append(("startpage", _("Start Page")))
335                 if not strIsEmpty(self._currentPageUrl):
336                         l.append(("current", _("Current Page")))
337                 l.append(("direct", _("Direct Input")))
338                 self.menuItemStartpage = ConfigSelection(default="startpage", choices = l)
339                 self.menuEntryStartpage = getConfigListEntry(_("Startpage"), self.menuItemStartpage)
340
341                 kl = self.getKeymapTypeList()
342
343                 try:
344                         d = BrowserSetting().getData()
345                         self._startPageUrl = d['start']
346                         self._keymapType = d['keymap']
347                         #d['type']
348                 except: self._startPageUrl = 'http://vuplus.com'
349                 self.updateStartPageUrl()
350
351                 if self._keymapType is None or len(self._keymapType) == 0:
352                         self._keymapType = "us-rc"
353                 self.menuItemKeyboardLayout = ConfigSelection(default=self._keymapType, choices = kl)
354                 self.menuEntryKeyboardLayout = getConfigListEntry(_("Keyboard Layout"), self.menuItemKeyboardLayout)
355                 self.resetMenuList()
356
357         def resetMenuList(self):
358                 self.menulist = []
359                 self.menulist.append(self.menuEntryStartpage)
360                 self.menulist.append(self.menuEntryKeyboardLayout)
361
362                 self["config"].list = self.menulist
363                 self["config"].l.setList(self.menulist)
364
365 class BookmarkEditWindow(ConfigListScreen, Screen):
366         CATEGORY,BOOKMARK = 0,1
367         skin = """
368                 <screen position="center,center" size="600,140" title="Bookmark Edit">
369                         <widget name="config" position="0,0" size="600,100" scrollbarMode="showOnDemand" />
370
371                         <ePixmap pixmap="skin_default/buttons/red.png" position="310,100" size="140,40" alphatest="on" />
372                         <ePixmap pixmap="skin_default/buttons/green.png" position="150,100" size="140,40" alphatest="on" />
373
374                         <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" />
375                         <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" />
376
377                         <widget name="VKeyIcon" pixmap="skin_default/buttons/key_text.png" position="0,100" zPosition="10" size="35,25" transparent="1" alphatest="on" />
378
379                 </screen>
380                 """
381         def __init__(self, session, _mode, _type, _data, _bm):
382                 self.mMode = _mode
383                 self.mType = _type
384                 self.mData = _data
385                 self.mSession = session
386                 self.mBookmarkManager = _bm
387
388                 if _data is not None:
389                         vbcfg.DEBUG("0x%x" % _data.mId)
390
391                 Screen.__init__(self, session)
392
393                 self.menulist = []
394                 ConfigListScreen.__init__(self, self.menulist)
395
396                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions",], {
397                         "ok"     : self.keyGreen,
398                         "green"  : self.keyGreen,
399                         "red"    : self.keyRed,
400                         "cancel" : self.keyRed,
401                 }, -2)
402
403                 self["VKeyIcon"] = Pixmap()
404                 self["key_red"] = StaticText(_("Cancel"))
405                 self["key_green"] = StaticText(_("Save"))
406
407                 self.menuItemTitle = None
408                 self.menuItemUrl   = None
409                 self.menuItemName  = None
410
411                 self.menuEntryName = None
412                 self.menuEntryTitle = None
413                 self.menuEntryUrl = None
414
415                 self.makeConfigList()
416                 self.onLayoutFinish.append(self.layoutFinished)
417
418         def layoutFinished(self):
419                 self.setTitle(_('Bookmark') + ' ' + self.mMode)
420
421         def selectedItem(self):
422                 currentPosition = self["config"].getCurrent()
423                 if self.mType == BookmarkEditWindow.CATEGORY:
424                         return (_("Name"), self.menuItemName)
425                 else:
426                         if currentPosition == self.menuEntryTitle:
427                                 return (_("Title"), self.menuItemTitle)
428                         elif currentPosition == self.menuEntryUrl:
429                                 return (_("Url"), self.menuItemUrl)
430                 return None
431
432         def showMessageBox(self, text):
433                 msg = _("Invalid ") + text + _("!!(Empty)\nPlease, Input to the") + " " + text + "."
434                 self.mSession.openWithCallback(self.showVKeyWindow, MessageBox, msg, MessageBox.TYPE_INFO)
435                 return False
436
437         def showVKeyWindow(self, data=None):
438                 itemTitle = ""
439                 itemValue = ""
440                 selected = self.selectedItem()
441                 if selected is not None:
442                         itemValue = selected[1].value
443                         if strIsEmpty(itemValue):
444                                 itemValue = ""
445                         itemTitle = selected[0]
446
447                 self.session.openWithCallback(self.cbVKeyWindow, VirtualKeyBoard, title=itemTitle, text=itemValue)
448
449         def cbVKeyWindow(self, data=None):
450                 if data is not None:
451                         selected = self.selectedItem()
452                         if selected is not None:
453                                 selected[1].setValue(data)
454
455         def saveData(self):
456                 if self.mType == BookmarkEditWindow.CATEGORY:
457                         if self.mMode == _('Add'):
458                                 categoryName = self.menuItemName.value
459                                 if strIsEmpty(categoryName):
460                                         return self.showMessageBox(_("Category Name"))
461                                 self.mBookmarkManager.addCategory(categoryName)
462                         else:
463                                 if strIsEmpty(self.menuItemName.value):
464                                         return self.showMessageBox(_("Category Name"))
465                                 self.mData.mName = self.menuItemName.value
466                                 self.mBookmarkManager.updateCategory(self.mData)
467                 else:
468                         if self.mMode == _('Add'):
469                                 bookmarkTitle = self.menuItemTitle.value
470                                 bookmarkUrl = self.menuItemUrl.value
471                                 if strIsEmpty(bookmarkTitle):
472                                         self["config"].setCurrentIndex(0)
473                                         return self.showMessageBox(_("Bookmark Title"))
474                                 if strIsEmpty(bookmarkUrl):
475                                         self["config"].setCurrentIndex(1)
476                                         return self.showMessageBox(_("Bookmark URL"))
477                                 self.mBookmarkManager.addBookmark(bookmarkTitle, bookmarkUrl, self.mData.mParent, 0)
478                         else:
479                                 if strIsEmpty(self.menuItemTitle.value):
480                                         self["config"].setCurrentIndex(0)
481                                         return self.showMessageBox(_("Bookmark Title"))
482                                 if strIsEmpty(self.menuItemUrl.value):
483                                         self["config"].setCurrentIndex(1)
484                                         return self.showMessageBox(_("Bookmark URL"))
485                                 self.mData.mTitle = self.menuItemTitle.value
486                                 self.mData.mUrl = self.menuItemUrl.value
487                                 self.mBookmarkManager.updateBookmark(self.mData)
488                 return True
489
490         def keyGreen(self):
491                 if not self.saveData():
492                         return
493                 self.close(True)
494
495         def keyRed(self):
496                 self.close(False)
497
498         def keyLeft(self):
499                 ConfigListScreen.keyLeft(self)
500
501         def keyRight(self):
502                 ConfigListScreen.keyRight(self)
503
504         def makeConfigList(self):
505                 self.menulist = []
506
507                 if self.mType == BookmarkEditWindow.CATEGORY:
508                         self.menuItemName = ConfigText(default=self.mData.mName, visible_width=65, fixed_size=False)
509
510                         self.menuEntryName = getConfigListEntry(_("Name"), self.menuItemName)
511
512                         self.menulist.append(self.menuEntryName)
513                 else:
514                         self.menuItemTitle = ConfigText(default=self.mData.mTitle, visible_width=65, fixed_size=False)
515                         self.menuItemUrl   = ConfigText(default=self.mData.mUrl, visible_width=65, fixed_size=False)
516
517                         self.menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
518                         self.menuEntryUrl = getConfigListEntry(_("Url"), self.menuItemUrl)
519
520                         self.menulist.append(self.menuEntryTitle)
521                         self.menulist.append(self.menuEntryUrl)
522
523                 self["config"].list = self.menulist
524                 self["config"].l.setList(self.menulist)
525
526 class BrowserBookmarkWindow(Screen):
527         skin = """
528                 <screen name="BrowserBookmarkWindow" position="center,120" size="600,400" title="Bookmark" >
529                         <widget name="bookmarklist" position="0,0" size="600,200" zPosition="10" scrollbarMode="showOnDemand" />
530
531                         <ePixmap pixmap="skin_default/buttons/key_0.png" position="556,330" size="35,30" alphatest="on" />
532                         <widget source="key_0" render="Label" position="258,330" zPosition="1" size="300,30" font="Regular;20" halign="right" valign="center"/>
533
534                         <ePixmap pixmap="skin_default/buttons/red.png" position="5,360" size="140,40" alphatest="on" />
535                         <ePixmap pixmap="skin_default/buttons/green.png" position="155,360" size="140,40" alphatest="on" />
536                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,360" size="140,40" alphatest="on" />
537                         <ePixmap pixmap="skin_default/buttons/blue.png" position="450,360" size="140,40" alphatest="on" />
538
539                         <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" />
540                         <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" />
541                         <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" />
542                         <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" />
543                 </screen>
544                 """
545
546         def __init__(self, _session, _url=None, _title=None):
547                 self.mUrl = _url
548                 self.mTitle = _title
549                 self.mBookmarkManager = BookmarkManager.getInstance()
550                 self.mSession = _session
551                 Screen.__init__(self, _session)
552                 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions","ColorActions", "NumberActions"], {
553                                 "ok"    : self.keyOK,
554                                 "cancel": self.keyCancel,
555                                 "red"   : self.keyRed,
556                                 "green" : self.keyGreen,
557                                 "yellow": self.keyYellow,
558                                 "blue"  : self.keyBlue,
559                                 "0" : self.keyNumber,
560                         },-2)
561
562                 self["key_red"]    = StaticText(_("Exit"))
563                 self["key_green"]  = StaticText(_("Add"))
564                 self["key_yellow"] = StaticText(_("Edit"))
565                 self["key_blue"]   = StaticText(_("Delete"))
566                 self["key_0"]      = StaticText(_("Set as Startpage"))
567
568                 self.mBookmarkList = self.setBookmarkList()
569                 self["bookmarklist"] = MenuList(self.mBookmarkList)
570
571                 self.onLayoutFinish.append(self.layoutFinished)
572
573         def layoutFinished(self):
574                 self.setTitle(_('Bookmark'))
575
576         def setBookmarkList(self):
577                 l = []
578                 #self.mBookmarkManager.dump()
579                 cd = self.mBookmarkManager.getBookmarkRoot()
580                 for ck in cd.iterkeys():
581                         l.append(('# ' + cd[ck].mName, cd[ck]))
582                         bd = cd[ck].mBookmarks
583                         for bk in bd.iterkeys():
584                                 l.append(('    - ' + bd[bk].mTitle, bd[bk]))
585                 return l
586
587         def updateBookmarkList(self):
588                 self.mBookmarkList = self.setBookmarkList()
589                 self["bookmarklist"].setList(self.mBookmarkList)
590
591         def cbEditWindow(self, ret=False):
592                 if not ret:
593                         return
594                 self.updateBookmarkList()
595
596         def getParentCategory(self):
597                 idx = self["bookmarklist"].getSelectedIndex()
598                 try:
599                         while idx >= 0:
600                                 data = self.mBookmarkList[idx][0].strip()
601                                 if data[0] == '#':
602                                         return self.mBookmarkList[idx][1]
603                                 idx -= 1
604                 except: pass
605                 return None
606
607         def isCategoryItem(self):
608                 try:
609                         head = self["bookmarklist"].getCurrent()[0].strip()
610                         if head[0] == '#':
611                                 return True
612                 except: pass
613                 return False
614
615         def keyNumber(self):
616                 if self.isCategoryItem(): return
617
618                 data = self["bookmarklist"].getCurrent()[1]
619                 if strIsEmpty(data.mUrl):
620                         msg = _("Invalid URL. Please check again!!")
621                         self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
622                         return
623                 def cbSetStartpage(ret=None):
624                         if ret is None: return
625                         if ret:
626                                 data = self["bookmarklist"].getCurrent()[1]
627                                 BrowserSetting().setData(data.mUrl, data.mType)
628                 msg = _("Do you want to set selected url to the Startpage?")
629                 self.mSession.openWithCallback(cbSetStartpage, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
630
631         def keyGreen(self):
632                 def cbGreen(data):
633                         if data is None:
634                                 return
635                         if data[1] == 1:
636                                 parent = self.getParentCategory()
637                                 if parent is None:
638                                         return
639                                 if strIsEmpty(self.mTitle):
640                                         return
641                                 retAdd = self.mBookmarkManager.addBookmark(self.mTitle, self.mUrl, parent.mId, 0)
642                                 if not retAdd:
643                                         msg = _("Current page is already exist.")
644                                         self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
645                                 self.cbEditWindow(True)
646                         elif data[1] == 2:
647                                 parent = self.getParentCategory()
648                                 if parent is None:
649                                         return
650                                 b = BookmarkData(0, '', '', parent.mId, 0)
651                                 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.BOOKMARK, b, self.mBookmarkManager)
652                         elif data[1] == 3:
653                                 c = CategoryData(0, '')
654                                 self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.CATEGORY, c, self.mBookmarkManager)
655                 if strIsEmpty(self.mUrl):
656                         l = [(_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
657                 else:   l = [(_('Currentpage(Bookmark)'),1,), (_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
658                 self.mSession.openWithCallback(cbGreen, ChoiceBox, title=_("Please choose."), list=l)
659
660         def keyYellow(self):
661                 data = self["bookmarklist"].getCurrent()[1]
662                 if self.isCategoryItem():
663                         self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.CATEGORY, data, self.mBookmarkManager)
664                 else:   self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.BOOKMARK, data, self.mBookmarkManager)
665
666         def keyBlue(self):
667                 def cbBlue(ret=None):
668                         if not ret: return
669                         data = self["bookmarklist"].getCurrent()[1]
670                         if self.isCategoryItem():
671                                 self.mBookmarkManager.deleteCategory(data.mId)
672                         else:   self.mBookmarkManager.deleteBookmark(data.mId)
673                         self.updateBookmarkList()
674                 if self.isCategoryItem():
675                         msg = _("Do you want to delete the category and the bookmarks?")
676                 else:   msg = _("Do you want to delete the bookmark?")
677                 self.mSession.openWithCallback(cbBlue, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
678
679         def keyOK(self):
680                 if self.isCategoryItem(): return
681
682                 data = self["bookmarklist"].getCurrent()[1]
683                 url = data.mUrl.strip()
684                 if len(url) == 0:
685                         self.session.open(MessageBox, _("Can't open selected bookmark.\n   - URL data is empty!!"), type = MessageBox.TYPE_INFO)
686                         return
687                 mode = data.mType
688                 if mode:
689                         lang = language.getLanguage()
690                         if os.path.exists(vbcfg.MANUALROOT + '/' + lang):
691                                 url = vbcfg.MANUALROOT + '/' + lang + '/main.html'
692                 self.close((url, mode))
693
694         def keyRed(self):
695                 self.keyCancel()
696
697         def keyCancel(self):
698                 self.close()
699
700 class BrowserHelpWindow(Screen, HelpableScreen):
701         MODE_GLOBAL,MODE_KEYBOARD,MODE_MOUSE = 1,2,3
702         skin = """
703                 <screen name="BrowserHelpWindow" position="center,center" size="600,40" title="Browser Help" >
704                         <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
705                         <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
706                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
707                         <ePixmap pixmap="skin_default/buttons/blue.png" position="450,0" size="140,40" alphatest="on" />
708
709                         <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" />
710                         <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" />
711                         <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" />
712                         <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" />
713                 </screen>
714                 """
715         def __init__(self, session):
716                 Screen.__init__(self, session)
717                 HelpableScreen.__init__(self)
718
719                 self["key_red"]    = StaticText(_("Exit"))
720                 self["key_green"]  = StaticText(_("Global"))
721                 self["key_yellow"] = StaticText(_("Mouse"))
722                 self["key_blue"]   = StaticText(_("Keyboard"))
723
724                 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions","ColorActions"], {
725                                 "ok"    : self.keyRed,
726                                 "cancel": self.keyRed,
727                                 "red"   : self.keyRed,
728                                 "green" : self.keyGreen,
729                                 "yellow": self.keyYellow,
730                                 "blue"  : self.keyBlue,
731                         },-2)
732
733                 self.showHelpTimer = eTimer()
734                 self.showHelpTimer.callback.append(self.cbShowHelpTimerClosed)
735                 self.showHelpTimer.start(500)
736
737                 self.onLayoutFinish.append(self.layoutFinished)
738
739         def layoutFinished(self):
740                 self.setTitle(_('Browser Help'))
741
742         def cbShowHelpTimerClosed(self):
743                 self.showHelpTimer.stop()
744                 self.setHelpModeActions(self.MODE_GLOBAL)
745
746         def setHelpModeActions(self, _mode=0):
747                 self.helpList = []
748                 if _mode == self.MODE_GLOBAL:
749                         self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
750                                 "cancel" : (self.keyPass, _("Exit the Browser.")),
751                         })
752                         self["MenuActions"] = HelpableActionMap(self, "MenuActions", {
753                                 "menu" : (self.keyPass, _("Show the Menu window.")),
754                         })
755                         self["ColorActions"] = HelpableActionMap(self, "ColorActions", {
756                                 "green"  : (self.keyPass, _("Enter Key")),
757                                 "yellow" : (self.keyPass, _("Show the Virtual keyboard window.")),
758                                 "blue"   : (self.keyPass, _("Backspace Key")),
759                         })
760                         self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
761                                 "info" : (self.keyPass, _("Switch to keyboard/mouse mode.")),
762                         })
763
764                 elif _mode == self.MODE_MOUSE:
765                         self["DirectionActions"] = HelpableActionMap(self, "DirectionActions", {
766                                 "up"    : (self.keyPass, _("It will move the mouse pointer up.")),
767                                 "down"  : (self.keyPass, _("It will move the mouse pointer down.")),
768                                 "left"  : (self.keyPass, _("It will move the mouse pointer left.")),
769                                 "right" : (self.keyPass, _("It will move the mouse pointer right.")),
770                         })
771                         self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
772                                 "ok" : (self.keyPass, _("Left Mouse Button")),
773                         })
774                         self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
775                                 "nextBouquet" : (self.keyPass, _("Right Mouse Button")),
776                                 "nextService" : (self.keyPass, _("Left Key")),
777                                 "prevService" : (self.keyPass, _("Right Key")),
778                         })
779                 elif _mode == self.MODE_KEYBOARD:
780                         self["DirectionActions"] = HelpableActionMap(self, "DirectionActions", {
781                                 "up"    : (self.keyPass, _("Up Key")),
782                                 "down"  : (self.keyPass, _("Down Key")),
783                                 "left"  : (self.keyPass, _("Left Key")),
784                                 "right" : (self.keyPass, _("Right Key")),
785                         })
786                         self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", {
787                                 "ok" : (self.keyPass, _("Enter Key")),
788                         })
789                         self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions", {
790                                 "nextBouquet" : (self.keyPass, _("PageUp Key")),
791                                 "prevBouquet" : (self.keyPass, _("PageDown Key")),
792                                 "nextService" : (self.keyPass, _("Go to previous page.")),
793                                 "prevService" : (self.keyPass, _("Go to next page.")),
794                         })
795
796                 if _mode > 0:
797                         self.showHelp()
798
799         def keyPass(self):
800                 pass
801
802         def keyRed(self):
803                 self.close()
804
805         def keyGreen(self):
806                 self.setHelpModeActions(self.MODE_GLOBAL)
807
808         def keyYellow(self):
809                 self.setHelpModeActions(self.MODE_MOUSE)
810
811         def keyBlue(self):
812                 self.setHelpModeActions(self.MODE_KEYBOARD)
813
814 class Browser(Screen):
815         MENU_ITEM_WIDTH  = 150
816         MENU_ITEM_HEIGHT = 30
817         MENULIST_WIDTH   = 200
818         MENULIST_HEIGHT  = 25
819
820         # menulist->position->y : MENU_ITEM_HEIGHT+30
821         # menulist->size->x     : MENULIST_WIDTH
822
823         size = getDesktop(0).size()
824         WIDTH  = int(size.width())
825         HEIGHT = int(size.height())
826         skin =  """
827                 <screen name="OperaBrowser" position="0,0" size="%(width)d,%(height)d" backgroundColor="transparent" flags="wfNoBorder" title="Opera Browser">
828                         <widget name="topArea" zPosition="-1" position="0,0" size="1280,60" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
829                         <widget name="menuitemFile" position="30,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
830                         <widget name="menuitemTool" position="180,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
831                         <widget name="menuitemHelp" position="330,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
832                         <widget name="menulist" position="50,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
833                         <widget name="submenulist" position="252,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
834                         <widget name="bottomArea" position="0,%(bottom_pos_y)d" size="%(bottom_size_x)d,80" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
835                 </screen>
836                 """ % { 'width'  :WIDTH,
837                         'height' :HEIGHT,
838                         'bottom_pos_y'  :HEIGHT-80,
839                         'bottom_size_x' :WIDTH }
840
841         MENULIST_ITEMS = []
842         COMMAND_MAP = {}
843         def __init__(self, session, url=None, is_webapp=False):
844                 Screen.__init__(self, session)
845                 self["actions"] = ActionMap(["DirectionActions", "MenuActions", "OkCancelActions"], {
846                          "cancel"      : self.keyCancel
847                         ,"ok"          : self.keyOK
848                         ,"left"        : self.keyLeft
849                         ,"right"       : self.keyRight
850                         ,"up"          : self.keyUp
851                         ,"down"        : self.keyDown
852                         ,"menu"        : self.keyMenu
853                 }, -2)
854
855                 self._cb_update_language()
856
857                 self.idx_menu = 0
858                 self.is_browser_opened = False
859                 self.is_show_top = True
860                 self.is_show_menu = False
861
862                 self._current_url = None
863                 self._current_title = None
864
865                 self["topArea"]    = Label()
866                 self["bottomArea"] = Label()
867
868                 self["menuitemFile"] = MultiColorLabel()
869                 self["menuitemTool"] = MultiColorLabel()
870                 self["menuitemHelp"] = MultiColorLabel()
871
872                 self.top_menus = [self["menuitemFile"], self["menuitemTool"], self["menuitemHelp"]]
873
874                 self["menulist"] = MenuList(self.get_menulist_items(self.idx_menu))
875                 self["submenulist"] = MenuList(None)
876
877                 self.onLayoutFinish.append(self.layoutFinished)
878
879                 self._close_timer = eTimer()
880                 self._close_timer.callback.append(self._cb_stop_browser)
881
882                 self.m_url = url
883                 self.m_webapp = is_webapp
884                 language.addCallback(self._cb_update_language)
885
886         def layoutFinished(self):
887                 self["menuitemFile"].setText(_("File"))
888                 self["menuitemTool"].setText(_("Tools"))
889                 self["menuitemHelp"].setText(_("Help"))
890
891                 self["menulist"].hide()
892                 self["submenulist"].hide()
893
894                 self["bottomArea"].setText(_("Opera Web Browser Plugin v2.0"))
895                 self.setTitle(_("BrowserMain"))
896                 self.set_menu_item()
897                 vbcfg.LOG("Starting Browser")
898
899                 if self.m_url is not None:
900                         self.keyMenu()
901                         if self.m_webapp:
902                                 self._cb_start_browser(self.m_url, 1, 'YOUTUBETV_OPENURL')
903                         else:
904                                 self._cb_start_browser(self.m_url, 1)
905
906         def _cb_update_language(self):
907                 self.MENULIST_ITEMS = [
908                         [(_('Open Startpage'), None), (_('Open URL'), None), (_('Start/Stop'),None), (_('Exit'), None)],
909                         [(_('Bookmark'), None), (_('Preference'), None), (_('Position Setup'), None)],
910                         [(_('About'), None), (_('Help'), None)]
911                 ]
912                 self.COMMAND_MAP = {}
913                 self.COMMAND_MAP[_('Open Startpage')] = self._cmd_OpenStartpage
914                 self.COMMAND_MAP[_('Open URL')] = self._cmd_OpenURL
915                 self.COMMAND_MAP[_('Start/Stop')] = self._cmd_StartStop
916                 self.COMMAND_MAP[_('Exit')] = self._cmd_Exit
917                 self.COMMAND_MAP[_('Bookmark')] = self._cmd_Bookmark
918                 self.COMMAND_MAP[_('Preference')] = self._cmd_Preference
919                 self.COMMAND_MAP[_('Position Setup')] = self._cmd_Position
920                 self.COMMAND_MAP[_('About')] = self._cmd_About
921                 self.COMMAND_MAP[_('Help')] = self._cmd_Help
922                 self.COMMAND_MAP[_('Return')] = self._cmd_Return
923
924         def _cb_set_title(self, title=None):
925                 vbcfg.LOG("page title: %s" % title)
926                 if title is None:
927                         return
928                 self.setTitle(title)
929
930         def _cb_close_window(self):
931                 self._close_timer.start(1000)
932
933         def _cb_start_browser(self, data=None, mode=0, opcode='BROWSER_OPENURL'):
934                 if not vbcfg.g_main.check_browser():
935                         if self.m_url is not None:
936                                 if vbcfg.g_service:
937                                         self.session.nav.playService(vbcfg.g_service)
938                         return
939                 vbcfg.LOG("open url: %s %d" % (data, mode))
940                 if strIsEmpty(data):
941                         return
942
943                 try:
944                         if self._cb_set_title not in vbcfg.g_main.vbhandler.onSetTitleCB:
945                                 vbcfg.g_main.vbhandler.onSetTitleCB.append(self._cb_set_title)
946                 except Exception:
947                         pass
948
949                 try:
950                         if self._cb_close_window not in vbcfg.g_main.vbhandler.onCloseCB:
951                                 vbcfg.g_main.vbhandler.onCloseCB.append(self._cb_close_window)
952                 except Exception:
953                         pass
954
955                 vbcfg.g_position = vbcfg.getPosition()
956                 fbClass.getInstance().lock()
957                 eRCInput.getInstance().lock()
958
959                 self.toggle_top()
960                 ret = VBController.command(opcode, data)
961                 self._current_url = data
962                 if ret:
963                         self.is_browser_opened = True
964                 else:
965                         self.is_browser_opened = False
966                         vbcfg.ERR("Failed to open url: %s" % data)
967
968                 vbcfg.g_main.vbhandler.soft_volume = -1
969
970         def _cb_stop_browser(self):
971                 self._close_timer.stop()
972
973                 try:
974                         if self._cb_set_title in vbcfg.g_main.vbhandler.onSetTitleCB:
975                                 vbcfg.g_main.vbhandler.onSetTitleCB.remove(self._cb_set_title)
976                 except Exception:
977                         pass
978
979                 try:
980                         if self._cb_close_window in vbcfg.g_main.vbhandler.onCloseCB:
981                                 vbcfg.g_main.vbhandler.onCloseCB.remove(self._cb_close_window)
982                 except Exception:
983                         pass
984
985                 self.toggle_top()
986
987                 from enigma import gMainDC
988                 gMainDC.getInstance().setResolution(self.WIDTH, self.HEIGHT)
989                 vbcfg.setPosition(vbcfg.g_position)
990
991                 fbClass.getInstance().unlock()
992                 eRCInput.getInstance().unlock()
993                 getDesktop(0).paint()
994                 self.is_browser_opened = False
995
996                 vbcfg.LOG("Stop Browser")
997                 self.setTitle(_("BrowserMain"))
998                 if self.m_url is not None:
999                         self.keyCancel()
1000                         if vbcfg.g_service:
1001                                 self.session.nav.playService(vbcfg.g_service)
1002                 else:
1003                         self.keyRight()
1004                         self.keyLeft()
1005
1006         def _cb_update_bookmark(self, data=None):
1007                 if data is None:
1008                         return
1009                 if not vbcfg.g_main.check_browser():
1010                         message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1011                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1012                         return
1013                 (url, mode) = data
1014                 self._cb_start_browser(url, mode)
1015
1016         def _cmd_OpenStartpage(self):
1017                 if not vbcfg.g_main.check_browser():
1018                         message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1019                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1020                         return
1021                 mode = 0
1022                 #startpage = 'http://vuplus.com'
1023                 try:
1024                         d = BrowserSetting().getData()
1025                         start = d['start']
1026                         mode = d['type']
1027                 except:
1028                         pass
1029                 self._cb_start_browser(start, mode)
1030
1031         def _cmd_OpenURL(self):
1032                 if not vbcfg.g_main.check_browser():
1033                         message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
1034                         self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
1035                         return
1036                 self.session.openWithCallback(self._cb_start_browser, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
1037
1038         def _cmd_StartStop(self):
1039                 if vbcfg.g_main is None:
1040                         return
1041                 vbcfg.g_main.menu_toggle_browser(self.keyMenu())
1042
1043         def _cmd_Exit(self):
1044                 self.close()
1045
1046         def _cmd_Bookmark(self):
1047                 url = self._current_url
1048                 if url is None:
1049                         url = ''
1050                 title = self._current_title
1051                 if title is None:
1052                         title = ''
1053                 self.session.openWithCallback(self._cb_update_bookmark, BrowserBookmarkWindow, url, title)
1054
1055         def _cmd_Preference(self):
1056                 url = self._current_url
1057                 if url is None:
1058                         url = ''
1059                 self.session.open(BrowserPreferenceWindow, url)
1060
1061         def _cmd_Position(self):
1062                 self.session.open(BrowserPositionWindow)
1063
1064         def _cmd_About(self):
1065                 self.session.open(MessageBox, _('Opera Web Browser Plugin v2.0'), type = MessageBox.TYPE_INFO)
1066
1067         def _cmd_Help(self):
1068                 self.session.open(BrowserHelpWindow)
1069
1070         def _cmd_Return(self):
1071                 self.keyCancel()
1072
1073         def do_command(self, command):
1074                 try:
1075                         self.COMMAND_MAP[command]()
1076                 except Exception, ErrMsg:
1077                         vbcfg.ERR(ErrMsg)
1078
1079         def get_menulist_items(self, idx=0):
1080                 l = self.MENULIST_ITEMS[idx]
1081                 if self.is_browser_opened and idx == 0:
1082                         l = [(_("Return"), None)]
1083                 return l
1084
1085         def set_menu_item(self):
1086                 self["menuitemFile"].setForegroundColorNum(0)
1087                 self["menuitemTool"].setForegroundColorNum(0)
1088                 self["menuitemHelp"].setForegroundColorNum(0)
1089                 self.top_menus[self.idx_menu].setForegroundColorNum(1)
1090
1091         def toggle_top(self):
1092                 if self.is_show_top:
1093                         self.hide()
1094                 else:
1095                         self.show()
1096                 self.is_show_top = not self.is_show_top
1097
1098         def toggle_menulist(self):
1099                 if self.is_show_menu:
1100                         self["menulist"].hide()
1101                 else:
1102                         self["menulist"].show()
1103                 self.is_show_menu = not self.is_show_menu
1104
1105         def toggle_browser(self, url=None, title=None):
1106                 self._current_url = url
1107                 if title is None:
1108                         idx = len(url)
1109                         if idx > 10:
1110                                 idx = 10
1111                         title = url[:idx]
1112                 self._current_title = title
1113                 if self._current_url:
1114                         vbcfg.DEBUG(self._current_url)
1115
1116                 self.toggle_top()
1117
1118                 self["menulist"].pageUp()
1119                 self.keyUp()
1120                 self.keyDown()
1121
1122         def keyCancel(self):
1123                 if self.is_browser_opened:
1124                         fbClass.getInstance().lock()
1125                         eRCInput.getInstance().lock()
1126                         self.toggle_top()
1127
1128                         VBController.command("BROWSER_MENU_CLOSE")
1129                         return
1130                 self._cmd_Exit()
1131
1132         def keyOK(self):
1133                 if not self.is_show_top:
1134                         self.keyMenu()
1135                         return
1136                 if not self.is_show_menu:
1137                         self.keyDown()
1138                         return
1139                 if self["menulist"].getCurrent()[1] is None:
1140                         self.do_command(self["menulist"].getCurrent()[0])
1141                         return
1142                 self.keyRight()
1143
1144         def keyLeft(self):
1145                 if self.idx_menu == 0:
1146                         self.idx_menu = 2
1147                 else:
1148                         self.idx_menu = self.idx_menu - 1
1149
1150                 if self.is_show_menu:
1151                         self["menulist"].pageUp()
1152                         self.keyUp()
1153                         self.keyDown()
1154                 self.set_menu_item()
1155
1156         def keyRight(self):
1157                 if self.idx_menu == 2:
1158                         self.idx_menu = 0
1159                 else:
1160                         self.idx_menu = self.idx_menu + 1
1161
1162                 if self.is_show_menu:
1163                         self["menulist"].pageUp()
1164                         self.keyUp()
1165                         self.keyDown()
1166                 self.set_menu_item()
1167
1168         def keyUp(self):
1169                 if self.is_show_menu and self["menulist"].getSelectedIndex() == 0:
1170                         self.toggle_menulist()
1171                         return
1172                 self["menulist"].up()
1173
1174         def keyDown(self):
1175                 if not self.is_show_menu:
1176                         self["menulist"].setList(self.get_menulist_items(self.idx_menu))
1177                         self["menulist"].resize(self.MENULIST_WIDTH, self.MENULIST_HEIGHT*len(self.get_menulist_items(self.idx_menu))+5)
1178                         self["menulist"].move(self.MENU_ITEM_WIDTH*self.idx_menu+50,self.MENU_ITEM_HEIGHT+30)
1179                         self.toggle_menulist()
1180                         return
1181                 self["menulist"].down()
1182
1183         def keyMenu(self):
1184                 self.toggle_top()