def __init__(self, *args, **kwds):
        Log.__init__(self)
        self.__queueList = []
        self.__queueDict = {}
        if platform.system().lower() == "windows":
            # win用に書く
            pass
        else:
            home = os.getenv("HOME")
        nmlHome = os.path.join(home, WORKDIR)
        if not os.path.exists(nmlHome):
            os.mkdir(nmlHome)
        self.databasePath = os.path.join(nmlHome, DATABASE_FILE)
        self.systemDatabasePath = os.path.join(nmlHome, SYSTEM_DATABASE_FILE)

        db = Database(self.databasePath)
        db.ctTable()
        db.close()
        sdb = SystemDatabase(self.systemDatabasePath)
        sdb.ctTable()
        nid = sdb.getNicoid() if sdb.getNicoid() else u""
        npw = sdb.getNicopw() if sdb.getNicopw() else u""
        gid = sdb.getGmailid() if sdb.getGmailid() else u""
        gpw = sdb.getGmailpw() if sdb.getGmailpw() else u""
        sdr = sdb.getSavedir() if sdb.getSavedir() else u""
        sdb.close()

        self.nicoTable = NTable(nid, npw, gid, gpw, sdr)

        # begin wxGlade: NicoMovieLoadGUI.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.treeCtrl = gizmos.TreeListCtrl(self, -1, style=wx.TR_HAS_BUTTONS | wx.TR_NO_LINES | wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_HIDE_ROOT | wx.TR_DEFAULT_STYLE)
        self.pnlCenter = wx.Panel(self, -1)
        self.lblUrl = wx.StaticText(self.pnlCenter, -1, "URL:")
        self.tclUrl = wx.TextCtrl(self.pnlCenter, -1, "", style=wx.TE_PROCESS_ENTER)
        self.pnlBottom = wx.Panel(self, -1)
        self.lblQueueList = wx.StaticText(self.pnlBottom, -1, "QueueList:")
        self.lclQueueList = wx.ListCtrl(self.pnlBottom, -1, style=wx.LC_REPORT | wx.LC_AUTOARRANGE | wx.LC_NO_HEADER | wx.SUNKEN_BORDER)
        self.lblLog = wx.StaticText(self.pnlBottom, -1, "Log:")
        self.tclLog = wx.TextCtrl(self.pnlBottom, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY)
        self.static_line_1 = wx.StaticLine(self, -1, style=wx.LI_VERTICAL)
        self.pnlRight = wx.Panel(self, -1)
        self.btnRss = wx.ToggleButton(self.pnlRight, -1, "RSS")
        self.btnAdd = wx.Button(self.pnlRight, -1, u"新規登録")
        self.btnLoad = wx.Button(self.pnlRight, -1, u"再ロード")
        self.btnClearLog = wx.Button(self.pnlRight, -1, u"ログ消去")
        self.btnDelete = wx.Button(self.pnlRight, -1, u"削除")
        self.btnSettings = wx.Button(self.pnlRight, -1, u"設定")
        self.btnExit = wx.Button(self.pnlRight, -1, "Exit")

        self.__set_properties()
        self.__do_layout()
        # end wxGlade
        self.__bind()
        self.__setTreeListCtrl()
        self.__set_QueueListCtrl()
        # other wigets
        self.dlgSettings = SettingsDialog(self.nicoTable, self.logging, self)
        # main
        self.nicoMain = NicoMovieLoadMain(self.databasePath, self.systemDatabasePath, self.logging)
        self.nicoMain.main()
        # timer
        timer = wx.Timer(self)
        timer.Start(3 * 1000)
        print "timer start"
