User:Fyan/Improving Tab Hierarchy: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
=== Phase I ===
<pre>
 
globals:
globals:
   tabs
   tabs
   newTabButton
   selectedTab
   newTabOffset := 0
   newTabOffset := 0


# opens a new tab with the provided url
# default options: selected = true, position = END, opener = null
openTab(url, options):
openTab(url, options):
   // opens a new tab with the provided url
   tab := new Tab(url)
   // default options: selected = true, position = end, opener = null
  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):
openURLInNewTab(url, openerTab, selected):
  // triggered whenever a new tab is opened from a tab,
  // including window.open, link cmd+click, and context menu
   IF selected
   IF selected
     newTabOffset := 0
     newTabOffset := 0
   newTabOffset := newTabOffset + 1
   newTabOffset := newTabOffset + 1
   position := openerTab.position + newTabOffset
   position := openerTab.position + newTabOffset
   openTab(url, { selected : selected, position : position, opener : openerTab })
   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
    IF tab.opener = closedTab:
      tab.opener := closedTab.opener
   prev := closedTab.previousSibling
   prev := closedTab.previousSibling
   next := closedTab.nextSibling
   next := closedTab.nextSibling
   IF !closedTab.opener
   IF closedTab.opener
     selectTab(next)
     IF next AND next.opener = closedTab.opener
    RETURN
      selectedTab := next
  ELSE IF next AND next.opener = closedTab.opener
      RETURN
    selectTab(next)
    FOR tab := prev; tab; tab := tab.previousSibling
    RETURN
      IF tab.opener = closedTab.opener
  FOR tab := prev; tab; tab := tab.previousSibling
        selectedTab := tab
    IF tab.opener = closedTab.opener
        RETURN
       selectTab(tab)
    IF prev AND prev = closedTab.opener
       selectedTab := prev
       RETURN
       RETURN
   IF prev AND prev = closedTab.opener
   IF next
    selectTab(prev)
     selectedTab := next
  ELSE IF next
     selectTab(next)
   ELSE IF prev
   ELSE IF prev
     selectTab(prev)
     selectedTab := prev
   ELSE IF getBoolPref('closeWindowWithLastTab')
   ELSE IF getBoolPref('closeWindowWithLastTab')
     closeWindow()
     closeWindow()
   ELSE
   ELSE
     openTab('about:blank')
     openNewTab()


onTabSelect(fromTab, toTab):
# triggered when the user explicitly switches tabs (not due to tab close, etc.)
onTabUserSelect(fromTab, toTab):
   newTabOffset := 0
   newTabOffset := 0
  IF !fromTab // triggered by tab close
    RETURN
   IF fromTab.opener != toTab AND toTab.opener != fromTab AND
   IF fromTab.opener != toTab AND toTab.opener != fromTab AND
     fromTab.opener != toTab.opener
     fromTab.opener != toTab.opener
Line 55: Line 67:
       tab.opener := NULL
       tab.opener := NULL


onTabMove(fromIndex, toIndex):
# triggered when the user explicitly moves tabs
onTabUserMove():
   FOR EACH tab IN tabs
   FOR EACH tab IN tabs
     tab.opener := NULL
     tab.opener := NULL
 
</pre>
=== Phase II ===
 
openBlankTab(trigger):
  // this method applies only to new blank tabs
  IF trigger = newTabButton
    openTab('about:blank')
  ELSE
    tab := contextTab OR selectedTab
    openTab('about:blank', { position : tab.position + 1, opener : tab })

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