User:Fyan/Improving Tab Hierarchy: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
(Created page with 'openNewTab(newTab, trigger): IF trigger = newTabButton: openTab('about:blank') ELSE: openTab('about:blank', { opener : tab, position : tab.position + 1 })…')
 
No edit summary
 
(24 intermediate revisions by the same user not shown)
Line 1: Line 1:
openNewTab(newTab, trigger):
<pre>
    IF trigger = newTabButton:
globals:
        openTab('about:blank')
  tabs
    ELSE:
  selectedTab
        openTab('about:blank', { opener : tab, position : tab.position + 1 })
  newTabOffset := 0


onOpenLinkInNewTab(newTab, openerTab):
# opens a new tab with the provided url
     newTab.opener := openerTab
# default options: selected = true, position = END, opener = null
openTab(url, options):
  tab := new Tab(url)
  IF 'position' IN options
     tabs.splice(position, 0, tab)
  ELSE
    tabs.push(tab)
  IF options.opener
    tab.opener = options.opener
  IF options.selected
    selectedTab := tab
  RETURN tab


# opens a blank tab
openNewTab():
  tab := openTab('about:blank', { opener: selectedTab })
  tab.onLocationChangeOrDeselect := function()
    DELETE tab.onLocationChangeOrDeselect
    DELETE tab.opener
# triggered when a new tab is opened from a tab,
# including window.open, link cmd+click, and context menu
openURLInNewTab(url, openerTab, selected):
  IF selected
    newTabOffset := 0
  newTabOffset := newTabOffset + 1
  position := openerTab.position + newTabOffset
  openTab(url, { selected: selected, position: position, opener: openerTab })
# triggered when a tab is closed by any mechanism
onTabClose(closedTab):
onTabClose(closedTab):
    FOR EACH tab IN tabs:
  prev := closedTab.previousSibling
        IF tab.opener = closedTab:
  next := closedTab.nextSibling
            tab.opener := closedTab.opener
  IF closedTab.opener
    prev := closedTab.prevSibling
     IF next AND next.opener = closedTab.opener
    next := closedTab.nextSibling
      selectedTab := next
    IF next AND next.opener AND next.opener = closedTab.opener:
      RETURN
        selectTab(next)
     FOR tab := prev; tab; tab := tab.previousSibling
     ELSE IF prev AND prev.opener AND prev.opener = closedTab.opener:
      IF tab.opener = closedTab.opener
        selectTab(prev)
        selectedTab := tab
    ELSE IF prev AND prev = closedTab.opener:
        selectTab(prev)
    ELSE IF next:
        selectTab(next)
     ELSE IF prev:
        selectTab(prev)
    ELSE IF pref('closeWindowWithLastTab'):
        closeWindow()
    ELSE:
        openTab('about:blank')
 
onTabSelect(from, to):
    IF from.opener = to
    OR to.opener = from
    OR from.opener = to.opener:
         RETURN
         RETURN
     ELSE:
     IF prev AND prev = closedTab.opener
        FOR EACH tab IN tabs:
      selectedTab := prev
            tab.opener := NULL
      RETURN
  IF next
    selectedTab := next
  ELSE IF prev
    selectedTab := prev
  ELSE IF getBoolPref('closeWindowWithLastTab')
    closeWindow()
  ELSE
    openNewTab()


onTabMove():
# triggered when the user explicitly switches tabs (not due to tab close, etc.)
onTabUserSelect(fromTab, toTab):
  newTabOffset := 0
  IF fromTab.opener != toTab AND toTab.opener != fromTab AND
    fromTab.opener != toTab.opener
     FOR EACH tab IN tabs:
     FOR EACH tab IN tabs:
        tab.opener := NULL
      tab.opener := NULL
 
# triggered when the user explicitly moves tabs
onTabUserMove():
  FOR EACH tab IN tabs
    tab.opener := NULL
</pre>

Latest revision as of 01:35, 27 October 2010

globals:
  tabs
  selectedTab
  newTabOffset := 0

# opens a new tab with the provided url
# default options: selected = true, position = END, opener = null
openTab(url, options):
  tab := new Tab(url)
  IF 'position' IN options
    tabs.splice(position, 0, tab)
  ELSE
    tabs.push(tab)
  IF options.opener
    tab.opener = options.opener
  IF options.selected
    selectedTab := tab
  RETURN tab

# opens a blank tab
openNewTab():
  tab := openTab('about:blank', { opener: selectedTab })
  tab.onLocationChangeOrDeselect := function()
    DELETE tab.onLocationChangeOrDeselect
    DELETE tab.opener

# triggered when a new tab is opened from a tab,
# including window.open, link cmd+click, and context menu
openURLInNewTab(url, openerTab, selected):
  IF selected
    newTabOffset := 0
  newTabOffset := newTabOffset + 1
  position := openerTab.position + newTabOffset
  openTab(url, { selected: selected, position: position, opener: openerTab })

# triggered when a tab is closed by any mechanism
onTabClose(closedTab):
  prev := closedTab.previousSibling
  next := closedTab.nextSibling
  IF closedTab.opener
    IF next AND next.opener = closedTab.opener
      selectedTab := next
      RETURN
    FOR tab := prev; tab; tab := tab.previousSibling
      IF tab.opener = closedTab.opener
        selectedTab := tab
        RETURN
    IF prev AND prev = closedTab.opener
      selectedTab := prev
      RETURN
  IF next
    selectedTab := next
  ELSE IF prev
    selectedTab := prev
  ELSE IF getBoolPref('closeWindowWithLastTab')
    closeWindow()
  ELSE
    openNewTab()

# triggered when the user explicitly switches tabs (not due to tab close, etc.)
onTabUserSelect(fromTab, toTab):
  newTabOffset := 0
  IF fromTab.opener != toTab AND toTab.opener != fromTab AND
     fromTab.opener != toTab.opener
    FOR EACH tab IN tabs:
      tab.opener := NULL

# triggered when the user explicitly moves tabs
onTabUserMove():
  FOR EACH tab IN tabs
    tab.opener := NULL