## page was renamed from TextCtrlAutoComplete (Phoenix)
= How to create a tree control (Phoenix) =
'''Keywords :''' Tree control.
<<TableOfContents>>

--------
= Introduction : =
wx.TreeCtrl displays data in a hierarchy. 

First of all we must create a root item.

{{{
root = self.tree.AddRoot('Programmer')
}}}
In our case, root item will not be displayed, because we used wx.TR_HIDE_ROOT flag in our constructor.

{{{
self.tree = wx.TreeCtrl(panel1, 1, wx.DefaultPosition, (-1,-1), wx.TR_HIDE_ROOT|wx.TR_HAS_BUTTONS)
}}}
We add items to the root item with{{{AppendItem()}}} method.

{{{
os = self.tree.AppendItem(root, 'Operating Systems')
pl = self.tree.AppendItem(root, 'Programming Languages')
tk = self.tree.AppendItem(root, 'Toolkits')
}}}
We can similarly create several levels by simply adding items to existing items.

We catch events with wx.EVT_TREE_SEL_CHANGED() event handler.

{{{
wx.EVT_TREE_SEL_CHANGED(self.tree, 1, self.OnSelChanged)
}}}
Various constructor style flags:

 * TR_NO_BUTTONS
 * TR_HAS_BUTTONS
 * TR_NO_LINES
 * TR_LINES_AT_ROOT
 * TR_SINGLE
 * TR_MULTIPLE
 * TR_EXTENDED
 * TR_HAS_VARIABLE_ROW_HEIGHT
 * TR_EDIT_LABELS
 * TR_HIDE_ROOT
 * TR_ROW_LINES
 * TR_FULL_ROW_HIGHLIGHT
 * TR_DEFAULT_STYLE
 * TR_TWIST_BUTTONS
 * TR_MAC_BUTTONS
 * TR_AQUA_BUTTONS

(info by '''ZetCode / Jan Bodnar''').
--------
= Demonstrating : =
__'''''Tested''' py3.x, wx4.x and Win10. ''__

Are you ready to use some samples ? ;)

Test, modify, correct, complete, improve and share your discoveries ! (!)

--------
== Sample one : ==
=== With wx.Panel ===
{{attachment:img_sample_one_a.png}}

{{{#!python
# Sample_one_a.py

"""

Author : Jan Bodnar
Website : zetcode.com

"""

import wx

# class MyFrame
# class MyApp

#---------------------------------------------------------------------------

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title,
                          wx.DefaultPosition, wx.Size(500, 480))

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        panel1 = wx.Panel(self, -1, style=wx.WANTS_CHARS)
        panel2 = wx.Panel(self, -1, style=wx.WANTS_CHARS)
        panel2.SetBackgroundColour('#c4c4c4')
        
        #------------
        
        self.tree = wx.TreeCtrl(panel1, 1,
                                wx.DefaultPosition,
                                wx.DefaultSize,
                                wx.TR_HIDE_ROOT |
                                wx.TR_HAS_BUTTONS)
        self.tree.SetBackgroundColour('#cce8ff')
        
        root = self.tree.AddRoot('Programmer')
        
        os = self.tree.AppendItem(root, 'Operating Systems')
        pl = self.tree.AppendItem(root, 'Programming Languages')
        tk = self.tree.AppendItem(root, 'Toolkits')

        cl = self.tree.AppendItem(pl, 'Compiled languages')
        sl = self.tree.AppendItem(pl, 'Scripting languages')

        self.tree.AppendItem(os, 'Linux')
        self.tree.AppendItem(os, 'FreeBSD')
        self.tree.AppendItem(os, 'OpenBSD')
        self.tree.AppendItem(os, 'NetBSD')
        self.tree.AppendItem(os, 'Solaris')
        self.tree.AppendItem(cl, 'Java')
        self.tree.AppendItem(cl, 'C++')
        self.tree.AppendItem(cl, 'C')
        self.tree.AppendItem(cl, 'Pascal')
        self.tree.AppendItem(sl, 'Python')
        self.tree.AppendItem(sl, 'Ruby')
        self.tree.AppendItem(sl, 'Tcl')
        self.tree.AppendItem(sl, 'PHP')
        self.tree.AppendItem(tk, 'Qt')
        self.tree.AppendItem(tk, 'MFC')
        self.tree.AppendItem(tk, 'wxPython')
        self.tree.AppendItem(tk, 'GTK+')
        self.tree.AppendItem(tk, 'Swing')

        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, self.tree)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        
        #------------
        
        self.display = wx.StaticText(panel2, -1, '', (10, 10), style=wx.ALIGN_CENTRE)

        #------------
        
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        vbox.Add(self.tree, 1, wx.EXPAND)

        hbox.Add(panel1, 1, wx.EXPAND)
        hbox.Add(panel2, 1, wx.EXPAND)

        panel1.SetSizer(vbox)
        self.SetSizer(hbox)

        #------------
        
        self.Centre()

    #-----------------------------------------------------------------------

    def OnSelChanged(self, event):
        self.item = event.GetItem()
        self.display.SetLabel(self.tree.GetItemText(self.item))
        self.tree.GetItemText(self.item)

        event.Skip()
        

    def OnCloseWindow(self, event):
        self.Destroy()
        
#---------------------------------------------------------------------------

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl (wx.Panel)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------

if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()
}}}
--------
=== With wx.SplitterWindow ===
{{attachment:img_sample_one_b.png}}

