Beispiel #1
0
 def handleDetails(self):
     elem = self.GetFocusedElement()
     index = elem.getConfirmationManagerIndex()
     confs = self.fileOperator.GetConfirmationManager()
     confirmElem = confs.GetAt(index)
     e = confirmElem.GetElement()
     from_path = e.path
     dest_path = e.destpath
     from_stat = os.stat(from_path)
     dest_stat = os.stat(dest_path)
     info = [
         (_("名前"), os.path.basename(from_path), "", ""), (_("サイズ"), misc.ConvertBytesTo(
             dest_stat.st_size, misc.UNIT_AUTO, True), "→", misc.ConvertBytesTo(
             from_stat.st_size, misc.UNIT_AUTO, True)), (_("更新日時"), datetime.datetime.fromtimestamp(
                 dest_stat.st_mtime), "→", datetime.datetime.fromtimestamp(
                 from_stat.st_mtime))]
     d = views.OperationSelecter.Dialog(
         _("上書きしますか?"),
         info,
         views.OperationSelecter.GetMethod("ALREADY_EXISTS"),
         False)
     d.Initialize()
     d.Show()
     val = d.GetValue()
     if val['all'] is True:  # 「以降も同様に処理」がオン
         confs.RespondAll(confirmElem, val['response'])
     else:  # この1件だけ
         confirmElem.Respond(d.GetValue()['response'])  # 渓谷に対して、文字列でレスポンスする
     # end これ以降全てかこれだけか
     self.fileOperator.UpdateConfirmation()  # これで繁栄する
     self.listObject.Update(confs)
     self.Update(self.listObject)
     self.fileOperator.Execute()  # これでコピーを再実行
Beispiel #2
0
    def GetListTuple(self):
        """
			表示に必要なタプルを返す。
			変更した場合はNetworkResourceの方にも反映すること!
		"""
        return (self.basename, self.letter,
                misc.ConvertBytesTo(self.free, misc.UNIT_AUTO, True),
                misc.ConvertBytesTo(self.total, misc.UNIT_AUTO,
                                    True), self.typeString)
