Example #1
0
	def GoForward(self,stream,admin=False):
		"""検索結果表示では、フォルダを開くときに別タブを生成する。"""
		index=self.GetFocusedItem()
		elem=self.listObject.GetElement(index)
		if (not stream) and (type(elem)==browsableObjects.File or type(elem)==browsableObjects.GrepItem) :#このファイルを開く
			misc.RunFile(elem.fullpath,admin)
			return
		else:
			#新しいタブで開く
			globalVars.app.hMainView.Navigate(elem.fullpath,as_new_tab=True)
Example #2
0
File: base.py Project: yncat/falcon
 def GoForward(self, stream, admin=False):
     """選択中のフォルダやドライブに入るか、選択中のファイルを実行する。stream=True の場合、ファイルの NTFS 副ストリームを開く。"""
     index = self.GetFocusedItem()
     elem = self.listObject.GetElement(index)
     if not stream and type(elem) == browsableObjects.File:  # このファイルを開く
         misc.RunFile(elem.fullpath, admin, "",
                      self.listObject.rootDirectory)
         return
     else:
         # TODO: 管理者権限が要求され、自身が管理者権限を有していないなら、別のfalconが昇格して開くように
         return self.Move(elem.fullpath)
Example #3
0
File: base.py Project: yncat/falcon
 def ExecProgram(self, val):
     argv = misc.CommandLineToArgv(val)
     path = argv[0]
     prm = " ".join(argv[1:])
     misc.RunFile(path, prm=prm, workdir=self.listObject.rootDirectory)