{{{#!python
# Sample_one_b.py

"""

Author : Adil Hasan
https://wiki.wxpython.org/AnotherTutorialTreeCtrlComment

"""

import wx

# class MyTree
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------

class MyTree(wx.TreeCtrl):
    """
    Our customized TreeCtrl class.
    """
    def __init__(self, parent, id, position, size, style):
        """
        Initialize our tree.
        """
        wx.TreeCtrl.__init__(self, parent, id, position, size, style)
       
        root = self.AddRoot('Programmer')
        
        os = self.AppendItem(root, 'Operating Systems')
        pl = self.AppendItem(root, 'Programming Languages')
        tk = self.AppendItem(root, 'Toolkits')
           
        cl = self.AppendItem(pl, 'Compiled languages')
        sl = self.AppendItem(pl, 'Scripting languages')

        self.AppendItem(os, 'Linux')
        self.AppendItem(os, 'FreeBSD')
        self.AppendItem(os, 'OpenBSD')
        self.AppendItem(os, 'NetBSD')
        self.AppendItem(os, 'Solaris')        
        self.AppendItem(cl, 'Java')
        self.AppendItem(cl, 'C++')
        self.AppendItem(cl, 'C')
        self.AppendItem(cl, 'Pascal')
        self.AppendItem(sl, 'Python')
        self.AppendItem(sl, 'Ruby')
        self.AppendItem(sl, 'Tcl')
        self.AppendItem(sl, 'PHP')
        self.AppendItem(tk, 'Qt')
        self.AppendItem(tk, 'MFC')
        self.AppendItem(tk, 'wxPython')
        self.AppendItem(tk, 'GTK+')
        self.AppendItem(tk, 'Swing')

#---------------------------------------------------------------------------
        
class MyFrame(wx.Frame):
    """
    Our customized window class.
    """
    def __init__(self, parent, id, title):
        """
        Initialize our window.
        """
        wx.Frame.__init__(self, parent, id, title,
                          wx.DefaultPosition, wx.Size(500, 480))

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        # Create a splitter window.
        self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_LIVE_UPDATE)
        
        # Create the left panel.
        leftPanel = wx.Panel(self.splitter, -1)
        
        # Create our tree and put it into the left panel.
        self.tree = MyTree(leftPanel, 1,
                           wx.DefaultPosition,
                           wx.DefaultSize,
                           wx.TR_HIDE_ROOT |
                           wx.TR_HAS_BUTTONS)
        self.tree.SetBackgroundColour('#d8f0d4')

        # Bind the OnSelChanged method to the tree.
        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1)

        # Create the right panel.
        rightPanel = wx.Panel(self.splitter, -1, style=wx.SUNKEN_BORDER)
        rightPanel.SetBackgroundColour('#f0d4e9')
        
        # Create a widget to display static text 
        # and store it in the right panel.
        self.display = wx.StaticText(rightPanel, -1, '',
                                     style=wx.ALIGN_LEFT)
        
        # Put the left and right panes into the split window.
        self.splitter.SplitVertically(leftPanel, rightPanel, 200)

        # Minimum size of subwindow.
        self.splitter.SetMinimumPaneSize(1)         

        #------------

        # Create a box sizer that will contain the left panel contents.
        leftBox = wx.BoxSizer(wx.VERTICAL)
        
        # Add the tree to the box sizer.
        leftBox.Add(self.tree, 1, wx.EXPAND)
        
        # Set the size of the right panel to that required by the tree.
        leftPanel.SetSizer(leftBox)
        
        # Create the right box sizer that will contain the panel's contents.
        rightBox = wx.BoxSizer(wx.VERTICAL)
        
        # Add the display widget to the right panel.
        rightBox.Add(self.display, 0, wx.ALL, 10)

        # Set the size of the right panel to that 
        # required by the display widget.
        rightPanel.SetSizer(rightBox)
        
        #------------
        
        # Create the window in the centre of the screen.
        self.Centre()

    #-----------------------------------------------------------------------
        
    def OnSelChanged(self, event):
        """
        Method called when selected item is changed.
        """
        
        # Get the selected item object.
        item =  event.GetItem()
        
        # Display the selected item text in the text widget.
        self.display.SetLabel(self.tree.GetItemText(item))

#---------------------------------------------------------------------------
        
class MyApp(wx.App):
    """
    Our application class.
    """
    def OnInit(self):
        """
        Initialize by creating the split window with the tree.
        """
        
        frame = MyFrame(None, -1, 'wx.TreeCtrl (wx.SplitterWindow)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------
    
if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()
}}}
--------
== Sample two ==
{{attachment:img_sample_two.png}}

