21 from E5Gui.E5MainWindow import E5MainWindow |
21 from E5Gui.E5MainWindow import E5MainWindow |
22 from E5Gui import E5FileDialog, E5MessageBox |
22 from E5Gui import E5FileDialog, E5MessageBox |
23 |
23 |
24 from .HexEditWidget import HexEditWidget |
24 from .HexEditWidget import HexEditWidget |
25 from .HexEditSearchReplaceWidget import HexEditSearchReplaceWidget |
25 from .HexEditSearchReplaceWidget import HexEditSearchReplaceWidget |
|
26 from .HexEditGotoWidget import HexEditGotoWidget |
26 |
27 |
27 import UI.PixmapCache |
28 import UI.PixmapCache |
28 import UI.Config |
29 import UI.Config |
29 |
30 |
30 import Preferences |
31 import Preferences |
31 |
32 |
32 |
33 |
33 # TODO: füge Goto Aktion inkl. Eingabewidget hinzu |
|
34 class HexEditMainWindow(E5MainWindow): |
34 class HexEditMainWindow(E5MainWindow): |
35 """ |
35 """ |
36 Class implementing the web browser main window. |
36 Class implementing the web browser main window. |
37 |
37 |
38 @signal editorClosed() emitted after the window was requested to close down |
38 @signal editorClosed() emitted after the window was requested to close down |
73 self.__editor = HexEditWidget() |
73 self.__editor = HexEditWidget() |
74 self.__searchWidget = HexEditSearchReplaceWidget( |
74 self.__searchWidget = HexEditSearchReplaceWidget( |
75 self.__editor, self, False) |
75 self.__editor, self, False) |
76 self.__replaceWidget = HexEditSearchReplaceWidget( |
76 self.__replaceWidget = HexEditSearchReplaceWidget( |
77 self.__editor, self, True) |
77 self.__editor, self, True) |
|
78 self.__gotoWidget = HexEditGotoWidget(self.__editor) |
78 cw = QWidget() |
79 cw = QWidget() |
79 layout = QVBoxLayout(cw) |
80 layout = QVBoxLayout(cw) |
80 layout.setContentsMargins(1, 1, 1, 1) |
81 layout.setContentsMargins(1, 1, 1, 1) |
81 layout.setSpacing(1) |
82 layout.setSpacing(1) |
82 layout.addWidget(self.__editor) |
83 layout.addWidget(self.__editor) |
83 layout.addWidget(self.__searchWidget) |
84 layout.addWidget(self.__searchWidget) |
|
85 layout.addWidget(self.__gotoWidget) |
84 cw.setLayout(layout) |
86 cw.setLayout(layout) |
85 layout.addWidget(self.__replaceWidget) |
87 layout.addWidget(self.__replaceWidget) |
86 self.__searchWidget.hide() |
88 self.__searchWidget.hide() |
87 self.__replaceWidget.hide() |
89 self.__replaceWidget.hide() |
|
90 self.__gotoWidget.hide() |
88 self.setCentralWidget(cw) |
91 self.setCentralWidget(cw) |
89 |
92 |
90 g = Preferences.getGeometry("HexEditorGeometry") |
93 g = Preferences.getGeometry("HexEditorGeometry") |
91 if g.isEmpty(): |
94 if g.isEmpty(): |
92 s = QSize(600, 500) |
95 s = QSize(600, 500) |
494 """ A dialog is shown to enter the data to search for and the""" |
497 """ A dialog is shown to enter the data to search for and the""" |
495 """ replacement data in various formats.</p>""" |
498 """ replacement data in various formats.</p>""" |
496 )) |
499 )) |
497 self.replaceAct.triggered.connect(self.__replace) |
500 self.replaceAct.triggered.connect(self.__replace) |
498 self.__actions.append(self.replaceAct) |
501 self.__actions.append(self.replaceAct) |
|
502 |
|
503 self.gotoAct = E5Action( |
|
504 self.tr('Goto Offset'), |
|
505 UI.PixmapCache.getIcon("goto.png"), |
|
506 self.tr('&Goto Offset...'), |
|
507 QKeySequence(QCoreApplication.translate( |
|
508 'ViewManager', "Ctrl+G", "Search|Goto Offset")), |
|
509 0, |
|
510 self, 'hexEditor_edit_goto') |
|
511 self.gotoAct.setStatusTip(self.tr('Goto Offset')) |
|
512 self.gotoAct.setWhatsThis(self.tr( |
|
513 """<b>Goto Offset</b>""" |
|
514 """<p>Go to a specific address. A dialog is shown to enter""" |
|
515 """ the movement data.</p>""" |
|
516 )) |
|
517 self.gotoAct.triggered.connect(self.__goto) |
|
518 self.__actions.append(self.gotoAct) |
499 |
519 |
500 self.redoAct.setEnabled(False) |
520 self.redoAct.setEnabled(False) |
501 self.__editor.canRedoChanged.connect(self.redoAct.setEnabled) |
521 self.__editor.canRedoChanged.connect(self.redoAct.setEnabled) |
502 |
522 |
503 self.undoAct.setEnabled(False) |
523 self.undoAct.setEnabled(False) |
664 menu.addAction(self.searchAct) |
684 menu.addAction(self.searchAct) |
665 menu.addAction(self.searchNextAct) |
685 menu.addAction(self.searchNextAct) |
666 menu.addAction(self.searchPrevAct) |
686 menu.addAction(self.searchPrevAct) |
667 menu.addAction(self.replaceAct) |
687 menu.addAction(self.replaceAct) |
668 menu.addSeparator() |
688 menu.addSeparator() |
|
689 menu.addAction(self.gotoAct) |
|
690 menu.addSeparator() |
669 menu.addAction(self.readonlyAct) |
691 menu.addAction(self.readonlyAct) |
670 |
692 |
671 if not self.__fromEric: |
693 if not self.__fromEric: |
672 menu = mb.addMenu(self.tr("Se&ttings")) |
694 menu = mb.addMenu(self.tr("Se&ttings")) |
673 menu.setTearOffEnabled(True) |
695 menu.setTearOffEnabled(True) |
797 if avail: |
819 if avail: |
798 start = self.__editor.getSelectionBegin() |
820 start = self.__editor.getSelectionBegin() |
799 end = self.__editor.getSelectionEnd() |
821 end = self.__editor.getSelectionEnd() |
800 slen = self.__editor.getSelectionLength() |
822 slen = self.__editor.getSelectionLength() |
801 self.__sbSelection.setText( |
823 self.__sbSelection.setText( |
802 self.tr("Selection: 0x{0:0{2}x} - 0x{1:0{2}x} ({3:n} Bytes)", |
824 self.tr("Selection: 0x{0:0{2}x} - 0x{1:0{2}x} ({3:n} Bytes)", |
803 "0: start, 1: end, 2: address width," |
825 "0: start, 1: end, 2: address width," |
804 " 3: selection length") |
826 " 3: selection length") |
805 .format(start, end, self.__editor.addressWidth(), slen) |
827 .format(start, end, self.__editor.addressWidth(), slen) |
806 ) |
828 ) |
807 else: |
829 else: |
1235 def __search(self): |
1257 def __search(self): |
1236 """ |
1258 """ |
1237 Private method to handle the search action. |
1259 Private method to handle the search action. |
1238 """ |
1260 """ |
1239 self.__replaceWidget.hide() |
1261 self.__replaceWidget.hide() |
|
1262 self.__gotoWidget.hide() |
1240 if self.__editor.hasSelection(): |
1263 if self.__editor.hasSelection(): |
1241 txt = self.__editor.selectionToHexString() |
1264 txt = self.__editor.selectionToHexString() |
1242 else: |
1265 else: |
1243 txt = "" |
1266 txt = "" |
1244 self.__searchWidget.show(txt) |
1267 self.__searchWidget.show(txt) |
1246 def __replace(self): |
1269 def __replace(self): |
1247 """ |
1270 """ |
1248 Private method to handle the replace action. |
1271 Private method to handle the replace action. |
1249 """ |
1272 """ |
1250 self.__searchWidget.hide() |
1273 self.__searchWidget.hide() |
|
1274 self.__gotoWidget.hide() |
1251 if self.__editor.hasSelection(): |
1275 if self.__editor.hasSelection(): |
1252 txt = self.__editor.selectionToHexString() |
1276 txt = self.__editor.selectionToHexString() |
1253 else: |
1277 else: |
1254 txt = "" |
1278 txt = "" |
1255 self.__replaceWidget.show(txt) |
1279 self.__replaceWidget.show(txt) |
|
1280 |
|
1281 def __goto(self): |
|
1282 """ |
|
1283 Private method to handle the goto action. |
|
1284 """ |
|
1285 self.__searchWidget.hide() |
|
1286 self.__replaceWidget.hide() |
|
1287 self.__gotoWidget.show() |
1256 |
1288 |
1257 def preferencesChanged(self): |
1289 def preferencesChanged(self): |
1258 """ |
1290 """ |
1259 Public method to (re-)read the various settings. |
1291 Public method to (re-)read the various settings. |
1260 """ |
1292 """ |