class NicoMovieLoadGUI(wx.Frame, Log):
    def __init__(self, *args, **kwds):
        Log.__init__(self)
        self.__queueList = []
        self.__queueDict = {}
        if platform.system().lower() == "windows":
            # win用に書く
            pass
        else:
            home = os.getenv("HOME")
        nmlHome = os.path.join(home, WORKDIR)
        if not os.path.exists(nmlHome):
            os.mkdir(nmlHome)
        self.databasePath = os.path.join(nmlHome, DATABASE_FILE)
        self.systemDatabasePath = os.path.join(nmlHome, SYSTEM_DATABASE_FILE)

        db = Database(self.databasePath)
        db.ctTable()
        db.close()
        sdb = SystemDatabase(self.systemDatabasePath)
        sdb.ctTable()
        nid = sdb.getNicoid() if sdb.getNicoid() else u""
        npw = sdb.getNicopw() if sdb.getNicopw() else u""
        gid = sdb.getGmailid() if sdb.getGmailid() else u""
        gpw = sdb.getGmailpw() if sdb.getGmailpw() else u""
        sdr = sdb.getSavedir() if sdb.getSavedir() else u""
        sdb.close()

        self.nicoTable = NTable(nid, npw, gid, gpw, sdr)

        # begin wxGlade: NicoMovieLoadGUI.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.treeCtrl = gizmos.TreeListCtrl(self, -1, style=wx.TR_HAS_BUTTONS | wx.TR_NO_LINES | wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_HIDE_ROOT | wx.TR_DEFAULT_STYLE)
        self.pnlCenter = wx.Panel(self, -1)
        self.lblUrl = wx.StaticText(self.pnlCenter, -1, "URL:")
        self.tclUrl = wx.TextCtrl(self.pnlCenter, -1, "", style=wx.TE_PROCESS_ENTER)
        self.pnlBottom = wx.Panel(self, -1)
        self.lblQueueList = wx.StaticText(self.pnlBottom, -1, "QueueList:")
        self.lclQueueList = wx.ListCtrl(self.pnlBottom, -1, style=wx.LC_REPORT | wx.LC_AUTOARRANGE | wx.LC_NO_HEADER | wx.SUNKEN_BORDER)
        self.lblLog = wx.StaticText(self.pnlBottom, -1, "Log:")
        self.tclLog = wx.TextCtrl(self.pnlBottom, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY)
        self.static_line_1 = wx.StaticLine(self, -1, style=wx.LI_VERTICAL)
        self.pnlRight = wx.Panel(self, -1)
        self.btnRss = wx.ToggleButton(self.pnlRight, -1, "RSS")
        self.btnAdd = wx.Button(self.pnlRight, -1, u"新規登録")
        self.btnLoad = wx.Button(self.pnlRight, -1, u"再ロード")
        self.btnClearLog = wx.Button(self.pnlRight, -1, u"ログ消去")
        self.btnDelete = wx.Button(self.pnlRight, -1, u"削除")
        self.btnSettings = wx.Button(self.pnlRight, -1, u"設定")
        self.btnExit = wx.Button(self.pnlRight, -1, "Exit")

        self.__set_properties()
        self.__do_layout()
        # end wxGlade
        self.__bind()
        self.__setTreeListCtrl()
        self.__set_QueueListCtrl()
        # other wigets
        self.dlgSettings = SettingsDialog(self.nicoTable, self.logging, self)
        # main
        self.nicoMain = NicoMovieLoadMain(self.databasePath, self.systemDatabasePath, self.logging)
        self.nicoMain.main()
        # timer
        timer = wx.Timer(self)
        timer.Start(3 * 1000)
        print "timer start"

    def __bind(self):
        self.Bind(wx.EVT_BUTTON, self.OnSettings, self.btnSettings)
        self.Bind(wx.EVT_BUTTON, self.OnClearLog, self.btnClearLog)
        self.Bind(wx.EVT_BUTTON, self.OnAdd, self.btnAdd)
        self.Bind(wx.EVT_TEXT_ENTER, self.OnAdd, self.tclUrl)
        self.Bind(wx.EVT_TIMER, self.updateQueueList)

    def OnAdd(self, evt):
        """
        add movieid/mylistid from self.tclUrl
        """
        url = self.tclUrl.GetValue()
        mid = self.nicoMain.find(url)
        if not mid:
            self.logging("Add: IDが見つかりませんでした")
        elif self.nicoMain.register(mid):
            self.logging(u"Add: %sを登録しました" % mid)
        elif mid[0:2] == u"sm":
            self.nicoMain.getQueueObj().addFront(mid)
            self.logging(u"Add: %sを次に予約しました" % mid)
        self.tclUrl.SetValue("")

    def logging(self, *texts, **indent):
        """
        texts: shown strings
        indent: (indent=True/False) If indent is True, show indent.
        """
        self.output(texts[0])
        self.output("\n")
        #self.log(*texts, **indent)  # raise unknown error

    def OnClearLog(self, evt):
        """
        log Clear
        """
        self.tclLog.SetValue("")
        time.sleep(0.1)

    def OnSettings(self, evt):
        self.dlgSettings.ShowModal()
        #try:
        sdb = SystemDatabase(self.systemDatabasePath)
        sdb.svNicoid(self.nicoTable.getNicoid().encode("utf-8"))
        sdb.svNicopw(self.nicoTable.getNicopw().encode("utf-8"))
        sdb.svGmailid(self.nicoTable.getGmailid().encode("utf-8"))
        sdb.svGmailpw(self.nicoTable.getGmailpw().encode("utf-8"))
        sdb.svSavedir(self.nicoTable.getSavedir().encode("utf-8"))
        sdb.close()

        self.dlgSettings = SettingsDialog(self.nicoTable, self.tclLog.WriteText, self)

    def output(self, text):
        """
        overwrite
        """
        self.tclLog.SetInsertionPointEnd()
        self.tclLog.WriteText(text)

    def __set_properties(self):
        # begin wxGlade: NicoMovieLoadGUI.__set_properties
        self.SetTitle("NicoMovieLoad")
        self.SetSize((700, 650))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: NicoMovieLoadGUI.__do_layout
        sizer0 = wx.BoxSizer(wx.HORIZONTAL)
        sizerButtons = wx.BoxSizer(wx.VERTICAL)
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        szrBottom = wx.BoxSizer(wx.HORIZONTAL)
        szrLog = wx.BoxSizer(wx.VERTICAL)
        szrQueueList = wx.BoxSizer(wx.VERTICAL)
        szrUrlTextBox = wx.BoxSizer(wx.HORIZONTAL)
        szrUrlBox = wx.BoxSizer(wx.VERTICAL)
        szrUrlText = wx.BoxSizer(wx.VERTICAL)
        sizer_1.Add(self.treeCtrl, 1, wx.EXPAND, 0)
        szrUrlText.Add(self.lblUrl, 1, 0, 0)
        szrUrlTextBox.Add(szrUrlText, 0, wx.EXPAND, 0)
        szrUrlBox.Add(self.tclUrl, 0, wx.EXPAND, 0)
        szrUrlTextBox.Add(szrUrlBox, 1, wx.EXPAND, 0)
        self.pnlCenter.SetSizer(szrUrlTextBox)
        sizer_1.Add(self.pnlCenter, 0, wx.EXPAND, 0)
        szrQueueList.Add(self.lblQueueList, 0, wx.EXPAND, 0)
        szrQueueList.Add(self.lclQueueList, 1, wx.EXPAND, 0)
        szrBottom.Add(szrQueueList, 1, wx.EXPAND, 0)
        szrLog.Add(self.lblLog, 0, wx.EXPAND, 0)
        szrLog.Add(self.tclLog, 1, wx.EXPAND, 0)
        szrBottom.Add(szrLog, 1, wx.EXPAND, 0)
        self.pnlBottom.SetSizer(szrBottom)
        sizer_1.Add(self.pnlBottom, 1, wx.EXPAND, 0)
        sizer0.Add(sizer_1, 1, wx.EXPAND, 0)
        sizer0.Add(self.static_line_1, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 1)
        sizerButtons.Add(self.btnRss, 0, wx.EXPAND, 0)
        sizerButtons.Add(self.btnAdd, 0, wx.EXPAND, 0)
        sizerButtons.Add(self.btnLoad, 0, wx.EXPAND, 0)
        sizerButtons.Add(self.btnClearLog, 0, wx.EXPAND, 0)
        sizerButtons.Add(self.btnDelete, 0, wx.EXPAND, 0)
        sizerButtons.Add(self.btnSettings, 0, wx.EXPAND, 0)
        sizerButtons.Add(self.btnExit, 0, wx.EXPAND, 0)
        self.pnlRight.SetSizer(sizerButtons)
        sizer0.Add(self.pnlRight, 0, wx.EXPAND, 0)
        self.SetSizer(sizer0)
        self.Layout()
        # end wxGlade

    def __setTreeListCtrl(self):
        isz = (16,16)  # image
        il = wx.ImageList(isz[0], isz[1])
        fldridx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
        fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
        fileidx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))

        self.treeCtrl.SetImageList(il)
        self.il = il

        # create some columns
        self.treeCtrl.AddColumn(u"タイトル")
        self.treeCtrl.AddColumn(u"済み or RSS")
        self.treeCtrl.AddColumn(u"id")
        self.treeCtrl.SetMainColumn(0) # the one with the tree in it...
        self.treeCtrl.SetColumnWidth(0, 175)
        # append data
        self.treeCtrlRoot = []
        self.root = self.treeCtrl.AddRoot("The Root Item")
        self.treeCtrlRoot.append(self.root)
        #self.treeCtrl.SetItemText(self.root, "col 1 self.root", 1)
        #self.treeCtrl.SetItemText(self.root, "col 2 self.root", 2)
        #self.treeCtrl.SetItemImage(self.root, fldridx, which = wx.TreeItemIcon_Normal)
        #self.treeCtrl.SetItemImage(self.root, fldropenidx, which = wx.TreeItemIcon_Expanded)
        for x in range(5):
            txt = "Item %d" % x
            child = self.treeCtrl.AppendItem(self.root, txt)  # tree part
            self.treeCtrl.SetItemText(child, txt + " do RSS or dont", 1)  # description 1
            self.treeCtrl.SetItemText(child, txt + " mylist id", 2)  # description 2
            self.treeCtrl.SetItemImage(child, fldridx, which = wx.TreeItemIcon_Normal)
            self.treeCtrl.SetItemImage(child, fldropenidx, which = wx.TreeItemIcon_Expanded)
            for i in xrange(5):
                txt2 = "Item"
                last = self.treeCtrl.AppendItem(child, txt2)
                self.treeCtrl.SetItemText(last, txt + " Loaded or yet", 1)  # description 1
                self.treeCtrl.SetItemText(last, txt + " move id", 2)  # description 2
                self.treeCtrl.SetItemImage(last, fileidx, which = wx.TreeItemIcon_Normal)
                self.treeCtrl.SetItemImage(last, fileidx, which = wx.TreeItemIcon_Selected)

    def __set_QueueListCtrl(self):
        self.lclQueueList.InsertColumn(0, u"ID")
        self.lclQueueList.InsertColumn(1, u"title")
        self.lclQueueList.SetColumnWidth(0, wx.LIST_AUTOSIZE)
        self.lclQueueList.SetColumnWidth(1, wx.LIST_AUTOSIZE)
        self.lclQueueList.OnGetItemText = self.OnGetItemText

    def updateQueueList(self):
        movieQueue = self.nicoMain.getQueueObj.getQueueList()
        print movieQueue
        # 辞書の値の更新
        for movieid in self.__queueDict.keys():
            if not(movieid in movieQueue):
                del self.__queueDict[movieid]
        for movieid in movieQueue:
            if self.__queueDict.has_key(movieid) == False:
                try:
                    api = NicovideoAPI(movie_id=movieid)
                    title = api.get_movie_title()
                except:
                    title = "unknown"
                self.__queueDict.update({movieid : title})

        for movieid, title in self.__queueDict.items():
            self.__queueList.append((movieid, title))
        self.lclQueueList.SetItemCount(len(self.__queueList))

    def appendQueueList(self, mid, title):
        self.__queueList.append((mid, title))
        self.lclQueueList.SetItemCount(len(self.__queueList))

    def OnGetItemText(self, row, col):
        return self.__queueList[row][col]

    def removeQueueList(self):
        self.lclQueueList.DeleteItem(0)