{{{#!python
# sample_two.py

"""

Author : Rahul Sabharwal
https://www.geeksforgeeks.org/wxpython-treectrl/

"""

import wx

# class MyFrame
# class MyApp

#---------------------------------------------------------------------------
  
class MyFrame(wx.Frame): 
    def __init__(self, parent, id, title): 
        wx.Frame.__init__(self, parent, -1, title) 

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        # Tree control 
        self.tree = wx.TreeCtrl(self, wx.ID_ANY,
                                wx.DefaultPosition,
                                wx.DefaultSize) 
        self.tree.SetBackgroundColour('#d9f3fa')
        
        # Add root to tree 
        self.root = self.tree.AddRoot('Root ')
        
        # Add item to root 
        self.tree.AppendItem(self.root, 'Child 1') 
        self.tree.AppendItem(self.root, 'Child 2') 
        self.tree.AppendItem(self.root, 'Child 3') 
        self.tree.AppendItem(self.root, 'Child 4') 
        self.tree.AppendItem(self.root, 'Child 5') 
        self.tree.AppendItem(self.root, 'Child 6') 
        self.tree.AppendItem(self.root, 'Child 7') 
        self.tree.AppendItem(self.root, 'Child 8')
        
        # Expand tree 
        self.tree.Expand(self.root) 

        #------------
        
        # Show frame 
        self.Show() 
  
#---------------------------------------------------------------------------
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------
    
app = MyApp(0)
app.MainLoop()
}}}
--------
== Sample three ==
{{attachment:img_sample_three.png}}

{{{#!python
# sample_three.py

"""

Author : Rahul Sabharwal
https://www.geeksforgeeks.org/wxpython-assignimagelist-method-in-wx-treectrl/?ref=rp

"""

import wx

# class MyFrame
# class MyApp

#---------------------------------------------------------------------------
  
class MyFrame(wx.Frame): 
    def __init__(self, parent, id, title): 
        wx.Frame.__init__(self, parent, -1, title) 

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        # Tree control 
        self.tree = wx.TreeCtrl(self, wx.ID_ANY,
                                wx.DefaultPosition,
                                wx.DefaultSize) 
        self.tree.SetBackgroundColour('#f1f2f2')
        
        # Create imagelist 
        il = wx.ImageList(16, 16) 
  
        # Add images to image list 
        one = il.Add(wx.Image('./bitmaps/plus.png', wx.BITMAP_TYPE_PNG).Scale(16, 16).ConvertToBitmap()) 
        two = il.Add(wx.Image('./bitmaps/close.png').Scale(16, 16).ConvertToBitmap()) 
  
        # Asign image list to tree 
        self.tree.AssignImageList(il) 
  
        # Add a root node to tree 
        self.root = self.tree.AddRoot('Root ', 0) 
  
        # Add item to self.root 
        self.tree.AppendItem(self.root, 'Item 1', 1) 
        self.tree.AppendItem(self.root, 'Item 2', 1)  
        self.tree.AppendItem(self.root, 'Item 3', 1)  
        self.tree.AppendItem(self.root, 'Item 4', 1)  
        self.tree.AppendItem(self.root, 'Item 5', 1)  
        self.tree.AppendItem(self.root, 'Item 6', 1)  
        self.tree.AppendItem(self.root, 'Item 7', 1) 
        self.tree.AppendItem(self.root, 'Item 8', 1) 
        
        # Expand tree 
        self.tree.Expand(self.root) 

        #------------
        
        # Show frame 
        self.Show()
        
#---------------------------------------------------------------------------
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl (AssignImageList)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------
    
app = MyApp(0)
app.MainLoop()
}}}
--------
== Sample four ==
{{attachment:img_sample_four.png}}