Example #4
0
File: main.py Project: yncat/falcon
    def OnMenuSelect(self, event):
        """メニュー項目が選択されたときのイベントハンドら。"""
        # ショートカットキーが無効状態のときは何もしない
        if not self.parent.shortcutEnable:
            event.Skip()
            return

        # プレビュー再生停止等のため、キー押下をタブへ通知
        # ここにきている場合KeyDownイベントはとれないため
        self.parent.activeTab.OnKeyDown()

        selected = event.GetId()  # メニュー識別しの数値が出る

        # カラムソートは特別対応
        if selected >= constants.MENU_ID_SORT_COLUMN:
            self.ColumnSort(selected)
            return

        # キー重複対応のためのIDの場合には、イベントを投げ直す
        # 複数投げられるが、有効状態の者は1つだけなはず
        if globalVars.app.hMainView.menu.keymap.isRefHit(selected):
            for ref in globalVars.app.hMainView.menu.keymap.GetOriginalRefs(selected):
                newEvent = wx.CommandEvent(event.GetEventType(), ref)
                newEvent.SetExtraLong(EVENT_FROM_SELF)  # キー操作無効を示す音を鳴らさない
                wx.PostEvent(self.parent.hFrame.GetEventHandler(), newEvent)
            return

        # 選択された(ショートカットで押された)メニューが無効状態なら何もしない
        if selected in views.menuBlocker.testMenu(self.parent.activeTab):
            if not event.GetExtraLong() == EVENT_FROM_SELF:
                globalVars.app.PlaySound(globalVars.app.config["sounds"]["boundary"])
            event.Skip()
            return

        if selected == menuItemsStore.getRef("ENV_PASTTABTEST"):
            self.parent.Navigate({"action": "past"}, as_new_tab=True)
            return
        # end test
        if selected == menuItemsStore.getRef("MOVE_BACKWARD"):
            self.GoBackward()
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD"):
            self.GoForward(False)
            return
        if selected == menuItemsStore.getRef("MOVE_EXEC_ORIGINAL_ASSOCIATION"):
            elem = self.parent.activeTab.GetFocusedElement()
            if ((not isinstance(elem, browsableObjects.Folder)) and
                    isinstance(elem, (browsableObjects.File, browsableObjects.Stream, browsableObjects.GrepItem))):
                extention = os.path.splitext(elem.fullpath)[1][1:].lower()
                if extention in globalVars.app.config["originalAssociation"]:
                    config = globalVars.app.config["originalAssociation"][extention]
                else:
                    config = globalVars.app.config["originalAssociation"]["<default_file>"]
            else:
                config = globalVars.app.config["originalAssociation"]["<default_dir>"]
            config = misc.analyzeUserInputPath(config)
            misc.RunFile(config, prm="\"%s\"" % (elem.fullpath))
            return
        if selected == menuItemsStore.getRef("ENV_KEY_CONFIG"):
            keys = self.parent.menu.keymap.map[self.parent.identifier.upper()]
            keyData = {}
            menuData = {}
            for refName in defaultKeymap.defaultKeymap["MainView".upper()].keys():
                title = menuItemsDic.dic[refName]
                if refName in keys:
                    keyData[title] = keys[refName]
                else:
                    keyData[title] = "なし"
                menuData[title] = refName
            d = views.globalKeyConfig.Dialog(keyData, menuData)
            d.Initialize()
            if d.Show() == wx.ID_CANCEL:
                return

            result = {}
            keyData, menuData = d.GetValue()

            # キーマップの既存設定を置き換える
            keymap = ConfigManager.ConfigManager()
            keymap.read(constants.KEYMAP_FILE_NAME)
            for name, key in keyData.items():
                if key != _("なし"):
                    keymap[self.parent.identifier.upper()][menuData[name]] = key
                else:
                    keymap[self.parent.identifier.upper()][menuData[name]] = ""
            keymap.write()

            # ショートカットキーの変更適用とメニューバーの再描画
            self.parent.UpdateUserCommand()
            self.parent.menu.Apply(self.parent.hFrame)
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD_ADMIN"):
            self.GoForward(False, admin=True)
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD_STREAM"):
            self.GoForward(True)
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD_TAB"):
            self.OpenNewTab()
            return
        if selected == menuItemsStore.getRef("MOVE_CLOSECURRENTTAB"):
            self.CloseTab()
            return
        if selected == menuItemsStore.getRef("MOVE_NEWTAB"):
            self.NewTab()
            return
        if selected == menuItemsStore.getRef("EDIT_COPY"):
            self.parent.activeTab.Copy()
            return
        if selected == menuItemsStore.getRef("EDIT_CUT"):
            self.parent.activeTab.Cut()
            return
        if selected == menuItemsStore.getRef("EDIT_PAST"):
            self.parent.activeTab.Past()
            return
        if selected == menuItemsStore.getRef("EDIT_NAMECOPY"):
            self.parent.activeTab.NameCopy()
            return
        if selected == menuItemsStore.getRef("EDIT_FULLPATHCOPY"):
            self.parent.activeTab.FullpathCopy()
            return
        if selected == menuItemsStore.getRef("EDIT_SELECTALL"):
            self.parent.activeTab.SelectAll()
            return
        if selected == menuItemsStore.getRef("MOVE_TOPFILE"):
            self.parent.activeTab.GoToTopFile()
            return
        if selected == menuItemsStore.getRef("MOVE_SPECIAL_UP"):
            self.parent.activeTab.Jump(constants.ARROW_UP)
            return
        if selected == menuItemsStore.getRef("MOVE_SPECIAL_DOWN"):
            self.parent.activeTab.Jump(constants.ARROW_DOWN)
            return
        if selected == menuItemsStore.getRef("MOVE_HIST_PREV"):
            self.parent.activeTab.GoHistPrevious()
            return
        if selected == menuItemsStore.getRef("MOVE_HIST_NEXT"):
            self.parent.activeTab.GoHistNext()
            return
        if selected == menuItemsStore.getRef("MOVE_MARKSET"):
            self.parent.activeTab.MarkSet()
            self.parent.menu.Enable(menuItemsStore.getRef("MOVE_MARK"), True)
            return
        if selected == menuItemsStore.getRef("MOVE_MARK"):
            self.parent.activeTab.GoToMark()
            return
        if selected == menuItemsStore.getRef("MOVE_INPUT_DIR"):
            d = views.SympleImputDialog.Dialog(_("パスを指定して移動"), _("移動先"))
            d.Initialize()
            if d.Show() == wx.ID_CANCEL:
                return
            self.parent.activeTab.Move(misc.analyzeUserInputPath(d.GetValue(), self.parent.activeTab.listObject.rootDirectory))
            return
        if selected == menuItemsStore.getRef("MOVE_ADD_FAVORITE"):
            rootDir = self.parent.activeTab.listObject.rootDirectory
            d = views.favoriteDirectory.SettingDialog(self.parent.hFrame, os.path.basename(rootDir), rootDir, "")
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL:
                return
            name, path, key = d.GetValue()

            if name in globalVars.app.favoriteDirectory:
                dlg = wx.MessageDialog(
                    self.parent.hFrame,
                    _("この名前は既に登録されています。登録を上書きしますか?"),
                    _("上書き確認"),
                    wx.YES_NO | wx.ICON_QUESTION)
                if dlg.ShowModal() == wx.ID_NO:
                    return
            v = dict(globalVars.app.favoriteDirectory.keyMap.items())
            v[name] = key
            if not views.KeyValueSettingDialogBase.KeySettingValidation(
                    dict(globalVars.app.favoriteDirectory.keyMap.items()), v, None):
                return

            globalVars.app.favoriteDirectory.add(name, path, key)
            self.parent.UpdateUserCommand()
            return
        if selected == menuItemsStore.getRef("MOVE_SETTING_FAVORITE"):
            d = views.favoriteDirectory.Dialog(
                dict(globalVars.app.favoriteDirectory.paramMap.items()),
                dict(globalVars.app.favoriteDirectory.keyMap.items()))
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL:
                return

            result = {}
            params, keys = d.GetValue()
            globalVars.app.favoriteDirectory.replace(params, keys)
            self.parent.UpdateUserCommand()
            return
        if selected == menuItemsStore.getRef("MOVE_SETTING_OPEN_HERE"):
            d = views.openHere.Dialog(
                dict(globalVars.app.openHereCommand.paramMap.items()),
                dict(globalVars.app.openHereCommand.keyMap.items()))
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL:
                return

            result = {}
            params, keys = d.GetValue()
            globalVars.app.openHereCommand.replace(params, keys)
            self.parent.UpdateUserCommand()
            return
        if selected == menuItemsStore.getRef("VIEW_SORTNEXT"):
            self.DelaiedCall(self.SortNext)
            return
        if selected == menuItemsStore.getRef("EDIT_MARKITEM"):
            self.parent.activeTab.OnSpaceKey()
            return
        if selected == menuItemsStore.getRef("EDIT_MARKITEM_ALL"):
            self.parent.activeTab.CheckAll()
            return
        if selected == menuItemsStore.getRef("EDIT_UNMARKITEM_ALL"):
            self.parent.activeTab.UncheckAll()
            return
        if selected == menuItemsStore.getRef("EDIT_MARKITEM_INVERSE"):
            self.parent.activeTab.CheckInverse()
            return
        if selected == menuItemsStore.getRef("VIEW_SORTSELECT"):
            self.SortSelect()
            return
        if selected == menuItemsStore.getRef("VIEW_SORTCYCLEAD"):
            self.DelaiedCall(self.SortCycleAd)
            return
        if selected == menuItemsStore.getRef("EDIT_SEARCH"):
            self.Search()
            return
        if selected == menuItemsStore.getRef("EDIT_UPDATEFILELIST"):
            self.UpdateFilelist()
            return
        if selected == menuItemsStore.getRef("EDIT_OPENCONTEXTMENU"):
            self.OpenContextMenu()
            return
        if selected == menuItemsStore.getRef("FILE_MAKESHORTCUT"):
            target = self.parent.activeTab.GetSelectedItems().GetElement(0)  # browsableObjects
            d = views.makeShortcut.Dialog(
                target.basename,
                target.canLnkTarget,
                target.canHardLinkTarget,
                target.canSynLinkTarget)
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL:
                return
            self.parent.activeTab.MakeShortcut(d.GetValue())
            return
        if selected == menuItemsStore.getRef("FILE_CHANGEATTRIBUTE"):
            d = views.changeAttribute.Dialog(self.parent.activeTab.GetSelectedItems().GetAttributeCheckState())
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL:
                return
            val = d.GetValue()
            self.parent.activeTab.ChangeAttribute(val)
            return
        if selected == menuItemsStore.getRef("FILE_MKDIR"):
            d = views.SympleImputDialog.Dialog(_("ディレクトリ作成"), _("ディレクトリ名"))
            d.Initialize()
            if d.Show() == wx.ID_CANCEL:
                return
            self.parent.activeTab.MakeDirectory(d.GetValue())
            return
        if selected == menuItemsStore.getRef("FILE_FILEOPTEST"):
            self.parent.activeTab.FileOperationTest()
            return
        if selected == menuItemsStore.getRef("FILE_TRASH"):
            self.parent.activeTab.Trash()
            return
        if selected == menuItemsStore.getRef("FILE_DELETE"):
            self.parent.activeTab.Delete()
            return
        if selected == menuItemsStore.getRef("FILE_VIEW_DETAIL"):
            elem = self.parent.activeTab.GetFocusedElement()
            self.ShowDetail(elem)
            return
        if selected == menuItemsStore.getRef("FILE_SHOWPROPERTIES"):
            self.parent.activeTab.ShowProperties()
            return
        if selected == menuItemsStore.getRef("READ_CURRENTFOLDER"):
            self.DelaiedCall(self.parent.activeTab.ReadCurrentFolder)
            return
        if selected == menuItemsStore.getRef("READ_LISTITEMNUMBER"):
            self.DelaiedCall(self.parent.activeTab.ReadListItemNumber)
            return
        if selected == menuItemsStore.getRef("READ_LISTINFO"):
            self.DelaiedCall(self.parent.activeTab.ReadListInfo)
            return
        if selected == menuItemsStore.getRef("READ_CONTENT_PREVIEW"):
            self.parent.activeTab.Preview()
            return
        if selected == menuItemsStore.getRef("READ_CONTENT_READHEADER"):
            self.DelaiedCall(self.parent.activeTab.ReadHeader)
            return
        if selected == menuItemsStore.getRef("READ_CONTENT_READFOOTER"):
            self.DelaiedCall(self.parent.activeTab.ReadFooter)
            return
        if selected == menuItemsStore.getRef("READ_SETMOVEMENTREAD"):
            self.parent.activeTab.SetMovementRead()
            return
        if selected == menuItemsStore.getRef("TOOL_DIRCALC"):
            self.parent.activeTab.DirCalc()
            return
        if selected == menuItemsStore.getRef("TOOL_HASHCALC"):
            d = views.makeHash.Dialog(self.parent.activeTab.GetFocusedElement().fullpath)
            d.Initialize()
            d.Show()
            return
        if selected == menuItemsStore.getRef("TOOL_EXEC_PROGRAM"):
            self.ExecProgram()
            return
        if selected == menuItemsStore.getRef("TOOL_ADDPATH"):
            t = self.parent.activeTab.GetSelectedItems()
            t = t.GetItemPaths()
            if misc.addPath(t):
                dialog(_("パスの追加"), _("ユーザ環境変数PATHに追加しました。"))
            else:
                dialog(_("パスの追加"), _("追加に失敗しました。"))
            return
        if selected == menuItemsStore.getRef("TOOL_EJECT_DRIVE"):
            ret = deviceCtrl.ejectDrive(self.parent.activeTab.GetFocusedElement().letter)
            if ret == errorCodes.OK:
                dialog(_("成功"), _("ドライブは安全に切断されました。"))
                self.UpdateFilelist(False)
            elif ret == errorCodes.FILE_NOT_FOUND:
                dialog(_("エラー"), _("指定されたドライブが見つかりません。既に取り外しされた可能性があります。"))
            elif ret == errorCodes.UNKNOWN:
                # エラー表示はむこうでやってる
                pass
            elif errorCodes.ACCESS_DENIED:
                dialog(_("エラー"), _("取り外しに失敗しました。") + _("このドライブは使用中の可能性があります。"))
            return
        if selected == menuItemsStore.getRef("TOOL_EJECT_DEVICE"):
            ret = deviceCtrl.EjectDevice(self.parent.activeTab.GetFocusedElement().letter)
            if ret == errorCodes.OK:
                dialog(_("成功"), _("デバイスは安全に取り外せる状態になりました。"))
                self.UpdateFilelist(False)
            elif ret == errorCodes.UNKNOWN:
                dialog(_("エラー"), _("デバイスの取り外しに失敗しました。"))
            return
        if selected == menuItemsStore.getRef("VIEW_DRIVE_INFO"):
            elem = self.parent.activeTab.GetRootObject()
            if elem is None:
                dialog(_("エラー"), _("ドライブ情報の取得に失敗しました。"))
                return
            self.ShowDetail(elem)
            return
        if selected == menuItemsStore.getRef("ENV_REGIST_ORIGINAL_ASSOCIATION"):
            config = globalVars.app.config["originalAssociation"]
            d = views.registerOriginalAssociation.Dialog(dict(config.items()))
            d.Initialize()
            if d.Show() == wx.ID_CANCEL:
                return
            result = {}
            result["originalAssociation"] = d.GetValue()[0]
            globalVars.app.config.remove_section("originalAssociation")
            globalVars.app.config.read_dict(result)
            return
        if selected == menuItemsStore.getRef("ENV_TESTDIALOG"):
            return
        if selected == menuItemsStore.getRef("ENV_FONTTEST"):
            self.fonttest = views.fonttest.View()
            self.fonttest.Initialize()
            return
        if selected == menuItemsStore.getRef("ENV_SETTINGS"):
            d = views.settingsDialog.Dialog()
            d.Initialize()
            d.Show()
            return
        if selected == menuItemsStore.getRef("FILE_RENAME"):
            self.StartRename()
            return
        if selected == menuItemsStore.getRef("FILE_EXIT"):
            self.parent.hFrame.Close()
            return
        if selected == menuItemsStore.getRef("HELP_VERINFO"):
            views.versionDialog.versionDialog()
            return
        if selected == menuItemsStore.getRef("HELP_UPDATE"):
            globalVars.update.update()
            return

        for m in globalVars.app.userCommandManagers:
            if m.isRefHit(selected):
                if m == globalVars.app.favoriteDirectory:
                    ret = self.parent.activeTab.Move(misc.analyzeUserInputPath(m.get(selected), self.parent.activeTab.listObject.rootDirectory))
                    # TODO: エラー処理する
                else:  # ここで開く
                    path = m.get(selected)
                    path, prm = misc.PathParamSplit(path)
                    prm = prm.replace("%1", self.parent.activeTab.listObject.rootDirectory)
                    misc.RunFile(path, False, prm)
                return

        dialog(_("エラー"), _("操作が定義されていないメニューです。"))
        return
