12 import os |
12 import os |
13 import sys |
13 import sys |
14 |
14 |
15 import pysvn |
15 import pysvn |
16 |
16 |
17 from PyQt4.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot |
17 from PyQt4.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot, QPoint |
18 from PyQt4.QtGui import QCursor, QHeaderView, QDialog, QApplication, \ |
18 from PyQt4.QtGui import QCursor, QHeaderView, QWidget, QApplication, \ |
19 QDialogButtonBox, QTreeWidgetItem |
19 QDialogButtonBox, QTreeWidgetItem |
20 |
20 |
21 from E5Gui import E5MessageBox |
21 from E5Gui import E5MessageBox |
22 |
22 |
23 from .SvnUtilities import formatTime, dateFromTime_t |
23 from .SvnUtilities import formatTime, dateFromTime_t |
24 from .SvnDialogMixin import SvnDialogMixin |
24 from .SvnDialogMixin import SvnDialogMixin |
25 |
25 |
26 from .Ui_SvnLogBrowserDialog import Ui_SvnLogBrowserDialog |
26 from .Ui_SvnLogBrowserDialog import Ui_SvnLogBrowserDialog |
27 |
27 |
28 |
28 |
29 class SvnLogBrowserDialog(QDialog, SvnDialogMixin, Ui_SvnLogBrowserDialog): |
29 class SvnLogBrowserDialog(QWidget, SvnDialogMixin, Ui_SvnLogBrowserDialog): |
30 """ |
30 """ |
31 Class implementing a dialog to browse the log history. |
31 Class implementing a dialog to browse the log history. |
32 """ |
32 """ |
33 def __init__(self, vcs, isFile=False, parent=None): |
33 def __init__(self, vcs, parent=None): |
34 """ |
34 """ |
35 Constructor |
35 Constructor |
36 |
36 |
37 @param vcs reference to the vcs object |
37 @param vcs reference to the vcs object |
38 @param isFile flag indicating log for a file is to be shown (boolean) |
|
39 @param parent parent widget (QWidget) |
38 @param parent parent widget (QWidget) |
40 """ |
39 """ |
41 super(SvnLogBrowserDialog, self).__init__(parent) |
40 super(SvnLogBrowserDialog, self).__init__(parent) |
42 self.setupUi(self) |
41 self.setupUi(self) |
43 SvnDialogMixin.__init__(self) |
42 SvnDialogMixin.__init__(self) |
44 |
43 |
|
44 self.__position = QPoint() |
|
45 |
45 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) |
46 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) |
46 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) |
47 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) |
47 |
48 |
48 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "") |
49 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "") |
49 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder) |
50 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder) |
50 |
51 |
51 self.sbsCheckBox.setEnabled(isFile) |
|
52 self.sbsCheckBox.setVisible(isFile) |
|
53 |
|
54 self.vcs = vcs |
52 self.vcs = vcs |
55 |
53 |
56 self.__maxDate = QDate() |
54 self.__initData() |
57 self.__minDate = QDate() |
|
58 self.__filterLogsEnabled = True |
|
59 |
55 |
60 self.fromDate.setDisplayFormat("yyyy-MM-dd") |
56 self.fromDate.setDisplayFormat("yyyy-MM-dd") |
61 self.toDate.setDisplayFormat("yyyy-MM-dd") |
57 self.toDate.setDisplayFormat("yyyy-MM-dd") |
62 self.fromDate.setDate(QDate.currentDate()) |
58 self.__resetUI() |
63 self.toDate.setDate(QDate.currentDate()) |
|
64 self.fieldCombo.setCurrentIndex( |
|
65 self.fieldCombo.findText(self.trUtf8("Message"))) |
|
66 self.limitSpinBox.setValue( |
|
67 self.vcs.getPlugin().getPreferences("LogLimit")) |
|
68 self.stopCheckBox.setChecked( |
|
69 self.vcs.getPlugin().getPreferences("StopLogOnCopy")) |
|
70 |
59 |
71 self.__messageRole = Qt.UserRole |
60 self.__messageRole = Qt.UserRole |
72 self.__changesRole = Qt.UserRole + 1 |
61 self.__changesRole = Qt.UserRole + 1 |
73 |
62 |
74 self.flags = { |
63 self.flags = { |
75 'A': self.trUtf8('Added'), |
64 'A': self.tr('Added'), |
76 'D': self.trUtf8('Deleted'), |
65 'D': self.tr('Deleted'), |
77 'M': self.trUtf8('Modified'), |
66 'M': self.tr('Modified'), |
78 'R': self.trUtf8('Replaced'), |
67 'R': self.tr('Replaced'), |
79 } |
68 } |
80 |
|
81 self.diff = None |
|
82 self.__lastRev = 0 |
|
83 |
69 |
84 self.client = self.vcs.getClient() |
70 self.client = self.vcs.getClient() |
85 self.client.callback_cancel = \ |
71 self.client.callback_cancel = \ |
86 self._clientCancelCallback |
72 self._clientCancelCallback |
87 self.client.callback_get_login = \ |
73 self.client.callback_get_login = \ |
88 self._clientLoginCallback |
74 self._clientLoginCallback |
89 self.client.callback_ssl_server_trust_prompt = \ |
75 self.client.callback_ssl_server_trust_prompt = \ |
90 self._clientSslServerTrustPromptCallback |
76 self._clientSslServerTrustPromptCallback |
91 |
77 |
|
78 def __initData(self): |
|
79 """ |
|
80 Private method to (re-)initialize some data. |
|
81 """ |
|
82 self.__maxDate = QDate() |
|
83 self.__minDate = QDate() |
|
84 self.__filterLogsEnabled = True |
|
85 |
|
86 self.diff = None |
|
87 self.__lastRev = 0 |
|
88 |
|
89 def closeEvent(self, e): |
|
90 """ |
|
91 Private slot implementing a close event handler. |
|
92 |
|
93 @param e close event (QCloseEvent) |
|
94 """ |
|
95 self.__position = self.pos() |
|
96 |
|
97 e.accept() |
|
98 |
|
99 def show(self): |
|
100 """ |
|
101 Public slot to show the dialog. |
|
102 """ |
|
103 if not self.__position.isNull(): |
|
104 self.move(self.__position) |
|
105 self.__resetUI() |
|
106 |
|
107 super(SvnLogBrowserDialog, self).show() |
|
108 |
|
109 def __resetUI(self): |
|
110 """ |
|
111 Private method to reset the user interface. |
|
112 """ |
|
113 self.fromDate.setDate(QDate.currentDate()) |
|
114 self.toDate.setDate(QDate.currentDate()) |
|
115 self.fieldCombo.setCurrentIndex(self.fieldCombo.findText( |
|
116 self.tr("Message"))) |
|
117 self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences( |
|
118 "LogLimit")) |
|
119 self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences( |
|
120 "StopLogOnCopy")) |
|
121 |
|
122 self.logTree.clear() |
|
123 |
|
124 self.nextButton.setEnabled(True) |
|
125 self.limitSpinBox.setEnabled(True) |
|
126 |
92 def _reset(self): |
127 def _reset(self): |
93 """ |
128 """ |
94 Protected method to reset the internal state of the dialog. |
129 Protected method to reset the internal state of the dialog. |
95 """ |
130 """ |
96 SvnDialogMixin._reset(self) |
131 SvnDialogMixin._reset(self) |
366 Private slot called, when the current item of the log tree changes. |
408 Private slot called, when the current item of the log tree changes. |
367 |
409 |
368 @param current reference to the new current item (QTreeWidgetItem) |
410 @param current reference to the new current item (QTreeWidgetItem) |
369 @param previous reference to the old current item (QTreeWidgetItem) |
411 @param previous reference to the old current item (QTreeWidgetItem) |
370 """ |
412 """ |
371 self.messageEdit.setPlainText(current.data(0, self.__messageRole)) |
413 if current is not None: |
372 |
414 self.messageEdit.setPlainText(current.data(0, self.__messageRole)) |
373 self.filesTree.clear() |
415 |
374 changes = current.data(0, self.__changesRole) |
416 self.filesTree.clear() |
375 if len(changes) > 0: |
417 changes = current.data(0, self.__changesRole) |
376 for change in changes: |
418 if len(changes) > 0: |
377 self.__generateFileItem( |
419 for change in changes: |
378 change["action"], change["path"], |
420 self.__generateFileItem( |
379 change["copyfrom_path"], change["copyfrom_revision"]) |
421 change["action"], change["path"], |
380 self.__resizeColumnsFiles() |
422 change["copyfrom_path"], change["copyfrom_revision"]) |
381 self.__resortFiles() |
423 self.__resizeColumnsFiles() |
|
424 self.__resortFiles() |
382 |
425 |
383 self.diffPreviousButton.setEnabled( |
426 self.diffPreviousButton.setEnabled( |
384 current != self.logTree.topLevelItem( |
427 current != self.logTree.topLevelItem( |
385 self.logTree.topLevelItemCount() - 1)) |
428 self.logTree.topLevelItemCount() - 1)) |
386 |
429 |