{{{#!python
# sample_four.py

"""

Author : Rahul Sabharwal
https://www.geeksforgeeks.org/wxpython-collapse-method-wx-treectrl/?ref=rp

"""

import wx

# class MyTree
# class MyTreePanel
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------
  
class MyTree(wx.TreeCtrl):   
    def __init__(self, parent, id, pos, size, style): 
        wx.TreeCtrl.__init__(self, parent, id, pos, size, style) 
  
#---------------------------------------------------------------------------
        
class MyTreePanel(wx.Panel):   
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent) 
  
        # Create tree control 
        self.tree = MyTree(self, wx.ID_ANY,
                           wx.DefaultPosition,
                           wx.DefaultSize,
                           wx.TR_HAS_BUTTONS) 
        self.tree.SetBackgroundColour('#f8f094')
        
        # Add root to self.tree 
        self.root = self.tree.AddRoot('Root') 

        # Add item to self.root 
        item = self.tree.AppendItem(self.root, 'Item 1') 
        item = self.tree.AppendItem(self.root, 'Item 2')
        item = self.tree.AppendItem(self.root, 'Item 3') 
        item = self.tree.AppendItem(self.root, 'Item 4') 
        item = self.tree.AppendItem(self.root, 'Item 5')
        item = self.tree.AppendItem(self.root, 'Item 6') 
        item = self.tree.AppendItem(self.root, 'Item 7')         
        item = self.tree.AppendItem(self.root, 'Item 8')

        # Expand whole tree 
        self.tree.Expand(self.root)
        
        #------------
        
        # Add button in panel 
        self.btn = wx.Button(self, 1, "&Collapse")
        
        # Bind event with self.btn 
        self.btn.Bind(wx.EVT_BUTTON, self.OnClick) 

        #------------
        
        sizer = wx.BoxSizer(wx.VERTICAL) 
        sizer.Add(self.tree, 1, wx.EXPAND) 
        sizer.Add(self.btn, 0, wx.EXPAND) 
        self.SetSizer(sizer) 

    #-----------------------------------------------------------------------  

    def OnClick(self, event): 
        # Collapse root 
        self.tree.Collapse(self.root) 

#---------------------------------------------------------------------------
        
class MyFrame(wx.Frame): 
    def __init__(self, parent, id, title): 
        wx.Frame.__init__(self, parent, -1, title)  

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        panel = MyTreePanel(self) 

        #------------
        
        # Show frame 
        self.Show()
        
#---------------------------------------------------------------------------
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl (Collapse)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------
    
app = MyApp(0)
app.MainLoop()
}}}
--------
== Sample five ==
{{attachment:img_sample_five.png}}

{{{#!python
# sample_five.py

"""

Author : Rahul Sabharwal
https://www.geeksforgeeks.org/wxpython-clearfocuseditem-method-in-wx-treectrl/?ref=rp

"""

import wx

# class MyTree
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------
  
class MyTree(wx.Panel): 
  
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent) 
  
        # create Tree Control in frame 
        self.tree = wx.TreeCtrl(self, wx.ID_ANY,
                                wx.DefaultPosition,
                                wx.DefaultSize,
                                wx.TR_HAS_BUTTONS) 
        self.tree.SetBackgroundColour('#fddef5')
        
        # Create root for Tree Control 
        self.root = self.tree.AddRoot('Root') 
  
        # Add item to root 
        item = self.tree.AppendItem(self.root, 'Item 1') 
        item = self.tree.AppendItem(self.root, 'Item 2')
        item = self.tree.AppendItem(self.root, 'Item 3') 
        item = self.tree.AppendItem(self.root, 'Item 4') 
        item = self.tree.AppendItem(self.root, 'Item 5') 
        item = self.tree.AppendItem(self.root, 'Item 6') 
        item = self.tree.AppendItem(self.root, 'Item 7')
        item = self.tree.AppendItem(self.root, 'Item 8') 
  
        # Clear focused item 
        self.tree.ClearFocusedItem() 
  
        # expand tree 
        self.tree.Expand(self.root) 

        #------------
        
        sizer = wx.BoxSizer(wx.VERTICAL) 
        sizer.Add(self.tree, 1, wx.EXPAND) 
        self.SetSizer(sizer) 

#---------------------------------------------------------------------------
        
class MyFrame(wx.Frame):
    """
    Main root frame for tree control.
    """
    def __init__(self, parent, id, title): 
        wx.Frame.__init__(self, parent, -1, title)  

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        panel = MyTree(self) 

        #------------
        
        # Show frame 
        self.Show()
        
#---------------------------------------------------------------------------
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl (ClearFocusedItem)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------
    
app = MyApp(0)
app.MainLoop()
}}}
--------
== Sample six ==
{{attachment:img_sample_six.png}}