Example #5
0
def Navigate(target,
             cursor="",
             previous_tab=None,
             create_new_tab_info=None,
             environment={}):
    """
		指定したパスにアクセスする。現在のタブと違う種類のタブが必要とされた場合に、新しいタブを返す。今のタブを再利用した場合は、Trueを返す。失敗時にはエラーコードを返す。
		パスに空の文字を指定すると、ドライブリストへ行く。
		パスに辞書を指定した場合、内容によって動作が変わる。事前に取得したファイルリストからの検索などができる。
		create_new_tab_info に (parent,hPanel) のタプルがあれば、この情報を使って新規タブを作成する。これは、メインビューで使っている
	"""
    if previous_tab is None and create_new_tab_info is None:
        return errorCodes.INVALID_PARAMETER
    parent = previous_tab.parent if previous_tab is not None else create_new_tab_info[
        0]
    hListCtrl = previous_tab.hListCtrl if previous_tab is not None else None
    creator = create_new_tab_info[
        1] if create_new_tab_info is not None else None
    targetItemIndex = -1
    if isinstance(target, dict):
        if target['action'] == 'search':
            newtab = searchResult.SearchResultTab(environment)
            newtab.Initialize(parent, creator)
            newtab.StartSearch(target['basePath'], target['out_lst'],
                               target['keyword'],
                               target['isRegularExpression'])
            return newtab
        #end 検索
        if target['action'] == 'grep':
            newtab = grepResult.GrepResultTab(environment)
            newtab.Initialize(parent, creator)
            newtab.StartSearch(target['basePath'], target['out_lst'],
                               target['keyword'],
                               target['isRegularExpression'])
            return newtab
        #end grep検索
    #end targetが辞書の時の特殊処理

    if target == "":  #ドライブリスト
        lst = lists.DriveList()
        lst.Initialize()
        if isinstance(previous_tab, driveList.DriveListTab):  #再利用
            newtab = previous_tab
        else:
            newtab = driveList.DriveListTab(environment)
            newtab.Initialize(parent, creator, hListCtrl)
        #end 再利用するかどうか
        targetItemIndex = lst.Search(cursor, 1)
        if targetItemIndex == -1:
            targetItemIndex = lst.Search(cursor, 0)
        newtab.Update(lst, targetItemIndex)
        if globalVars.app.config['on_list_moved']['read_item_count'] == 'True':
            newtab.ReadListItemNumber(short=True)
        return newtab
    #end ドライブリストへ行く
    target = os.path.expandvars(target)
    if not os.path.exists(target):
        dialog(_("エラー"), _("移動に失敗しました。移動先が存在しません。"))
        return errorCodes.FILE_NOT_FOUND
    elif os.path.isfile(target):  #副ストリームへ移動
        lst = lists.StreamList()
        lst.Initialize(target)
        if isinstance(previous_tab, streamList.StreamListTab):  #再利用
            newtab = previous_tab
        else:
            newtab = streamList.StreamListTab(environment)
            newtab.Initialize(parent, creator, hListCtrl)
        #end 再利用するかどうか
        newtab.Update(lst)
        if globalVars.app.config['on_list_moved']['read_item_count'] == 'True':
            newtab.ReadListItemNumber(short=True)
        return newtab
    else:
        lst = lists.FileList()
        result = lst.Initialize(target)
        if result != errorCodes.OK:
            if result == errorCodes.ACCESS_DENIED and not ctypes.windll.shell32.IsUserAnAdmin(
            ):
                dlg = wx.MessageDialog(
                    None, _("アクセスが拒否されました。管理者としてFalconを別ウィンドウで立ち上げて再試行しますか?"),
                    _("確認"), wx.YES_NO | wx.ICON_QUESTION)
                if dlg.ShowModal() == wx.ID_YES:
                    misc.RunFile(sys.argv[0], True, target)
            return result  #アクセス負荷
        if cursor != "":
            targetItemIndex = lst.Search(cursor)
        if type(previous_tab) == fileList.FileListTab:  #再利用
            newtab = previous_tab
        else:
            newtab = fileList.FileListTab(environment)
            newtab.Initialize(parent, creator, hListCtrl)
        #end 再利用するかどうか
    newtab.Update(lst, targetItemIndex)
    #end ターゲットにフォーカス
    if globalVars.app.config['on_list_moved']['read_item_count'] == 'True':
        newtab.ReadListItemNumber(short=True)
    return newtab
