diff -r 552a790fd9bc -r 00f5aae565a3 src/eric7/HexEdit/HexEditMainWindow.py --- a/src/eric7/HexEdit/HexEditMainWindow.py Fri Mar 08 15:30:23 2024 +0100 +++ b/src/eric7/HexEdit/HexEditMainWindow.py Fri Mar 08 15:30:53 2024 +0100 @@ -27,9 +27,11 @@ from eric7.EricGui import EricPixmapCache from eric7.EricGui.EricAction import EricAction from eric7.EricWidgets import EricFileDialog, EricMessageBox +from eric7.EricWidgets.EricApplication import ericApp from eric7.EricWidgets.EricClickableLabel import EricClickableLabel from eric7.EricWidgets.EricMainWindow import EricMainWindow from eric7.Globals import recentNameHexFiles, strGroup +from eric7.RemoteServerInterface import EricServerFileDialog from eric7.SystemUtilities import FileSystemUtilities from .HexEditGotoWidget import HexEditGotoWidget @@ -82,6 +84,12 @@ if not self.__fromEric: self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet")) + self.__remotefsInterface =( + ericApp().getObject("EricServer").getServiceInterface("FileSystem") + if self.__fromEric + else None + ) + self.__editor = HexEditWidget() self.__searchWidget = HexEditSearchReplaceWidget(self.__editor, self, False) self.__replaceWidget = HexEditSearchReplaceWidget(self.__editor, self, True) @@ -1056,11 +1064,20 @@ ): self.__lastOpenPath = self.__project.getProjectPath() - fileName = EricFileDialog.getOpenFileName( - self, - self.tr("Open binary file in new window"), - self.__lastOpenPath, - self.tr("All Files (*)"), + fileName = ( + EricServerFileDialog.getOpenFileName( + self, + self.tr("Open binary file"), + self.__lastOpenPath, + self.tr("All Files (*)"), + ) + if FileSystemUtilities.isRemoteFileName(self.__lastOpenPath) + else EricFileDialog.getOpenFileName( + self, + self.tr("Open binary file in new window"), + self.__lastOpenPath, + self.tr("All Files (*)"), + ) ) if fileName: he = HexEditMainWindow( @@ -1097,17 +1114,12 @@ @param fileName name of the binary file to load @type str """ - if not os.path.exists(fileName): - EricMessageBox.warning( - self, - self.tr("eric Hex Editor"), - self.tr("The file '{0}' does not exist.").format(fileName), - ) - return - try: - with open(fileName, "rb") as f: - data = f.read() + if FileSystemUtilities.isRemoteFileName(fileName): + data = self.__remotefsInterface.readFile(fileName) + else: + with open(fileName, "rb") as f: + data = f.read() except OSError as err: EricMessageBox.warning( self, @@ -1118,7 +1130,11 @@ ) return - self.__lastOpenPath = os.path.dirname(fileName) + self.__lastOpenPath = ( + self.__remotefsInterface.dirname(fileName) + if FileSystemUtilities.isRemoteFileName(fileName) + else os.path.dirname(fileName) + ) self.__editor.setData(data) self.__setCurrentFile(fileName) @@ -1138,11 +1154,20 @@ ): self.__lastOpenPath = self.__project.getProjectPath() - fileName = EricFileDialog.getOpenFileName( - self, - self.tr("Open binary file"), - self.__lastOpenPath, - self.tr("All Files (*)"), + fileName = ( + EricServerFileDialog.getOpenFileName( + self, + self.tr("Open binary file"), + self.__lastOpenPath, + self.tr("All Files (*)"), + ) + if FileSystemUtilities.isRemoteFileName(self.__lastOpenPath) + else EricFileDialog.getOpenFileName( + self, + self.tr("Open binary file"), + self.__lastOpenPath, + self.tr("All Files (*)"), + ) ) if fileName: self.__loadHexFile(fileName) @@ -1190,17 +1215,35 @@ if not self.__lastSavePath and self.__lastOpenPath: self.__lastSavePath = self.__lastOpenPath - fileName = EricFileDialog.getSaveFileName( - self, - self.tr("Save binary file"), - self.__lastSavePath, - self.tr("All Files (*)"), - options=EricFileDialog.DontConfirmOverwrite, + fileName = ( + EricServerFileDialog.getSaveFileName( + self, + self.tr("Save binary file"), + self.__lastSavePath, + self.tr("All Files (*)"), + ) + if FileSystemUtilities.isRemoteFileName(self.__lastSavePath) + else EricFileDialog.getSaveFileName( + self, + self.tr("Save binary file"), + self.__lastSavePath, + self.tr("All Files (*)"), + options=EricFileDialog.DontConfirmOverwrite, + ) ) if not fileName: return False - if pathlib.Path(fileName).exists(): + if ( + ( + FileSystemUtilities.isRemoteFileName(fileName) + and self.__remotefsInterface.exists(fileName) + ) + or ( + FileSystemUtilities.isPlainFileName(fileName) + and pathlib.Path(fileName).exists() + ) + ): res = EricMessageBox.yesNo( self, self.tr("Save binary file"), @@ -1226,8 +1269,12 @@ @rtype bool """ try: - with open(fileName, "wb") as f: - f.write(self.__editor.data()) + data = self.__editor.data() + if FileSystemUtilities.isRemoteFileName(fileName): + self.__remotefsInterface.writeFile(fileName, data) + else: + with open(fileName, "wb") as f: + f.write(data) except OSError as err: EricMessageBox.warning( self, @@ -1261,29 +1308,50 @@ if not savePath and self.__lastOpenPath: savePath = self.__lastOpenPath - fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( - self, - self.tr("Save to readable file"), - savePath, - self.tr("Text Files (*.txt);;All Files (*)"), - self.tr("Text Files (*.txt)"), - EricFileDialog.DontConfirmOverwrite, - ) - if not fileName: - return + if FileSystemUtilities.isRemoteFileName(savePath): + fileName, selectedFilter = EricServerFileDialog.getSaveFileNameAndFilter( + self, + self.tr("Save to readable file"), + savePath, + self.tr("Text Files (*.txt);;All Files (*)"), + self.tr("Text Files (*.txt)"), + ) + if not fileName: + return - fpath = pathlib.Path(fileName) - if not fpath.suffix: - ex = selectedFilter.split("(*")[1].split(")")[0] - if ex: - fpath = fpath.with_suffix(ex) - if fpath.exists(): + ext = self.__remotefsInterface.splitext(fileName)[1] + if not ext: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fileName += ex + fileExists = self.__remotefsInterface.exists(fileName) + else: + fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( + self, + self.tr("Save to readable file"), + savePath, + self.tr("Text Files (*.txt);;All Files (*)"), + self.tr("Text Files (*.txt)"), + EricFileDialog.DontConfirmOverwrite, + ) + if not fileName: + return + + fpath = pathlib.Path(fileName) + if not fpath.suffix: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fpath = fpath.with_suffix(ex) + fileExists = fpath.exists() + fileName = str(fpath) + + if fileExists: res = EricMessageBox.yesNo( self, self.tr("Save to readable file"), self.tr( "<p>The file <b>{0}</b> already exists. Overwrite it?</p>" - ).format(fpath), + ).format(fileName), icon=EricMessageBox.Warning, ) if not res: @@ -1295,8 +1363,13 @@ else self.__editor.toReadableString() ) try: - with fpath.open("w", encoding="latin1") as f: - f.write(readableData) + if FileSystemUtilities.isRemoteFileName(fileName): + self.__remotefsInterface.writeFile( + fileName, readableData.encode("latin1") + ) + else: + with open(fileName, "w", encoding="latin1") as f: + f.write(readableData) except OSError as err: EricMessageBox.warning( self, @@ -1535,6 +1608,10 @@ self.__recentMenu.clear() + connected = ( + self.__fromEric and ericApp().getObject("EricServer").isServerConnected() + ) + for idx, rs in enumerate(self.__recent, start=1): formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}" act = self.__recentMenu.addAction( @@ -1546,7 +1623,10 @@ ) ) act.setData(rs) - act.setEnabled(pathlib.Path(rs).exists()) + act.setEnabled( + (FileSystemUtilities.isRemoteFileName(rs) and connected) + or pathlib.Path(rs).exists() + ) self.__recentMenu.addSeparator() self.__recentMenu.addAction(self.tr("&Clear"), self.__clearRecent) @@ -1581,7 +1661,7 @@ rs = Preferences.Prefs.rsettings.value(recentNameHexFiles) if rs is not None: for f in Preferences.toList(rs): - if pathlib.Path(f).exists(): + if FileSystemUtilities.isRemoteFileName(f) or pathlib.Path(f).exists(): self.__recent.append(f) def __saveRecent(self):