{{{#!python
# sample_six.py

"""

Author : Rahul Sabharwal
https://www.geeksforgeeks.org/wxpython-collapseallchildren-method-in-wx-treectrl/?ref=rp

"""

import wx

# class MyTree
# class MyTreePanel
# class MyFrame
# class MyApp

#---------------------------------------------------------------------------
  
class MyTree(wx.TreeCtrl): 
    def __init__(self, parent, id, pos, size, style): 
        wx.TreeCtrl.__init__(self, parent, id, pos, size, style) 
  
#---------------------------------------------------------------------------
        
class MyTreePanel(wx.Panel):  
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent) 
  
        # Create Tree Control 
        self.tree = MyTree(self, wx.ID_ANY,
                           wx.DefaultPosition,
                           wx.DefaultSize,
                           wx.TR_HAS_BUTTONS) 
        self.tree.SetForegroundColour('#ffffff')
        self.tree.SetBackgroundColour('#000000')
        
        # Add root to Tree Control 
        self.root = self.tree.AddRoot('Root') 
  
        # Add item to root 
        self.itm = self.tree.AppendItem(self.root, 'Item') 
  
        # Add item to 'itm' 
        self.itm2 = self.tree.AppendItem(self.itm, "Sub Item") 
  
        # Add child item to itm2 
        self.itm3 = self.tree.AppendItem(self.itm2, "Another Item") 
        self.itm4 = self.tree.AppendItem(self.itm2, "Another Item")
        self.itm5 = self.tree.AppendItem(self.itm2, "Another Item") 
        self.itm6 = self.tree.AppendItem(self.itm2, "Another Item")
        self.itm7 = self.tree.AppendItem(self.itm2, "Another Item")
        self.itm8 = self.tree.AppendItem(self.itm2, "Another Item") 
        self.itm9 = self.tree.AppendItem(self.itm2, "Another Item")
        
        # Expand whole tree 
        self.tree.Expand(self.root) 

        #------------
        
        # Add button in frame 
        self.btn = wx.Button(self, 1, "Collapse") 

        # Bind event function with button 
        self.btn.Bind(wx.EVT_BUTTON, self.OnClick) 
        
        #------------
        
        sizer = wx.BoxSizer(wx.VERTICAL) 
        sizer.Add(self.tree, 1, wx.EXPAND) 
        sizer.Add(self.btn, 0, wx.EXPAND)
        self.SetSizer(sizer) 
  
    #-----------------------------------------------------------------------
  
    def OnClick(self, event): 
        # Collapse all children of itm recursively 
        self.tree.CollapseAllChildren(self.itm) 

#---------------------------------------------------------------------------
        
class MyFrame(wx.Frame):
    def __init__(self, parent, id, title): 
        wx.Frame.__init__(self, parent, -1, title)  

        self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO))

        #------------
        
        panel = MyTreePanel(self) 

        #------------
        
        # Show frame 
        self.Show()
        
#---------------------------------------------------------------------------
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl (CollapseAllChildren)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True

#---------------------------------------------------------------------------
    
app = MyApp(0)
app.MainLoop()
}}}
--------
= Download source =
[[attachment:source.zip]]

--------
= Additional Information =
'''Link :'''

--------

https://wiki.wxpython.org/TitleIndex

https://docs.wxpython.org/

--------
= Thanks to =
Jan Bodnar (sample_one.py coding), Adil Hasan (sample_two.py coding), Rahul Sabharwal (sample_three /four / five / six.py coding), the wxPython community...

--------
= About this page =
Date(d/m/y)     Person (bot)    Comments :

21/01/21 - Ecco (Created page for wxPython Phoenix).

--------
= Comments =
- blah, blah, blah....