Beispiel #3
0
 def ShowDetail(self, elem):
     dic = {}
     dic[_("名前")] = elem.basename
     dic[_("パス")] = elem.fullpath
     if elem.__class__ == browsableObjects.File or elem.__class__ == browsableObjects.Stream:
         dic[_("サイズ")] = misc.ConvertBytesTo(elem.size, misc.UNIT_AUTO,
                                             True)
         dic[_("サイズ(バイト)")] = elem.size
     elif elem.__class__ == browsableObjects.Folder:
         if elem.size >= 0:
             dic[_("サイズ")] = misc.ConvertBytesTo(elem.size, misc.UNIT_AUTO,
                                                 True)
             dic[_("サイズ(バイト)")] = elem.size
         else:
             size = misc.GetDirectorySize(elem.fullpath)
             if size >= 0:
                 dic[_("サイズ")] = misc.ConvertBytesTo(
                     size, misc.UNIT_AUTO, True)
                 dic[_("サイズ(バイト)")] = size
             else:
                 dic[_("サイズ")] = _("不明")
                 dic[_("サイズ(バイト)")] = _("不明")
     if isinstance(elem, browsableObjects.File):
         dic[_("作成日時")] = elem.creationDate.strftime(
             "%Y/%m/%d(%a) %H:%M:%S")
         dic[_("更新日時")] = elem.modDate.strftime("%Y/%m/%d(%a) %H:%M:%S")
         dic[_("属性")] = elem.longAttributesString
         dic[_("種類")] = elem.typeString
         if not elem.shortName == "":
             dic[_("短い名前")] = elem.shortName
         else:
             dic[_("短い名前")] = _("なし")
     if elem.__class__ == browsableObjects.Drive:
         if elem.free >= 0:
             dic[_("フォーマット")] = fileSystemManager.GetFileSystemObject(
                 elem.letter)
             dic[_("空き容量")] = misc.ConvertBytesTo(elem.free, misc.UNIT_AUTO,
                                                  True)
         else:
             dic[_("フォーマット")] = _("未挿入")
         if elem.total > 0:
             dic[_("空き容量")] += " (" + str(
                 elem.free * 100 // elem.total) + "%)"
         if elem.free >= 0:
             dic[_("総容量")] = misc.ConvertBytesTo(elem.total, misc.UNIT_AUTO,
                                                 True)
         dic[_("種類")] = elem.typeString
     if elem.__class__ == browsableObjects.NetworkResource:
         dic[_("IPアドレス")] = elem.address
     d = views.objectDetail.Dialog()
     d.Initialize(dic)
     d.Show()
     d.Destroy()
     return
Beispiel #4
0
 def GetListTuple(self):
     """表示に必要なタプルを返す。"""
     return (self.basename,
             misc.ConvertBytesTo(self.size, misc.UNIT_AUTO,
                                 True), self.relpath,
             misc.PTime2string(self.modDate), self.attributesString,
             self.typeString)
Beispiel #5
0
 def GetListTuple(self):
     """表示に必要なタプルを返す。フォルダなのでサイズ不明(-1)の場合があり、この場合は <dir> にする。"""
     if self.size < 0:
         return (self.basename, "<dir>", misc.PTime2string(self.modDate),
                 self.attributesString, self.typeString)
     else:
         return (self.basename,
                 misc.ConvertBytesTo(self.size, misc.UNIT_AUTO,
                                     True), misc.PTime2string(self.modDate),
                 self.attributesString, self.typeString)
Beispiel #6
0
 def GetListTuple(self):
     """表示に必要なタプルを返す。フォルダなのでサイズ不明(-1)の場合があり、この場合は <dir> にする。"""
     if self.size == constants.DIR_SIZE_CALCURATING:
         sizeString = "<計算中>"
     elif self.size == constants.DIR_SIZE_CHECK_FAILED:
         sizeString = "<取得失敗>"
     elif self.size < 0:
         sizeString = "<dir>"
     else:
         sizeString = misc.ConvertBytesTo(self.size, misc.UNIT_AUTO, True)
     return (self.basename, sizeString, misc.PTime2string(self.modDate),
             self.attributesString, self.typeString)
Beispiel #7
0
 def _dirCalc_receive(self, results, taskState):
     """DirCalc の結果を受ける。"""
     for elem in results:
         self.listObject.GetElement(elem[0]).size = elem[1]
         if elem[1] >= 0:
             self.hListCtrl.SetItem(index=elem[0],
                                    column=1,
                                    label=misc.ConvertBytesTo(
                                        elem[1], misc.UNIT_AUTO, True))
         else:
             self.hListCtrl.SetItem(index=elem[0], column=1, label="<取得失敗>")
     #end for
     self.background_tasks.remove(taskState)
Beispiel #8
0
 def setDirCalcResult(self, results, taskState):
     result = results[0][1]  # 2つ以上来ることはなく、パス文字列は不要
     if result[0] >= 0:
         self.calcuratingFields[0].SetValue(
             misc.ConvertBytesTo(result[0], misc.UNIT_AUTO, True))
         self.calcuratingFields[1].SetValue(str(result[0]))
         self.calcuratingFields[2].SetValue(
             _("ファイル数: %d サブディレクトリ数: %d") % (result[1], result[2]))
     else:
         self.calcuratingFields[0].SetValue(_("不明"))
         self.calcuratingFields[1].SetValue(_("不明"))
         self.calcuratingFields[2].SetValue(_("不明"))
     self.task = None
Beispiel #9
0
    def PastOperation(self, target, dest, op=clipboard.COPY):
        op_str = _("複写") if op == clipboard.COPY else _("移動")

        # 重複を排除
        # target=set(target)

        # 自身のサブフォルダへの貼り付けはできない
        errors = []
        for it in target:
            i = it[0]
            if i in dest or os.path.dirname(i) == dest:
                errors.append(i)
            # end サブディレクトリ、あるいは、同じディレクトリへのコピー/貼り付け
        # end 事前チェック
        if errors:
            all = ""
            for i in errors:
                target.remove((i, i))
                if all == "SKIP":
                    continue
                # end 「以降も同様に処理」で全てスキップ
                if all == "RENAME":
                    nn = self.getNewNameForPast(os.path.dirname(i), os.path.basename(i))
                    if nn == "":
                        continue
                    # end 名前が入力されなかったらスキップ扱い
                    target.append((i, os.path.join(dest, nn)))
                    continue
                # 「以降も同様に処理」ででリネーム
                info = [
                    (_("項目"), _("パス")),
                    (_("%s先") % op_str, dest),
                    (os.path.basename(i), i)
                ]
                d = views.OperationSelecter.Dialog(
                    _("自身のサブディレクトリへの%sはできません。") %
                    op_str, info, views.OperationSelecter.GetMethod("OWN_SUB_DIR"), False)
                d.Initialize()
                d.Show()
                ret = d.GetValue()
                if ret["all"]:
                    all = ret["response"]
                # end 「以降も同様に処理」が指定されていたら、そのレスポンスを覚える
                if ret["response"] == "SKIP":
                    continue
                elif ret["response"] == "RENAME":
                    nn = self.getNewNameForPast(os.path.dirname(i), os.path.basename(i))
                    if nn == "":
                        continue
                    # end 名前が入力されなかったらスキップ扱い
                    target.append((i, os.path.join(dest, nn)))
                # end rename
            # エラーの問い合わせ
        # end エラーがある場合

        # この時点でtargetが0ならおわり
        if len(target) == 0:
            return

        # ユーザに確認表示
        if len(target) == 1:
            msg = _("%(file)s\nこのファイルを、 %(dest)s に%(op)sしますか?") % {
                'file': target[0][0], 'dest': target[0][1], 'op': op_str}
        else:
            msg = _("%(num)d 項目を、 %(dest)s に%(op)sしますか?") % {'num': len(
                target), 'dest': self.listObject.rootDirectory, 'op': op_str}
        # end メッセージどっちにするか
        dlg = wx.MessageDialog(None, msg, _("%(op)sの確認") %
                               {'op': op_str}, wx.YES_NO | wx.ICON_QUESTION)
        if dlg.ShowModal() == wx.ID_NO:
            return

        # fileOperatorに処理依頼
        inst = {
            "operation": "past",
            "target": target,
            "to": dest,
            "copy_move_flag": op}
        op = fileOperator.FileOperator(inst)
        ret = op.Execute()

        # 今はテストで、常にダイアログを表示して処理刷る
        nav = {"action": "past", "operator": op}
        globalVars.app.hMainView.Navigate(nav, as_new_tab=True)
        return  # このあとのことは新しいタブに任せる

        # ここから先は今はリーチしない
        # 0.5秒待つ
        time.sleep(0.5)

        # 状況確認
        # TODO:タブに分ける処理
        self.log.debug("Start checking confirmation")
        confs = op.GetConfirmationManager()
        while(True):
            confs_list = list(confs.IterateNotResponded())
            self.log.debug("%d confirmations." % len(confs_list))
            if len(confs_list) == 0:
                break
            elem = confs_list[0]
            e = elem.GetElement()
            from_path = e.path
            dest_path = e.destpath
            from_stat = os.stat(from_path)
            dest_stat = os.stat(dest_path)
            info = [
                (_("名前"), "test.txt", "", ""), (_("サイズ"), misc.ConvertBytesTo(
                    dest_stat.st_size, misc.UNIT_AUTO, True), "→", misc.ConvertBytesTo(
                    from_stat.st_size, misc.UNIT_AUTO, True)), (_("更新日時"), datetime.datetime.fromtimestamp(
                        dest_stat.st_mtime), "→", datetime.datetime.fromtimestamp(
                        from_stat.st_mtime))]
            d = views.OperationSelecter.Dialog(
                _("上書きしますか?"),
                info,
                views.OperationSelecter.GetMethod("ALREADY_EXISTS"),
                False)
            d.Initialize()
            d.Show()
            val = d.GetValue()
            if val['all'] is True:  # 「以降も同様に処理」がオン
                confs.RespondAll(elem, val['response'])
            else:  # この1件だけ
                elem.SetResponse(d.GetValue())  # 渓谷に対して、文字列でレスポンスする
            # end これ以降全てかこれだけか
        # end while
        self.log.debug("End checking confirmation.")
        op.UpdateConfirmation()  # これで繁栄する
        op.Execute()  # これでコピーを再実行

        if op.CheckSucceeded() == 0 and ret == 0:
            dialog(_("エラー"), _("%(op)sに失敗しました。" % {'op': op_str}))
        # end failure
        self.UpdateFilelist(silence=True)
Beispiel #10
0
    def PastOperation(self, target, dest, op=clipboard.COPY):
        op_str = _("複写") if op == clipboard.COPY else _("移動")

        #重複を排除
        #target=set(target)

        #自身のサブフォルダへの貼り付けはできない
        errors = []
        for i in target:
            if i in dest:
                errors.append(i)
        if errors:
            info = [(_("項目"), _("パス")), (_("%s先") % op_str, dest)]
            for i in errors:
                target.remove(i)
                info.append((os.path.basename(i), i))
            d = views.OperationSelecter.Dialog(
                _("自身のサブディレクトリへの%sはできません。") % op_str, info,
                views.OperationSelecter.GetMethod("OWN_SUB_DIR"), False)
            d.Initialize()
            d.Show()
            ret = d.GetValue()["response"]
            if ret == "CANCEL": return
        #TODO:同一ディレクトリなら別名を決めさせる

        #この時点でtargetが0ならおわり
        if len(target) == 0: return

        #ユーザに確認表示
        if len(target) == 1:
            msg = _("%(file)s\nこのファイルを、 %(dest)s に%(op)sしますか?") % {
                'file': target[0],
                'dest': dest,
                'op': op_str
            }
        else:
            msg = _("%(num)d 項目を、 %(dest)s に%(op)sしますか?") % {
                'num': len(target),
                'dest': self.listObject.rootDirectory,
                'op': op_str
            }
        #end メッセージどっちにするか
        dlg = wx.MessageDialog(None, msg,
                               _("%(op)sの確認") % {'op': op_str},
                               wx.YES_NO | wx.ICON_QUESTION)
        if dlg.ShowModal() == wx.ID_NO: return

        #fileOperatorに処理依頼
        inst = {
            "operation": "past",
            "target": target,
            "to": dest,
            'copy_move_flag': op
        }
        op = fileOperator.FileOperator(inst)
        ret = op.Execute()

        #0.5秒待つ
        time.sleep(0.5)

        #状況確認
        #TODO:タブに分ける処理
        self.log.debug("Start checking confirmation")
        confs = op.GetConfirmationManager()
        while (True):
            confs_list = list(confs.IterateNotResponded())
            self.log.debug("%d confirmations." % len(confs_list))
            if len(confs_list) == 0: break
            elem = confs_list[0]
            e = elem.GetElement()
            from_path = e.path
            dest_path = e.destpath
            from_stat = os.stat(from_path)
            dest_stat = os.stat(dest_path)
            info = [(_("名前"), "test.txt", "", ""),
                    (_("サイズ"),
                     misc.ConvertBytesTo(dest_stat.st_size, misc.UNIT_AUTO,
                                         True), "→",
                     misc.ConvertBytesTo(from_stat.st_size, misc.UNIT_AUTO,
                                         True)),
                    (_("更新日時"),
                     datetime.datetime.fromtimestamp(dest_stat.st_mtime), "→",
                     datetime.datetime.fromtimestamp(from_stat.st_mtime))]
            d = views.OperationSelecter.Dialog(
                _("上書きしますか?"), info,
                views.OperationSelecter.GetMethod("ALREADY_EXISTS"), False)
            d.Initialize()
            d.Show()
            val = d.GetValue()
            if val['all'] is True:  #「以降も同様に処理」がオン
                confs.RespondAll(elem, val['response'])
            else:  #この1件だけ
                elem.SetResponse(d.GetValue())  #渓谷に対して、文字列でレスポンスする
            #end これ以降全てかこれだけか
        #end while
        self.log.debug("End checking confirmation.")
        op.UpdateConfirmation()  #これで繁栄する
        op.Execute()  #これでコピーを再実行

        if op.CheckSucceeded() == 0 and ret == 0:
            dialog(_("エラー"), _("%(op)sに失敗しました。" % {'op': op_str}))
        #end failure
        self.UpdateFilelist(silence=True)
Beispiel #11
0
    def ShowDetail(self, elem):
        d = views.objectDetail.Dialog()
        d.Initialize()
        d.add(_("名前"), elem.basename)
        d.add(_("パス"), elem.fullpath)
        if isinstance(elem, browsableObjects.File) or isinstance(elem, browsableObjects.Stream):
            if elem.size >= 0:
                d.add(_("サイズ"), misc.ConvertBytesTo(elem.size, misc.UNIT_AUTO, True))
                d.add(_("サイズ(バイト)"), elem.size)
                if isinstance(elem, browsableObjects.Folder):
                    d.add(_("内容"), _("ファイル数: %d サブディレクトリ数: %d") % (elem.fileCount, elem.dirCount))
            elif isinstance(elem, browsableObjects.Folder):
                d.add(_("サイズ"), d.CALCURATING)
                d.add(_("サイズ(バイト)"), d.CALCURATING)
                d.add(_("内容"), d.CALCURATING)
                param = {'lst': [(0, elem.fullpath)], 'callback': d.setDirCalcResult}
                d.setTask(workerThreads.RegisterTask(workerThreadTasks.DirCalc, param))
        if isinstance(elem, browsableObjects.File):
            d.add(_("作成日時"), elem.creationDate.strftime("%Y/%m/%d(%a) %H:%M:%S"))
            d.add(_("更新日時"), elem.modDate.strftime("%Y/%m/%d(%a) %H:%M:%S"))
            d.add(_("属性"), elem.longAttributesString)
            d.add(_("種類"), elem.typeString)
            if not elem.shortName == "":
                d.add(_("短い名前"), elem.shortName)
            else:
                d.add(_("短い名前"), _("なし"))

            h = win32file.CreateFile(
                elem.fullpath,
                0,
                win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE,
                None,
                win32file.OPEN_EXISTING,
                win32file.FILE_FLAG_BACKUP_SEMANTICS,  # これがないとディレクトリを開けない
                0)
            info = win32file.GetFileInformationByHandleEx(h, win32file.FileStandardInfo)
            if info:
                d.add(_("消費ディスク領域"),
                      misc.ConvertBytesTo(info["AllocationSize"], misc.UNIT_AUTO, True) + " (" + str(info["AllocationSize"]) + " bytes)")
                tmp = ""
                if info["DeletePending"]:
                    tmp += _("削除予約済 ")
                if info["NumberOfLinks"] > 1:
                    tmp += _("ハードリンクにより他の %d 箇所から参照" % (info["NumberOfLinks"] - 1))
                if tmp == "":
                    tmp = _("なし")
                d.add(_("追加情報"), tmp)

        if isinstance(elem, browsableObjects.Drive):
            if elem.free >= 0:
                d.add(_("フォーマット"), fileSystemManager.GetFileSystemObject(elem.letter))
                if elem.total > 0:
                    d.add(_("空き容量"), "%s (%s%%)" % (misc.ConvertBytesTo(elem.free, misc.UNIT_AUTO, True), elem.free * 100 // elem.total))
                else:
                    d.add(_("空き容量"), misc.ConvertBytesTo(elem.free, misc.UNIT_AUTO, True))
                d.add(_("総容量"), misc.ConvertBytesTo(elem.total, misc.UNIT_AUTO, True))
            else:
                d.add(_("フォーマット"), _("未挿入"))
            d.add(_("種類"), elem.typeString)
        if isinstance(elem, browsableObjects.NetworkResource) and elem.address != "":
            d.add(_("IPアドレス"), elem.address)
        d.Show()
        return
Beispiel #12
0
 def GetListTuple(self):
     """表示に必要なタプルを返す。"""
     return (self.basename,
             misc.ConvertBytesTo(self.size, misc.UNIT_AUTO, True))