Example #6
0
def Navigate(target,
             cursor="",
             previous_tab=None,
             create_new_tab_info=None,
             environment=None):
    """
            指定したパスにアクセスする。現在のタブと違う種類のタブが必要とされた場合に、新しいタブを返す。今のタブを再利用した場合は、Trueを返す。失敗時にはエラーコードを返す。
            パスに空の文字を指定すると、ドライブリストへ行く。
            パスに辞書を指定した場合、内容によって動作が変わる。事前に取得したファイルリストからの検索などができる。
            create_new_tab_info に (parent,hPanel) のタプルがあれば、この情報を使って新規タブを作成する。これは、メインビューで使っている
    """
    if previous_tab is None and create_new_tab_info is None:
        return errorCodes.INVALID_PARAMETER
    parent = previous_tab.parent if previous_tab is not None else create_new_tab_info[
        0]
    hListCtrl = previous_tab.hListCtrl if previous_tab is not None else None
    creator = create_new_tab_info[
        1] if create_new_tab_info is not None else None
    targetItemIndex = -1
    if environment is None:
        environment = {}

    if isinstance(target, dict):
        if target['action'] == 'search':
            newtab = searchResult.SearchResultTab(environment)
            newtab.Initialize(parent, creator)
            newtab.StartSearch(target['basePath'], target['out_lst'],
                               target['keyword'],
                               target['isRegularExpression'])
        # end 検索
        if target['action'] == 'grep':
            newtab = grepResult.GrepResultTab({})
            newtab.Initialize(parent, creator)
            newtab.StartSearch(target['basePath'], target['out_lst'],
                               target['keyword'],
                               target['isRegularExpression'])
        # end grep検索
        if target['action'] == 'past':
            newtab = pastProgress.PastProgressTab(environment)
            newtab.Initialize(parent, creator)
            lst = lists.PastProgressList()
            lst.Initialize(
                header_directory=target["operator"].instructions["to"])
            newtab.Update(lst)
            newtab.SetFileOperator(target["operator"])
        # end 貼り付け
        # かならずviews.Main.Navigateを経由して呼び出されているはず
        return newtab
    # end targetが辞書の時の特殊処理

    target = os.path.expandvars(target)
    if target == "":  # ドライブリスト
        lst = lists.DriveList()
        lst.Initialize()
        if isinstance(previous_tab, driveList.DriveListTab):  # 再利用
            newtab = previous_tab
        else:
            newtab = driveList.DriveListTab(environment)
            newtab.Initialize(parent, creator, hListCtrl)
        # end 再利用するかどうか
        targetItemIndex = lst.Search(cursor, 1)
        if targetItemIndex == -1 and cursor != "":  # ネットワークドライブ対策
            targetItemIndex = lst.Search(cursor, 0)
    # end ドライブリストへ行く
    elif target[0:2] == "\\\\" and "\\" not in target[2:]:
        lst = lists.NetworkResourceList()
        result = lst.Initialize(target)
        if result != errorCodes.OK:
            return result  # アクセス不可
        newtab = NetworkResourceList.NetworkResourceListTab(environment)
        newtab.Initialize(parent, creator, hListCtrl)
    elif not os.path.exists(target):
        log.error("navigate failed: %s not exist." % target)
        dialog(_("エラー"), _("移動に失敗しました。移動先が存在しません。"))
        return errorCodes.FILE_NOT_FOUND
    elif os.path.isfile(target):  # 副ストリームへ移動
        lst = lists.StreamList()
        lst.Initialize(target)
        if isinstance(previous_tab, streamList.StreamListTab):  # 再利用
            newtab = previous_tab
        else:
            newtab = streamList.StreamListTab(environment)
            newtab.Initialize(parent, creator, hListCtrl)
        # end 再利用するかどうか
        targetItemIndex = -1
    else:
        lst = lists.FileList()
        result = lst.Initialize(target)
        if result != errorCodes.OK:
            if result == errorCodes.ACCESS_DENIED and not ctypes.windll.shell32.IsUserAnAdmin(
            ):
                dlg = wx.MessageDialog(
                    None, _("アクセスが拒否されました。管理者としてFalconを別ウィンドウで立ち上げて再試行しますか?"),
                    _("確認"), wx.YES_NO | wx.ICON_QUESTION)
                if dlg.ShowModal() == wx.ID_YES:
                    misc.RunFile(sys.argv[0], True, target)
            return result  # アクセス不可
        if cursor != "":
            targetItemIndex = lst.Search(cursor)
        if isinstance(previous_tab, fileList.FileListTab):  # 再利用
            newtab = previous_tab
        else:
            newtab = fileList.FileListTab(environment)
            newtab.Initialize(parent, creator, hListCtrl)
        # end 再利用するかどうか
    newtab.Update(lst, targetItemIndex)
    # end ターゲットにフォーカス
    if globalVars.app.config['on_list_moved']['read_item_count'] == 'True':
        newtab.ReadListItemNumber(short=True)
    if newtab != previous_tab and previous_tab is not None:
        globalVars.app.hMainView.ReplaceCurrentTab(newtab)
    return newtab
