22"""
33Main frame
44"""
5+
56import wx
6- import sqlite3
77from wx import aui
88
9+ from db import DBUtils
10+ from events import EVT_CREATE_MAIN_EVENT , CreateTabEvent
911from sql_editor import SQLEditor
1012
1113
14+ class TableMetaPanel (wx .Panel ):
15+ def __init__ (self , parent , data_list ):
16+ wx .Panel .__init__ (self , parent = parent )
17+
18+ meta_data_list_ctrl = wx .ListCtrl (self , style = wx .LC_REPORT )
19+ meta_data_list_ctrl .InsertColumn (0 , "" )
20+ meta_data_list_ctrl .InsertColumn (1 , "PK" )
21+ meta_data_list_ctrl .InsertColumn (2 , "Name" )
22+ meta_data_list_ctrl .InsertColumn (3 , "Type" )
23+ meta_data_list_ctrl .InsertColumn (4 , "Null?" )
24+ meta_data_list_ctrl .InsertColumn (5 , "Default Value" )
25+
26+ for item in data_list :
27+ meta_data_list_ctrl .Append (
28+ (item .idx , item .pk_field , item .column_name , item .column_type , item .allow_null , item .default_value ))
29+ meta_data_list_ctrl .SetColumnWidth (0 , 20 )
30+ meta_data_list_ctrl .SetColumnWidth (1 , 40 )
31+ meta_data_list_ctrl .SetColumnWidth (2 , 150 )
32+ meta_data_list_ctrl .SetColumnWidth (5 , 150 )
33+ root_sizer = wx .BoxSizer (wx .VERTICAL )
34+ root_sizer .Add (meta_data_list_ctrl , 1 , wx .EXPAND )
35+
36+ self .SetSizer (root_sizer )
37+
38+
1239class SideBar (wx .Panel ):
1340 def __init__ (self , parent , db_fp ):
1441 super (SideBar , self ).__init__ (
1542 parent , style = wx .TAB_TRAVERSAL | wx .CLIP_CHILDREN )
1643 self .db_fp = db_fp
44+ self .db_utils = DBUtils (self .db_fp )
45+ self .parent = parent
1746
1847 self .tree = wx .TreeCtrl (self , - 1 , wx .Point (0 , 0 ), wx .Size (160 , 250 ),
1948 wx .TR_DEFAULT_STYLE | wx .NO_BORDER )
@@ -28,7 +57,8 @@ def __init__(self, parent, db_fp):
2857 self .tree .Bind (wx .EVT_TREE_ITEM_ACTIVATED , self .on_node_activated )
2958
3059 root = self .tree .AddRoot (self .db_fp , 0 )
31- self .tree .AppendItem (root , u'Tables' , 0 , data = 'TABLES' )
60+ for item in self .db_utils .get_object_type ():
61+ self .tree .AppendItem (root , item , 0 , data = item .upper ())
3262 self .tree .Expand (root )
3363
3464 main_sizer = wx .BoxSizer (wx .VERTICAL )
@@ -37,16 +67,15 @@ def __init__(self, parent, db_fp):
3767
3868 def on_node_activated (self , evt ):
3969 selected_item_data = self .tree .GetItemData (evt .GetItem ())
40- if 'TABLES' == selected_item_data :
41- with sqlite3 .connect (self .db_fp ) as conn :
42- for row in conn .execute (
43- "select name from sqlite_master where type = 'table'" ):
44- self .tree .AppendItem (
45- evt .GetItem (), row [0 ], 1 , data = 'TABLE' )
46- self .tree .Expand (evt .GetItem ())
47- elif 'TABLE' == selected_item_data :
70+ if selected_item_data in ['TABLE' , 'INDEX' , 'TRIGGER' , 'VIEW' ]:
71+ for name in self .db_utils .get_object_list (selected_item_data .lower ()):
72+ self .tree .AppendItem (evt .GetItem (), name , 1 , data = 'EACH-%s' % selected_item_data )
73+ self .tree .Expand (evt .GetItem ())
74+ elif 'EACH-TABLE' == selected_item_data :
4875 selected_item_text = self .tree .GetItemText (evt .GetItem ())
49- # open tab page
76+ table_metadata = self .db_utils .get_meta_of_table (selected_item_text )
77+ wx .PostEvent (self .parent , CreateTabEvent (table_metadata = table_metadata ,
78+ tab_name = "Table %s" % selected_item_text ))
5079
5180
5281class MainFrame (wx .Frame ):
@@ -65,13 +94,9 @@ def __init__(self, app, db_fp):
6594
6695 self .main_panel = wx .Panel (self )
6796 self .left = SideBar (self .main_panel , self .db_fp )
68- self .right = aui .AuiNotebook (
69- self .main_panel , - 1 , style = wx .CLIP_CHILDREN )
97+ self .right = aui .AuiNotebook (self .main_panel , - 1 , style = wx .CLIP_CHILDREN )
7098 self .right .AddPage (SQLEditor (self .right , self ), "Welcome" )
71- self .logger = wx .TextCtrl (
72- self .main_panel ,
73- - 1 ,
74- style = wx .TE_MULTILINE | wx .TE_READONLY | wx .HSCROLL )
99+ self .logger = wx .TextCtrl (self .main_panel , style = wx .TE_MULTILINE | wx .TE_READONLY | wx .HSCROLL )
75100
76101 self .mgr = aui .AuiManager ()
77102 self .mgr .SetManagedWindow (self .main_panel )
@@ -80,18 +105,29 @@ def __init__(self, app, db_fp):
80105 self .mgr .AddPane (self .left ,
81106 aui .AuiPaneInfo ().Left ().Layer (2 ).BestSize (
82107 (240 , - 1 )).MinSize ((240 , - 1 )).Floatable (
83- self .allowAuiFloating ).FloatingSize (
84- (240 , 700 )).Caption ("DB" )
108+ self .allowAuiFloating ).FloatingSize (
109+ (240 , 700 )).Caption ("DB" )
85110 .CloseButton (False ).Name ("Tree" ))
86111 self .mgr .AddPane (self .logger ,
87112 aui .AuiPaneInfo ().Bottom ().BestSize (
88113 (- 1 , 150 )).MinSize ((- 1 , 140 )).Floatable (
89- self .allowAuiFloating ).FloatingSize (
90- (500 , 160 )).Caption ("Log Messages" )
114+ self .allowAuiFloating ).FloatingSize (
115+ (500 , 160 )).Caption ("Log Messages" )
91116 .CloseButton (False ).Name ("LogWindow" ))
92117 self .Center (wx .BOTH )
93118 self .mgr .Update ()
94119 self .Bind (wx .EVT_CLOSE , self .on_exit )
120+ self .main_panel .Bind (EVT_CREATE_MAIN_EVENT , self .on_create_new_tab )
121+
122+ def on_create_new_tab (self , evt ):
123+ has_created = False
124+ for i in xrange (0 , self .right .GetPageCount ()):
125+ if self .right .GetPageText (i ) == evt .tab_name :
126+ self .right .ChangeSelection (i )
127+ has_created = True
128+ break
129+ if not has_created :
130+ self .right .AddPage (TableMetaPanel (self .right , evt .table_metadata ), caption = evt .tab_name , select = True )
95131
96132 def create_menu_bar (self ):
97133 fileMenu = wx .Menu ()
0 commit comments