User:Fyan/Improving Tab Hierarchy: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
=== Phase I ===
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 66:
       tab.opener := NULL
       tab.opener := NULL


onTabMove(fromIndex, toIndex):
# triggered when the user explicitly moves tabs
onTabUserMove(fromIndex, toIndex):
   FOR EACH tab IN tabs
   FOR EACH tab IN tabs
     tab.opener := NULL
     tab.opener := NULL
=== 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 })

Revision as of 01:30, 27 October 2010

globals:

 tabs
 selectedTab
 newTabOffset := 0
  1. opens a new tab with the provided url
  2. 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
  1. opens a blank tab

openNewTab():

 tab := openTab('about:blank', { opener: selectedTab })
 tab.onLocationChangeOrDeselect := function()
   DELETE tab.onLocationChangeOrDeselect
   DELETE tab.opener
  1. triggered when a new tab is opened from a tab,
  2. 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 })
  1. 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()
  1. 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
  1. triggered when the user explicitly moves tabs

onTabUserMove(fromIndex, toIndex):

 FOR EACH tab IN tabs
   tab.opener := NULL