Example #7
0
    def OnMenuSelect(self, event):
        """メニュー項目が選択されたときのイベントハンドら。"""
        #ショートカットキーが無効状態のときは何もしない
        if not self.parent.SetShortcutEnable:
            event.Skip()
            return

        selected = event.GetId()  #メニュー識別しの数値が出る

        #カラムソートは特別対応
        if selected >= constants.MENU_ID_SORT_COLUMN:
            self.ColumnSort(selected)
            return

        #キー重複対応のためのIDの場合には、イベントを投げ直す
        #複数投げられるが、有効状態の者は1つだけなはず
        if globalVars.app.hMainView.menu.keymap.isRefHit(selected):
            for ref in globalVars.app.hMainView.menu.keymap.GetOriginalRefs(
                    selected):
                newEvent = wx.CommandEvent(event.GetEventType(), ref)
                newEvent.SetExtraLong(EVENT_FROM_SELF)  #キー操作無効を示す音を鳴らさない
                wx.PostEvent(globalVars.app.hMainView.hFrame.GetEventHandler(),
                             newEvent)
            return

        #選択された(ショートカットで押された)メニューが無効状態なら何もしない
        if self.parent.menu.blockCount[selected] > 0:
            if not event.GetExtraLong() == EVENT_FROM_SELF:
                globalVars.app.PlaySound(
                    globalVars.app.config["sounds"]["boundary"])
            event.Skip()
            return

        if selected == menuItemsStore.getRef("MOVE_BACKWARD"):
            self.GoBackward()
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD"):
            self.GoForward(False)
            return
        if selected == menuItemsStore.getRef("MOVE_EXEC_ORIGINAL_ASSOCIATION"):
            elem = self.parent.activeTab.GetFocusedElement()
            if (not type(elem) == browsableObjects.Folder) and isinstance(
                    elem, (browsableObjects.File, browsableObjects.Stream,
                           browsableObjects.GrepItem)):
                extention = os.path.splitext(elem.fullpath)[1][1:].lower()
                if extention in globalVars.app.config["originalAssociation"]:
                    config = globalVars.app.config["originalAssociation"][
                        extention]
                else:
                    config = globalVars.app.config["originalAssociation"][
                        "<default_file>"]
            else:
                config = globalVars.app.config["originalAssociation"][
                    "<default_dir>"]
            misc.RunFile(config, prm=elem.fullpath)
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD_ADMIN"):
            self.GoForward(False, admin=True)
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD_STREAM"):
            self.GoForward(True)
            return
        if selected == menuItemsStore.getRef("MOVE_FORWARD_TAB"):
            self.OpenNewTab()
            return
        if selected == menuItemsStore.getRef("MOVE_CLOSECURRENTTAB"):
            self.CloseTab()
            return
        if selected == menuItemsStore.getRef("MOVE_NEWTAB"):
            self.NewTab()
            return
        if selected == menuItemsStore.getRef("EDIT_COPY"):
            self.parent.activeTab.Copy()
            return
        if selected == menuItemsStore.getRef("EDIT_CUT"):
            self.parent.activeTab.Cut()
            return
        if selected == menuItemsStore.getRef("EDIT_PAST"):
            self.parent.activeTab.Past()
            return
        if selected == menuItemsStore.getRef("EDIT_NAMECOPY"):
            self.parent.activeTab.NameCopy()
            return
        if selected == menuItemsStore.getRef("EDIT_FULLPATHCOPY"):
            self.parent.activeTab.FullpathCopy()
            return
        if selected == menuItemsStore.getRef("EDIT_SELECTALL"):
            self.parent.activeTab.SelectAll()
            return
        if selected == menuItemsStore.getRef("MOVE_TOPFILE"):
            self.parent.activeTab.GoToTopFile()
            return
        if selected == menuItemsStore.getRef("MOVE_MARKSET"):
            self.parent.activeTab.MarkSet()
            self.parent.menu.Enable(menuItemsStore.getRef("MOVE_MARK"), True)
            return
        if selected == menuItemsStore.getRef("MOVE_MARK"):
            self.parent.activeTab.GoToMark()
            return
        if selected == menuItemsStore.getRef("VIEW_SORTNEXT"):
            self.DelaiedCall(self.SortNext)
            return
        if selected == menuItemsStore.getRef("EDIT_MARKITEM"):
            self.parent.activeTab.OnSpaceKey()
            return
        if selected == menuItemsStore.getRef("EDIT_MARKITEM_ALL"):
            self.parent.activeTab.CheckAll()
            return
        if selected == menuItemsStore.getRef("EDIT_UNMARKITEM_ALL"):
            self.parent.activeTab.UncheckAll()
            return
        if selected == menuItemsStore.getRef("EDIT_MARKITEM_INVERSE"):
            self.parent.activeTab.CheckInverse()
            return
        if selected == menuItemsStore.getRef("VIEW_SORTSELECT"):
            self.SortSelect()
            return
        if selected == menuItemsStore.getRef("VIEW_SORTCYCLEAD"):
            self.DelaiedCall(self.SortCycleAd)
            return
        if selected == menuItemsStore.getRef("EDIT_SEARCH"):
            self.Search()
            return
        if selected == menuItemsStore.getRef("EDIT_UPDATEFILELIST"):
            self.UpdateFilelist()
            return
        if selected == menuItemsStore.getRef("EDIT_OPENCONTEXTMENU"):
            self.OpenContextMenu()
            return
        if selected == menuItemsStore.getRef("FILE_MAKESHORTCUT"):
            target = self.parent.activeTab.GetSelectedItems().GetElement(
                0)  #browsableObjects
            d = views.makeShortcut.Dialog(target.basename)
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL: return
            self.parent.activeTab.MakeShortcut(d.GetValue())
            d.Destroy()
            return
        if selected == menuItemsStore.getRef("FILE_CHANGEATTRIBUTE"):
            d = views.changeAttribute.Dialog()
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL: return
            val = d.GetValue()
            d.Destroy()
            self.parent.activeTab.ChangeAttribute(val)
            return
        if selected == menuItemsStore.getRef("FILE_MKDIR"):
            d = views.mkdir.Dialog()
            d.Initialize()
            ret = d.Show()
            if ret == wx.ID_CANCEL: return
            self.parent.activeTab.MakeDirectory(d.GetValue())
            d.Destroy()
            return
        if selected == menuItemsStore.getRef("FILE_FILEOPTEST"):
            self.parent.activeTab.FileOperationTest()
            return
        if selected == menuItemsStore.getRef("FILE_TRASH"):
            self.parent.activeTab.Trash()
            return
        if selected == menuItemsStore.getRef("FILE_DELETE"):
            self.parent.activeTab.Delete()
            return
        if selected == menuItemsStore.getRef("FILE_VIEW_DETAIL"):
            elem = self.parent.activeTab.listObject.GetElement(
                self.parent.activeTab.GetFocusedItem())
            self.ShowDetail(elem)
            return
        if selected == menuItemsStore.getRef("FILE_SHOWPROPERTIES"):
            self.parent.activeTab.ShowProperties()
            return
        if selected == menuItemsStore.getRef("READ_CURRENTFOLDER"):
            self.DelaiedCall(self.parent.activeTab.ReadCurrentFolder)
            return
        if selected == menuItemsStore.getRef("READ_LISTITEMNUMBER"):
            self.DelaiedCall(self.parent.activeTab.ReadListItemNumber)
            return
        if selected == menuItemsStore.getRef("READ_LISTINFO"):
            self.DelaiedCall(self.parent.activeTab.ReadListInfo)
            return
        if selected == menuItemsStore.getRef("READ_CONTENT_PREVIEW"):
            self.parent.activeTab.Preview()
            return
        if selected == menuItemsStore.getRef("READ_CONTENT_READHEADER"):
            self.DelaiedCall(self.parent.activeTab.ReadHeader)
            return
        if selected == menuItemsStore.getRef("READ_CONTENT_READFOOTER"):
            self.DelaiedCall(self.parent.activeTab.ReadFooter)
            return
        if selected == menuItemsStore.getRef("READ_SETMOVEMENTREAD"):
            self.parent.activeTab.SetMovementRead()
            return
        if selected == menuItemsStore.getRef("TOOL_DIRCALC"):
            self.parent.activeTab.DirCalc()
            return
        if selected == menuItemsStore.getRef("TOOL_HASHCALC"):
            d = views.makeHash.Dialog(
                self.parent.activeTab.GetFocusedElement().fullpath)
            d.Initialize()
            d.Show()
            d.Destroy()
            return
        if selected == menuItemsStore.getRef("TOOL_EXEC_PROGRAM"):
            self.ExecProgram()
            return
        if selected == menuItemsStore.getRef("TOOL_ADDPATH"):
            t = self.parent.activeTab.GetSelectedItems()
            if item in t:
                if item.__class__ != browsableObjects.Folder:
                    return
            t = t.GetItemPaths()
            if misc.addPath(t):
                dialog(_("パスの追加"), _("ユーザ環境変数PATHに追加しました。"))
            else:
                dialog(_("パスの追加"), _("追加に失敗しました。"))
            return
        if selected == menuItemsStore.getRef("TOOL_EJECT_DRIVE"):
            ret = deviceCtrl.ejectDrive(
                self.parent.activeTab.GetFocusedElement().letter)
            if ret == errorCodes.OK:
                dialog(_("成功"), _("ドライブは安全に切断されました。"))
                self.UpdateFilelist(False)
            elif ret == errorCodes.FILE_NOT_FOUND:
                dialog(_("エラー"), _("指定されたドライブが見つかりません。既に取り外しされた可能性があります。"))
            elif ret == errorCodes.UNKNOWN:
                #エラー表示はむこうでやってる
                pass
            elif errorCodes.ACCESS_DENIED:
                dialog(_("エラー"), _("取り外しに失敗しました。") + _("このドライブは使用中の可能性があります。"))
            return
        if selected == menuItemsStore.getRef("TOOL_EJECT_DEVICE"):
            ret = deviceCtrl.EjectDevice(
                self.parent.activeTab.GetFocusedElement().letter)
            if ret == errorCodes.OK:
                dialog(_("成功"), _("デバイスは安全に取り外せる状態になりました。"))
                self.UpdateFilelist(False)
            elif ret == errorCodes.UNKNOWN:
                dialog(_("エラー"), _("デバイスの取り外しに失敗しました。"))
            return
        if selected == menuItemsStore.getRef("VIEW_DRIVE_INFO"):
            rootPath = self.parent.activeTab.GetFocusedElement(
            ).GetRootDrivePath()
            elem = None
            if len(rootPath) == 1:
                elem = lists.drive.GetDriveObject(int(ord(rootPath) - 65))
            else:  #ネットワークリソース
                lst = lists.drive.DriveList()
                lst.Initialize(None, True)
                for d in lst:
                    if d.basename == rootPath:
                        elem = d
            if elem == None:
                dialog(_("エラー"), _("ドライブ情報の取得に失敗しました。"))
                return
            self.ShowDetail(elem)
            return
        if selected == menuItemsStore.getRef(
                "ENV_REGIST_ORIGINAL_ASSOCIATION"):
            config = globalVars.app.config["originalAssociation"]
            d = views.registOriginalAssociation.Dialog(dict(config.items()))
            d.Initialize()
            if d.Show() == wx.ID_CANCEL:
                d.Destroy()
                return
            result = {}
            result["originalAssociation"] = d.GetValue()
            globalVars.app.config.remove_section("originalAssociation")
            globalVars.app.config.read_dict(result)
            return
        if selected == menuItemsStore.getRef("ENV_TESTDIALOG"):
            self.testdialog = views.test.View()
            self.testdialog.Initialize()
            self.testdialog.Show()
            return
        if selected == menuItemsStore.getRef("ENV_FONTTEST"):
            self.fonttest = views.fonttest.View()
            self.fonttest.Initialize()
            return
        if selected == menuItemsStore.getRef("FILE_RENAME"):
            self.StartRename()
            return
        if selected == menuItemsStore.getRef("FILE_EXIT"):
            self.Exit(event)
            return
        if selected == menuItemsStore.getRef("HELP_VERINFO"):
            self.ShowVersionInfo()
            return

        for m in globalVars.app.userCommandManagers:
            if m.isRefHit(selected):
                if m == globalVars.app.favoriteDirectory:
                    ret = self.parent.activeTab.Move(m.get(selected))
                    if issubclass(ret.__class__, tabs.base.FalconTabBase):
                        self.parent.ReplaceCurrentTab(ret)
                    #TODO: エラー処理する
                else:
                    path = m.get(selected)
                    path = path.replace(
                        "%1", self.parent.activeTab.listObject.rootDirectory)
                    prm = re.sub(r"^[^ ]* (.*)$", r"\1", path)
                    path = re.sub(r"^([^ ]*).*$", r"\1", path)
                    misc.RunFile(path, False, prm)
                return

        dialog(_("エラー"), _("操作が定義されていないメニューです。"))
        return