1
2
3
4
5
6
7
8
9
10
11
12
13
14 """
15 PYBAG - Crossplatform files synchronization and backup portable tools.
16
17 GUI implementation.
18 """
19
20
21
22
23
24 import re
25 import webbrowser
26 import time
27 import threading
28 import traceback
29 import cfg
30 from const import *
31 from iof import *
32 from termcolors import TermColors
33 from help import _tips, __about__, _usage, __license__
34 from cli import command_class, f_add, cmd_dist, z_gp_class, cmd_remove,\
35 cmd_relocate, dbstartswith, getpathdirdb, f_stat, z_r, f_syncread,\
36 f_synccompare, f_syncsync, f_syncclear, dbsave, cmd_cleandb
37
38
39
40
41
42
43 try:
44 try:
45 import wxversion
46 wxversion.ensureMinimal('2.8')
47 except Exception,exc:
48 log(u'ERROR: When import wxversion - %s \n' % (str(exc),))
49 pass
50
51 import wx
52 log(u'wxPython version (%s).' % (wx.__version__,))
53
54 except Exception,exc:
55 prt0(u'ERROR: When import wx - %s \n\nFor correct GUI you need wxPython 2.8.9 or greater.' % (str(exc),))
56 wx = None
57
58
59
60 pass
61 if not wx:
62 prt0( u'No needed wxPython found. Use command line interface.\n' )
63
64
65
66
67 if not hasattr(wx, 'ST_SIZEGRIP'):
68 setattr(wx, 'ST_SIZEGRIP',wx.STB_SIZEGRIP)
69
70 if not hasattr(wx, 'SystemSettings_GetColour'):
71 setattr(wx, 'SystemSettings_GetColour', wx.SystemSettings.GetColour)
72
73
74
75
76
77
78
79
80
81 catalog = {}
82 """Icons catalog."""
83 index = []
84 """Icons index."""
85
86 SELSTATEALL = 1
87 SELSTATEDEFAULT = 0
88 SELSTATECLEAR = 2
89 btnSelectRoots_state = SELSTATEDEFAULT
90 """Current state of button."""
91
92
93
94 AppState ={}
95
96 AppState.update(
97 ff_ok = False,
98
99 ff_bag = True,
100 ff_orig = True,
101 ff_del = True,
102 ff_ch = True,
103 ff_new = True,
104 ff_err = True,
105 ff_conf = True,
106 ff_warn = True,
107 ff_forced = True,
108 ff_unch = False,
109 ff_file = True,
110 ff_dir = True,
111 ff_sym = True,
112 ff_unk = True,
113 ff_ign = False,
114 ff_ts = True,
115 )
116 AppState[P_OUTPUT] = True
117 _filter = {
118 u'ff_ok': u'filter_ok',
119
120 u'ff_bag' : u'filter_bag',
121 u'ff_orig' : u'filter_origin',
122 u'ff_del' : u'filter_delete',
123 u'ff_ch' : u'filter_changed',
124 u'ff_new' : u'filter_new',
125 u'ff_err' : u'filter_error',
126 u'ff_conf' : u'filter_conflict',
127 u'ff_warn' : u'filter_warning',
128 u'ff_forced' : u'filter_forced',
129 u'ff_unch' : u'filter_unchanged',
130 u'ff_file' : u'filter_file',
131 u'ff_dir' : u'filter_directory',
132 u'ff_sym' : u'filter_symlink',
133 u'ff_unk' : u'filter_unknown',
134 u'ff_ign' : u'filter_ignored',
135 u'ff_ts' : u'filter_ts',
136 P_OUTPUT : P_OUTPUT
137 }
138
139 _outlock = threading.Lock()
140 """
141 Lock object for gui print.
142 """
143
144 _outtxt = u''
145 """
146 Text printed from GUI.
147 """
148
149
170
171
172
173
174
175
176 cfg.Z_COLUMN_CHOISE_DEFAULT = [
177 (u'err', u'Error', 0, 16, wx.LIST_FORMAT_CENTER),
178 (u'forced', u'Forced', 0, 16, wx.LIST_FORMAT_CENTER),
179 (u'dir', u'Direction', 0, 32, wx.LIST_FORMAT_CENTER),
180 (u'stateicon', u'State', 1, 38, wx.LIST_FORMAT_CENTER),
181 (u'actionicon', u'Action', 1, 38, wx.LIST_FORMAT_CENTER),
182 (u'path', u'Path', 1, 350, wx.LIST_FORMAT_LEFT),
183 (u'desc', u'Description', 1, 350, wx.LIST_FORMAT_LEFT),
184 (u'type', u'Type', 0, 16, wx.LIST_FORMAT_CENTER),
185 (u'mdatedb', u'MDate DB', 0, 80, wx.LIST_FORMAT_LEFT),
186 (u'gmdatedb', u'GMT MDate DB', 0, 80, wx.LIST_FORMAT_LEFT),
187 (u'lmdatedb', u'Local MDate DB', 0, 80, wx.LIST_FORMAT_LEFT),
188 (u'crc32db', u'CRC32 DB', 0, 80, wx.LIST_FORMAT_RIGHT),
189 (u'sizedb', u'Size DB', 0, 80, wx.LIST_FORMAT_RIGHT),
190 (u'mdatebag', u'MDate bag', 0, 80, wx.LIST_FORMAT_LEFT),
191 (u'gmdatebag', u'GMT MDate bag', 0, 80, wx.LIST_FORMAT_LEFT),
192 (u'lmdatebag', u'Local MDate bag', 0, 80, wx.LIST_FORMAT_LEFT),
193 (u'crc32bag', u'CRC32 bag', 0, 80, wx.LIST_FORMAT_RIGHT),
194 (u'sizebag', u'Size bag', 0, 80, wx.LIST_FORMAT_RIGHT),
195 (u'mdateorigin', u'MDate origin', 0, 80, wx.LIST_FORMAT_LEFT),
196 (u'gmdateorigin', u'GMT MDate origin', 0, 80, wx.LIST_FORMAT_LEFT),
197 (u'lmdateorigin', u'Local MDate origin', 0, 80, wx.LIST_FORMAT_LEFT),
198 (u'crc32origin', u'CRC32 origin', 0, 80, wx.LIST_FORMAT_RIGHT),
199 (u'sizeorigin', u'Size origin', 0, 80, wx.LIST_FORMAT_RIGHT),
200 (u'symlinkdb', u'Symlink DB', 0, 250, wx.LIST_FORMAT_LEFT),
201 (u'symlinkbag', u'Symlink bag', 0, 250, wx.LIST_FORMAT_LEFT),
202 (u'symlinkorigin', u'Symlink origin', 0, 250, wx.LIST_FORMAT_LEFT),
203 (u'timeshift', u'TS', 0, 16, wx.LIST_FORMAT_CENTER),
204 ]
205 """Columns in default order for GUI list."""
206
207 _column_choise_dict = dict([(i[COL_NAME],i) for i in cfg.Z_COLUMN_CHOISE_DEFAULT])
208
210 """
211 Return list with columns.
212 If no columns in config then use default.
213 """
214 log(u'FillColFromConfig: start')
215 cc = []
216 k = _column_choise_dict
217 if cfg.Z_CP.has_section(P_GUI):
218 for i in range(len(cfg.Z_COLUMN_CHOISE_DEFAULT)):
219 if cfg.Z_CP.has_option(P_GUI, u'column%d' % i):
220
221 try:
222 n, v, w = tuple([j.strip() for j in cfg.Z_CP.get(P_GUI, u'column%d' % i).split(u',')])
223 v = int(v)
224 w = int(w)
225 if n in k:
226 cc.append( (n,k[n][COL_HEADING], v, w, k[n][COL_FORMAT]) )
227 else:
228 log(u'initGUI: ERROR when load columns from config: Wrong column name "%s".' % n)
229 except Exception, exc:
230 log(u'initGUI: ERROR when load columns from config: %s.' % str(exc))
231
232
233
234 if len(cc) <1:
235
236 log(u'initGUI: columns not found.')
237 cc = cfg.Z_COLUMN_CHOISE_DEFAULT
238
239 k = [i[COL_NAME] for i in cc]
240 for i in cfg.Z_COLUMN_CHOISE_DEFAULT:
241 if not i[COL_NAME] in k:
242
243 cc.append( (i[COL_NAME],i[COL_HEADING], 0, i[COL_WIDTH], i[COL_FORMAT]) )
244 else:
245
246 cc = cfg.Z_COLUMN_CHOISE_DEFAULT
247
248 log(u'FillColFromConfig: end')
249 return cc
250
251
252
254 """
255 Write columns to config L{cfg.Z_CP}.
256 """
257
258 try:
259 log(u'WriteCols2Config: start')
260 if cfg.Z_CP.has_section(P_GUI):
261 for i in cfg.Z_CP.options(P_GUI):
262 if i.startswith(u'column'):
263 cfg.Z_CP.remove_option(P_GUI, i)
264 else:
265 cfg.Z_CP.add_section(P_GUI)
266 for j in range(len(cols)):
267 i = cols[j]
268 v = u'%s, %d, %d' % (i[COL_NAME], \
269 i[COL_VISIBLE], i[COL_WIDTH])
270 cfg.Z_CP.set(P_GUI, u'column%d' % j, v)
271 log(u'WriteCols2Config: column%d = %s' % (j,v))
272 except Exception, exc:
273 log(u'WriteCols2Config: ERROR %s' % str(exc))
274 log(u'WriteCols2Config: end')
275
285
297
298
301
302 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
303 wx.Dialog.__init__(self, *args, **kwds)
304 self.SetSize((600, 300))
305 self.label_16 = wx.StaticText(self, wx.ID_ANY, "Tips", style=wx.ALIGN_CENTER)
306 self.static_line_2 = wx.StaticLine(self, wx.ID_ANY)
307 self.txtTips = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.BORDER_NONE | wx.TE_AUTO_URL | wx.TE_CHARWRAP | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP)
308 self.static_line_6 = wx.StaticLine(self, wx.ID_ANY)
309 self.btnPrev = wx.Button(self, wx.ID_ANY, "<<<")
310 self.btnNext = wx.Button(self, wx.ID_ANY, ">>>")
311 self.btnClose = wx.Button(self, wx.ID_ANY, "Close")
312 self.chboxShowTips = wx.CheckBox(self, wx.ID_ANY, "Show tips at startup.")
313
314 self.__set_properties()
315 self.__do_layout()
316
317 self.Bind(wx.EVT_TEXT_URL, self.txtTips_url_handler, self.txtTips)
318 self.Bind(wx.EVT_BUTTON, self.btnPrev_handler, self.btnPrev)
319 self.Bind(wx.EVT_BUTTON, self.btnNext_handler, self.btnNext)
320 self.Bind(wx.EVT_BUTTON, self.btnClose_handler, self.btnClose)
321
322
323 self.Bind(wx.EVT_INIT_DIALOG, self.Init_handler)
324 self.Bind(wx.EVT_CLOSE, self.dlgClose_handler)
325
327
328 self.SetTitle("PYBAG - Tips")
329 self.SetSize((600, 300))
330 self.label_16.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
331 self.txtTips.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
332 self.chboxShowTips.SetValue(1)
333
334
336
337 sizer_25 = wx.BoxSizer(wx.VERTICAL)
338 sizer_27 = wx.BoxSizer(wx.HORIZONTAL)
339 sizer_26 = wx.BoxSizer(wx.HORIZONTAL)
340 sizer_25.Add(self.label_16, 0, wx.ALIGN_CENTER | wx.ALL, 10)
341 sizer_25.Add(self.static_line_2, 0, wx.EXPAND, 0)
342 sizer_25.Add(self.txtTips, 3, wx.ALL | wx.EXPAND, 10)
343 sizer_25.Add(self.static_line_6, 0, wx.EXPAND, 0)
344 sizer_26.Add(self.btnPrev, 0, wx.ALIGN_CENTER | wx.ALL, 2)
345 sizer_26.Add(self.btnNext, 0, wx.ALIGN_CENTER | wx.ALL, 2)
346 sizer_25.Add(sizer_26, 1, wx.EXPAND, 0)
347 sizer_27.Add(self.btnClose, 0, wx.ALIGN_CENTER | wx.ALL, 2)
348 sizer_27.Add(self.chboxShowTips, 1, wx.ALL | wx.EXPAND, 15)
349 sizer_25.Add(sizer_27, 1, wx.EXPAND, 0)
350 self.SetSizer(sizer_25)
351 self.Layout()
352
353
355 try:
356 if event.GetMouseEvent().LeftUp():
357 url = self.txtTips.GetRange(event.GetURLStart(), event.GetURLEnd())
358 webbrowser.open(url)
359 except Exception,exc:
360 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgTips.txtTips_Url_handler',
361 error=exc)
362 event.Skip()
363
367
381
383 cfg.TIPSNUMBER -= 2
384 self.ShowTip()
385 event.Skip()
386
388 self.ShowTip()
389 event.Skip()
390
392 self.Close()
393 event.Skip()
394
396 cfg.SHOWTIPS = self.chboxShowTips.IsChecked()
397 log(u'dlgTips.dlgClose_handler: set SHOWTIPS=%s' % cfg.SHOWTIPS)
398 self.EndModal(0)
399 event.Skip(False)
400
401
402
403
406
407 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
408 wx.Dialog.__init__(self, *args, **kwds)
409 self.SetSize((600, 570))
410 self.nbookPrefs = wx.Notebook(self, wx.ID_ANY, style=0)
411 self.panelPrefsGlobal = wx.Panel(self.nbookPrefs, wx.ID_ANY)
412 self.label_6 = wx.StaticText(self.panelPrefsGlobal, wx.ID_ANY, "Verbosity:")
413 self.cboxGlobalVerbosity = wx.ComboBox(self.panelPrefsGlobal, wx.ID_ANY, choices=["-1 - Not at all", "0 - Only global errors", "1 - Errors and success", "2 - Errors and conflicts", "3 - Normal output (errors, conflicts, warnings)", "4 - Large output (as 3 and file operations)", "5 - Logging output"], style=wx.CB_DROPDOWN | wx.CB_READONLY)
414 self.chboxGlobalEmulation = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Enable emulation by default.")
415 self.chboxGlobalLogging = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Enable logging by default.")
416 self.chboxGlobalDebug = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Enable debug output by default.")
417 self.checkboxGlobalColorize = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Colorize output in text (console) mode.")
418 self.label_15 = wx.StaticText(self.panelPrefsGlobal, wx.ID_ANY, "Modification time delta:")
419 self.spinGlobalMDDELTA = wx.SpinCtrl(self.panelPrefsGlobal, wx.ID_ANY, "5", min=0, max=10000, style=0)
420 self.chboxGlobalOutput = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Show output window.")
421 self.chboxGlobalTip = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Show tips window at start up.")
422 self.chboxGlobalFilterOk = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Synchronization OK")
423 self.chboxGlobalFilterWarn = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Warnings")
424 self.chboxGlobalFilterConf = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Conflicts")
425 self.chboxGlobalFilterErr = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Errors")
426 self.chboxGlobalFilterBag = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Bag direction")
427 self.chboxGlobalFilterOrig = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Origin direction")
428 self.chboxGlobalFilterNew = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "New items")
429 self.chboxGlobalFilterCh = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Changed items")
430 self.chboxGlobalFilterDel = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Deleted items")
431 self.chboxGlobalFilterIgn = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Ignored items")
432 self.chboxGlobalFilterUnch = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Unchanged items")
433 self.chboxGlobalFilterForced = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Forced operation")
434 self.chboxGlobalFilterFile = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "File")
435 self.chboxGlobalFilterDir = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Directories")
436 self.chboxGlobalFilterSym = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Symlinks")
437 self.chboxGlobalFilterUnk = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Unknown items")
438 self.chboxGlobalFilterTs = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Time shifted items")
439 self.panelPrefsRoots = wx.Panel(self.nbookPrefs, wx.ID_ANY)
440 self.lboxRoots = wx.ListBox(self.panelPrefsRoots, wx.ID_ANY, choices=[], style=wx.LB_HSCROLL | wx.LB_NEEDED_SB | wx.LB_SINGLE | wx.LB_SORT)
441 self.label_12 = wx.StaticText(self.panelPrefsRoots, wx.ID_ANY, "Symlink action:")
442 self.cboxRootsSymlink = wx.ComboBox(self.panelPrefsRoots, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY)
443 self.label_13 = wx.StaticText(self.panelPrefsRoots, wx.ID_ANY, "Compare method:")
444 self.cboxRootsCompare = wx.ComboBox(self.panelPrefsRoots, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY)
445 self.label_14 = wx.StaticText(self.panelPrefsRoots, wx.ID_ANY, "Ignore pattern (wilds (* and ?) separated by\ncomma, or regexp started with ! ).")
446 self.txtIgnore = wx.TextCtrl(self.panelPrefsRoots, wx.ID_ANY, "")
447 self.chboxRootsBackup = wx.CheckBox(self.panelPrefsRoots, wx.ID_ANY, "Check if root is backup.")
448 self.chboxRootsSelectDefault = wx.CheckBox(self.panelPrefsRoots, wx.ID_ANY, "Select by default for synchronization.")
449 self.nbookPrefs_pane_3 = wx.Panel(self.nbookPrefs, wx.ID_ANY)
450 self.lboxColumns = wx.ListBox(self.nbookPrefs_pane_3, wx.ID_ANY, choices=[])
451 self.btnColumnsUp = wx.Button(self.nbookPrefs_pane_3, wx.ID_UP, "")
452 self.btnColumnsDown = wx.Button(self.nbookPrefs_pane_3, wx.ID_DOWN, "")
453 self.btnColumnsCurrent = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "Get current")
454 self.btnColumnsConfig = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "From config")
455 self.btnColumnsDefault = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "Reset to default")
456 self.label_17 = wx.StaticText(self.nbookPrefs_pane_3, wx.ID_ANY, "Column width", style=wx.ALIGN_CENTER)
457 self.spinColWidth = wx.SpinCtrl(self.nbookPrefs_pane_3, wx.ID_ANY, "", min=0, max=2000, style=0)
458 self.chboxColVisible = wx.CheckBox(self.nbookPrefs_pane_3, wx.ID_ANY, "Visible")
459 self.btnColumnsApply = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "Apply")
460 self.chboxColumnsSave = wx.CheckBox(self.nbookPrefs_pane_3, wx.ID_ANY, "Save columns changes when exit from PyBAG (save only if emulation mode turn off).")
461 self.btnOk = wx.Button(self, wx.ID_ANY, "Ok")
462 self.btnCancel = wx.Button(self, wx.ID_ANY, "Cancel")
463
464 self.__set_properties()
465 self.__do_layout()
466
467 self.Bind(wx.EVT_LISTBOX, self.lboxRoots_handler, self.lboxRoots)
468 self.Bind(wx.EVT_LISTBOX, self.lboxColumns_selected_handler, self.lboxColumns)
469 self.Bind(wx.EVT_BUTTON, self.btnColumnsUp_handler, self.btnColumnsUp)
470 self.Bind(wx.EVT_BUTTON, self.btnColumnsDown_handler, self.btnColumnsDown)
471 self.Bind(wx.EVT_BUTTON, self.btnColumnsCurrent_handler, self.btnColumnsCurrent)
472 self.Bind(wx.EVT_BUTTON, self.btnColumnsConfig_handler, self.btnColumnsConfig)
473 self.Bind(wx.EVT_BUTTON, self.btnColumnsDefault_handler, self.btnColumnsDefault)
474 self.Bind(wx.EVT_BUTTON, self.btnColumnsApply_handler, self.btnColumnsApply)
475 self.Bind(wx.EVT_BUTTON, self.btnOk_handler, self.btnOk)
476 self.Bind(wx.EVT_BUTTON, self.btnCancel_handler, self.btnCancel)
477
478
479 self.cursel = u''
480 self.cboxRootsCompare.AppendItems(z_compare_choice)
481 self.cboxRootsSymlink.AppendItems(z_symlink_choice)
482
483 self.Bind(wx.EVT_INIT_DIALOG, self.Init_handler)
484
486
487 self.SetTitle("Preferences")
488 self.SetSize((600, 570))
489 self.cboxGlobalVerbosity.SetToolTipString("Verbosity level")
490 self.cboxGlobalVerbosity.SetSelection(4)
491 self.lboxColumns.SetFont(wx.Font(8, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
492 self.btnColumnsCurrent.SetToolTipString("Get columns positions from window")
493 self.btnColumnsConfig.SetToolTipString("Get columns position from configuration file")
494 self.btnColumnsDefault.SetToolTipString("Reset columns position to program default")
495 self.spinColWidth.SetToolTipString("Set column width in pixels")
496 self.chboxColVisible.SetToolTipString("Show / hide column")
497
498
500
501 sizer_12 = wx.BoxSizer(wx.VERTICAL)
502 sizer_14 = wx.BoxSizer(wx.HORIZONTAL)
503 sizer_13 = wx.BoxSizer(wx.HORIZONTAL)
504 sizer_21 = wx.BoxSizer(wx.VERTICAL)
505 sizer_22 = wx.BoxSizer(wx.HORIZONTAL)
506 sizer_24 = wx.BoxSizer(wx.VERTICAL)
507 sizer_15 = wx.BoxSizer(wx.HORIZONTAL)
508 sizer_16 = wx.BoxSizer(wx.VERTICAL)
509 sizer_17 = wx.BoxSizer(wx.HORIZONTAL)
510 sizer_20 = wx.StaticBoxSizer(wx.StaticBox(self.panelPrefsGlobal, wx.ID_ANY, "Default item list filter:"), wx.VERTICAL)
511 sizer_19 = wx.BoxSizer(wx.VERTICAL)
512 sizer_19.Add(self.label_6, 0, wx.ALL, 2)
513 sizer_19.Add(self.cboxGlobalVerbosity, 0, wx.ALL | wx.EXPAND, 2)
514 sizer_19.Add((10, 10), 0, 0, 0)
515 sizer_19.Add(self.chboxGlobalEmulation, 0, wx.ALL, 2)
516 sizer_19.Add(self.chboxGlobalLogging, 0, wx.ALL, 2)
517 sizer_19.Add(self.chboxGlobalDebug, 0, wx.ALL, 2)
518 sizer_19.Add(self.checkboxGlobalColorize, 0, wx.ALL, 2)
519 sizer_19.Add((10, 10), 0, 0, 0)
520 sizer_19.Add(self.label_15, 0, wx.ALL, 2)
521 sizer_19.Add(self.spinGlobalMDDELTA, 0, wx.ALL, 2)
522 sizer_19.Add((10, 10), 0, 0, 0)
523 sizer_19.Add(self.chboxGlobalOutput, 0, wx.ALL, 2)
524 sizer_19.Add((10, 10), 0, 0, 0)
525 sizer_19.Add(self.chboxGlobalTip, 0, wx.ALL, 2)
526 sizer_17.Add(sizer_19, 1, wx.EXPAND, 0)
527 sizer_20.Add(self.chboxGlobalFilterOk, 0, wx.ALL, 2)
528 sizer_20.Add(self.chboxGlobalFilterWarn, 0, wx.ALL, 2)
529 sizer_20.Add(self.chboxGlobalFilterConf, 0, wx.ALL, 2)
530 sizer_20.Add(self.chboxGlobalFilterErr, 0, wx.ALL, 2)
531 sizer_20.Add(self.chboxGlobalFilterBag, 0, wx.ALL, 2)
532 sizer_20.Add(self.chboxGlobalFilterOrig, 0, wx.ALL, 2)
533 sizer_20.Add(self.chboxGlobalFilterNew, 0, wx.ALL, 2)
534 sizer_20.Add(self.chboxGlobalFilterCh, 0, wx.ALL, 2)
535 sizer_20.Add(self.chboxGlobalFilterDel, 0, wx.ALL, 2)
536 sizer_20.Add(self.chboxGlobalFilterIgn, 0, wx.ALL, 2)
537 sizer_20.Add(self.chboxGlobalFilterUnch, 0, wx.ALL, 2)
538 sizer_20.Add(self.chboxGlobalFilterForced, 0, wx.ALL, 2)
539 sizer_20.Add(self.chboxGlobalFilterFile, 0, wx.ALL, 2)
540 sizer_20.Add(self.chboxGlobalFilterDir, 0, wx.ALL, 2)
541 sizer_20.Add(self.chboxGlobalFilterSym, 0, wx.ALL, 2)
542 sizer_20.Add(self.chboxGlobalFilterUnk, 0, wx.ALL, 2)
543 sizer_20.Add(self.chboxGlobalFilterTs, 0, wx.ALL, 2)
544 sizer_17.Add(sizer_20, 1, 0, 0)
545 self.panelPrefsGlobal.SetSizer(sizer_17)
546 sizer_15.Add(self.lboxRoots, 1, wx.ALL | wx.EXPAND, 2)
547 sizer_16.Add(self.label_12, 0, wx.ALL, 2)
548 sizer_16.Add(self.cboxRootsSymlink, 0, wx.ALL | wx.EXPAND, 2)
549 sizer_16.Add((20, 20), 0, 0, 0)
550 sizer_16.Add(self.label_13, 0, wx.ALL, 2)
551 sizer_16.Add(self.cboxRootsCompare, 0, wx.ALL | wx.EXPAND, 2)
552 sizer_16.Add((20, 20), 0, 0, 0)
553 sizer_16.Add(self.label_14, 0, wx.ALL, 2)
554 sizer_16.Add(self.txtIgnore, 0, wx.ALL | wx.EXPAND, 2)
555 sizer_16.Add((20, 20), 0, 0, 0)
556 sizer_16.Add(self.chboxRootsBackup, 0, wx.ALL, 2)
557 sizer_16.Add((20, 20), 0, 0, 0)
558 sizer_16.Add(self.chboxRootsSelectDefault, 0, wx.ALL, 2)
559 sizer_15.Add(sizer_16, 1, wx.ALL | wx.EXPAND, 2)
560 self.panelPrefsRoots.SetSizer(sizer_15)
561 sizer_22.Add(self.lboxColumns, 2, wx.ALL | wx.EXPAND, 5)
562 sizer_24.Add(self.btnColumnsUp, 0, wx.ALL | wx.EXPAND, 5)
563 sizer_24.Add(self.btnColumnsDown, 0, wx.ALL | wx.EXPAND, 5)
564 sizer_24.Add(self.btnColumnsCurrent, 0, wx.ALL | wx.EXPAND, 5)
565 sizer_24.Add(self.btnColumnsConfig, 0, wx.ALL | wx.EXPAND, 5)
566 sizer_24.Add(self.btnColumnsDefault, 0, wx.ALL | wx.EXPAND, 5)
567 sizer_24.Add(self.label_17, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
568 sizer_24.Add(self.spinColWidth, 0, wx.ALL | wx.EXPAND, 5)
569 sizer_24.Add(self.chboxColVisible, 0, wx.ALL, 5)
570 sizer_24.Add(self.btnColumnsApply, 0, wx.ALL | wx.EXPAND, 5)
571 sizer_22.Add(sizer_24, 1, wx.EXPAND, 0)
572 sizer_21.Add(sizer_22, 1, wx.EXPAND, 0)
573 sizer_21.Add(self.chboxColumnsSave, 0, wx.ALL | wx.EXPAND, 10)
574 self.nbookPrefs_pane_3.SetSizer(sizer_21)
575 self.nbookPrefs.AddPage(self.panelPrefsGlobal, "Global preferences")
576 self.nbookPrefs.AddPage(self.panelPrefsRoots, "Roots preferences")
577 self.nbookPrefs.AddPage(self.nbookPrefs_pane_3, "Columns preferences")
578 sizer_13.Add(self.nbookPrefs, 1, wx.ALL | wx.EXPAND, 2)
579 sizer_12.Add(sizer_13, 1, wx.ALL | wx.EXPAND, 2)
580 sizer_14.Add(self.btnOk, 0, wx.ALL, 2)
581 sizer_14.Add(self.btnCancel, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
582 sizer_12.Add(sizer_14, 0, wx.ALL | wx.EXPAND, 2)
583 self.SetSizer(sizer_12)
584 self.Layout()
585
586
588 try:
589 sel = self.lboxRoots.GetString(self.lboxRoots.GetSelection())
590 dbg(u'dlgPrefs.lboxRoots_handler: sel="%s".' % (sel,))
591 self.saveRootsPage()
592 self.cursel = sel
593 self.loadRootsPage()
594 except Exception,exc:
595 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.lboxRoots_handler',
596 error=exc)
597 event.Skip(False)
598
600 try:
601 mddelta = self.spinGlobalMDDELTA.GetValue()
602 cfg.Z_CP.setopt(u'root', P_MDDELTA,str(mddelta))
603 self.saveRootsPage()
604 WriteCols2Config(self.cols)
605 if not cfg.Z_CP.has_section(P_GUI):
606 cfg.Z_CP.add_section(P_GUI)
607 cfg.Z_CP.set(P_GUI, P_SHOWTIPS, str(int(self.chboxGlobalTip.GetValue())))
608 cfg.SHOWTIPS = bool(int(self.chboxGlobalTip.GetValue()))
609 cfg.Z_CP.set(P_GUI, P_WRITECOLSATEXIT, str(int(self.chboxColumnsSave.GetValue())))
610
611 cfg.Z_CP.setopt(u'root', P_DEBUG, str(int(self.chboxGlobalDebug.GetValue())))
612 cfg.Z_CP.setopt(u'root', P_EMUL, str(int(self.chboxGlobalEmulation.GetValue())))
613 cfg.Z_CP.setopt(u'root', P_LOGGING, str(int(self.chboxGlobalLogging.GetValue())))
614 cfg.Z_CP.setopt(u'root', P_VERB, str(int(self.cboxGlobalVerbosity.GetSelection()-1)))
615 cfg.Z_CP.setopt(u'root', P_COLORIZE, str(int(self.checkboxGlobalColorize.GetValue())))
616
617 for k in _filter.keys():
618 if k.startswith(u'ff_'):
619 n = u'chboxGlobalFilter' + k[3:].capitalize()
620 AppState[k] = getattr(self, n).GetValue()
621 AppState[P_OUTPUT] = self.chboxGlobalOutput.GetValue()
622 SaveAppStateToConfig()
623 cfg.Z_CP.save()
624 if cfg.PYBAG_EMUL:
625 prt0(u'Emulation on. Do not save.',place=u'dlgPrefs.btnOk_handler')
626 else:
627 prt0(u'Preferences saved.',place=u'dlgPrefs.btnOk_handler')
628 except Exception,exc:
629 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.btnOk_handler',
630 error=exc)
631 self.EndModal(0)
632 event.Skip(False)
633
635 log(u'dlgPrefs.Init_handler: Init handler')
636 try:
637
638 mddelta = cfg.Z_CP.getopt(u'root', P_MDDELTA, False, cfg.MDDELTA)
639 self.spinGlobalMDDELTA.SetValue(int(mddelta))
640 self.chboxGlobalDebug.SetValue( bool(int(cfg.Z_CP.getopt(u'root', P_DEBUG, False, PYBAG_DEBUG_DEFAULT))) )
641 self.chboxGlobalEmulation.SetValue( bool(int(cfg.Z_CP.getopt(u'root', P_EMUL, False, PYBAG_EMUL_DEFAULT))) )
642 self.chboxGlobalLogging.SetValue( bool(int(cfg.Z_CP.getopt(u'root', P_LOGGING, False, PYBAG_LOG_DEFAULT))) )
643 verb = int(cfg.Z_CP.getopt(u'root', P_VERB, False, VERBOSE_DEFAULT))
644 self.cboxGlobalVerbosity.SetSelection(verb + 1)
645 colorize = cfg.Z_CP.getopt(u'root', P_COLORIZE, False, PYBAG_COLORIZE_DEFAULT)
646 self.checkboxGlobalColorize.SetValue(bool(int(colorize)))
647 if cfg.Z_CP.has_section(P_GUI):
648 v = False
649 if cfg.Z_CP.has_option(P_GUI,P_WRITECOLSATEXIT):
650 v = cfg.Z_CP.get(P_GUI,P_WRITECOLSATEXIT)
651 v = bool(int( (v in [u'0', u'1'] and v) or u'0' ))
652 self.chboxColumnsSave.SetValue(v)
653 self.chboxGlobalTip.SetValue(cfg.SHOWTIPS)
654 rs = cfg.Z_CP.getrootsbag()
655 self.lboxRoots.Set(rs)
656 self.lboxRoots.Select(-1)
657 self.cursel = u''
658 self.loadRootsPage()
659 LoadAppStateFromConfig()
660 for k in _filter.keys():
661 if k.startswith(u'ff_'):
662 n = u'chboxGlobalFilter' + k[3:].capitalize()
663 getattr(self, n).SetValue(AppState[k])
664 self.chboxGlobalOutput.SetValue(AppState[P_OUTPUT])
665
666 self.cols = FillColFromConfig()
667 self.FillColumns()
668 self.chboxColVisible.SetValue(False)
669 self.spinColWidth.SetValue(0)
670 self.lboxColumns.Select(wx.NOT_FOUND)
671 except Exception,exc:
672 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.Init_handler',
673 error=exc)
674 event.Skip()
675
676 - def GetColText(self, coldata):
677 """
678 Return string for fill listbox.
679 Format I{coldata} in default order [(configname, colname, show, size, align), ...].
680 """
681 v = coldata[COL_VISIBLE] and u'X' or u'-'
682 s = u' ' + v
683 s += u'...' + coldata[COL_HEADING] + u'.'*(25-len(coldata[COL_HEADING]))
684 d = u'%d' % coldata[COL_WIDTH]
685 s += u'.'*(5-len(d)) + d
686 return s
687
689 """
690 Fill list box from C{self.cols}.
691 Format in default order [(configname, colname, show, size, align), ...].
692 """
693 self.lboxColumns.Clear()
694
695 for i in self.cols:
696
697 self.lboxColumns.Append(self.GetColText(i))
698
699
701 log(u'dlgPrefs.btnCancel_handler: Cancel.')
702 self.EndModal(-1)
703 event.Skip(False)
704
705 - def loadRootsPage(self):
706 """
707 """
708 log(u'dlgPrefs.loadRootsPage: start')
709
710 try:
711 if self.cursel:
712 rn = cfg.Z_CP.findroot(self.cursel)
713 log(u'dlgPrefs.loadRootsPage: rn = "%s"' % (rn,))
714 ignore = cfg.Z_CP.getopt(rn, P_IGNORE, False, P_DEFIGNORE)
715 symlink = cfg.Z_CP.getopt(rn, P_SYMLINK, False, P_DEFSYMLINK)
716 compare = cfg.Z_CP.getopt(rn, P_COMPARE, False, P_DEFCOMPARE)
717 backup = cfg.Z_CP.getopt(rn, P_BACKUP, False, P_DEFBACKUP)
718 seldef = cfg.Z_CP.getopt(rn, P_SELECTDEFAULT, False, P_DEFSELECTDEFAULT)
719 backup = backup == P_BACKUPYES
720 seldef = seldef == P_SELECTDEFAULTYES
721 sym = self.cboxRootsSymlink.FindString(symlink)
722 _cmp = self.cboxRootsCompare.FindString(compare)
723 else:
724 log(u'dlgPrefs.loadRootsPage: no cursel')
725 ignore = u''
726 sym = -1
727 _cmp = -1
728 backup = False
729 seldef = False
730 self.txtIgnore.SetValue(ignore)
731 self.cboxRootsCompare.Select(_cmp)
732 self.cboxRootsSymlink.Select(sym)
733 self.chboxRootsBackup.SetValue(backup)
734 self.chboxRootsSelectDefault.SetValue(seldef)
735 except Exception,exc:
736 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.loadRootsPage',
737 error=exc)
738 log(u'dlgPrefs.loadRootsPage: end')
739
740 - def saveRootsPage(self):
741 """
742 """
743 log(u'dlgPrefs.saveRootsPage: start')
744 try:
745 if self.cursel:
746 dbg(u'dlgPrefs.saveRootsPage: cursel is good')
747 _cmp = self.cboxRootsCompare.GetSelection()
748 sym = self.cboxRootsSymlink.GetSelection()
749 ignore = self.txtIgnore.GetValue()
750 symlink = self.cboxRootsSymlink.GetString(sym)
751 compare = self.cboxRootsCompare.GetString(_cmp)
752 backup = (self.chboxRootsBackup.GetValue() and P_BACKUPYES) or P_BACKUPNO
753 seldef = (self.chboxRootsSelectDefault.GetValue() and P_SELECTDEFAULTYES) or P_SELECTDEFAULTNO
754 rn = cfg.Z_CP.findroot(self.cursel)
755 cfg.Z_CP.setopt(rn, P_IGNORE, ignore)
756 cfg.Z_CP.setopt(rn, P_COMPARE, compare)
757 cfg.Z_CP.setopt(rn, P_SYMLINK, symlink)
758 cfg.Z_CP.setopt(rn, P_BACKUP, backup)
759 cfg.Z_CP.setopt(rn, P_SELECTDEFAULT, seldef)
760
761 except Exception,exc:
762 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.saveRootsPage',
763 error=exc)
764 log(u'dlgPrefs.saveRootsPage: end')
765
767 idx = self.lboxColumns.GetSelection()
768 if idx != wx.NOT_FOUND:
769 if idx > 0:
770 cx = self.cols[idx-1]
771 self.cols[idx-1] = self.cols[idx]
772 self.cols[idx] = cx
773 self.FillColumns()
774 self.lboxColumns.Select(idx-1)
775 event.Skip(False)
776
778 idx = self.lboxColumns.GetSelection()
779 if idx != wx.NOT_FOUND:
780 if idx < len(self.cols)-1:
781 cx = self.cols[idx+1]
782 self.cols[idx+1] = self.cols[idx]
783 self.cols[idx] = cx
784 self.FillColumns()
785 self.lboxColumns.Select(idx+1)
786 event.Skip(False)
787
789 self.cols = cfg.Z_COLUMN_CHOISE[:]
790 self.FillColumns()
791 self.chboxColVisible.SetValue(False)
792 self.spinColWidth.SetValue(0)
793 self.lboxColumns.Select(wx.NOT_FOUND)
794 event.Skip(False)
795
797 self.cols = cfg.Z_COLUMN_CHOISE_DEFAULT[:]
798 self.FillColumns()
799 self.chboxColVisible.SetValue(False)
800 self.spinColWidth.SetValue(0)
801 self.lboxColumns.Select(wx.NOT_FOUND)
802 event.Skip(False)
803
805
806 idx = self.lboxColumns.GetSelection()
807 if idx != wx.NOT_FOUND:
808 cd = self.cols[idx]
809 v = int(self.chboxColVisible.GetValue())
810 w = self.spinColWidth.GetValue()
811 self.cols[idx] = (cd[COL_NAME],cd[COL_HEADING],v,w,cd[COL_FORMAT])
812 self.FillColumns()
813 self.lboxColumns.Select(idx)
814 event.Skip(False)
815
817 self.cols = FillColFromConfig()
818 self.FillColumns()
819 self.chboxColVisible.SetValue(False)
820 self.spinColWidth.SetValue(0)
821 self.lboxColumns.Select(wx.NOT_FOUND)
822 event.Skip(False)
823
825 try:
826 log(u'lboxColumns_selected_handler: start')
827 idx = self.lboxColumns.GetSelection()
828 if idx != wx.NOT_FOUND:
829 self.chboxColVisible.SetValue(self.cols[idx][COL_VISIBLE])
830 self.spinColWidth.SetValue(self.cols[idx][COL_WIDTH])
831 else:
832 self.chboxColVisible.SetValue(False)
833 self.spinColWidth.SetValue(0)
834 except Exception, exc:
835 log(u'lboxColumns_selected_handler: ERROR %s' % str(exc))
836 event.Skip()
837
838
839
840
843
844 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
845 wx.Dialog.__init__(self, *args, **kwds)
846 self.label_8 = wx.StaticText(self, wx.ID_ANY, "Path for adding: ")
847 self.txtPath = wx.TextCtrl(self, wx.ID_ANY, "")
848 self.btnPathSelect = wx.Button(self, wx.ID_ANY, ". . .")
849 self.rbPathType = wx.RadioBox(self, wx.ID_ANY, "Select path type.", choices=["Directory", "File or symlink"], majorDimension=0, style=wx.RA_SPECIFY_COLS)
850 self.static_line_4 = wx.StaticLine(self, wx.ID_ANY)
851 self.label_9 = wx.StaticText(self, wx.ID_ANY, "Select symlink action.")
852 self.cboxSymlink = wx.ComboBox(self, wx.ID_ANY, choices=["Copy", "Ignore"], style=wx.CB_DROPDOWN | wx.CB_READONLY)
853 self.label_10 = wx.StaticText(self, wx.ID_ANY, "Select compare method.")
854 self.cboxCompare = wx.ComboBox(self, wx.ID_ANY, choices=["Statistic", "CRC32"], style=wx.CB_DROPDOWN | wx.CB_READONLY)
855 self.label_11 = wx.StaticText(self, wx.ID_ANY, "Ignore filter. You may use system wildchar (*,?), separated by comma or can use\nregexp starts with ! .")
856 self.txtIgnore = wx.TextCtrl(self, wx.ID_ANY, "")
857 self.chboxBackup = wx.CheckBox(self, wx.ID_ANY, "Backup root.")
858 self.chboxDefault = wx.CheckBox(self, wx.ID_ANY, "Mark root default.")
859 self.btnAdd = wx.Button(self, wx.ID_ANY, "Add root")
860 self.button_2 = wx.Button(self, wx.ID_ANY, "Cancel")
861
862 self.__set_properties()
863 self.__do_layout()
864
865 self.Bind(wx.EVT_BUTTON, self.btnPathSelect_handler, self.btnPathSelect)
866 self.Bind(wx.EVT_BUTTON, self.btnAddRoot_handler, self.btnAdd)
867 self.Bind(wx.EVT_BUTTON, self.btnCancel_handler, self.button_2)
868
869
870 self.cboxCompare.Clear()
871 log(u'log(Z_COLUMN_CHOISE)===%s' % str(z_compare_choice))
872 self.cboxCompare.AppendItems(z_compare_choice)
873 self.cboxCompare.SetSelection(self.cboxCompare.FindString(P_DEFCOMPARE))
874 self.cboxSymlink.Clear()
875 self.cboxSymlink.AppendItems(z_symlink_choice)
876 self.cboxSymlink.SetSelection(self.cboxSymlink.FindString(P_DEFSYMLINK))
877
879
880 self.SetTitle("Add root")
881 self.btnPathSelect.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
882 self.btnPathSelect.SetToolTipString("Select path ...")
883 self.rbPathType.SetSelection(0)
884 self.cboxSymlink.SetSelection(0)
885 self.cboxCompare.SetSelection(0)
886 self.chboxDefault.SetValue(1)
887
888
890
891 sizer_2 = wx.BoxSizer(wx.VERTICAL)
892 sizer_11 = wx.BoxSizer(wx.HORIZONTAL)
893 sizer_32 = wx.BoxSizer(wx.HORIZONTAL)
894 sizer_8 = wx.BoxSizer(wx.HORIZONTAL)
895 sizer_10 = wx.BoxSizer(wx.VERTICAL)
896 sizer_9 = wx.BoxSizer(wx.VERTICAL)
897 sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
898 sizer_6.Add(self.label_8, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
899 sizer_6.Add(self.txtPath, 2, wx.ALL | wx.EXPAND, 2)
900 sizer_6.Add(self.btnPathSelect, 0, wx.ALL, 2)
901 sizer_2.Add(sizer_6, 0, wx.EXPAND, 0)
902 sizer_2.Add(self.rbPathType, 0, wx.ALL, 5)
903 sizer_2.Add(self.static_line_4, 0, wx.ALL | wx.EXPAND, 3)
904 sizer_9.Add(self.label_9, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2)
905 sizer_9.Add(self.cboxSymlink, 1, wx.ALL | wx.EXPAND, 5)
906 sizer_8.Add(sizer_9, 1, 0, 0)
907 sizer_10.Add(self.label_10, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2)
908 sizer_10.Add(self.cboxCompare, 1, wx.ALL | wx.EXPAND, 5)
909 sizer_8.Add(sizer_10, 1, 0, 0)
910 sizer_2.Add(sizer_8, 0, wx.EXPAND, 0)
911 sizer_2.Add(self.label_11, 0, wx.ALL, 2)
912 sizer_2.Add(self.txtIgnore, 0, wx.ALL | wx.EXPAND, 2)
913 sizer_32.Add(self.chboxBackup, 0, wx.ALL, 10)
914 sizer_32.Add(self.chboxDefault, 0, wx.ALL, 10)
915 sizer_2.Add(sizer_32, 1, wx.EXPAND, 0)
916 sizer_11.Add(self.btnAdd, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2)
917 sizer_11.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2)
918 sizer_2.Add(sizer_11, 0, wx.EXPAND, 0)
919 self.SetSizer(sizer_2)
920 sizer_2.Fit(self)
921 self.Layout()
922
923
925 sel = self.rbPathType.GetSelection()
926 if sel == 0:
927
928 path = wx.DirSelector(u'Select diroctory for adding.')
929 elif sel == 1:
930
931 path = wx.FileSelector(u'Select file or symlink for adding.')
932 self.txtPath.SetValue(path)
933 event.Skip(False)
934
936 path = self.txtPath.GetValue()
937 if path:
938 cmd = command_class
939 setattr(cmd,'fs',[path])
940 _cmp = self.cboxCompare.GetValue()
941 ign = self.txtIgnore.GetValue()
942 sym = self.cboxSymlink.GetValue()
943 backup = str(int(self.chboxBackup.GetValue()))
944 seldef = str(int(self.chboxDefault.GetValue()))
945 dbg(u'dlgAddRoot.btnAddRoot_handler: ',sym, ' ',_cmp,' ',ign,' ', backup,' ',seldef)
946
947
948
949 setattr(cmd,'k',[sym])
950 setattr(cmd,'e',[ign])
951 setattr(cmd,'s',[_cmp])
952 setattr(cmd,'b',[backup])
953 setattr(cmd,'x',[seldef])
954 setattr(cmd,'r',[])
955 try:
956 f_add(cmd)
957 except Exception,exc:
958 prt0(u'ERROR in programm.',place=u'dlgAddRoot.btnAddRoot_handler', error=exc)
959 self.EndModal(0)
960 else:
961 wx.MessageBox(u'Path not selected!', u'Error.',wx.OK | wx.ICON_ERROR)
962 event.Skip()
963
965 self.EndModal(0)
966 event.Skip()
967
968
969
970
973
974 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
975 wx.Dialog.__init__(self, *args, **kwds)
976 self.SetSize((600, 500))
977 self.bmpBag = wx.StaticBitmap(self, wx.ID_ANY, catalog['pybag'].getBitmap())
978 global IDLBLNAME; IDLBLNAME = wx.NewId()
979 self.lblName = wx.StaticText(self, IDLBLNAME, "P Y B A G", style=wx.ALIGN_CENTER)
980 self.static_line_3 = wx.StaticLine(self, wx.ID_ANY)
981 global IDTXTINFO; IDTXTINFO = wx.NewId()
982 self.txtInfo = wx.TextCtrl(self, IDTXTINFO, "Synchronization tool.\n\nhttp://pybag.sourceforge.net\n", style=wx.BORDER_NONE | wx.TE_AUTO_URL | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH | wx.TE_WORDWRAP)
983 self.static_line_5 = wx.StaticLine(self, wx.ID_ANY)
984 self.btnOk = wx.Button(self, wx.ID_CLOSE, "")
985
986 self.__set_properties()
987 self.__do_layout()
988
989 self.Bind(wx.EVT_TEXT_URL, self.txtInfo_Url_handler, self.txtInfo)
990 self.Bind(wx.EVT_BUTTON, self.btnOk_handler, self.btnOk)
991
992
994
995 self.SetTitle("Info")
996 self.SetSize((600, 500))
997 self.lblName.SetBackgroundColour(wx.Colour(212, 208, 200))
998 self.lblName.SetForegroundColour(wx.Colour(35, 142, 35))
999 self.lblName.SetFont(wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
1000 self.txtInfo.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
1001 self.txtInfo.SetFont(wx.Font(8, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
1002
1003
1005
1006 sizer_3 = wx.BoxSizer(wx.VERTICAL)
1007 sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
1008 sizer_4.Add(self.bmpBag, 0, wx.ALIGN_CENTER | wx.ALL, 20)
1009 sizer_4.Add((100, 1), 0, 0, 0)
1010 sizer_4.Add(self.lblName, 0, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 20)
1011 sizer_3.Add(sizer_4, 0, wx.EXPAND, 0)
1012 sizer_3.Add(self.static_line_3, 0, wx.ALL | wx.EXPAND, 5)
1013 sizer_3.Add(self.txtInfo, 2, wx.ALL | wx.EXPAND, 10)
1014 sizer_3.Add(self.static_line_5, 0, wx.ALL | wx.EXPAND, 5)
1015 sizer_3.Add(self.btnOk, 0, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 10)
1016 self.SetSizer(sizer_3)
1017 self.Layout()
1018 self.Centre()
1019
1020
1022 self.EndModal(0)
1023 event.Skip()
1024
1026 try:
1027 if event.GetMouseEvent().LeftUp():
1028 url = self.txtInfo.GetRange(event.GetURLStart(), event.GetURLEnd())
1029 webbrowser.open(url)
1030 except Exception,exc:
1031 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgInfo.txtInfo_Url_handler',
1032 error=exc)
1033 event.Skip()
1034
1035
1036
1038
1040 super(PyBAGListCtrl_class,self).__init__(*args, **kwds)
1041
1042
1043 self.ks=[]
1044 self.SetItemCount(0)
1045 self.colkeys = []
1046 self.thread = None
1047
1049 log(u'PyBAGListCtrl_class.Clear().')
1050 self.ks=[]
1051 self.SetItemCount(0)
1052 lks = len(self.ks)-1
1053 if lks>=0:
1054 self.RefreshItems(0, lks)
1055 self.Refresh()
1056
1058 """
1059 Return list of keys selected items.
1060 """
1061 log(u'GetSelectionKeys: start')
1062 r = []
1063 ln = self.GetItemCount()
1064
1065 for i in range(ln):
1066
1067
1068 if self.GetItemState(i, wx.LIST_STATE_SELECTED):
1069
1070 r.append(self.ks[i])
1071 log(u'PyBAGListCtrl_class.GetSelektionKeys: return %d selected items.' % len(r))
1072 return r
1073
1090
1116
1118 """
1119 Thread function.
1120 """
1121 cfg.LOCK[LI_FILTERRUNNING] = True
1122 ks = []
1123 log(u'_filterkeys: start')
1124
1125 DBDBFLAG_ = DBDBFLAG
1126 DBDBPATH_ = DBDBPATH
1127 DBDIR_ = DBDIR
1128
1129
1130 try:
1131 REPORTFILTER_ = 0
1132
1133 SYNCFILTER_ = 0
1134 if filter[u'ff_bag']:
1135 REPORTFILTER_ |= DBDIRBAG
1136 if filter[u'ff_orig']:
1137 REPORTFILTER_ |= DBDIRORIG
1138 if filter[u'ff_ch']:
1139 REPORTFILTER_ |= DBDIRCOPY
1140 if filter[u'ff_new']:
1141 REPORTFILTER_ |= DBDIRNEW
1142 if filter[u'ff_del']:
1143 REPORTFILTER_ |= DBDIRDELETE
1144 if filter[u'ff_warn']:
1145 REPORTFILTER_ |= DBDIRWARNING
1146 if filter[u'ff_conf']:
1147 REPORTFILTER_ |= DBDIRCONFLICT
1148 SYNCFILTER_ |= DBSYNCCONFLICT
1149 if filter[u'ff_err']:
1150 REPORTFILTER_ |= DBDIRERROR
1151 SYNCFILTER_ |= DBSYNCERROR
1152 if filter[u'ff_ign']:
1153 REPORTFILTER_ |= DBDIRIGNORED
1154 if filter[u'ff_forced']:
1155 REPORTFILTER_ |= DBDIRFORCED
1156 if filter[u'ff_unch']:
1157 REPORTFILTER_ |= DBDIRUNCHANGED
1158 if filter[u'ff_ok']:
1159 SYNCFILTER_ |= DBSYNCOK
1160 if filter[u'ff_ts']:
1161 REPORTFILTER_ |= DBDIRTS
1162
1163
1164 REPORTTYPE_ = u''
1165 if filter[u'ff_file']:
1166 REPORTTYPE_ += u'f'
1167 if filter[u'ff_dir']:
1168 REPORTTYPE_ += u'd'
1169 if filter[u'ff_sym']:
1170 REPORTTYPE_ += u's'
1171 if filter[u'ff_unk']:
1172 REPORTTYPE_ += u'u'
1173
1174 REPORTPATTCMP_ = cfg.REPORTPATTCMP
1175
1176 for k,vdb in cfg.Z_DB.iteritems():
1177 if cfg.IsDBSynced:
1178 t = (vdb[DBSYNC] & SYNCFILTER_) and (REPORTFILTER_ & vdb[DBDIR_])
1179 else:
1180 t = REPORTFILTER_ & vdb[DBDIR_]
1181 if t and (vdb[DBDBFLAG_] in REPORTTYPE_) and \
1182 not (REPORTPATTCMP_.match(vdb[DBDBPATH_]) is None):
1183 ks.append(k)
1184 except Exception, exc:
1185 log(u'_filterkeys: ERROR - "%s"' % str(exc))
1186 cfg.Z_LISTKS = ks
1187 cfg.Z_LISTKS.sort()
1188 cfg.LOCK[LI_FILTERRUNNING] = False
1189 wx.CallAfter(self.FillKeys)
1190 log(u'_filterkeys: end')
1191
1194
1197
1203
1219
1235
1342
1343 - def OnGetItemText(self, itemid, column):
1344
1345 ret = u''
1346 DBDIR_ = DBDIR
1347 dbdirbagorig = DBDIRBAG | DBDIRORIG
1348 dbdirnewbag = DBDIRNEW | DBDIRBAG
1349 dbdirneworig = DBDIRNEW | DBDIRORIG
1350 dbdircopybag = DBDIRCOPY | DBDIRBAG
1351 dbdircopyorig = DBDIRCOPY | DBDIRORIG
1352 dbdirerrconf = DBDIRERROR | DBDIRCONFLICT
1353
1354 try:
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364 cn = self.colkeys[column]
1365
1366 vdb = cfg.Z_DB[self.ks[itemid]]
1367
1368
1369 if cn == u'forced':
1370 return (vdb[DBDIR] & DBDIRFORCED and u'!') or u' '
1371 elif cn == u'actionicon':
1372
1373 ret = u''
1374 elif cn == u'stateicon':
1375 ret = u''
1376 elif cn == u'desc':
1377 ret = vdb[DBDESC] + vdb[DBDESCMAN]
1378 elif cn == u'dir':
1379 vdbdir_ = vdb[DBDIR_]
1380 if vdbdir_ & DBDIRTS:
1381 if cfg.TSDIR == TSDIRBAG:
1382 unch = u'<=='
1383 elif cfg.TSDIR == TSDIRORIG:
1384 unch = u'==>'
1385 else:
1386 unch = u'###'
1387 else:
1388 unch = u'==='
1389 ret = (vdbdir_ & DBDIRUNCHANGED and unch) or \
1390 (vdbdir_ & DBDIRIGNORED and u'---') or \
1391 (vdbdir_ & DBDIRDELETE and u'xxx') or \
1392 (vdbdir_ & DBDIRDB and not (vdb[DBDIR_] & dbdirbagorig) and u'===') or \
1393 ((vdbdir_ & dbdirnewbag == dbdirnewbag) and u'<<<') or \
1394 ((vdbdir_ & dbdirneworig == dbdirneworig) and u'>>>') or \
1395 ((vdbdir_ & dbdircopybag == dbdircopybag) and u'<--') or \
1396 ((vdbdir_ & dbdircopyorig == dbdircopyorig) and u'-->') or \
1397 (vdbdir_ & dbdirerrconf and u'***') or \
1398 u'###'
1399 elif cn == u'err':
1400 ret = (vdb[DBDIR_] & DBDIRERROR and u'e') or \
1401 (vdb[DBDIR_] & DBDIRWARNING and u'w') or \
1402 (vdb[DBDIR_] & DBDIRCONFLICT and u'c') or u' '
1403 elif cn == u'path':
1404 ret = vdb[DBDBPATH]
1405 elif cn == u'type':
1406 ret = vdb[DBDBFLAG] or u' '
1407 elif cn == u'crc32db':
1408 ret = u'0x%08X' % vdb[DBDBCRC32]
1409 elif cn == u'sizedb':
1410 ret = z_u(vdb[DBDBSIZE])
1411 elif cn == u'crc32bag':
1412 ret = u'0x%08X' % vdb[DBBAGCRC32]
1413 elif cn == u'sizebag':
1414 ret = z_u(vdb[DBBAGSIZE])
1415 elif cn == u'crc32origin':
1416 ret = u'0x%08X' % vdb[DBORIGCRC32]
1417 elif cn == u'sizeorigin':
1418 ret = z_u(vdb[DBORIGSIZE])
1419 elif cn == u'symlinkdb':
1420 ret = vdb[DBDBLINK]
1421 elif cn == u'symlinkbag':
1422 ret = vdb[DBBAGLINK]
1423 elif cn == u'symlinkorigin':
1424 ret = vdb[DBORIGLINK]
1425 elif cn == u'mdatedb':
1426 ret = (vdb[DBDBFLAG] == DBFLAGFILE) and z_u(vdb[DBDBMDATE]) or u'-'
1427 elif cn == u'gmdatedb':
1428 ret = (vdb[DBDBFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBDBMDATE])) or u'-'
1429 elif cn == u'lmdatedb':
1430 ret = (vdb[DBDBFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBDBMDATE])) or u'-'
1431 elif cn == u'mdatebag':
1432 ret = (vdb[DBBAGFLAG] == DBFLAGFILE) and z_u(vdb[DBBAGMDATE]) or u'-'
1433 elif cn == u'gmdatebag':
1434 ret = (vdb[DBBAGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBBAGMDATE])) or u'-'
1435 elif cn == u'lmdatebag':
1436 ret = (vdb[DBBAGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBBAGMDATE])) or u'-'
1437 elif cn == u'mdateorigin':
1438 ret = (vdb[DBORIGFLAG] == DBFLAGFILE) and z_u(vdb[DBORIGMDATE]) or u'-'
1439 elif cn == u'gmdateorigin':
1440 ret = (vdb[DBORIGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBORIGMDATE])) or u'-'
1441 elif cn == u'lmdateorigin':
1442 ret = (vdb[DBORIGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBORIGMDATE])) or u'-'
1443 elif cn == u'timeshift':
1444 if vdb[DBDIR_] & DBDIRTS:
1445 if cfg.TSDIR == TSDIRBAG:
1446 ret = u'b'
1447 elif cfg.TSDIR == TSDIRORIG:
1448 ret = u'o'
1449 else:
1450 ret = u'#'
1451 else:
1452 ret = u' '
1453 else:
1454 ret = u'!!!WRONG!!!'
1455 except Exception, exc:
1456 log(u'OnGetItemText: ERROR - "%s"' % str(exc))
1457 log(u'OnGetItemText: EXCEPTION - "%s"' % traceback.format_exc(5))
1458 log(u'OnGetItemText: (i=%d, c=%d), self.colkeys=%s' % (itemid, column, str(self.colkeys)))
1459 if not ret:
1460 ret = u'ERROR in OnGetItemText'
1461
1462 return ret
1463
1465 log(u'RefreshColumns: start')
1466 try:
1467 self.DeleteAllColumns()
1468 self.colkeys = []
1469 ccur = 0
1470 for i in cfg.Z_COLUMN_CHOISE:
1471 if i[COL_VISIBLE]:
1472 self.colkeys.append(i[COL_NAME])
1473 self.InsertColumn(ccur, i[COL_HEADING], i[COL_FORMAT], i[COL_WIDTH])
1474 ccur += 1
1475 except Exception,exc:
1476 log(u'RefreshColumns: ERROR - "%s"' % str(exc))
1477 log(u'RefreshColumns: colkeys=%s' % str(self.colkeys))
1478
1479
1480
1481
1482 -class frmMain_class(wx.Frame):
1483 - def __init__(self, *args, **kwds):
1484
1485 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
1486 wx.Frame.__init__(self, *args, **kwds)
1487 self.SetSize((1088, 500))
1488
1489
1490 self.mnuBar = wx.MenuBar()
1491 global IDMNUFILEREAD; IDMNUFILEREAD = wx.NewId()
1492 global IDMNUFILECOMPARE; IDMNUFILECOMPARE = wx.NewId()
1493 global IDMNUFILESYNC; IDMNUFILESYNC = wx.NewId()
1494 global IDMNUFILEADD; IDMNUFILEADD = wx.NewId()
1495 global IDMNUFILEREMOVE; IDMNUFILEREMOVE = wx.NewId()
1496 global IDMNUFILEDIST; IDMNUFILEDIST = wx.NewId()
1497 global IDMNUFILERELOCATE; IDMNUFILERELOCATE = wx.NewId()
1498 global IDMNUFILECLEANDB; IDMNUFILECLEANDB = wx.NewId()
1499 global IDMNUFILETIPS; IDMNUFILETIPS = wx.NewId()
1500 global IDMNUFILESAVEOUT; IDMNUFILESAVEOUT = wx.NewId()
1501 global IDMNUFILEEXIT; IDMNUFILEEXIT = wx.NewId()
1502 global IDMNUVIEWPROP; IDMNUVIEWPROP = wx.NewId()
1503 global IDMNUVIEWOUT; IDMNUVIEWOUT = wx.NewId()
1504 global IDMNUVIEWCLEAROUT; IDMNUVIEWCLEAROUT = wx.NewId()
1505 global IDMNUVIEWEMUL; IDMNUVIEWEMUL = wx.NewId()
1506 global IDMNUVIEWLOGGING; IDMNUVIEWLOGGING = wx.NewId()
1507 global IDMNUVIEWDEBUG; IDMNUVIEWDEBUG = wx.NewId()
1508 global IDMNUVIEWVERB; IDMNUVIEWVERB = wx.NewId()
1509 global IDMNUVIEWVERBNO; IDMNUVIEWVERBNO = wx.NewId()
1510 global IDMNUVIEWVERB0; IDMNUVIEWVERB0 = wx.NewId()
1511 global IDMNUVIEWVERB1; IDMNUVIEWVERB1 = wx.NewId()
1512 global IDMNUVIEWVERB2; IDMNUVIEWVERB2 = wx.NewId()
1513 global IDMNUVIEWVERB3; IDMNUVIEWVERB3 = wx.NewId()
1514 global IDMNUVIEWVERB4; IDMNUVIEWVERB4 = wx.NewId()
1515 global IDMNUVIEWVERB5; IDMNUVIEWVERB5 = wx.NewId()
1516 global IDMNUROOTSSELALL; IDMNUROOTSSELALL = wx.NewId()
1517 global IDMNUROOTSUNSELALL; IDMNUROOTSUNSELALL = wx.NewId()
1518 global IDMNUROOTSSELDEF; IDMNUROOTSSELDEF = wx.NewId()
1519 global IDMNUACTIONBAG; IDMNUACTIONBAG = wx.NewId()
1520 global IDMNUACTIONORIG; IDMNUACTIONORIG = wx.NewId()
1521 global IDMNUACTIONDEL; IDMNUACTIONDEL = wx.NewId()
1522 global IDMNUACTIONUNCH; IDMNUACTIONUNCH = wx.NewId()
1523 global IDMNUACTIONRESTORE; IDMNUACTIONRESTORE = wx.NewId()
1524 global IDMNUACTIONTS; IDMNUACTIONTS = wx.NewId()
1525 global IDMNUACTIONTSBAG; IDMNUACTIONTSBAG = wx.NewId()
1526 global IDMNUACTIONTSORIG; IDMNUACTIONTSORIG = wx.NewId()
1527 global IDMNUACTIONTSRESET; IDMNUACTIONTSRESET = wx.NewId()
1528 global IDMNUFILTEROK; IDMNUFILTEROK = wx.NewId()
1529 global IDMNUFILTERWARN; IDMNUFILTERWARN = wx.NewId()
1530 global IDMNUFILTERCONF; IDMNUFILTERCONF = wx.NewId()
1531 global IDMNUFILTERERR; IDMNUFILTERERR = wx.NewId()
1532 global IDMNUFILTERBAG; IDMNUFILTERBAG = wx.NewId()
1533 global IDMNUFILTERORIG; IDMNUFILTERORIG = wx.NewId()
1534 global IDMNUFILTERNEW; IDMNUFILTERNEW = wx.NewId()
1535 global IDMNUFILTERCH; IDMNUFILTERCH = wx.NewId()
1536 global IDMNUFILTERDEL; IDMNUFILTERDEL = wx.NewId()
1537 global IDMNUFILTERIGN; IDMNUFILTERIGN = wx.NewId()
1538 global IDMNUFILTERUNCH; IDMNUFILTERUNCH = wx.NewId()
1539 global IDMNUFILTERFORCED; IDMNUFILTERFORCED = wx.NewId()
1540 global IDMNUFILTERFILE; IDMNUFILTERFILE = wx.NewId()
1541 global IDMNUFILTERDIR; IDMNUFILTERDIR = wx.NewId()
1542 global IDMNUFILTERSYM; IDMNUFILTERSYM = wx.NewId()
1543 global IDMNUFILTERUNK; IDMNUFILTERUNK = wx.NewId()
1544 global IDMNUFILTERTS; IDMNUFILTERTS = wx.NewId()
1545 global IDMNUOPTIONSSTAT; IDMNUOPTIONSSTAT = wx.NewId()
1546 global IDMNUOPTIONSPREFS; IDMNUOPTIONSPREFS = wx.NewId()
1547 global IDMNUHELPABOUT; IDMNUHELPABOUT = wx.NewId()
1548 global IDMNUHELPUSAGE; IDMNUHELPUSAGE = wx.NewId()
1549 global IDMNUABOUTLICENSE; IDMNUABOUTLICENSE = wx.NewId()
1550 self.mnuFile = wx.Menu()
1551 self.mnuBar.mnuFileRead = self.mnuFile.Append(IDMNUFILEREAD, "&Read and Compare", "Read items and compare")
1552 self.Bind(wx.EVT_MENU, self.mnuFileRead_handler, id=IDMNUFILEREAD)
1553 self.mnuBar.mnuFileCompare = self.mnuFile.Append(IDMNUFILECOMPARE, "&Compare", "Compare files")
1554 self.Bind(wx.EVT_MENU, self.mnuFileCompare_handler, id=IDMNUFILECOMPARE)
1555 self.mnuBar.mnuFileSync = self.mnuFile.Append(IDMNUFILESYNC, "&Synchronize", "Synchronize files")
1556 self.Bind(wx.EVT_MENU, self.mnuFileSync_handler, id=IDMNUFILESYNC)
1557 self.mnuFile.AppendSeparator()
1558 self.mnuBar.mnuFileAdd = self.mnuFile.Append(IDMNUFILEADD, "&Add root ...", "Add new root")
1559 self.Bind(wx.EVT_MENU, self.mnuFileAdd_handler, id=IDMNUFILEADD)
1560 self.mnuBar.mnuFileRemove = self.mnuFile.Append(IDMNUFILEREMOVE, "Re&move root ...", "Remove root")
1561 self.Bind(wx.EVT_MENU, self.mnuFileRemove_handler, id=IDMNUFILEREMOVE)
1562 self.mnuFile.AppendSeparator()
1563 self.mnuBar.mnuFileDist = self.mnuFile.Append(IDMNUFILEDIST, "&Distribute ...", "Distribute")
1564 self.Bind(wx.EVT_MENU, self.mnuFileDist_handler, id=IDMNUFILEDIST)
1565 self.mnuBar.mnuFileRelocate = self.mnuFile.Append(IDMNUFILERELOCATE, "Re&locate ...", "Relocate")
1566 self.Bind(wx.EVT_MENU, self.mnuFileRelocate_handler, id=IDMNUFILERELOCATE)
1567 self.mnuBar.mnuFileCleanDB = self.mnuFile.Append(IDMNUFILECLEANDB, "Clean D&B", "Clean DB from old records.")
1568 self.Bind(wx.EVT_MENU, self.mnuFileCleanDB_handler, id=IDMNUFILECLEANDB)
1569 self.mnuFile.AppendSeparator()
1570 self.mnuBar.mnuFileTips = self.mnuFile.Append(IDMNUFILETIPS, "Show &tips", "Show tips window")
1571 self.Bind(wx.EVT_MENU, self.mnuFileTips_handler, id=IDMNUFILETIPS)
1572 self.mnuFile.AppendSeparator()
1573 self.mnuBar.mnuFileSaveOut = self.mnuFile.Append(IDMNUFILESAVEOUT, "Save &output ...", "Save PYBAG output")
1574 self.Bind(wx.EVT_MENU, self.mnuFileSaveOut_handler, id=IDMNUFILESAVEOUT)
1575 self.mnuFile.AppendSeparator()
1576 self.mnuBar.mnuFileExit = self.mnuFile.Append(IDMNUFILEEXIT, "E&xit", "Exit from PYBAG")
1577 self.Bind(wx.EVT_MENU, self.mnuFileExit_handler, id=IDMNUFILEEXIT)
1578 self.mnuBar.Append(self.mnuFile, "&File")
1579 self.mnuView = wx.Menu()
1580 self.mnuBar.mnuViewProp = self.mnuView.Append(IDMNUVIEWPROP, "Item &properties", "Show item properties")
1581 self.Bind(wx.EVT_MENU, self.mnuViewProp_handler, id=IDMNUVIEWPROP)
1582 self.mnuView.AppendSeparator()
1583 self.mnuBar.mnuViewOut = self.mnuView.Append(IDMNUVIEWOUT, "&Output", "Show/Hide PYBAG output", wx.ITEM_CHECK)
1584 self.Bind(wx.EVT_MENU, self.mnuViewOut_handler, id=IDMNUVIEWOUT)
1585 self.mnuBar.mnuViewClearout = self.mnuView.Append(IDMNUVIEWCLEAROUT, "&Clear output", "Clear output")
1586 self.Bind(wx.EVT_MENU, self.mnuViewClearout_handler, id=IDMNUVIEWCLEAROUT)
1587 self.mnuView.AppendSeparator()
1588 self.mnuBar.mnuViewEmul = self.mnuView.Append(IDMNUVIEWEMUL, "E&mulation", "Enable/Disable emulation mode.", wx.ITEM_CHECK)
1589 self.Bind(wx.EVT_MENU, self.mnuViewEmul_handler, id=IDMNUVIEWEMUL)
1590 self.mnuBar.mnuViewLogging = self.mnuView.Append(IDMNUVIEWLOGGING, "&Logging", "Enable/Disable logging", wx.ITEM_CHECK)
1591 self.Bind(wx.EVT_MENU, self.mnuViewLogging_handler, id=IDMNUVIEWLOGGING)
1592 self.mnuBar.mnuViewDebug = self.mnuView.Append(IDMNUVIEWDEBUG, "&Debug logging", "Enable/Disable debug logging", wx.ITEM_CHECK)
1593 self.Bind(wx.EVT_MENU, self.mnuViewDebug_handler, id=IDMNUVIEWDEBUG)
1594 mnuViewVerb = wx.Menu()
1595 self.mnuBar.mnuViewVerbNo = mnuViewVerb.Append(IDMNUVIEWVERBNO, "-1 - N&o output at all", "No output at all", wx.ITEM_RADIO)
1596 self.Bind(wx.EVT_MENU, self.mnuViewVerbNo_handler, id=IDMNUVIEWVERBNO)
1597 self.mnuBar.mnuViewVerb0 = mnuViewVerb.Append(IDMNUVIEWVERB0, "0 - &Global errors", "Only global errors", wx.ITEM_RADIO)
1598 self.Bind(wx.EVT_MENU, self.mnuViewVerb0_handler, id=IDMNUVIEWVERB0)
1599 self.mnuBar.mnuViewVerb1 = mnuViewVerb.Append(IDMNUVIEWVERB1, "1 - &Errors and success", "Output errors and success", wx.ITEM_RADIO)
1600 self.Bind(wx.EVT_MENU, self.mnuViewVerb1_handler, id=IDMNUVIEWVERB1)
1601 self.mnuBar.mnuViewVerb2 = mnuViewVerb.Append(IDMNUVIEWVERB2, "2 - Errors and &conflicts", "Output errors and conflicts", wx.ITEM_RADIO)
1602 self.Bind(wx.EVT_MENU, self.mnuViewVerb2_handler, id=IDMNUVIEWVERB2)
1603 self.mnuBar.mnuViewVerb3 = mnuViewVerb.Append(IDMNUVIEWVERB3, "3 - &Normal", "Show Errors, conflicts and warnings.", wx.ITEM_RADIO)
1604 self.Bind(wx.EVT_MENU, self.mnuViewVerb3_handler, id=IDMNUVIEWVERB3)
1605 self.mnuBar.mnuViewVerb4 = mnuViewVerb.Append(IDMNUVIEWVERB4, "4 - &Large", "As normal and show file processing", wx.ITEM_RADIO)
1606 self.Bind(wx.EVT_MENU, self.mnuViewVerb4_handler, id=IDMNUVIEWVERB4)
1607 self.mnuBar.mnuViewVerb5 = mnuViewVerb.Append(IDMNUVIEWVERB5, "5 - Logg&ing output", "Show logging output", wx.ITEM_RADIO)
1608 self.Bind(wx.EVT_MENU, self.mnuViewVerb5_handler, id=IDMNUVIEWVERB5)
1609 self.mnuView.AppendMenu(IDMNUVIEWVERB, "&Verbosity", mnuViewVerb, "")
1610 self.mnuBar.Append(self.mnuView, "&View")
1611 self.mnuRoots = wx.Menu()
1612 self.mnuBar.mnuRootsSelall = self.mnuRoots.Append(IDMNUROOTSSELALL, "&Select all roots", "Select all roots")
1613 self.Bind(wx.EVT_MENU, self.mnuRootsSelall_handler, id=IDMNUROOTSSELALL)
1614 self.mnuBar.mnuRootsUnselall = self.mnuRoots.Append(IDMNUROOTSUNSELALL, "&Unselect all roots", "Unselect all roots")
1615 self.Bind(wx.EVT_MENU, self.mnuRootsUnselall_handler, id=IDMNUROOTSUNSELALL)
1616 self.mnuBar.mnuRootsSeldef = self.mnuRoots.Append(IDMNUROOTSSELDEF, "Select &default", "Select &default")
1617 self.Bind(wx.EVT_MENU, self.mnuRootsSeldef_hundler, id=IDMNUROOTSSELDEF)
1618 self.mnuBar.Append(self.mnuRoots, "&Roots")
1619 self.mnuAction = wx.Menu()
1620 self.mnuBar.mnuActionBag = self.mnuAction.Append(IDMNUACTIONBAG, "Force to &bag", "Force to bag")
1621 self.Bind(wx.EVT_MENU, self.mnuActionBag_handler, id=IDMNUACTIONBAG)
1622 self.mnuBar.mnuActionOrig = self.mnuAction.Append(IDMNUACTIONORIG, "Force to &origin", "Force to origin")
1623 self.Bind(wx.EVT_MENU, self.mnuActionOrig_handler, id=IDMNUACTIONORIG)
1624 self.mnuBar.mnuActionDel = self.mnuAction.Append(IDMNUACTIONDEL, "Force &delete", "Force delete")
1625 self.Bind(wx.EVT_MENU, self.mnuActionDel_handler, id=IDMNUACTIONDEL)
1626 self.mnuBar.mnuActionUnch = self.mnuAction.Append(IDMNUACTIONUNCH, "Force &unchanged", "Force unchanged")
1627 self.Bind(wx.EVT_MENU, self.mnuActionUnch_handler, id=IDMNUACTIONUNCH)
1628 self.mnuBar.mnuActionRestore = self.mnuAction.Append(IDMNUACTIONRESTORE, "&Restore default action", "Restore default action")
1629 self.Bind(wx.EVT_MENU, self.mnuActionRestore_handler, id=IDMNUACTIONRESTORE)
1630 mnuActionTs = wx.Menu()
1631 self.mnuBar.mnuActionTsbag = mnuActionTs.Append(IDMNUACTIONTSBAG, "Time shift to &bag", "Use this item as template for time shift to bag")
1632 self.Bind(wx.EVT_MENU, self.mnuActionTsbag_handler, id=IDMNUACTIONTSBAG)
1633 self.mnuBar.mnuActionTsorig = mnuActionTs.Append(IDMNUACTIONTSORIG, "Time shift to &origin", "Use this item as template for time shift to origin")
1634 self.Bind(wx.EVT_MENU, self.mnuActionTsorig_handler, id=IDMNUACTIONTSORIG)
1635 self.mnuBar.mnuActionTsreset = mnuActionTs.Append(IDMNUACTIONTSRESET, "&Reset time shift", "Reset time shift")
1636 self.Bind(wx.EVT_MENU, self.mnuActionTsreset_handler, id=IDMNUACTIONTSRESET)
1637 self.mnuAction.AppendMenu(IDMNUACTIONTS, "&Time shift", mnuActionTs, "")
1638 self.mnuBar.Append(self.mnuAction, "&Action")
1639 self.mnuFilter = wx.Menu()
1640 self.mnuBar.mnuFilterOk = self.mnuFilter.Append(IDMNUFILTEROK, "Show OK s&ynchronization", "Show OK synchronization", wx.ITEM_CHECK)
1641 self.Bind(wx.EVT_MENU, self.mnuFilterOk_handler, id=IDMNUFILTEROK)
1642 self.mnuBar.mnuFilterWarn = self.mnuFilter.Append(IDMNUFILTERWARN, "Show &warnings", "Show warnings", wx.ITEM_CHECK)
1643 self.Bind(wx.EVT_MENU, self.mnuFilterWarn_handler, id=IDMNUFILTERWARN)
1644 self.mnuBar.mnuFilterConf = self.mnuFilter.Append(IDMNUFILTERCONF, "Show &conflicts", "Show conflicts", wx.ITEM_CHECK)
1645 self.Bind(wx.EVT_MENU, self.mnuFilterConf_handler, id=IDMNUFILTERCONF)
1646 self.mnuBar.mnuFilterErr = self.mnuFilter.Append(IDMNUFILTERERR, "Show &errors", "Show errors", wx.ITEM_CHECK)
1647 self.Bind(wx.EVT_MENU, self.mnuFilterErr_handler, id=IDMNUFILTERERR)
1648 self.mnuBar.mnuFilterBag = self.mnuFilter.Append(IDMNUFILTERBAG, "Show copied to &bag", "Show copied to bag", wx.ITEM_CHECK)
1649 self.Bind(wx.EVT_MENU, self.mnuFilterBag_handler, id=IDMNUFILTERBAG)
1650 self.mnuBar.mnuFilterOrig = self.mnuFilter.Append(IDMNUFILTERORIG, "Show copied to &origin", "Show copied to origin", wx.ITEM_CHECK)
1651 self.Bind(wx.EVT_MENU, self.mnuFilterOrig_handler, id=IDMNUFILTERORIG)
1652 self.mnuBar.mnuFilterNew = self.mnuFilter.Append(IDMNUFILTERNEW, "Show &new", "Show new", wx.ITEM_CHECK)
1653 self.Bind(wx.EVT_MENU, self.mnuFilterNew_handler, id=IDMNUFILTERNEW)
1654 self.mnuBar.mnuFilterCh = self.mnuFilter.Append(IDMNUFILTERCH, "Show c&hanged", "Show changed", wx.ITEM_CHECK)
1655 self.Bind(wx.EVT_MENU, self.mnuFilterCh_handler, id=IDMNUFILTERCH)
1656 self.mnuBar.mnuFilterDel = self.mnuFilter.Append(IDMNUFILTERDEL, "Show &deleted", "Show deleted", wx.ITEM_CHECK)
1657 self.Bind(wx.EVT_MENU, self.mnuFilterDel_handler, id=IDMNUFILTERDEL)
1658 self.mnuBar.mnuFilterIgn = self.mnuFilter.Append(IDMNUFILTERIGN, "Show &ignored", "Show ignored", wx.ITEM_CHECK)
1659 self.Bind(wx.EVT_MENU, self.mnuFilterIgn_handler, id=IDMNUFILTERIGN)
1660 self.mnuBar.mnuFilterUnch = self.mnuFilter.Append(IDMNUFILTERUNCH, "Show &unchanged", "Show unchanged", wx.ITEM_CHECK)
1661 self.Bind(wx.EVT_MENU, self.mnuFilterUnch_handler, id=IDMNUFILTERUNCH)
1662 self.mnuBar.mnuFilterForced = self.mnuFilter.Append(IDMNUFILTERFORCED, "Show &forced", "Show forced", wx.ITEM_CHECK)
1663 self.Bind(wx.EVT_MENU, self.mnuFilterForced_handler, id=IDMNUFILTERFORCED)
1664 self.mnuBar.mnuFilterFile = self.mnuFilter.Append(IDMNUFILTERFILE, "Show files &1", "Show files", wx.ITEM_CHECK)
1665 self.Bind(wx.EVT_MENU, self.mnuFilterFile_handler, id=IDMNUFILTERFILE)
1666 self.mnuBar.mnuFilterDir = self.mnuFilter.Append(IDMNUFILTERDIR, "Show directories &2", "Show directories", wx.ITEM_CHECK)
1667 self.Bind(wx.EVT_MENU, self.mnuFilterDir_handler, id=IDMNUFILTERDIR)
1668 self.mnuBar.mnuFilterSym = self.mnuFilter.Append(IDMNUFILTERSYM, "Show symlinks &3", "Show symlinks", wx.ITEM_CHECK)
1669 self.Bind(wx.EVT_MENU, self.mnuFilterSym_handler, id=IDMNUFILTERSYM)
1670 self.mnuBar.mnuFilterUnk = self.mnuFilter.Append(IDMNUFILTERUNK, "Show unknown &4", "Show unknown items", wx.ITEM_CHECK)
1671 self.Bind(wx.EVT_MENU, self.mnuFilterUnk_handler, id=IDMNUFILTERUNK)
1672 self.mnuBar.mnuFilterTs = self.mnuFilter.Append(IDMNUFILTERTS, "Show &time shifted items", "Show time shifted items", wx.ITEM_CHECK)
1673 self.Bind(wx.EVT_MENU, self.mnuFilterTs_handler, id=IDMNUFILTERTS)
1674 self.mnuBar.Append(self.mnuFilter, "Fi<er")
1675 self.mnuOptions = wx.Menu()
1676 self.mnuBar.mnuOptionsStat = self.mnuOptions.Append(IDMNUOPTIONSSTAT, "&Statistics ...", "Show statistics about roots.")
1677 self.Bind(wx.EVT_MENU, self.mnuOptionsStat_handler, id=IDMNUOPTIONSSTAT)
1678 self.mnuOptions.AppendSeparator()
1679 self.mnuBar.mnuOptionsPrefs = self.mnuOptions.Append(IDMNUOPTIONSPREFS, "&Preferences ...", "Preferences")
1680 self.Bind(wx.EVT_MENU, self.mnuOptionsPrefs_handler, id=IDMNUOPTIONSPREFS)
1681 self.mnuBar.Append(self.mnuOptions, "&Options")
1682 self.mnuHelp = wx.Menu()
1683 self.mnuBar.mnuHelpAbout = self.mnuHelp.Append(IDMNUHELPABOUT, "&About", "About")
1684 self.Bind(wx.EVT_MENU, self.mnuHelpAbout_handler, id=IDMNUHELPABOUT)
1685 self.mnuBar.mnuHelpUsage = self.mnuHelp.Append(IDMNUHELPUSAGE, "&Usage", "Show usage info")
1686 self.Bind(wx.EVT_MENU, self.mnuHelpUsage_handler, id=IDMNUHELPUSAGE)
1687 self.mnuBar.mnuAboutLicense = self.mnuHelp.Append(IDMNUABOUTLICENSE, "&License", "Show license information.")
1688 self.Bind(wx.EVT_MENU, self.mnuAboutLicense_handler, id=IDMNUABOUTLICENSE)
1689 self.mnuBar.Append(self.mnuHelp, "&Help")
1690 self.SetMenuBar(self.mnuBar)
1691
1692 self.sbarSBar = self.CreateStatusBar(1, wx.ST_SIZEGRIP)
1693
1694
1695 self.tBar = wx.ToolBar(self, -1)
1696 self.SetToolBar(self.tBar)
1697 global IDTOOLCOMPARE; IDTOOLCOMPARE = wx.NewId()
1698 global IDTOOLSYNC; IDTOOLSYNC = wx.NewId()
1699 global IDTOOLFILTEROK; IDTOOLFILTEROK = wx.NewId()
1700 global IDTOOLFILTERWARN; IDTOOLFILTERWARN = wx.NewId()
1701 global IDTOOLFILTERCONF; IDTOOLFILTERCONF = wx.NewId()
1702 global IDTOOLFILTERERR; IDTOOLFILTERERR = wx.NewId()
1703 global IDTOOLFILTERBAG; IDTOOLFILTERBAG = wx.NewId()
1704 global IDTOOLFILTERORIG; IDTOOLFILTERORIG = wx.NewId()
1705 global IDTOOLFILTERNEW; IDTOOLFILTERNEW = wx.NewId()
1706 global IDTOOLFILTERCHANGED; IDTOOLFILTERCHANGED = wx.NewId()
1707 global IDTOOLFILTERDELETE; IDTOOLFILTERDELETE = wx.NewId()
1708 global IDTOOLFILTERIGNORED; IDTOOLFILTERIGNORED = wx.NewId()
1709 global IDTOOLFILTERUNCH; IDTOOLFILTERUNCH = wx.NewId()
1710 global IDTOOLFILTERFORCED; IDTOOLFILTERFORCED = wx.NewId()
1711 global IDTOOLFILTERFILE; IDTOOLFILTERFILE = wx.NewId()
1712 global IDTOOLFILTERDIR; IDTOOLFILTERDIR = wx.NewId()
1713 global IDTOOLFILTERSYM; IDTOOLFILTERSYM = wx.NewId()
1714 global IDTOOLFILTERUNK; IDTOOLFILTERUNK = wx.NewId()
1715 global IDTOOLFILTERTS; IDTOOLFILTERTS = wx.NewId()
1716 global IDTOOLFORCEUNCHANGED; IDTOOLFORCEUNCHANGED = wx.NewId()
1717 global IDTOOLFORCEBAG; IDTOOLFORCEBAG = wx.NewId()
1718 global IDTOOLFORCEORIG; IDTOOLFORCEORIG = wx.NewId()
1719 global IDTOOLFORCEDEL; IDTOOLFORCEDEL = wx.NewId()
1720 global IDTOOLFORCERESTORE; IDTOOLFORCERESTORE = wx.NewId()
1721 self.tBar.AddLabelTool(IDTOOLCOMPARE, "Compare", catalog['compare'].getBitmap(), wx.NullBitmap, wx.ITEM_NORMAL, "Compare files", "Compare files")
1722 self.tBar.AddLabelTool(IDTOOLSYNC, "Sync", catalog['sync'].getBitmap(), wx.NullBitmap, wx.ITEM_NORMAL, "Synchronize files", "Synchronize files")
1723 self.tBar.AddSeparator()
1724 self.tBar.AddLabelTool(IDTOOLFILTEROK, "FilterOk", catalog['ok'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter OK synchronization", "Show OK synchronization")
1725 self.tBar.AddLabelTool(IDTOOLFILTERWARN, "FilterWarn", catalog['warn'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter Warning", "Show warnings")
1726 self.tBar.AddLabelTool(IDTOOLFILTERCONF, "FilterConf", catalog['conf'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter conflicts", "Show conflicts")
1727 self.tBar.AddLabelTool(IDTOOLFILTERERR, "FilterErr", catalog['err'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter errors", "Show errors")
1728 self.tBar.AddLabelTool(IDTOOLFILTERBAG, "FilterBag", catalog['bag'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter bag", "Show to bag")
1729 self.tBar.AddLabelTool(IDTOOLFILTERORIG, "FilterOrigin", catalog['orig'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter origin", "Show to origin")
1730 self.tBar.AddLabelTool(IDTOOLFILTERNEW, "FilterNew", catalog['new'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter new", "Show new items")
1731 self.tBar.AddLabelTool(IDTOOLFILTERCHANGED, "FilterChanged", catalog['changed'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter changed", "Show changed items")
1732 self.tBar.AddLabelTool(IDTOOLFILTERDELETE, "FilterDelete", catalog['del'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter delete", "Show deleted items")
1733 self.tBar.AddLabelTool(IDTOOLFILTERIGNORED, "FilterIgnored", catalog['ign'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter ignored", "Show ignored items")
1734 self.tBar.AddLabelTool(IDTOOLFILTERUNCH, "FilterUnch", catalog['unch'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter unchanged", "Show unchanged items")
1735 self.tBar.AddLabelTool(IDTOOLFILTERFORCED, "FilterForced", catalog['forced'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter forced", "Show forced items")
1736 self.tBar.AddLabelTool(IDTOOLFILTERFILE, "FilterFile", catalog['file'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter file", "Show files")
1737 self.tBar.AddLabelTool(IDTOOLFILTERDIR, "FilterDir", catalog['dir'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter directory", "Show directories")
1738 self.tBar.AddLabelTool(IDTOOLFILTERSYM, "FilterSym", catalog['sym'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter symlink", "Show symlinks")
1739 self.tBar.AddLabelTool(IDTOOLFILTERUNK, "FilterUnk", catalog['unk'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter unknown items", "Show unknown items")
1740 self.tBar.AddLabelTool(IDTOOLFILTERTS, "FilterTs", catalog['ts'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter time shifted items", "Show time shifted items")
1741 self.tBar.AddSeparator()
1742 self.tBar.AddLabelTool(IDTOOLFORCEUNCHANGED, "ForceUnchanged", catalog['unchforced'].getBitmap(), wx.BitmapFromImage(catalog['unchforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force unchanged", "Do not synchronize file")
1743 self.tBar.AddLabelTool(IDTOOLFORCEBAG, "ForceBag", catalog['bagforced'].getBitmap(), wx.BitmapFromImage(catalog['bagforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force to bag", "Force to bag")
1744 self.tBar.AddLabelTool(IDTOOLFORCEORIG, "ForceOrigin", catalog['origforced'].getBitmap(), wx.BitmapFromImage(catalog['origforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force to origin", "Force to origin")
1745 self.tBar.AddLabelTool(IDTOOLFORCEDEL, "ForceDel", catalog['delforced'].getBitmap(), wx.BitmapFromImage(catalog['delforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force delete", "Force delete")
1746 self.tBar.AddLabelTool(IDTOOLFORCERESTORE, "ForceRestore", catalog['restore'].getBitmap(), wx.BitmapFromImage(catalog['restore'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Restore", "Restore comparision result")
1747
1748 global IDSPLITTER; IDSPLITTER = wx.NewId()
1749 self.Splitter = wx.SplitterWindow(self, IDSPLITTER, style=wx.SP_3D | wx.SP_BORDER | wx.SP_LIVE_UPDATE | wx.SP_PERMIT_UNSPLIT)
1750
1751 self.splitPanel1 = wx.Panel(self.Splitter, wx.ID_ANY)
1752 global IDCLBOXROOTS; IDCLBOXROOTS = wx.NewId()
1753 self.clboxRoots = wx.CheckListBox(self.splitPanel1, IDCLBOXROOTS, choices=[], style=wx.LB_ALWAYS_SB | wx.LB_EXTENDED | wx.LB_SORT)
1754 global IDBTNSELECTROOTS; IDBTNSELECTROOTS = wx.NewId()
1755 self.btnSelectRoots = wx.Button(self.splitPanel1, IDBTNSELECTROOTS, "Select All")
1756 self.label_4 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Auto Conflict:")
1757 global IDCBOXAUTOACTION; IDCBOXAUTOACTION = wx.NewId()
1758 self.cboxAutoAction = wx.ComboBox(self.splitPanel1, IDCBOXAUTOACTION, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY)
1759 self.label_5 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Verbosity:")
1760 global IDCBOXVERBOSITY; IDCBOXVERBOSITY = wx.NewId()
1761 self.cboxVerbosity = wx.ComboBox(self.splitPanel1, IDCBOXVERBOSITY, choices=["-1 - Not at all", "0 - Only global errors", "1 - Errors and success", "2 - Errors and conflicts", "3 - Normal output (errors, conflicts, warnings)", "4 - Large output (as 3 and file operations)", "5 - Logging output"], style=wx.CB_DROPDOWN | wx.CB_READONLY)
1762 global IDCHBOXEMUL; IDCHBOXEMUL = wx.NewId()
1763 self.chboxEmul = wx.CheckBox(self.splitPanel1, IDCHBOXEMUL, "Emulation")
1764 global IDCHBOXLOGGING; IDCHBOXLOGGING = wx.NewId()
1765 self.chboxLogging = wx.CheckBox(self.splitPanel1, IDCHBOXLOGGING, "Logging")
1766 global IDCHBOXDEBUG; IDCHBOXDEBUG = wx.NewId()
1767 self.chboxDebug = wx.CheckBox(self.splitPanel1, IDCHBOXDEBUG, "Debug logging")
1768 self.label_7 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Modify date delta")
1769 global IDSPINMDDELTA; IDSPINMDDELTA = wx.NewId()
1770 self.spinMDDELTA = wx.SpinCtrl(self.splitPanel1, IDSPINMDDELTA, "5", min=0, max=10000)
1771 self.chboxBackupMode = wx.CheckBox(self.splitPanel1, wx.ID_ANY, "Backup full synch")
1772 self.label_19 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Time shift", style=wx.ALIGN_CENTER)
1773 self.lblTsDir = wx.StaticText(self.splitPanel1, wx.ID_ANY, "None", style=wx.ALIGN_CENTER)
1774 self.lblTsValueBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "b:0.0", style=wx.ALIGN_CENTER)
1775 self.lblTsValueOrigin = wx.StaticText(self.splitPanel1, wx.ID_ANY, "o:0.0", style=wx.ALIGN_CENTER)
1776 self.label_18 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Path filter (wilds, !regexp):", style=wx.ALIGN_CENTER)
1777 self.txtFilter = wx.TextCtrl(self.splitPanel1, wx.ID_ANY, "*", style=wx.TE_PROCESS_ENTER)
1778 self.btnFilterRefresh = wx.Button(self.splitPanel1, wx.ID_ANY, "Refresh list")
1779 global IDLISTFILES; IDLISTFILES = wx.NewId()
1780 self.listFiles = PyBAGListCtrl_class(self.splitPanel1, IDLISTFILES, style=wx.BORDER_STATIC | wx.LC_HRULES | wx.LC_REPORT | wx.LC_VIRTUAL | wx.LC_VRULES)
1781 self.lblErrors = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Errors: 100")
1782 self.lblConflicts = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Conflicts: 100")
1783 self.lblWarnings = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Warnings: 100")
1784 self.lblAllItems = wx.StaticText(self.splitPanel1, wx.ID_ANY, "All items: 100")
1785 self.lblNewBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "New in bag: 100")
1786 self.lblNewOrig = wx.StaticText(self.splitPanel1, wx.ID_ANY, "New in origin: 100")
1787 self.lblChangeBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Changed in bag: 100")
1788 self.lblChangeOrig = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Changed in origin: 100")
1789 self.lblDelBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Deleted in bag: 100")
1790 self.lblDelOrig = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Deleted in origin: 100")
1791 self.lblIgnored = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Ignored: 100")
1792 self.lblTimeshifted = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Timeshifted: 100")
1793 self.static_line_1 = wx.StaticLine(self.splitPanel1, wx.ID_ANY)
1794 self.label_1 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "File:")
1795 self.txtFile = wx.TextCtrl(self.splitPanel1, wx.ID_ANY, "", style=wx.BORDER_NONE | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP)
1796 self.label_2 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Desc:")
1797 self.txtDesc = wx.TextCtrl(self.splitPanel1, wx.ID_ANY, "", style=wx.BORDER_NONE | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP)
1798 self.splitPanel2 = wx.Panel(self.Splitter, wx.ID_ANY, style=wx.BORDER_SIMPLE | wx.TAB_TRAVERSAL)
1799 global IDBTNCLEAR; IDBTNCLEAR = wx.NewId()
1800 self.btnClear_copy = wx.Button(self.splitPanel2, IDBTNCLEAR, "Clear")
1801 global IDTXTOUT; IDTXTOUT = wx.NewId()
1802 self.txtOut = wx.TextCtrl(self.splitPanel2, IDTXTOUT, "", style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH | wx.TE_WORDWRAP)
1803
1804 self.__set_properties()
1805 self.__do_layout()
1806
1807 self.Bind(wx.EVT_TOOL, self.tBarCompare_handler, id=IDTOOLCOMPARE)
1808 self.Bind(wx.EVT_TOOL, self.tBarSync_handler, id=IDTOOLSYNC)
1809 self.Bind(wx.EVT_TOOL, self.mnuFilterOk_handler, id=IDTOOLFILTEROK)
1810 self.Bind(wx.EVT_TOOL, self.mnuFilterWarn_handler, id=IDTOOLFILTERWARN)
1811 self.Bind(wx.EVT_TOOL, self.mnuFilterConf_handler, id=IDTOOLFILTERCONF)
1812 self.Bind(wx.EVT_TOOL, self.mnuFilterErr_handler, id=IDTOOLFILTERERR)
1813 self.Bind(wx.EVT_TOOL, self.mnuFilterBag_handler, id=IDTOOLFILTERBAG)
1814 self.Bind(wx.EVT_TOOL, self.mnuFilterOrig_handler, id=IDTOOLFILTERORIG)
1815 self.Bind(wx.EVT_TOOL, self.mnuFilterNew_handler, id=IDTOOLFILTERNEW)
1816 self.Bind(wx.EVT_TOOL, self.mnuFilterCh_handler, id=IDTOOLFILTERCHANGED)
1817 self.Bind(wx.EVT_TOOL, self.mnuFilterDel_handler, id=IDTOOLFILTERDELETE)
1818 self.Bind(wx.EVT_TOOL, self.mnuFilterIgn_handler, id=IDTOOLFILTERIGNORED)
1819 self.Bind(wx.EVT_TOOL, self.mnuFilterUnch_handler, id=IDTOOLFILTERUNCH)
1820 self.Bind(wx.EVT_TOOL, self.mnuFilterForced_handler, id=IDTOOLFILTERFORCED)
1821 self.Bind(wx.EVT_TOOL, self.mnuFilterFile_handler, id=IDTOOLFILTERFILE)
1822 self.Bind(wx.EVT_TOOL, self.mnuFilterDir_handler, id=IDTOOLFILTERDIR)
1823 self.Bind(wx.EVT_TOOL, self.mnuFilterSym_handler, id=IDTOOLFILTERSYM)
1824 self.Bind(wx.EVT_TOOL, self.mnuFilterUnk_handler, id=IDTOOLFILTERUNK)
1825 self.Bind(wx.EVT_TOOL, self.mnuFilterTs_handler, id=IDTOOLFILTERTS)
1826 self.Bind(wx.EVT_TOOL, self.tBarForceUnchanged_handler, id=IDTOOLFORCEUNCHANGED)
1827 self.Bind(wx.EVT_TOOL, self.tBarForceBag_handler, id=IDTOOLFORCEBAG)
1828 self.Bind(wx.EVT_TOOL, self.tBarForceOrig_handler, id=IDTOOLFORCEORIG)
1829 self.Bind(wx.EVT_TOOL, self.tBarForceDel_handler, id=IDTOOLFORCEDEL)
1830 self.Bind(wx.EVT_TOOL, self.tBarForceRestore_handler, id=IDTOOLFORCERESTORE)
1831 self.Bind(wx.EVT_BUTTON, self.btnSelectRoots_handler, self.btnSelectRoots)
1832 self.Bind(wx.EVT_COMBOBOX, self.cboxAutoAction_handler, self.cboxAutoAction)
1833 self.Bind(wx.EVT_COMBOBOX, self.cboxVerbosity_handler, self.cboxVerbosity)
1834 self.Bind(wx.EVT_CHECKBOX, self.chboxEmul_handler, self.chboxEmul)
1835 self.Bind(wx.EVT_CHECKBOX, self.chboxLogging_handler, self.chboxLogging)
1836 self.Bind(wx.EVT_CHECKBOX, self.chboxDebug_handler, self.chboxDebug)
1837 self.Bind(wx.EVT_SPINCTRL, self.spinMDDELTA_handler, self.spinMDDELTA)
1838 self.Bind(wx.EVT_CHECKBOX, self.chboxBackupMode_handler, self.chboxBackupMode)
1839 self.Bind(wx.EVT_TEXT, self.txtFilter_text_handler, self.txtFilter)
1840 self.Bind(wx.EVT_TEXT_ENTER, self.txtFilter_enter_handler, self.txtFilter)
1841 self.Bind(wx.EVT_BUTTON, self.btnFilterRefresh_handler, self.btnFilterRefresh)
1842 self.Bind(wx.EVT_LIST_COL_CLICK, self.listFiles_col_click_handler, self.listFiles)
1843 self.Bind(wx.EVT_LIST_COL_END_DRAG, self.listFiles_col_end_drag_handler, self.listFiles)
1844 self.Bind(wx.EVT_LIST_COL_RIGHT_CLICK, self.listFiles_col_rclick_handler, self.listFiles)
1845 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.listFiles_item_activated_handler, self.listFiles)
1846 self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.listFiles_item_rclick_handler, self.listFiles)
1847 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.listFiles_item_selected_handler, self.listFiles)
1848 self.Bind(wx.EVT_BUTTON, self.btnClear_handler, self.btnClear_copy)
1849 self.Bind(wx.EVT_SPLITTER_DCLICK, self.Splitter_dclick_handler, self.Splitter)
1850
1851
1852
1853 self.Bind(wx.EVT_CLOSE, self.frmMain_Close_handler)
1854
1855 self.colidrclicked = -1
1856
1857
1858 global IDMNUCTXRCOLLEFT; IDMNUCTXRCOLLEFT = wx.NewId()
1859 global IDMNUCTXRCOLRIGHT; IDMNUCTXRCOLRIGHT = wx.NewId()
1860 global IDMNUCTXRCOLERR; IDMNUCTXRCOLERR = wx.NewId()
1861 global IDMNUCTXRCOLSTATEICON; IDMNUCTXRCOLSTATEICON = wx.NewId()
1862 global IDMNUCTXRCOLACTIONICON; IDMNUCTXRCOLACTIONICON = wx.NewId()
1863 global IDMNUCTXRCOLFORCED; IDMNUCTXRCOLFORCED = wx.NewId()
1864 global IDMNUCTXRCOLDIR; IDMNUCTXRCOLDIR = wx.NewId()
1865 global IDMNUCTXRCOLPATH; IDMNUCTXRCOLPATH = wx.NewId()
1866 global IDMNUCTXRCOLDESC; IDMNUCTXRCOLDESC = wx.NewId()
1867 global IDMNUCTXRCOLTYPE; IDMNUCTXRCOLTYPE = wx.NewId()
1868 global IDMNUCTXRCOLMDATEDB; IDMNUCTXRCOLMDATEDB = wx.NewId()
1869 global IDMNUCTXRCOLGMDATEDB; IDMNUCTXRCOLGMDATEDB = wx.NewId()
1870 global IDMNUCTXRCOLLMDATEDB; IDMNUCTXRCOLLMDATEDB = wx.NewId()
1871 global IDMNUCTXRCOLCRC32DB; IDMNUCTXRCOLCRC32DB = wx.NewId()
1872 global IDMNUCTXRCOLSIZEDB; IDMNUCTXRCOLSIZEDB = wx.NewId()
1873 global IDMNUCTXRCOLMDATEBAG; IDMNUCTXRCOLMDATEBAG = wx.NewId()
1874 global IDMNUCTXRCOLGMDATEBAG; IDMNUCTXRCOLGMDATEBAG = wx.NewId()
1875 global IDMNUCTXRCOLLMDATEBAG; IDMNUCTXRCOLLMDATEBAG = wx.NewId()
1876 global IDMNUCTXRCOLCRC32BAG; IDMNUCTXRCOLCRC32BAG = wx.NewId()
1877 global IDMNUCTXRCOLSIZEBAG; IDMNUCTXRCOLSIZEBAG = wx.NewId()
1878 global IDMNUCTXRCOLMDATEORIG; IDMNUCTXRCOLMDATEORIG = wx.NewId()
1879 global IDMNUCTXRCOLGMDATEORIG; IDMNUCTXRCOLGMDATEORIG = wx.NewId()
1880 global IDMNUCTXRCOLLMDATEORIG; IDMNUCTXRCOLLMDATEORIG = wx.NewId()
1881 global IDMNUCTXRCOLCRC32ORIG; IDMNUCTXRCOLCRC32ORIG = wx.NewId()
1882 global IDMNUCTXRCOLSIZEORIG; IDMNUCTXRCOLSIZEORIG = wx.NewId()
1883 global IDMNUCTXRCOLSYMLINKDB; IDMNUCTXRCOLSYMLINKDB = wx.NewId()
1884 global IDMNUCTXRCOLSYMLINKBAG; IDMNUCTXRCOLSYMLINKBAG = wx.NewId()
1885 global IDMNUCTXRCOLSYMLINKORIG; IDMNUCTXRCOLSYMLINKORIG = wx.NewId()
1886 global IDMNUCTXRCOLTS; IDMNUCTXRCOLTS = wx.NewId()
1887 global IDMNUCTXRCOLDEFAULT; IDMNUCTXRCOLDEFAULT = wx.NewId()
1888
1889 self.mnuctxrcol = wx.Menu()
1890 self.mnuctxrcolLeft = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLEFT, "To left", "Move column left", wx.ITEM_NORMAL)
1891 self.mnuctxrcol.AppendItem(self.mnuctxrcolLeft)
1892 self.Bind(wx.EVT_MENU, self.mnuctxrcolLeft_handler, self.mnuctxrcolLeft)
1893
1894 self.mnuctxrcolRight = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLRIGHT, "To right", "Move column right", wx.ITEM_NORMAL)
1895 self.mnuctxrcol.AppendItem(self.mnuctxrcolRight)
1896 self.Bind(wx.EVT_MENU, self.mnuctxrcolRight_handler, self.mnuctxrcolRight)
1897 self.mnuctxrcol.AppendSeparator()
1898
1899 self.mnuctxrcolErr = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLERR, "Error", "Show/hide column", wx.ITEM_CHECK)
1900 self.mnuctxrcol.AppendItem(self.mnuctxrcolErr)
1901 self.Bind(wx.EVT_MENU, self.mnuctxrcolErr_handler, self.mnuctxrcolErr)
1902 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolErr_updateui, self.mnuctxrcolErr)
1903
1904 self.mnuctxrcolStateicon = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSTATEICON, "State", "Show/hide column", wx.ITEM_CHECK)
1905 self.mnuctxrcol.AppendItem(self.mnuctxrcolStateicon)
1906 self.Bind(wx.EVT_MENU, self.mnuctxrcolStateicon_handler, self.mnuctxrcolStateicon)
1907 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolStateicon_updateui, self.mnuctxrcolStateicon)
1908
1909 self.mnuctxrcolActionicon = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLACTIONICON, "Action", "Show/hide column", wx.ITEM_CHECK)
1910 self.mnuctxrcol.AppendItem(self.mnuctxrcolActionicon)
1911 self.Bind(wx.EVT_MENU, self.mnuctxrcolActionicon_handler, self.mnuctxrcolActionicon)
1912 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolActionicon_updateui, self.mnuctxrcolActionicon)
1913
1914 self.mnuctxrcolForced = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLFORCED, "Forced", "Show/hide column", wx.ITEM_CHECK)
1915 self.mnuctxrcol.AppendItem(self.mnuctxrcolForced)
1916 self.Bind(wx.EVT_MENU, self.mnuctxrcolForced_handler, self.mnuctxrcolForced)
1917 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolForced_updateui, self.mnuctxrcolForced)
1918
1919 self.mnuctxrcolDir = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLDIR, "Dir", "Show/hide column", wx.ITEM_CHECK)
1920 self.mnuctxrcol.AppendItem(self.mnuctxrcolDir)
1921 self.Bind(wx.EVT_MENU, self.mnuctxrcolDir_handler, self.mnuctxrcolDir)
1922 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolDir_updateui, self.mnuctxrcolDir)
1923
1924 self.mnuctxrcolPath = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLPATH, "Path", "Show/hide column", wx.ITEM_CHECK)
1925 self.mnuctxrcol.AppendItem(self.mnuctxrcolPath)
1926 self.Bind(wx.EVT_MENU, self.mnuctxrcolPath_handler, self.mnuctxrcolPath)
1927 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolPath_updateui, self.mnuctxrcolPath)
1928
1929 self.mnuctxrcolDesc = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLDESC, "Description", "Show/hide column", wx.ITEM_CHECK)
1930 self.mnuctxrcol.AppendItem(self.mnuctxrcolDesc)
1931 self.Bind(wx.EVT_MENU, self.mnuctxrcolDesc_handler, self.mnuctxrcolDesc)
1932 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolDesc_updateui, self.mnuctxrcolDesc)
1933
1934 self.mnuctxrcolType = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLTYPE, "Type", "Show/hide column", wx.ITEM_CHECK)
1935 self.mnuctxrcol.AppendItem(self.mnuctxrcolType)
1936 self.Bind(wx.EVT_MENU, self.mnuctxrcolType_handler, self.mnuctxrcolType)
1937 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolType_updateui, self.mnuctxrcolType)
1938
1939 self.mnuctxrcolMdatedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLMDATEDB, "MDate DB", "Show/hide column", wx.ITEM_CHECK)
1940 self.mnuctxrcol.AppendItem(self.mnuctxrcolMdatedb)
1941 self.Bind(wx.EVT_MENU, self.mnuctxrcolMdatedb_handler, self.mnuctxrcolMdatedb)
1942 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolMdatedb_updateui, self.mnuctxrcolMdatedb)
1943
1944 self.mnuctxrcolGMdatedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLGMDATEDB, "GMT Date DB", "Show/hide column", wx.ITEM_CHECK)
1945 self.mnuctxrcol.AppendItem(self.mnuctxrcolGMdatedb)
1946 self.Bind(wx.EVT_MENU, self.mnuctxrcolGMdatedb_handler, self.mnuctxrcolGMdatedb)
1947 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolGMdatedb_updateui, self.mnuctxrcolGMdatedb)
1948
1949 self.mnuctxrcolLMdatedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLMDATEDB, "Local Date DB", "Show/hide column", wx.ITEM_CHECK)
1950 self.mnuctxrcol.AppendItem(self.mnuctxrcolLMdatedb)
1951 self.Bind(wx.EVT_MENU, self.mnuctxrcolLMdatedb_handler, self.mnuctxrcolLMdatedb)
1952 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolLMdatedb_updateui, self.mnuctxrcolLMdatedb)
1953
1954 self.mnuctxrcolCrc32db = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLCRC32DB, "CRC32 DB", "Show/hide column", wx.ITEM_CHECK)
1955 self.mnuctxrcol.AppendItem(self.mnuctxrcolCrc32db)
1956 self.Bind(wx.EVT_MENU, self.mnuctxrcolCrc32db_handler, self.mnuctxrcolCrc32db)
1957 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolCrc32db_updateui, self.mnuctxrcolCrc32db)
1958
1959 self.mnuctxrcolSizedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSIZEDB, "Size DB", "Show/hide column", wx.ITEM_CHECK)
1960 self.mnuctxrcol.AppendItem(self.mnuctxrcolSizedb)
1961 self.Bind(wx.EVT_MENU, self.mnuctxrcolSizedb_handler, self.mnuctxrcolSizedb)
1962 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSizedb_updateui, self.mnuctxrcolSizedb)
1963
1964 self.mnuctxrcolMdatebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLMDATEBAG, "MDate bag", "Show/hide column", wx.ITEM_CHECK)
1965 self.mnuctxrcol.AppendItem(self.mnuctxrcolMdatebag)
1966 self.Bind(wx.EVT_MENU, self.mnuctxrcolMdatebag_handler, self.mnuctxrcolMdatebag)
1967 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolMdatebag_updateui, self.mnuctxrcolMdatebag)
1968
1969 self.mnuctxrcolGMdatebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLGMDATEBAG, "GMT Date bag", "Show/hide column", wx.ITEM_CHECK)
1970 self.mnuctxrcol.AppendItem(self.mnuctxrcolGMdatebag)
1971 self.Bind(wx.EVT_MENU, self.mnuctxrcolGMdatebag_handler, self.mnuctxrcolGMdatebag)
1972 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolGMdatebag_updateui, self.mnuctxrcolGMdatebag)
1973
1974 self.mnuctxrcolLMdatebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLMDATEBAG, "Locale Date bag", "Show/hide column", wx.ITEM_CHECK)
1975 self.mnuctxrcol.AppendItem(self.mnuctxrcolLMdatebag)
1976 self.Bind(wx.EVT_MENU, self.mnuctxrcolLMdatebag_handler, self.mnuctxrcolLMdatebag)
1977 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolLMdatebag_updateui, self.mnuctxrcolLMdatebag)
1978
1979 self.mnuctxrcolCrc32bag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLCRC32BAG, "CRC32 bag", "Show/hide column", wx.ITEM_CHECK)
1980 self.mnuctxrcol.AppendItem(self.mnuctxrcolCrc32bag)
1981 self.Bind(wx.EVT_MENU, self.mnuctxrcolCrc32bag_handler, self.mnuctxrcolCrc32bag)
1982 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolCrc32bag_updateui, self.mnuctxrcolCrc32bag)
1983
1984 self.mnuctxrcolSizebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSIZEBAG, "Size bag", "Show/hide column", wx.ITEM_CHECK)
1985 self.mnuctxrcol.AppendItem(self.mnuctxrcolSizebag)
1986 self.Bind(wx.EVT_MENU, self.mnuctxrcolSizebag_handler, self.mnuctxrcolSizebag)
1987 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSizebag_updateui, self.mnuctxrcolSizebag)
1988
1989 self.mnuctxrcolMdateorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLMDATEORIG, "MDate origin", "Show/hide column", wx.ITEM_CHECK)
1990 self.mnuctxrcol.AppendItem(self.mnuctxrcolMdateorig)
1991 self.Bind(wx.EVT_MENU, self.mnuctxrcolMdateorig_handler, self.mnuctxrcolMdateorig)
1992 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolMdateorig_updateui, self.mnuctxrcolMdateorig)
1993
1994 self.mnuctxrcolGMdateorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLGMDATEORIG, "GMT Date origin", "Show/hide column", wx.ITEM_CHECK)
1995 self.mnuctxrcol.AppendItem(self.mnuctxrcolGMdateorig)
1996 self.Bind(wx.EVT_MENU, self.mnuctxrcolGMdateorig_handler, self.mnuctxrcolGMdateorig)
1997 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolGMdateorig_updateui, self.mnuctxrcolGMdateorig)
1998
1999 self.mnuctxrcolLMdateorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLMDATEORIG, "Locale Date origin", "Show/hide column", wx.ITEM_CHECK)
2000 self.mnuctxrcol.AppendItem(self.mnuctxrcolLMdateorig)
2001 self.Bind(wx.EVT_MENU, self.mnuctxrcolLMdateorig_handler, self.mnuctxrcolLMdateorig)
2002 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolLMdateorig_updateui, self.mnuctxrcolLMdateorig)
2003
2004 self.mnuctxrcolCrc32orig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLCRC32ORIG, "CRC32 origin", "Show/hide column", wx.ITEM_CHECK)
2005 self.mnuctxrcol.AppendItem(self.mnuctxrcolCrc32orig)
2006 self.Bind(wx.EVT_MENU, self.mnuctxrcolCrc32orig_handler, self.mnuctxrcolCrc32orig)
2007 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolCrc32orig_updateui, self.mnuctxrcolCrc32orig)
2008
2009 self.mnuctxrcolSizeorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSIZEORIG, "Size origin", "Show/hide column", wx.ITEM_CHECK)
2010 self.mnuctxrcol.AppendItem(self.mnuctxrcolSizeorig)
2011 self.Bind(wx.EVT_MENU, self.mnuctxrcolSizeorig_handler, self.mnuctxrcolSizeorig)
2012 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSizeorig_updateui, self.mnuctxrcolSizeorig)
2013
2014 self.mnuctxrcolSymlinkdb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSYMLINKDB, "Symlink DB", "Show/hide column", wx.ITEM_CHECK)
2015 self.mnuctxrcol.AppendItem(self.mnuctxrcolSymlinkdb)
2016 self.Bind(wx.EVT_MENU, self.mnuctxrcolSymlinkdb_handler, self.mnuctxrcolSymlinkdb)
2017 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSymlinkdb_updateui, self.mnuctxrcolSymlinkdb)
2018
2019 self.mnuctxrcolSymlinkbag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSYMLINKBAG, "Symlink bag", "Show/hide column", wx.ITEM_CHECK)
2020 self.mnuctxrcol.AppendItem(self.mnuctxrcolSymlinkbag)
2021 self.Bind(wx.EVT_MENU, self.mnuctxrcolSymlinkbag_handler, self.mnuctxrcolSymlinkbag)
2022 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSymlinkbag_updateui, self.mnuctxrcolSymlinkbag)
2023
2024 self.mnuctxrcolSymlinkorigin = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSYMLINKORIG, "Symlink origin", "Show/hide column", wx.ITEM_CHECK)
2025 self.mnuctxrcol.AppendItem(self.mnuctxrcolSymlinkorigin)
2026 self.Bind(wx.EVT_MENU, self.mnuctxrcolSymlinkorigin_handler, self.mnuctxrcolSymlinkorigin)
2027 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSymlinkorigin_updateui, self.mnuctxrcolSymlinkorigin)
2028
2029 self.mnuctxrcolTs = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLTS, "Time shift", "Show/hide column", wx.ITEM_CHECK)
2030 self.mnuctxrcol.AppendItem(self.mnuctxrcolTs)
2031 self.Bind(wx.EVT_MENU, self.mnuctxrcolTs_handler, self.mnuctxrcolTs)
2032 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolTs_updateui, self.mnuctxrcolTs)
2033 self.mnuctxrcol.AppendSeparator()
2034
2035 self.mnuctxrcolDefault = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLDEFAULT, "Reset to config", "Reset columns to saved in preferences", wx.ITEM_NORMAL)
2036 self.mnuctxrcol.AppendItem(self.mnuctxrcolDefault)
2037 self.Bind(wx.EVT_MENU, self.mnuctxrcolDefault_handler, self.mnuctxrcolDefault)
2038
2039
2040 self._outstream = outstream()
2041 self._sys_stdout = sys.stdout
2042
2043 sys.stdout = self._outstream
2044 self.progress = None
2045
2046 self.ForceDir = DBDIRNONE
2047
2048 self.readdur = 0.0
2049
2050 self.read_ign = 0
2051
2052 self.cmpdur = 0.0
2053
2054 self.syncdur = 0.0
2055
2056 sx, sy = self.GetSize()
2057 self.SplitPos = int(sy/3.0*2.0)
2058
2059 self.LoadConfig()
2060
2061 self.spinMDDELTA.SetValue(cfg.MDDELTA)
2062
2063
2064 self.BackColor = self.ForeColor = None
2065 self.cboxVerbosity.SetSelection(cfg.VERBOSE+1)
2066
2067
2068 cfg.LOCK[LI_CANCEL] = False
2069 cfg.LOCK[LI_DESC] = u''
2070
2071 self._imgList= wx.ImageList(32,32,True)
2072
2073
2074 cfg.IMGINDEX = dict([ ( t, self._imgList.Add(catalog[t].getBitmap()) ) for t in \
2075 (u'file',u'filewarn', u'fileconf', u'fileerr', u'fileok', \
2076 u'dir', u'dirwarn', u'dirconf', u'direrr', u'dirok', \
2077 u'sym', u'symwarn', u'symconf', u'symerr', u'symok', \
2078 u'unk', u'unkwarn', u'unkconf', u'unkerr', u'unkok', \
2079 u'bagnew', u'orignew', \
2080 u'del', u'delforced', \
2081 u'unch', u'unchforced', \
2082 u'ign', u'ignforced', \
2083 u'bag', u'bagforced', u'orig', u'origforced', \
2084 u'wrong', u'ok', u'warn', u'conf', u'err', \
2085 u'unchtsbag', u'unchtsorig')])
2086
2087
2088
2089 self.listFiles.SetImageList(self._imgList, wx.IMAGELIST_DRAW_NORMAL)
2090
2091 self.listFiles.SetImageList(self._imgList, wx.IMAGELIST_DRAW_SELECTED)
2092
2093 self.listFiles.RefreshColumns()
2094
2095
2096
2097
2098
2099 self.InfoDlg = dlgInfo_class(self)
2100 self.dlgAddRoot = dlgAddRoot_class(self)
2101 self.dlgPrefs = dlgPrefs_class(self)
2102 self.dlgTips = dlgTips_class(self)
2103
2104
2105
2106
2107 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEBAG)
2108 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEORIG)
2109 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEDEL)
2110 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCERESTORE)
2111 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEUNCHANGED)
2112 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOk_updateui, id=IDTOOLFILTEROK)
2113 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterWarn_updateui, id=IDTOOLFILTERWARN)
2114 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterConf_updateui, id=IDTOOLFILTERCONF)
2115 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterErr_updateui, id=IDTOOLFILTERERR)
2116 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterBag_updateui, id=IDTOOLFILTERBAG)
2117 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOrig_updateui, id=IDTOOLFILTERORIG)
2118 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterNew_updateui, id=IDTOOLFILTERNEW)
2119 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterCh_updateui, id=IDTOOLFILTERCHANGED)
2120 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDel_updateui, id=IDTOOLFILTERDELETE)
2121 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterIgn_updateui, id=IDTOOLFILTERIGNORED)
2122 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnch_updateui, id=IDTOOLFILTERUNCH)
2123 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterForced_updateui, id=IDTOOLFILTERFORCED)
2124 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterFile_updateui, id=IDTOOLFILTERFILE)
2125 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDir_updateui, id=IDTOOLFILTERDIR)
2126 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterSym_updateui, id=IDTOOLFILTERSYM)
2127 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnk_updateui, id=IDTOOLFILTERUNK)
2128 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterTs_updateui, id=IDTOOLFILTERTS)
2129
2130 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionBag)
2131 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionOrig)
2132 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionDel)
2133 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionRestore)
2134 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionUnch)
2135 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionTsbag)
2136 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionTsorig)
2137 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionTsreset)
2138 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOk_updateui, self.mnuBar.mnuFilterOk)
2139 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterWarn_updateui, self.mnuBar.mnuFilterWarn)
2140 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterConf_updateui, self.mnuBar.mnuFilterConf)
2141 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterErr_updateui, self.mnuBar.mnuFilterErr)
2142 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterBag_updateui, self.mnuBar.mnuFilterBag)
2143 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOrig_updateui, self.mnuBar.mnuFilterOrig)
2144 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterNew_updateui, self.mnuBar.mnuFilterNew)
2145 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterCh_updateui, self.mnuBar.mnuFilterCh)
2146 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDel_updateui, self.mnuBar.mnuFilterDel)
2147 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterIgn_updateui, self.mnuBar.mnuFilterIgn)
2148 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnch_updateui, self.mnuBar.mnuFilterUnch)
2149 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterForced_updateui, self.mnuBar.mnuFilterForced)
2150 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterFile_updateui, self.mnuBar.mnuFilterFile)
2151 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDir_updateui, self.mnuBar.mnuFilterDir)
2152 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterSym_updateui, self.mnuBar.mnuFilterSym)
2153 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnk_updateui, self.mnuBar.mnuFilterUnk)
2154 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterTs_updateui, self.mnuBar.mnuFilterTs)
2155 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewDebug_updateui, id=IDMNUVIEWDEBUG)
2156 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewEmul_updateui, id=IDMNUVIEWEMUL)
2157 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewLogging_updateui, id=IDMNUVIEWLOGGING)
2158 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewOut_updateui, id=IDMNUVIEWOUT)
2159 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerbNo_updateui, id=IDMNUVIEWVERBNO)
2160 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb0_updateui, id=IDMNUVIEWVERB0)
2161 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb1_updateui, id=IDMNUVIEWVERB1)
2162 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb2_updateui, id=IDMNUVIEWVERB2)
2163 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb3_updateui, id=IDMNUVIEWVERB3)
2164 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb4_updateui, id=IDMNUVIEWVERB4)
2165 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb5_updateui, id=IDMNUVIEWVERB5)
2166
2167 self.Bind(wx.EVT_UPDATE_UI,self.chboxDebug_updateui, id=IDCHBOXDEBUG)
2168 self.Bind(wx.EVT_UPDATE_UI,self.chboxEmul_updateui, id=IDCHBOXEMUL)
2169 self.Bind(wx.EVT_UPDATE_UI,self.chboxLogging_updateui, id=IDCHBOXLOGGING)
2170
2171
2172 self.Bind(wx.EVT_CHECKLISTBOX, self.clboxRoots_toggled, id=IDCLBOXROOTS)
2173
2174 self.thread = None
2175
2176 if cfg.SHOWTIPS:
2177 log(u'frmMain.__init__: Show tips start.')
2178 self.dlgTips.ShowModal()
2179 log(u'frmMain.__init__: Show tips end.')
2180
2181 self.UpdateRoots()
2182
2183 global IDTIMER; IDTIMER = wx.NewId()
2184 self.timer = wx.Timer(self, IDTIMER)
2185 self.Bind(wx.EVT_TIMER, self.timer_handler, id=IDTIMER)
2186 self.timer.Start(300)
2187
2188 - def __set_properties(self):
2189
2190 self.SetTitle("PYBAG")
2191 _icon = wx.NullIcon
2192 _icon.CopyFromBitmap(catalog['pybag'].getBitmap())
2193 self.SetIcon(_icon)
2194 self.sbarSBar.SetStatusWidths([-1])
2195
2196 self.tBar.SetToolBitmapSize((32, 32))
2197 self.tBar.Realize()
2198 self.clboxRoots.SetMinSize((132, 63))
2199 self.clboxRoots.SetToolTipString("Select roots for synchronization")
2200 self.btnSelectRoots.SetToolTipString("Select All, Clear All, Default")
2201 self.label_4.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2202 self.cboxAutoAction.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2203 self.cboxAutoAction.SetToolTipString("Auto action for conflict recolve")
2204 self.label_5.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2205 self.cboxVerbosity.SetToolTipString("Verbosity level")
2206 self.cboxVerbosity.SetSelection(4)
2207 self.chboxEmul.SetValue(1)
2208 self.chboxLogging.SetValue(1)
2209 self.label_7.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2210 self.chboxBackupMode.SetMinSize((150, 40))
2211 self.chboxBackupMode.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2212 self.chboxBackupMode.SetToolTipString("Check for full synchronization backup roots")
2213 self.label_19.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2214 self.label_18.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2215 self.txtFilter.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2216 self.txtFilter.SetToolTipString("Press ENTER for refresh list or button below")
2217 self.listFiles.SetToolTipString("Bag files list")
2218 self.lblErrors.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2219 self.lblConflicts.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2220 self.lblWarnings.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2221 self.txtFile.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_MENU))
2222 self.txtFile.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
2223 self.txtDesc.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_MENU))
2224 self.Splitter.SetMinimumPaneSize(20)
2225
2226
2227 self.cboxAutoAction.AppendItems([i[0] for i in z_action_choise])
2228 self.cboxAutoAction.SetSelection(0)
2229 sx,sy = wx.GetDisplaySize()
2230 if sx > 1200:
2231 sx = 1200 + 40
2232 if sy > 700:
2233 sy = 700 + 40
2234 self.SetSize((sx - 40, sy - 40))
2235
2236 - def __do_layout(self):
2237
2238 sizerMain = wx.BoxSizer(wx.VERTICAL)
2239 sizer_output = wx.BoxSizer(wx.VERTICAL)
2240 sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
2241 sizer_18 = wx.BoxSizer(wx.VERTICAL)
2242 sizerSelDesc = wx.BoxSizer(wx.HORIZONTAL)
2243 sizerSelFile = wx.BoxSizer(wx.HORIZONTAL)
2244 sizerInfo2 = wx.BoxSizer(wx.HORIZONTAL)
2245 sizerInfo1 = wx.BoxSizer(wx.HORIZONTAL)
2246 sizer_29 = wx.BoxSizer(wx.HORIZONTAL)
2247 sizer_30 = wx.BoxSizer(wx.VERTICAL)
2248 sizerAction = wx.BoxSizer(wx.HORIZONTAL)
2249 sizer_23 = wx.BoxSizer(wx.VERTICAL)
2250 sizer_28 = wx.BoxSizer(wx.VERTICAL)
2251 sizer_5 = wx.BoxSizer(wx.VERTICAL)
2252 sizer_7 = wx.BoxSizer(wx.VERTICAL)
2253 grid_sizer_1 = wx.FlexGridSizer(2, 2, 0, 0)
2254 sizer_31 = wx.BoxSizer(wx.VERTICAL)
2255 sizer_31.Add(self.clboxRoots, 1, wx.ALL | wx.EXPAND, 2)
2256 sizer_31.Add(self.btnSelectRoots, 0, wx.EXPAND, 0)
2257 sizer_29.Add(sizer_31, 1, wx.EXPAND, 0)
2258 grid_sizer_1.Add(self.label_4, 0, wx.ALL, 2)
2259 grid_sizer_1.Add(self.cboxAutoAction, 3, wx.ALL | wx.EXPAND, 2)
2260 grid_sizer_1.Add(self.label_5, 0, wx.ALL, 2)
2261 grid_sizer_1.Add(self.cboxVerbosity, 3, wx.ALL | wx.EXPAND, 2)
2262 grid_sizer_1.AddGrowableCol(1)
2263 sizerAction.Add(grid_sizer_1, 3, wx.EXPAND | wx.LEFT | wx.RIGHT, 2)
2264 sizer_7.Add(self.chboxEmul, 0, wx.ALL, 2)
2265 sizer_7.Add(self.chboxLogging, 0, wx.ALL, 2)
2266 sizer_7.Add(self.chboxDebug, 0, wx.ALL, 2)
2267 sizerAction.Add(sizer_7, 0, wx.ALIGN_CENTER | wx.EXPAND | wx.LEFT | wx.RIGHT, 2)
2268 sizer_5.Add(self.label_7, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT, 2)
2269 sizer_5.Add(self.spinMDDELTA, 1, wx.ALIGN_CENTER, 0)
2270 sizer_5.Add(self.chboxBackupMode, 0, wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT | wx.TOP, 2)
2271 sizerAction.Add(sizer_5, 2, wx.LEFT | wx.RIGHT, 2)
2272 sizer_28.Add(self.label_19, 0, wx.ALL, 2)
2273 sizer_28.Add(self.lblTsDir, 0, wx.ALL, 2)
2274 sizer_28.Add(self.lblTsValueBag, 0, wx.ALL, 2)
2275 sizer_28.Add(self.lblTsValueOrigin, 0, wx.ALL, 2)
2276 sizerAction.Add(sizer_28, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 2)
2277 sizer_23.Add(self.label_18, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT, 2)
2278 sizer_23.Add(self.txtFilter, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND | wx.RIGHT, 2)
2279 sizer_23.Add(self.btnFilterRefresh, 2, wx.ALIGN_CENTER | wx.ALL, 2)
2280 sizerAction.Add(sizer_23, 2, wx.EXPAND | wx.LEFT | wx.RIGHT, 2)
2281 sizer_30.Add(sizerAction, 0, wx.EXPAND, 0)
2282 sizer_30.Add(self.listFiles, 6, wx.EXPAND, 0)
2283 sizer_29.Add(sizer_30, 8, wx.EXPAND, 0)
2284 sizer_18.Add(sizer_29, 5, wx.EXPAND, 0)
2285 sizerInfo1.Add(self.lblErrors, 1, wx.ALL, 2)
2286 sizerInfo1.Add(self.lblConflicts, 1, wx.ALL, 2)
2287 sizerInfo1.Add(self.lblWarnings, 1, wx.ALL, 2)
2288 sizerInfo1.Add(self.lblAllItems, 1, wx.ALL, 2)
2289 sizerInfo1.Add(self.lblNewBag, 1, wx.ALL, 2)
2290 sizerInfo1.Add(self.lblNewOrig, 1, wx.ALL, 2)
2291 sizer_18.Add(sizerInfo1, 0, wx.ALL | wx.EXPAND, 2)
2292 sizerInfo2.Add(self.lblChangeBag, 1, wx.ALL, 2)
2293 sizerInfo2.Add(self.lblChangeOrig, 1, wx.ALL, 2)
2294 sizerInfo2.Add(self.lblDelBag, 1, wx.ALL, 2)
2295 sizerInfo2.Add(self.lblDelOrig, 1, wx.ALL, 2)
2296 sizerInfo2.Add(self.lblIgnored, 1, wx.ALL, 2)
2297 sizerInfo2.Add(self.lblTimeshifted, 1, wx.ALL, 2)
2298 sizer_18.Add(sizerInfo2, 0, wx.ALL | wx.EXPAND, 2)
2299 sizer_18.Add(self.static_line_1, 0, wx.EXPAND, 0)
2300 sizerSelFile.Add(self.label_1, 0, 0, 0)
2301 sizerSelFile.Add((20, 1), 0, 0, 0)
2302 sizerSelFile.Add(self.txtFile, 1, wx.EXPAND | wx.LEFT, 2)
2303 sizer_18.Add(sizerSelFile, 0, wx.ALL | wx.EXPAND, 2)
2304 sizerSelDesc.Add(self.label_2, 0, 0, 0)
2305 sizerSelDesc.Add((20, 1), 0, 0, 0)
2306 sizerSelDesc.Add(self.txtDesc, 1, wx.EXPAND | wx.LEFT, 2)
2307 sizer_18.Add(sizerSelDesc, 0, wx.ALL | wx.EXPAND, 2)
2308 self.splitPanel1.SetSizer(sizer_18)
2309 label_3 = wx.StaticText(self.splitPanel2, wx.ID_ANY, "Output:")
2310 sizer_1.Add(label_3, 0, wx.ALL, 1)
2311 sizer_1.Add((40, 1), 0, 0, 0)
2312 sizer_1.Add(self.btnClear_copy, 0, 0, 0)
2313 sizer_output.Add(sizer_1, 0, 0, 0)
2314 sizer_output.Add(self.txtOut, 3, wx.ALL | wx.EXPAND, 2)
2315 self.splitPanel2.SetSizer(sizer_output)
2316 self.Splitter.SplitHorizontally(self.splitPanel1, self.splitPanel2)
2317 sizerMain.Add(self.Splitter, 1, wx.EXPAND, 0)
2318 self.SetSizer(sizerMain)
2319 self.Layout()
2320 self.Centre()
2321
2322
2323 self.sizerMain = sizerMain
2324 self.sizer_output = sizer_output
2325 self.sizerInfo1 = sizerInfo1
2326 self.sizerInfo2 = sizerInfo2
2327 self.sizerSelDesc = sizerSelDesc
2328 self.sizerSelFile = sizerSelFile
2329
2330 self.lblErrors.SetLabel(u'')
2331 self.lblConflicts.SetLabel(u'')
2332 self.lblWarnings.SetLabel(u'')
2333 self.lblAllItems.SetLabel(u'')
2334 self.lblNewBag.SetLabel(u'')
2335 self.lblNewOrig.SetLabel(u'')
2336 self.lblChangeBag.SetLabel(u'')
2337 self.lblChangeOrig.SetLabel(u'')
2338 self.lblDelBag.SetLabel(u'')
2339 self.lblDelOrig.SetLabel(u'')
2340 self.lblIgnored.SetLabel(u'')
2341 self.lblTimeshifted.SetLabel(u'')
2342 self.sizerMain.Show(self.sizerInfo1,False,True)
2343 self.sizerMain.Show(self.sizerInfo2,False,True)
2344 self.sizerMain.Show(self.sizerSelDesc,False,True)
2345 self.sizerMain.Show(self.sizerSelFile,False,True)
2346 self.sizerMain.Layout()
2347
2348 - def LoadConfig(self):
2349
2350 log(u'frmMain.LoadConfig: read GUI config.')
2351 try:
2352 LoadAppStateFromConfig()
2353
2354 if cfg.Z_CP.has_section(P_GUI):
2355 cfg.WRITECOLSATEXIT = False
2356 if cfg.Z_CP.has_option(P_GUI,P_WRITECOLSATEXIT):
2357 v = cfg.Z_CP.get(P_GUI,P_WRITECOLSATEXIT)
2358 cfg.WRITECOLSATEXIT = bool(int( (v in [u'0', u'1'] and v) or u'0' ))
2359 log(u'frmMain.LoadConfig: set '+P_WRITECOLSATEXIT+u' to %d' % cfg.WRITECOLSATEXIT)
2360
2361 cfg.SHOWTIPS = True
2362 if cfg.Z_CP.has_option(P_GUI,P_SHOWTIPS):
2363 v = cfg.Z_CP.get(P_GUI,P_SHOWTIPS)
2364 cfg.SHOWTIPS = bool(int( (v in [u'0', u'1'] and v) or u'1' ))
2365 log(u'frmMain.LoadConfig: set '+P_SHOWTIPS+u' to %d' % cfg.SHOWTIPS)
2366
2367 cfg.TIPSNUMBER = 0
2368 if cfg.Z_CP.has_option(P_GUI,P_TIPSNUMBER):
2369 v = cfg.Z_CP.get(P_GUI,P_TIPSNUMBER)
2370 try:
2371 cfg.TIPSNUMBER = int(v)
2372 except:
2373 log(u'Wrong tips number "%s".' % z_u(v))
2374 log(u'frmMain.LoadConfig: set '+P_TIPSNUMBER+u' to %d' % cfg.TIPSNUMBER)
2375
2376
2377 if AppState[P_OUTPUT]:
2378
2379 self.Splitter.SetSashPosition(self.SplitPos)
2380 else:
2381
2382 self.Splitter.Unsplit()
2383
2384 except Exception, exc:
2385 log(u'frmMain.LoadConfig: ERROR %s' % str(exc))
2386
2387 - def UpdateRoots(self):
2388
2389 rs = cfg.Z_CP.getrootsbag()
2390 self.clboxRoots.Clear()
2391 self.clboxRoots.AppendItems(rs)
2392 self.RootsSelectDefault()
2393
2394 - def RootsSelectAll(self):
2395 c = self.clboxRoots.GetCount()
2396 for i in range(c):
2397 self.clboxRoots.Check(i, True)
2398 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \
2399 u'Selected %d from %d roots.' % (c,c))
2400 cfg.IsDBReaded = False
2401 cfg.IsDBSynced = False
2402 cfg.IsDBCompared = False
2403 self.listFiles.Clear()
2404
2406
2407 cnt = self.clboxRoots.GetCount()
2408 s = 0
2409 for i in range(cnt):
2410 rs = self.clboxRoots.GetString(i)
2411 rn = cfg.Z_CP.findroot(rs)
2412 assert rn is not None
2413 seldef = cfg.Z_CP.getopt(rn, P_SELECTDEFAULT, False, P_SELECTDEFAULTNO)
2414 seldef = seldef==P_SELECTDEFAULTYES
2415 if seldef:
2416 self.clboxRoots.Check(i, True)
2417
2418 s = s + 1
2419 else:
2420 self.clboxRoots.Check(i, False)
2421
2422 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \
2423 u'Selected %d from %d roots.' % (s,cnt))
2424 cfg.IsDBReaded = False
2425 cfg.IsDBSynced = False
2426 cfg.IsDBCompared = False
2427 self.listFiles.Clear()
2428
2429 - def RootsUnselectAll(self):
2430 c = self.clboxRoots.GetCount()
2431 for i in range(c):
2432 self.clboxRoots.Check(i, False)
2433 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \
2434 u'Selected %d from %d roots.' % (0,c))
2435 cfg.IsDBReaded = False
2436 cfg.IsDBSynced = False
2437 cfg.IsDBCompared = False
2438 self.listFiles.Clear()
2439
2440 - def clboxRoots_toggled(self, event):
2441 s = 0
2442 c = self.clboxRoots.GetCount()
2443 for i in range(c):
2444 if self.clboxRoots.IsChecked(i):
2445 s += 1
2446 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \
2447 u'Selected %d from %d roots.' % (s,c))
2448 cfg.IsDBReaded = False
2449 cfg.IsDBSynced = False
2450 cfg.IsDBCompared = False
2451 self.listFiles.Clear()
2452
2453 - def mnuFileCompare_handler(self, event):
2454 self.tBarCompare_handler(event)
2455
2456 - def mnuFileSync_handler(self, event):
2457 self.tBarSync_handler(event)
2458
2459 - def mnuFileAdd_handler(self, event):
2460 self.tBarAddRoot_handler(event)
2461
2462 - def mnuFileRemove_handler(self, event):
2463 try:
2464 cfg.IsDBReaded = False
2465 cfg.IsDBCompared = False
2466 cfg.IsDBSynced = False
2467 self.listFiles.Clear()
2468 self.TSReset()
2469 rs = cfg.Z_CP.getrootsbag()
2470 if len(rs) > 0:
2471 rs.sort()
2472 r = wx.GetSingleChoice(u'Select root for deleteing.',u'Delete root',rs)
2473 if r:
2474 cmd = command_class()
2475 setattr(cmd,u'fs',[r])
2476 cmd_remove(cmd)
2477 except Exception,exc:
2478 prt0(u'ERROR in program %s.' % (traceback.format_exc(),),place=u'frmMain.tBarRmRoot_handler',
2479 error=exc)
2480 cfg.Z_CP = z_gp_class()
2481 cfg.Z_CP.load()
2482 self.UpdateRoots()
2483 event.Skip(False)
2484
2485 - def mnuFileDist_handler(self, event):
2486 ar1 = [u'Initialize', u'Copy additional files', u'Initialize and copy files']
2487 s = wx.GetSingleChoice(u'Select needed actions and in next step you can select path and roots.',
2488 u'Distribute PYBAG',ar1)
2489 if s != u'':
2490 cmd = command_class()
2491 setattr(cmd,u'fs',[])
2492 setattr(cmd,u'i',[])
2493 setattr(cmd,u'z',[])
2494 setattr(cmd,u'a',[])
2495 setattr(cmd,u'r',[])
2496 if s == u'Initialize':
2497 setattr(cmd,u'i',[u''])
2498 dbg(u'frmMain.mnuFileDist_handler: -i')
2499 elif s == u'Copy additional files':
2500 setattr(cmd,u'z',[u''])
2501 dbg(u'frmMain.mnuFileDist_handler: -z')
2502 elif s == u'Initialize and copy files':
2503 setattr(cmd,u'z',[u''])
2504 setattr(cmd,u'i',[u''])
2505 dbg(u'frmMain.mnuFileDist_handler: -z -i')
2506
2507 path = wx.DirSelector(u'Select path to distribute PYBAG.')
2508 dbg(u'frmMain.mnuFileDist_handler: path="%s"' % (path,))
2509 if path:
2510
2511 setattr(cmd,u'fs',[path])
2512 rs = cfg.Z_CP.getrootsbag()
2513 rs.sort()
2514 dlg = wx.MultiChoiceDialog(self, u'Select roots to distibute or none.',u'Distribute PYBAG',rs)
2515 ret = dlg.ShowModal()
2516 if ret == wx.ID_OK:
2517
2518 sr = dlg.GetSelections()
2519 for i in sr:
2520 cmd.r.append(rs[i])
2521 dbg(u'frmMain.mnuFileDist_handler: roots="%s"' % (str(cmd.r),))
2522 cmd_dist(cmd)
2523 del dlg
2524 event.Skip(False)
2525
2526 - def mnuFileSaveOut_handler(self, event):
2527 dlg = wx.FileDialog(self, u'Select a file.', style=wx.FD_SAVE)
2528 r = dlg.ShowModal()
2529 if r == wx.ID_OK:
2530
2531 path = dlg.GetPath()
2532 f = None
2533 try:
2534 f = codecs.open(path,'w', 'utf_8', 'strict', 0)
2535 txt = self.txtOut.GetValue()
2536
2537 f.write(txt)
2538 except Exception,exc:
2539 prt0(u'ERROR in programm: %s.' % (traceback.format_exc(),),place=u'frmMain.mnuFileSaveOut_handler',
2540 error=exc)
2541 finally:
2542 if f:
2543 f.close()
2544 del dlg
2545 event.Skip(False)
2546
2547 - def mnuFileExit_handler(self, event):
2548 self.Close()
2549 event.Skip(False)
2550
2551 - def mnuViewOut_handler(self, event):
2552 r = not AppState['output']
2553 dbg(u'mnuViewOut_handler: Show output = %s.' % (r,))
2554 AppState['output'] = r
2555 if r:
2556 self.Splitter.SplitHorizontally(self.splitPanel1, self.splitPanel2, self.SplitPos)
2557 else:
2558 self.SplitPos = self.Splitter.GetSashPosition()
2559 self.Splitter.Unsplit()
2560 event.Skip(False)
2561
2562 - def mnuViewLogging_handler(self, event):
2563 cfg.PYBAG_LOG = not cfg.PYBAG_LOG
2564 event.Skip(False)
2565
2566 - def mnuViewDebug_handler(self, event):
2567 cfg.PYBAG_DEBUG = not cfg.PYBAG_DEBUG
2568 event.Skip(False)
2569
2570 - def mnuViewVerbNo_handler(self, event):
2571 cfg.VERBOSE = -1
2572 self.cboxVerbosity_updateui()
2573 event.Skip(False)
2574
2575 - def mnuViewVerb0_handler(self, event):
2576 cfg.VERBOSE = 0
2577 self.cboxVerbosity_updateui()
2578 event.Skip(False)
2579
2580 - def mnuViewVerb1_handler(self, event):
2581 cfg.VERBOSE = 1
2582 self.cboxVerbosity_updateui()
2583 event.Skip(False)
2584
2585 - def mnuViewVerb2_handler(self, event):
2586 cfg.VERBOSE = 2
2587 self.cboxVerbosity_updateui()
2588 event.Skip(False)
2589
2590 - def mnuViewVerb3_handler(self, event):
2591 cfg.VERBOSE = 3
2592 self.cboxVerbosity_updateui()
2593 event.Skip(False)
2594
2595 - def mnuViewVerb4_handler(self, event):
2596 cfg.VERBOSE = 4
2597 self.cboxVerbosity_updateui()
2598 event.Skip(False)
2599
2600 - def mnuViewVerb5_handler(self, event):
2601 cfg.VERBOSE = 5
2602 self.cboxVerbosity_updateui()
2603 event.Skip(False)
2604
2605 - def mnuOptionsPrefs_handler(self, event):
2606 cfg.IsDBReaded = False
2607 cfg.IsDBCompared = False
2608 cfg.IsDBSynced = False
2609 self.listFiles.Clear()
2610 self.TSReset()
2611 self.dlgPrefs.ShowModal()
2612
2613 cfg.Z_CP = z_gp_class()
2614 cfg.Z_CP.load()
2615 if AppState[P_OUTPUT]:
2616
2617 self.Splitter.SetSashPosition(self.SplitPos)
2618 else:
2619
2620 self.Splitter.Unsplit()
2621 if cfg.Z_CP.has_section(P_GUI):
2622 if cfg.Z_CP.has_option(P_GUI,P_WRITECOLSATEXIT):
2623 cfg.WRITECOLSATEXIT = bool(int(cfg.Z_CP.get(P_GUI,P_WRITECOLSATEXIT)))
2624 self.listFiles.RefreshColumns()
2625 event.Skip(False)
2626
2627 - def mnuHelpAbout_handler(self, event):
2628 s = u'Python version: %s\nwxPython version: %s\n\n%s' % (sys.version,wx.version(),
2629 TermColors.skipTags(__about__))
2630
2631 self.InfoDlg.txtInfo.SetValue(s)
2632 self.InfoDlg.ShowModal()
2633 event.Skip(False)
2634
2635 - def mnuHelpUsage_handler(self, event):
2636 self.InfoDlg.txtInfo.SetValue(TermColors.skipTags(_usage))
2637 self.InfoDlg.ShowModal()
2638 event.Skip(False)
2639
2640 - def tBarCompare_handler(self, event):
2641 log(u'frmMain.tBarCompare_handler: start')
2642 cfg.BACKUPMODE = self.chboxBackupMode.IsChecked()
2643 if not cfg.LOCK[LI_FILTERRUNNING]:
2644 prt0(u'Backup mode is %s' % int(cfg.BACKUPMODE))
2645 self.listFiles.Clear()
2646 self.StartWork(self.do_compare, self.do_compare2)
2647 else:
2648 wx.MessageBox(u'Filtering is running. Try more later.', u'Filtering.')
2649 log(u'frmMain.tBarCompare_handler: end')
2650 event.Skip(False)
2651
2652 - def tBarSync_handler(self, event):
2653 log(u'frmMain.tBarSync_handler: start')
2654 cfg.BACKUPMODE = self.chboxBackupMode.IsChecked()
2655 if not cfg.LOCK[LI_FILTERRUNNING]:
2656 prt0(u'Backup mode is %s' % int(cfg.BACKUPMODE))
2657 self.listFiles.Clear()
2658 self.StartWork(self.do_sync, self.do_sync2)
2659 else:
2660 wx.MessageBox(u'Filtering is running. Try more later.', u'Filtering.')
2661 log(u'frmMain.tBarSync_handler: end')
2662 event.Skip(False)
2663
2664 - def tBarAddRoot_handler(self, event):
2665 try:
2666 cfg.IsDBReaded = False
2667 cfg.IsDBCompared = False
2668 cfg.IsDBSynced = False
2669 self.listFiles.Clear()
2670 self.TSReset()
2671 self.dlgAddRoot.ShowModal()
2672 except Exception,exc:
2673 prt0(u'ERROR in program %s.' % (traceback.format_exc(),),place=u'frmMain.tBarAddRoot_handler',
2674 error=exc)
2675 cfg.Z_CP = z_gp_class()
2676 cfg.Z_CP.load()
2677 self.UpdateRoots()
2678 event.Skip(False)
2679
2681 log(u'frmMain.tBarForceUnchanged_handler: start')
2682 if cfg.IsDBCompared:
2683 global ForceAction, ForceKs, ForceRet
2684 ForceAction = u'skip'
2685 ForceKs = self.listFiles.GetSelectionKeys()
2686 self.StartWork(self.set_force, self.set_force2)
2687 log(u'frmMain.tBarForceUnchanged_handler: end')
2688 event.Skip(False)
2689
2690 - def tBarForceBag_handler(self, event):
2691 log(u'frmMain.tBarForceBag_handler: start')
2692 if cfg.IsDBCompared:
2693 global ForceAction, ForceKs, ForceRet
2694 ForceAction = u'bag'
2695 ForceKs = self.listFiles.GetSelectionKeys()
2696 self.StartWork(self.set_force, self.set_force2)
2697 log(u'frmMain.tBarForceBag_handler: end')
2698 event.Skip(False)
2699
2700 - def tBarForceOrig_handler(self, event):
2701 log(u'frmMain.tBarForceOrig_handler: start')
2702 if cfg.IsDBCompared:
2703 global ForceAction, ForceKs, ForceRet
2704 ForceAction = u'origin'
2705 ForceKs = self.listFiles.GetSelectionKeys()
2706 self.StartWork(self.set_force, self.set_force2)
2707 log(u'frmMain.tBarForceOrig_handler: end')
2708 event.Skip(False)
2709
2710 - def tBarForceDel_handler(self, event):
2711 log(u'frmMain.tBarForceDel_handler: start')
2712 if cfg.IsDBCompared:
2713 global ForceAction, ForceKs, ForceRet
2714 ForceAction = u'delete'
2715 ForceKs = self.listFiles.GetSelectionKeys()
2716 self.StartWork(self.set_force, self.set_force2)
2717 log(u'frmMain.tBarForceDel_handler: end')
2718 event.Skip(False)
2719
2721 log(u'frmMain.tBarForceRestore_handler: start')
2722 if cfg.IsDBCompared:
2723 global ForceAction, ForceKs, ForceRet
2724 ForceAction = u'restore'
2725 ForceKs = self.listFiles.GetSelectionKeys()
2726 self.StartWork(self.set_force, self.set_force2)
2727 log(u'frmMain.tBarForceRestore_handler: end')
2728 event.Skip(False)
2729
2730 - def cboxAutoAction_handler(self, event):
2731 event.Skip()
2732
2733 - def cboxVerbosity_handler(self, event):
2734 log(u'frmMain.cboxVerbosity_handler: start')
2735 d = self.cboxVerbosity.GetSelection()
2736 cfg.VERBOSE = d - 1
2737 prt(u'Set verbosity level to "%d"' % (cfg.VERBOSE,))
2738 log(u'frmMain.cboxVerbosity_handler: end')
2739 event.Skip()
2740
2741 - def chboxDebug_handler(self, event):
2742 log(u'frmMain.chboxDebug_handler: start')
2743 cfg.PYBAG_DEBUG = self.chboxDebug.GetValue()
2744 prt3(u'Debug level changed to "%s".' % (cfg.PYBAG_DEBUG,))
2745 log(u'frmMain.chboxDebug_handler: end')
2746 event.Skip()
2747
2748 - def mnuViewEmul_handler(self, event):
2749 cfg.PYBAG_EMUL = not cfg.PYBAG_EMUL
2750 prt3(u'Emulation level changed to "%s".' % (cfg.PYBAG_EMUL,))
2751 event.Skip(False)
2752
2753 - def chboxEmul_handler(self, event):
2754 log(u'frmMain.chboxEmul_handler: start')
2755 cfg.PYBAG_EMUL = self.chboxEmul.GetValue()
2756 prt3(u'Emulation level changed to "%s".' % (cfg.PYBAG_EMUL,))
2757 log(u'frmMain.chboxEmul_handler: end')
2758 event.Skip(False)
2759
2760 - def chboxLogging_handler(self, event):
2761 log(u'frmMain.chboxLogging_handler: start')
2762 cfg.PYBAG_LOG = self.chboxLogging.GetValue()
2763 prt3(u'Logging level changed to "%s".' % (cfg.PYBAG_LOG,))
2764 log(u'frmMain.chboxLogging_handler: end')
2765 event.Skip(False)
2766
2767 - def spinMDDELTA_handler(self, event):
2768 log(u'frmMain.spinMDDELTA_handler: start')
2769 cfg.MDDELTA = float(self.spinMDDELTA.GetValue())
2770 prt3(u'MDDELTA changed to "%s".' % (cfg.MDDELTA,))
2771 log(u'frmMain.spinMDDELTA_handler: end')
2772 event.Skip(False)
2773
2774 - def frmMain_Close_handler(self, event):
2775 log(u'frmMain.Close_handler: start')
2776 cfg.LOCK[LI_CANCEL] = True
2777
2778 wx.Yield()
2779 try:
2780 if self.timer and self.timer.IsRunning():
2781 self.timer.Stop()
2782 except Exception, exc:
2783 log(u'frmMain_Close_handler: ERROR %s' % str(exc))
2784 wx.Yield()
2785 if self.progress:
2786 self.progress.Destroy()
2787 self.progress = None
2788 try:
2789 if cfg.WRITECOLSATEXIT:
2790 WriteCols2Config(cfg.Z_COLUMN_CHOISE)
2791 if not cfg.Z_CP.has_section(P_GUI):
2792 cfg.Z_CP.add_section(P_GUI)
2793 cfg.Z_CP.set(P_GUI, P_SHOWTIPS, str(int(cfg.SHOWTIPS)))
2794 cfg.Z_CP.set(P_GUI, P_WRITECOLSATEXIT, str(int(cfg.WRITECOLSATEXIT)))
2795 cfg.Z_CP.set(P_GUI, P_TIPSNUMBER, str(cfg.TIPSNUMBER))
2796 cfg.Z_CP.save()
2797 except Exception, exc:
2798 log(u'frmMain_close: ERROR %s' % str(exc))
2799 try:
2800 sys.stdout = self._sys_stdout
2801 del self._outstream
2802 except:
2803 pass
2804 self.Hide()
2805 log(u'frmMain.Close_handler: end')
2806 event.Skip()
2807
2808 - def btnClear_handler(self, event):
2809 self.txtOut.Clear()
2810 event.Skip(False)
2811
2812 - def mnuViewClearout_handler(self, event):
2813 self.btnClear_handler(event)
2814 event.Skip(False)
2815
2816 - def mnuViewDebug_updateui(self,event):
2817 event.Check(cfg.PYBAG_DEBUG)
2818
2819 - def mnuViewEmul_updateui(self,event):
2820 event.Check(cfg.PYBAG_EMUL)
2821
2823 event.Check(cfg.PYBAG_LOG)
2824
2825 - def mnuViewOut_updateui(self,event):
2826 event.Check(AppState['output'])
2827
2828 - def mnuAction_updateui(self,event):
2829 event.Enable(cfg.IsDBCompared and not cfg.IsDBSynced)
2830
2831 - def mnuFilterOk_updateui(self,event):
2832 event.Check(AppState['ff_ok'])
2833
2834 - def mnuFilterWarn_updateui(self,event):
2835 event.Check(AppState['ff_warn'])
2836
2837 - def mnuFilterConf_updateui(self,event):
2838 event.Check(AppState['ff_conf'])
2839
2840 - def mnuFilterErr_updateui(self,event):
2841 event.Check(AppState['ff_err'])
2842
2843 - def mnuFilterBag_updateui(self,event):
2844 event.Check(AppState['ff_bag'])
2845
2846 - def mnuFilterOrig_updateui(self,event):
2847 event.Check(AppState['ff_orig'])
2848
2849 - def mnuFilterNew_updateui(self,event):
2850 event.Check(AppState['ff_new'])
2851
2852 - def mnuFilterDel_updateui(self,event):
2853 event.Check(AppState['ff_del'])
2854
2855 - def mnuFilterIgn_updateui(self,event):
2856 event.Check(AppState['ff_ign'])
2857
2858 - def mnuFilterCh_updateui(self,event):
2859 event.Check(AppState['ff_ch'])
2860
2861 - def mnuFilterUnch_updateui(self,event):
2862 event.Check(AppState['ff_unch'])
2863
2865 event.Check(AppState['ff_forced'])
2866
2867 - def mnuFilterFile_updateui(self,event):
2868 event.Check(AppState['ff_file'])
2869
2870 - def mnuFilterDir_updateui(self,event):
2871 event.Check(AppState['ff_dir'])
2872
2873 - def mnuFilterSym_updateui(self,event):
2874 event.Check(AppState['ff_sym'])
2875
2876 - def mnuFilterUnk_updateui(self,event):
2877 event.Check(AppState['ff_unk'])
2878
2879 - def mnuFilterTs_updateui(self,event):
2880 event.Check(AppState['ff_ts'])
2881
2882 - def mnuViewVerbNo_updateui(self,event):
2883 event.Check(cfg.VERBOSE < 0)
2884
2885 - def mnuViewVerb0_updateui(self,event):
2886 event.Check(cfg.VERBOSE == 0)
2887
2888 - def mnuViewVerb1_updateui(self,event):
2889 event.Check(cfg.VERBOSE == 1)
2890
2891 - def mnuViewVerb2_updateui(self,event):
2892 event.Check(cfg.VERBOSE == 2)
2893
2894 - def mnuViewVerb3_updateui(self,event):
2895 event.Check(cfg.VERBOSE == 3)
2896
2897 - def mnuViewVerb4_updateui(self,event):
2898 event.Check(cfg.VERBOSE == 4)
2899
2900 - def mnuViewVerb5_updateui(self,event):
2901 event.Check(cfg.VERBOSE == 5)
2902
2903 - def chboxDebug_updateui(self,event):
2904 event.Check(cfg.PYBAG_DEBUG)
2905
2906 - def chboxEmul_updateui(self,event):
2907 self.chboxEmul.SetValue(cfg.PYBAG_EMUL)
2908
2909 - def chboxLogging_updateui(self,event):
2910 self.chboxLogging.SetValue(cfg.PYBAG_LOG)
2911
2912 - def lblTs_updateui(self,event = None):
2913 if cfg.TSDIR == TSDIRBAG:
2914 d = u'Bag'
2915 elif cfg.TSDIR == TSDIRORIG:
2916 d = u'Origin'
2917 else:
2918 d = u'None'
2919 self.lblTsDir.SetLabel(d)
2920 self.lblTsValueBag.SetLabel(u'b:%s' % str(cfg.TSBAG))
2921 self.lblTsValueOrigin.SetLabel(u'o:%s' % str(cfg.TSORIG))
2922
2924
2925 r = cfg.VERBOSE
2926 r += 1
2927 self.cboxVerbosity.SetSelection(r)
2928 prt(u'Set verbosity level to "%d"' % (cfg.VERBOSE,))
2929
2930 - def mnuFileRead_handler(self, event):
2931 cfg.IsDBReaded = False
2932 self.tBarCompare_handler(event)
2933
2934
2935 - def mnuOptionsStat_handler(self, event):
2936
2937
2938
2939 cfg.IsDBReaded = False
2940 cfg.IsDBSynced = False
2941 cfg.IsDBCompared = False
2942 self.listFiles.Clear()
2943 self._stat_info = u''
2944 self.StartWork(self.do_stat, self.do_stat2)
2945 event.Skip(False)
2946
2947 - def mnuAboutLicense_handler(self, event):
2948 self.InfoDlg.txtInfo.SetValue(TermColors.skipTags(__license__))
2949 self.InfoDlg.ShowModal()
2950 event.Skip(False)
2951
2952 - def mnuFileRelocate_handler(self, event):
2953 rs = cfg.Z_CP.getrootsbag()
2954 rs.sort()
2955 root = wx.GetSingleChoice(u'Select root for relocate.',
2956 u'Relocate',rs)
2957 if rs:
2958 rn = cfg.Z_CP.findroot(root)
2959 if rn:
2960 f = cfg.Z_CP.getrootsflag(rn)
2961 if f == DBFLAGDIR:
2962 path = wx.DirSelector(u'Select new root origin location')
2963 else:
2964 path = wx.FileSelector(u'Select new root origin location')
2965 if path:
2966 cmd = command_class()
2967 setattr(cmd,u'fs',[])
2968 setattr(cmd,u'r',[root + u'=' + path])
2969
2970 cfg.IsDBReaded = False
2971 cfg.IsDBCompared = False
2972 cfg.IsDBSynced = False
2973 self.listFiles.Clear()
2974 cmd_relocate(cmd)
2975 cfg.Z_CP = z_gp_class()
2976 cfg.Z_CP.load()
2977 event.Skip(False)
2978
2979 - def Splitter_dclick_handler(self, event):
2980 self.SplitPos = self.Splitter.GetSashPosition()
2981 AppState['output'] = False
2982 self.Splitter.Unsplit()
2983 event.Skip()
2984
2985
2987 try:
2988 itemid = self.listFiles.GetFocusedItem()
2989
2990 if itemid > -1:
2991 vdb = cfg.Z_DB[self.listFiles.ks[itemid]]
2992
2993 desc = vdb[DBDESC] + vdb[DBDESCMAN]
2994 _file = vdb[DBDBPATH]
2995 self.txtFile.SetValue(_file)
2996 self.txtDesc.SetValue(desc)
2997 else:
2998 self.txtFile.SetValue(u'')
2999 self.txtDesc.SetValue(u'')
3000 except Exception, exc:
3001 log(u'listFiles_item_selected_handler: (%d) ERROR "%s"' % (itemid,str(exc)))
3002 event.Skip()
3003
3005
3006 self.colidrclicked = event.GetColumn()
3007 self.PopupMenu(self.mnuctxrcol)
3008 event.Skip()
3009
3011
3012 log("Event handler `listFiles_col_click_handler' not implemented")
3013 event.Skip()
3014
3015 - def mnuActionBag_handler(self, event):
3016 self.tBarForceBag_handler(event)
3017
3018 - def mnuActionOrig_handler(self, event):
3019 self.tBarForceOrig_handler(event)
3020
3021 - def mnuActionDel_handler(self, event):
3022 self.tBarForceDel_handler(event)
3023
3024 - def mnuActionUnch_handler(self, event):
3025 self.tBarForceUnchanged_handler(event)
3026
3028 self.tBarForceRestore_handler(event)
3029
3030 - def mnuActionTsbag_handler(self, event):
3031 log(u'frmMain.mnuActionTsbag_handler: start')
3032 if cfg.IsDBCompared:
3033 try:
3034 sk = self.listFiles.GetSelectionKeys()
3035 if sk:
3036 sk = sk[0]
3037
3038 vdb = cfg.Z_DB[sk]
3039
3040 rd = vdb[DBBAGREAD] and vdb[DBDBREAD] and vdb[DBORIGREAD] and (vdb[DBDBFLAG]==DBFLAGFILE)
3041 mdb = vdb[DBDBMDATE] - vdb[DBBAGMDATE]
3042 mdo = vdb[DBDBMDATE] - vdb[DBORIGMDATE]
3043 if abs(mdb) <= cfg.MDDELTA:
3044 mdb = 0.0
3045 if abs(mdo) <= cfg.MDDELTA:
3046 mdo = 0.0
3047 if rd:
3048 if mdb:
3049 cfg.TSBAG = mdb
3050 cfg.TSORIG = 0.0
3051 cfg.TSDIR = TSDIRBAG
3052 elif mdo:
3053 cfg.TSORIG = mdo
3054 cfg.TSBAG = 0.0
3055 cfg.TSDIR = TSDIRBAG
3056 else:
3057
3058 cfg.TSBAG = 0.0
3059 cfg.TSORIG = 0.0
3060 cfg.TSDIR = TSDIRNONE
3061 prt4(u'Set TSBAG=%f, TSORIG=%f, TSDIR=%s.' % (cfg.TSBAG, cfg.TSORIG, [u'None',u'Bag',u'Origin'][cfg.TSDIR]))
3062
3063 self.tBarCompare_handler(event)
3064 except Exception, exc:
3065 log(u'frmMain.mnuActionTsbag_handler: ERROR: %s' % str(exc))
3066 self.lblTs_updateui()
3067 log(u'frmMain.mnuActionTsbag_handler: end')
3068 event.Skip(False)
3069
3070 - def mnuActionTsorig_handler(self, event):
3071 log(u'frmMain.mnuActionTsorig_handler: start')
3072 if cfg.IsDBCompared:
3073 try:
3074 sk = self.listFiles.GetSelectionKeys()
3075 if sk:
3076 sk = sk[0]
3077
3078 vdb = cfg.Z_DB[sk]
3079
3080 rd = vdb[DBBAGREAD] and vdb[DBDBREAD] and vdb[DBORIGREAD] and (vdb[DBDBFLAG]==DBFLAGFILE)
3081 mdb = vdb[DBDBMDATE] - vdb[DBBAGMDATE]
3082 mdo = vdb[DBDBMDATE] - vdb[DBORIGMDATE]
3083 if abs(mdb) <= cfg.MDDELTA:
3084 mdb = 0.0
3085 if abs(mdo) <= cfg.MDDELTA:
3086 mdo = 0.0
3087 if rd:
3088 if mdb:
3089 cfg.TSBAG = mdb
3090 cfg.TSORIG = 0.0
3091 cfg.TSDIR = TSDIRORIG
3092 elif mdo:
3093 cfg.TSORIG = mdo
3094 cfg.TSBAG = 0.0
3095 cfg.TSDIR = TSDIRORIG
3096 else:
3097
3098 cfg.TSBAG = 0.0
3099 cfg.TSORIG = 0.0
3100 cfg.TSDIR = TSDIRNONE
3101 prt4(u'Set TSBAG=%f, TSORIG=%f, TSDIR=%s.' % (cfg.TSBAG, cfg.TSORIG, [u'None',u'Bag',u'Origin'][cfg.TSDIR]))
3102
3103 self.tBarCompare_handler(event)
3104 except Exception, exc:
3105 log(u'frmMain.mnuActionTsbag_handler: ERROR: %s' % str(exc))
3106 self.lblTs_updateui()
3107 log(u'frmMain.mnuActionTsorig_handler: end')
3108 event.Skip(False)
3109
3110 - def TSReset(self):
3111
3112 cfg.TSBAG = 0.0
3113 cfg.TSORIG = 0.0
3114 cfg.TSDIR = TSDIRNONE
3115 self.lblTs_updateui()
3116 prt4(u'Reset time shift.')
3117
3119 log(u'frmMain.mnuActionTsreset_handler: start')
3120 if cfg.IsDBCompared:
3121 try:
3122 self.TSReset()
3123
3124 self.tBarCompare_handler(event)
3125 except Exception, exc:
3126 log(u'frmMain.mnuActionTsbag_handler: ERROR: %s' % str(exc))
3127 log(u'frmMain.mnuActionTsreset_handler: end')
3128 event.Skip(False)
3129
3130 - def mnuFilterOk_handler(self, event):
3131 AppState['ff_ok'] = not AppState['ff_ok']
3132 log(u'mnuFilterOk_handler: %d' % int(AppState['ff_ok']))
3133 cfg.LOCK[LI_UPDATEFILTER] = True
3134 self.listFiles.FilterKeys()
3135
3136 - def mnuFilterWarn_handler(self, event):
3137 AppState['ff_warn'] = not AppState['ff_warn']
3138 log(u'mnuFilterWarn_handler: %d' % int(AppState['ff_warn']))
3139 cfg.LOCK[LI_UPDATEFILTER] = True
3140 self.listFiles.FilterKeys()
3141
3142 - def mnuFilterConf_handler(self, event):
3143 AppState['ff_conf'] = not AppState['ff_conf']
3144 log(u'mnuFilterConf_handler: %d' % int(AppState['ff_conf']))
3145 cfg.LOCK[LI_UPDATEFILTER] = True
3146 self.listFiles.FilterKeys()
3147
3148 - def mnuFilterErr_handler(self, event):
3149 AppState['ff_err'] = not AppState['ff_err']
3150 log(u'mnuFilterErr_handler: %d' % int(AppState['ff_err']))
3151 cfg.LOCK[LI_UPDATEFILTER] = True
3152 self.listFiles.FilterKeys()
3153
3154 - def mnuFilterBag_handler(self, event):
3155 AppState['ff_bag'] = not AppState['ff_bag']
3156 log(u'mnuFilterBag_handler: %d' % int(AppState['ff_bag']))
3157 cfg.LOCK[LI_UPDATEFILTER] = True
3158 self.listFiles.FilterKeys()
3159
3160 - def mnuFilterOrig_handler(self, event):
3161 AppState['ff_orig'] = not AppState['ff_orig']
3162 log(u'mnuFilterOrig_handler: %d' % int(AppState['ff_orig']))
3163 cfg.LOCK[LI_UPDATEFILTER] = True
3164 self.listFiles.FilterKeys()
3165
3166 - def mnuFilterNew_handler(self, event):
3167 AppState['ff_new'] = not AppState['ff_new']
3168 log(u'mnuFilterNew_handler: %d' % int(AppState['ff_new']))
3169 cfg.LOCK[LI_UPDATEFILTER] = True
3170 self.listFiles.FilterKeys()
3171
3172 - def mnuFilterCh_handler(self, event):
3173 AppState['ff_ch'] = not AppState['ff_ch']
3174 log(u'mnuFilterCh_handler: %d' % int(AppState['ff_ch']))
3175 cfg.LOCK[LI_UPDATEFILTER] = True
3176 self.listFiles.FilterKeys()
3177
3178 - def mnuFilterDel_handler(self, event):
3179 AppState['ff_del'] = not AppState['ff_del']
3180 log(u'mnuFilterDel_handler: %d' % int(AppState['ff_del']))
3181 cfg.LOCK[LI_UPDATEFILTER] = True
3182 self.listFiles.FilterKeys()
3183
3184 - def mnuFilterIgn_handler(self, event):
3185 AppState['ff_ign'] = not AppState['ff_ign']
3186 log(u'mnuFilterIgn_handler: %d' % int(AppState['ff_ign']))
3187 cfg.LOCK[LI_UPDATEFILTER] = True
3188 self.listFiles.FilterKeys()
3189
3190 - def mnuFilterUnch_handler(self, event):
3191 AppState['ff_unch'] = not AppState['ff_unch']
3192 log(u'mnuFilterUnch_handler: %d' % int(AppState['ff_unch']))
3193 cfg.LOCK[LI_UPDATEFILTER] = True
3194 self.listFiles.FilterKeys()
3195
3196 - def mnuFilterForced_handler(self, event):
3197 AppState['ff_forced'] = not AppState['ff_forced']
3198 log(u'mnuFilterForced_handler: %d' % int(AppState['ff_forced']))
3199 cfg.LOCK[LI_UPDATEFILTER] = True
3200 self.listFiles.FilterKeys()
3201
3202 - def mnuFilterFile_handler(self, event):
3203 AppState['ff_file'] = not AppState['ff_file']
3204 log(u'mnuFilterFile_handler: %d' % int(AppState['ff_file']))
3205 cfg.LOCK[LI_UPDATEFILTER] = True
3206 self.listFiles.FilterKeys()
3207
3208 - def mnuFilterDir_handler(self, event):
3209 AppState['ff_dir'] = not AppState['ff_dir']
3210 log(u'mnuFilterDir_handler: %d' % int(AppState['ff_dir']))
3211 cfg.LOCK[LI_UPDATEFILTER] = True
3212 self.listFiles.FilterKeys()
3213
3214 - def mnuFilterSym_handler(self, event):
3215 AppState['ff_sym'] = not AppState['ff_sym']
3216 log(u'mnuFilterSym_handler: %d' % int(AppState['ff_sym']))
3217 cfg.LOCK[LI_UPDATEFILTER] = True
3218 self.listFiles.FilterKeys()
3219
3220 - def mnuFilterUnk_handler(self, event):
3221 AppState['ff_unk'] = not AppState['ff_unk']
3222 log(u'mnuFilterUnk_handler: %d' % int(AppState['ff_unk']))
3223 cfg.LOCK[LI_UPDATEFILTER] = True
3224 self.listFiles.FilterKeys()
3225
3226 - def mnuFilterTs_handler(self, event):
3227 AppState['ff_ts'] = not AppState['ff_ts']
3228 log(u'mnuFilterTs_handler: %d' % int(AppState['ff_ts']))
3229 cfg.LOCK[LI_UPDATEFILTER] = True
3230 self.listFiles.FilterKeys()
3231
3232 - def txtFilter_enter_handler(self, event):
3233 self.btnFilterRefresh_handler(event)
3234
3235
3236 - def txtFilter_text_handler(self, event):
3237 r = self.PattCMP()
3238 if not self.BackColor:
3239 self.BackColor = self.txtFilter.GetBackgroundColour()
3240 self.ForeColor = self.txtFilter.GetForegroundColour()
3241 if r:
3242 self.txtFilter.SetBackgroundColour(self.BackColor)
3243 self.txtFilter.SetForegroundColour(self.ForeColor)
3244 self.txtFilter.Refresh(True)
3245 else:
3246 self.txtFilter.SetBackgroundColour(self.ForeColor)
3247 self.txtFilter.SetForegroundColour(self.BackColor)
3248 self.txtFilter.Refresh(True)
3249 event.Skip()
3250
3251 - def chboxBackupMode_handler(self, event):
3252 log(u'chboxBackupMode_handler: Backup mode changed to %s' % int(self.chboxBackupMode.IsChecked()))
3253 cfg.IsDBReaded = cfg.IsDBCompared = cfg.IsDBSynced = False
3254 self.listFiles.Clear()
3255
3257 cfg.LOCK[LI_UPDATEFILTER] = True
3258 self.listFiles.FilterKeys()
3259
3261
3262 self.mnuctxlist = None
3263 self.mnuctxlist = wx.Menu()
3264 if cfg.IsDBCompared and not cfg.IsDBSynced:
3265 self.mnuctxlist.AppendItem(self.mnuActionBag)
3266 self.mnuctxlist.AppendItem(self.mnuActionOrig)
3267 self.mnuctxlist.AppendItem(self.mnuActionDel)
3268 self.mnuctxlist.AppendItem(self.mnuActionUnch)
3269 self.mnuctxlist.AppendItem(self.mnuActionRestore)
3270 self.mnuctxlist.AppendSeparator()
3271 self.mnuctxlist.AppendItem(self.mnuViewProp)
3272 self.PopupMenu(self.mnuctxlist)
3273 event.Skip()
3274
3275 - def mnuViewProp_handler(self, event):
3276 try:
3277 itemid = self.listFiles.GetFocusedItem()
3278
3279 if itemid > -1:
3280 vdb = cfg.Z_DB[self.listFiles.ks[itemid]]
3281
3282 s = vdb[DBDBPATH]
3283 s += u'\n\nDESCRIPTION: ' + vdb[DBDESC] + vdb[DBDESCMAN]
3284
3285 s += u'\n\n' + u'-'*50 + u'\n\n'
3286 if vdb[DBBAGREAD]:
3287
3288 s += u'BAG PATH: ' + vdb[DBBAGPATH] + u'\n'
3289 s += u'BAG TYPE: ' + vdb[DBBAGFLAG] + u'\n'
3290 s += u'BAG LINK: ' + vdb[DBBAGLINK] + u'\n'
3291 s += u'BAG SIZE: ' + z_u(vdb[DBBAGSIZE]) + u'\n'
3292 s += u'BAG CRC32: ' + u'0x%08X' % vdb[DBBAGCRC32] + u'\n'
3293 s += u'BAG TIME SEC: ' + z_u(vdb[DBBAGMDATE]) + u'\n'
3294 s += u'BAG TIME GMT: ' + time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBBAGMDATE])) + u'\n'
3295 s += u'BAG TIME LOC: ' + time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBBAGMDATE])) + u'\n'
3296 else:
3297 s += u'In bag item not found.'
3298
3299 s += u'\n\n' + u'-'*50 + u'\n\n'
3300 if vdb[DBORIGREAD]:
3301
3302 s += u'ORIGIN PATH: ' + vdb[DBORIGPATH] + u'\n'
3303 s += u'ORIGIN TYPE: ' + vdb[DBORIGFLAG] + u'\n'
3304 s += u'ORIGIN LINK: ' + vdb[DBORIGLINK] + u'\n'
3305 s += u'ORIGIN SIZE: ' + z_u(vdb[DBORIGSIZE]) + u'\n'
3306 s += u'ORIGIN CRC32: ' + u'0x%08X' % vdb[DBORIGCRC32] + u'\n'
3307 s += u'ORIGIN TIME SEC: ' + z_u(vdb[DBORIGMDATE]) + u'\n'
3308 s += u'ORIGIN TIME GMT: ' + time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBORIGMDATE])) + u'\n'
3309 s += u'ORIGIN TIME LOC: ' + time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBORIGMDATE])) + u'\n'
3310 else:
3311 s += u'In origin item not found.'
3312
3313 s += u'\n\n' + u'-'*50 + u'\n\n'
3314 if vdb[DBDBREAD]:
3315
3316 s += u'DB PATH: ' + vdb[DBDBPATH] + u'\n'
3317 s += u'DB TYPE: ' + vdb[DBDBFLAG] + u'\n'
3318 s += u'DB LINK: ' + vdb[DBDBLINK] + u'\n'
3319 s += u'DB SIZE: ' + z_u(vdb[DBDBSIZE]) + u'\n'
3320 s += u'DB CRC32: ' + u'0x%08X' % vdb[DBDBCRC32] + u'\n'
3321 s += u'DB TIME SEC: ' + z_u(vdb[DBDBMDATE]) + u'\n'
3322 s += u'DB TIME GMT: ' + time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBDBMDATE])) + u'\n'
3323 s += u'DB TIME LOC: ' + time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBDBMDATE])) + u'\n'
3324 else:
3325 s += u'In database item not found.'
3326
3327 self.InfoDlg.txtInfo.SetValue(s)
3328 self.InfoDlg.ShowModal()
3329 except Exception, exc:
3330 log(u'mnuViewProp_handler: (%d) ERROR "%s"' % (itemid,str(exc)))
3331 event.Skip(False)
3332
3334 self.mnuViewProp_handler(event)
3335
3336 - def mnuctxrcolLeft_handler(self, event):
3337 self.listFiles.MoveColLeft(self.colidrclicked)
3338 event.Skip()
3339
3340 - def mnuctxrcolRight_handler(self, event):
3341 self.listFiles.MoveColRight(self.colidrclicked)
3342 event.Skip()
3343
3344 - def mnuctxrcolErr_handler(self, event):
3345 self.ToggleCol(event, u'err')
3346 event.Skip()
3347
3348 - def mnuctxrcolErr_updateui(self, event):
3349 self.UpdateColMnuUI(event, u'err')
3350 event.Skip(False)
3351
3353 self.ToggleCol(event, u'stateicon')
3354 event.Skip()
3355
3357 self.UpdateColMnuUI(event, u'stateicon')
3358 event.Skip(False)
3359
3361 self.ToggleCol(event, u'actionicon')
3362 event.Skip()
3363
3365 self.UpdateColMnuUI(event, u'actionicon')
3366 event.Skip(False)
3367
3369 self.ToggleCol(event, u'forced')
3370 event.Skip()
3371
3373 self.UpdateColMnuUI(event, u'forced')
3374 event.Skip(False)
3375
3376 - def mnuctxrcolDir_handler(self, event):
3377 self.ToggleCol(event, u'dir')
3378 event.Skip()
3379
3380 - def mnuctxrcolDir_updateui(self, event):
3381 self.UpdateColMnuUI(event, u'dir')
3382 event.Skip(False)
3383
3384 - def mnuctxrcolPath_handler(self, event):
3385 self.ToggleCol(event, u'path')
3386 event.Skip()
3387
3388 - def mnuctxrcolPath_updateui(self, event):
3389 self.UpdateColMnuUI(event, u'path')
3390 event.Skip(False)
3391
3392 - def mnuctxrcolDesc_handler(self, event):
3393 self.ToggleCol(event, u'desc')
3394 event.Skip()
3395
3396 - def mnuctxrcolDesc_updateui(self, event):
3397 self.UpdateColMnuUI(event, u'desc')
3398 event.Skip(False)
3399
3400 - def mnuctxrcolType_handler(self, event):
3401 self.ToggleCol(event, u'type')
3402 event.Skip()
3403
3404 - def mnuctxrcolType_updateui(self, event):
3405 self.UpdateColMnuUI(event, u'type')
3406 event.Skip(False)
3407
3409 self.ToggleCol(event, u'mdatedb')
3410 event.Skip()
3411
3413 self.UpdateColMnuUI(event, u'mdatedb')
3414 event.Skip(False)
3415
3417 self.ToggleCol(event, u'gmdatedb')
3418 event.Skip()
3419
3421 self.UpdateColMnuUI(event, u'gmdatedb')
3422 event.Skip(False)
3423
3425 self.ToggleCol(event, u'lmdatedb')
3426 event.Skip()
3427
3429 self.UpdateColMnuUI(event, u'lmdatedb')
3430 event.Skip(False)
3431
3433 self.ToggleCol(event, u'crc32db')
3434 event.Skip()
3435
3437 self.UpdateColMnuUI(event, u'crc32db')
3438 event.Skip(False)
3439
3441 self.ToggleCol(event, u'sizedb')
3442 event.Skip()
3443
3445 self.UpdateColMnuUI(event, u'sizedb')
3446 event.Skip(False)
3447
3449 self.ToggleCol(event, u'mdatebag')
3450 event.Skip()
3451
3453 self.UpdateColMnuUI(event, u'mdatebag')
3454 event.Skip(False)
3455
3457 self.ToggleCol(event, u'gmdatebag')
3458 event.Skip()
3459
3461 self.UpdateColMnuUI(event, u'gmdatebag')
3462 event.Skip(False)
3463
3465 self.ToggleCol(event, u'lmdatebag')
3466 event.Skip()
3467
3469 self.UpdateColMnuUI(event, u'lmdatebag')
3470 event.Skip(False)
3471
3473 self.ToggleCol(event, u'crc32bag')
3474 event.Skip()
3475
3477 self.UpdateColMnuUI(event, u'crc32bag')
3478 event.Skip(False)
3479
3481 self.ToggleCol(event, u'sizebag')
3482 event.Skip()
3483
3485 self.UpdateColMnuUI(event, u'sizebag')
3486 event.Skip(False)
3487
3489 self.ToggleCol(event, u'mdateorigin')
3490 event.Skip()
3491
3493 self.UpdateColMnuUI(event, u'mdateorigin')
3494 event.Skip(False)
3495
3497 self.ToggleCol(event, u'gmdateorigin')
3498 event.Skip()
3499
3501 self.UpdateColMnuUI(event, u'gmdateorigin')
3502 event.Skip(False)
3503
3505 self.ToggleCol(event, u'lmdateorigin')
3506 event.Skip()
3507
3509 self.UpdateColMnuUI(event, u'lmdateorigin')
3510 event.Skip(False)
3511
3513 self.ToggleCol(event, u'crc32origin')
3514 event.Skip()
3515
3517 self.UpdateColMnuUI(event, u'crc32origin')
3518 event.Skip(False)
3519
3521 self.ToggleCol(event, u'sizeorigin')
3522 event.Skip()
3523
3525 self.UpdateColMnuUI(event, u'sizeorigin')
3526 event.Skip(False)
3527
3529 self.ToggleCol(event, u'symlinkdb')
3530 event.Skip()
3531
3533 self.UpdateColMnuUI(event, u'symlinkdb')
3534 event.Skip(False)
3535
3537 self.ToggleCol(event, u'symlinkbag')
3538 event.Skip()
3539
3541 self.UpdateColMnuUI(event, u'symlinkbag')
3542 event.Skip(False)
3543
3545 self.ToggleCol(event, u'symlinkorigin')
3546 event.Skip()
3547
3549 self.UpdateColMnuUI(event, u'symlinkorigin')
3550 event.Skip(False)
3551
3552 - def mnuctxrcolTs_handler(self, event):
3553 self.ToggleCol(event, u'timeshift')
3554 event.Skip()
3555
3556 - def mnuctxrcolTs_updateui(self, event):
3557 self.UpdateColMnuUI(event, u'timeshift')
3558 event.Skip(False)
3559
3561 try:
3562 log(u'mnuctxrcolDefault_handler')
3563 cfg.Z_COLUMN_CHOISE = FillColFromConfig()
3564 self.listFiles.RefreshColumns()
3565 except Exception, exc:
3566 log(u'mnuctxrcolDefault_handler: ERROR %s' % str(exc))
3567 event.Skip(False)
3568
3569 - def mnuFileTips_handler(self, event):
3570 self.dlgTips.ShowModal()
3571 event.Skip()
3572
3574
3575 try:
3576 log(u'listFiles_col_end_drag_handler: start')
3577 item = event.GetColumn()
3578 w = self.listFiles.GetColumnWidth(item)
3579 n = self.listFiles.colkeys[item]
3580 idx = self.listFiles.GetColChoiseIdx(n)
3581 cd = cfg.Z_COLUMN_CHOISE[idx]
3582 log(u'listFiles_col_end_drag_handler: idx=%d, name=%s, w=%d' % (idx,n,w))
3583 cfg.Z_COLUMN_CHOISE[idx] = (cd[COL_NAME],cd[COL_HEADING],cd[COL_VISIBLE],w,cd[COL_FORMAT])
3584 except Exception, exc:
3585 log(u'listFiles_col_end_drag_handler: ERROR %s' % str(exc))
3586 event.Skip()
3587
3588
3589 - def mnuRootsSelall_handler(self, event):
3590 self.RootsSelectAll()
3591 event.Skip()
3592
3594 self.RootsUnselectAll()
3595 event.Skip()
3596
3597 - def btnSelectRoots_handler(self, event):
3598 global btnSelectRoots_state;
3599
3600 if btnSelectRoots_state==SELSTATEALL:
3601 btnSelectRoots_state = SELSTATECLEAR
3602 self.btnSelectRoots.SetLabel("Select default")
3603 self.RootsUnselectAll()
3604 elif btnSelectRoots_state==SELSTATEDEFAULT:
3605 btnSelectRoots_state = SELSTATEALL
3606 self.btnSelectRoots.SetLabel("Clear all")
3607 self.RootsSelectAll()
3608 elif btnSelectRoots_state==SELSTATECLEAR:
3609 btnSelectRoots_state = SELSTATEDEFAULT
3610 self.btnSelectRoots.SetLabel("Select all")
3611 self.RootsSelectDefault()
3612
3613 event.Skip()
3614
3615 - def mnuRootsSeldef_hundler(self, event):
3616 self.RootsSelectDefault()
3617 event.Skip()
3618
3619 - def mnuFileCleanDB_handler(self, event):
3620 cfg.IsDBReaded = False
3621 cfg.IsDBCompared = False
3622 cfg.IsDBSynced = False
3623 self.listFiles.Clear()
3624
3625 self.StartWork(self.do_cleandb, self.do_cleandb2)
3626 event.Skip(False)
3627
3628
3629
3630 - def UpdateColMnuUI(self, event, idx):
3631 try:
3632 dbg(u'UpdateColMnuUI: start(%s)' % idx)
3633 i = self.listFiles.GetColChoiseIdx(idx)
3634 dbg(u'UpdateColMnuUI: Z_COLUMN_CHOISE[%d][COL_VISIBLE] = %s' % (i,str(cfg.Z_COLUMN_CHOISE[i][COL_VISIBLE])))
3635 if (i > -1) and (cfg.Z_COLUMN_CHOISE[i][COL_VISIBLE]):
3636 dbg(u'UpdateColMnuUI: set True')
3637 event.Check(True)
3638 else:
3639 dbg(u'UpdateColMnuUI: set False')
3640 event.Check(False)
3641 except Exception, exc:
3642 log(u'UpdateColMnuUI: ERROR %s' % str(exc))
3643
3644 - def ToggleCol(self, event, idx):
3645 log(u'ToggleCol: start(%s)' % idx)
3646 try:
3647 i = self.listFiles.GetColChoiseIdx(idx)
3648 if i > -1:
3649
3650 v = int(not bool(cfg.Z_COLUMN_CHOISE[i][COL_VISIBLE]))
3651 log(u'ToggleCol: i=%d, vis=%d' % (i,v))
3652 cfg.Z_COLUMN_CHOISE[i] = (cfg.Z_COLUMN_CHOISE[i][COL_NAME], \
3653 cfg.Z_COLUMN_CHOISE[i][COL_HEADING], v, \
3654 cfg.Z_COLUMN_CHOISE[i][COL_WIDTH], cfg.Z_COLUMN_CHOISE[i][COL_FORMAT])
3655 self.listFiles.RefreshColumns()
3656 except Exception, exc:
3657 log(u'ToggleCol: ERROR %s' % str(exc))
3658
3659 - def PattCMP(self):
3660 """
3661 Try compile from txtFilter. If Ok return True and set L{cfg.REPORTPATTCMP}
3662 to compiled regexp, otherwise return False and do not change L{cfg.REPORTPATTCMP}.
3663 """
3664 r = True
3665
3666 _filter = self.txtFilter.Value
3667
3668 if _filter:
3669 cire = _filter
3670 else:
3671 cire = u'!.*'
3672 if cire[0] == u'!':
3673 cire = cire[1:]
3674 else:
3675
3676 cire = cire.replace(u'\\',u'\\\\').replace(u'|',u'\\|').replace(u'.',u'\\.').replace(u'*',u'.*'). \
3677 replace(u'?',u'.?').replace(u'$',u'\\$').replace(u'^',u'\\^').replace(u'{',u'\\{'). \
3678 replace(u'(',u'\\(').replace(u'[',u'\\[').replace(u'+',u'\\+').split(u',')
3679 cire = u'|'.join([u'('+i+u'$)' for i in cire if i])
3680 if not cire:
3681 cire = u'.*'
3682 try:
3683 log(u'PattCMP: cire = "%s"' % z_u(cire))
3684 ci = re.compile(cire, re.LOCALE | re.UNICODE)
3685 except Exception, exc:
3686 log(u'PattCMP: Error when compiling _filter string "%s". ERROR="%s"' % (cire, str(exc)))
3687 r = False
3688 if r:
3689 cfg.REPORTPATTCMP = ci
3690 return r
3691
3692
3693 - def timer_handler(self,event):
3694 """
3695 """
3696 if cfg.PYBAG_DEBUG:
3697 dbg(u'frmMain.timer_handler: start')
3698 if self.thread:
3699
3700 if self.thread.isAlive():
3701
3702 if cfg.LOCK[LI_CANCEL]:
3703 log(u'frmMain.timer_handler: Cancel but thread running yet.')
3704 else:
3705
3706 if self.progress:
3707
3708 p100 = cfg.LOCK[LI_PERCENT100]
3709 p = cfg.LOCK[LI_PERCENT]
3710 if p100 == 0:
3711 p100 = 99
3712 msg = cfg.LOCK[LI_DESC]
3713 if p >= p100:
3714 p = p100 - 1
3715 p = float(p) / p100 * cfg.LOCK[LI_PERCENTPART] + cfg.LOCK[LI_PERCENTGLOBAL]
3716
3717 c,s = self.progress.Update(int(p), msg)
3718
3719 if not c:
3720 cfg.LOCK[LI_CANCEL] = True
3721 prt0(u'OPERATION CANCELED', place=u'frmMain.timer_handler')
3722
3723 else:
3724
3725 self.thread = None
3726 self.progress.Destroy()
3727 self.progress = None
3728 if not cfg.LOCK[LI_CANCEL]:
3729 fun2 = cfg.LOCK[LI_FUN2]
3730 if fun2:
3731 cfg.LOCK[LI_FUN2] = None
3732 dbg(u'frmMain.timer_handler: call after fun2 "%s"' % fun2.__name__)
3733 wx.CallAfter(fun2)
3734 cfg.LOCK[LI_CANCEL] = False
3735 log(u'frmMain.timer_handler: thread exited')
3736 else:
3737
3738 if self.progress:
3739
3740 self.progress = None
3741 cfg.LOCK[LI_CANCEL] = False
3742
3743 try:
3744 global _outtxt
3745 _outlock.acquire()
3746 if _outtxt:
3747 self.txtOut.AppendText(_outtxt)
3748 _outtxt = u''
3749 except:
3750 pass
3751 finally:
3752 _outlock.release()
3753
3754
3755
3756 - def set_force(self):
3757 """
3758 Thread function.
3759 """
3760
3761 log(u'frmMain.set_force: start')
3762 global ForceAction, ForceKs, ForceRet
3763 action = ForceAction
3764 ForceRet = u''
3765 fks = ForceKs
3766 db = cfg.Z_DB
3767 dbks = cfg.Z_KS
3768 dbstartswith_ = dbstartswith
3769 DBDBPATH_ = DBDBPATH
3770 DBPATH_ = DBPATH
3771 DBDBFLAG_ = DBDBFLAG
3772 DBBAGFLAG_ = DBBAGFLAG
3773 DBORIGFLAG_ = DBORIGFLAG
3774 DBFLAGDIR_ = DBFLAGDIR
3775 DBBAGREAD_ = DBBAGREAD
3776 DBORIGREAD_ = DBORIGREAD
3777 DBDBREAD_ = DBDBREAD
3778 DBDIRMAN_ = DBDIRMAN
3779 DBDIR_ = DBDIR
3780 DBDIRNONE_ = DBDIRNONE
3781 DBDESCMAN_ = DBDESCMAN
3782 DBDESCNONE_ = DBDESCNONE
3783 LOCK_ = cfg.LOCK
3784 LI_PERCENT_ = LI_PERCENT
3785 LI_CANCEL_ = LI_CANCEL
3786 dbbagdel = DBDIRBAG | DBDIRDELETE | DBDIRFORCED
3787 dborigdel = DBDIRORIG | DBDIRDELETE | DBDIRFORCED
3788 dbdbdel = DBDIRDB | DBDIRDELETE | DBDIRFORCED
3789 dbbag = DBDIRBAG | DBDIRDB | DBDIRCOPY | DBDIRFORCED
3790 dbunchanged = DBDIRUNCHANGED | DBDIRFORCED
3791
3792 dborig = DBDIRORIG | DBDIRDB | DBDIRCOPY | DBDIRFORCED
3793 doout = cfg.PYBAG_DEBUG
3794
3795 def act(v):
3796 """
3797 """
3798
3799 try:
3800 rdbag = v[DBBAGREAD_]
3801 rdorig = v[DBORIGREAD_]
3802 rddb = v[DBDBREAD_]
3803 if v[DBDIRMAN_] == DBDIRNONE_:
3804
3805 v[DBDIRMAN_] = v[DBDIR_]
3806 v[DBDESCMAN_] = u' Manualy forced: '
3807 if action == u'delete':
3808
3809
3810 v[DBDIR_] = DBDIRNONE_
3811 if rdbag:
3812 v[DBDIR_] = dbbagdel
3813 v[DBDESCMAN_] += u'Delete in bag.'
3814 if rdorig:
3815 v[DBDIR_] |= dborigdel
3816 v[DBDESCMAN_] += u'Delete in origin.'
3817 if rddb:
3818 v[DBDIR_] |= dbdbdel
3819 v[DBDESCMAN_] += u'Delete in db.'
3820 if not (rdbag or rdorig):
3821 v[DBDESCMAN_] += u'Nothing for deleting.'
3822 else:
3823
3824 p = getpathdirdb(v[DBPATH_])
3825 while p:
3826 pv = db[p]
3827 if pv[DBDIR_] & DBDIRDELETE:
3828 log(u'act(%s): Forced unchange parent "%s"' % (v[DBDBPATH_],p))
3829 pv[DBDIR_] = dbunchanged
3830 pv[DBDESCMAN] += u' Unchange (not all childeren deleted).'
3831 p = getpathdirdb(p)
3832
3833 if action == u'bag':
3834
3835
3836 if rdorig:
3837 v[DBDIR_] = dbbag
3838 v[DBDESCMAN_] += u'Copy to bag. '
3839 else:
3840 v[DBDIR_] = (v[DBDIR_] & DBDIRNEW) | dbunchanged
3841 v[DBDESCMAN_] += u'Nothing copy to bag. Unchange.'
3842 elif action == u'origin':
3843
3844
3845 if rdbag:
3846 v[DBDIR_] = dborig
3847 v[DBDESCMAN_] += u'Copy to origin.'
3848 else:
3849 v[DBDIR_] = dbunchanged
3850 v[DBDESCMAN_] += u'Nothing copy to origin. Unchange.'
3851 elif action == u'skip':
3852
3853
3854 v[DBDIR_] = dbunchanged
3855 v[DBDESCMAN_] += u'Unchanged.'
3856 elif action == u'restore':
3857
3858
3859 if v[DBDIRMAN_] != DBDIRNONE_:
3860 v[DBDIR_] = v[DBDIRMAN_]
3861 v[DBDESCMAN_] = u''
3862 else:
3863 log(u'act: ERROR action "%s"' % (action,))
3864 v[DBDESCMAN_] += u'ERROR action "%s"' % (action,)
3865
3866
3867
3868 except Exception, exc:
3869 log(u'act(%s): ERROR %s' % (v[DBPATH_],str(exc)))
3870
3871
3872 try:
3873
3874
3875 tm = time.time()
3876
3877 if not (action in O_ACTION):
3878 r = u'Unknown action "%s".' % action
3879 return r
3880
3881 dl = []
3882 if doout:
3883 dbg(u'frmMain.set_force: for start.')
3884
3885 cfg.LOCK[LI_PERCENTGLOBAL] = 1
3886 cfg.LOCK[LI_PERCENTPART] = 100
3887 cfg.LOCK[LI_PERCENT] = 0
3888 cfg.LOCK[LI_PERCENT100] = len(cfg.Z_DB)
3889 cfg.LOCK[LI_DESC] = 'Force ...'
3890 if cfg.LOCK[LI_CANCEL]:
3891
3892 log(u'frmMain.set_force: canceled')
3893 return u'Force canceled.'
3894
3895 LOOPN_ = LOOPN
3896 LN = 0
3897
3898
3899 for idb in dbks:
3900 LN += 1
3901 if LN > LOOPN_:
3902 LOCK_[LI_PERCENT_] += LN
3903 LN = 0
3904 if LOCK_[LI_CANCEL_]:
3905 log(u'frmMain.set_force: canceled.')
3906 ForceKs = u'Force canceled.'
3907 return
3908 vdb = db[idb]
3909 path = vdb[DBDBPATH_]
3910 if doout:
3911 dbg(u'\nfrmMain.set_force: for(path) = "%s".' % z_u(path))
3912 dbg(u'frmMain.set_force: loop for dli start.')
3913
3914
3915 kk = True
3916 for dli in dl[:]:
3917 if doout:
3918 dbg(u'do_action: dli = "%s".' % dli)
3919 if dbstartswith_(idb, dli):
3920 act(vdb)
3921 kk = False
3922 if doout:
3923 dbg(u'do_action: act ok.')
3924 else:
3925 if doout:
3926 dbg(u'do_action: remove dli from dl = "%s"' % z_u(dli))
3927 dl.remove(dli)
3928 dbg(u'do_action: loop for dli end.')
3929
3930
3931 if kk and (idb in fks):
3932 dbg(u'frmMain.set_force: if kk --> act.')
3933 act(vdb)
3934 if (vdb[DBDBFLAG_]==DBFLAGDIR) or (vdb[DBBAGFLAG_]==DBFLAGDIR) or (vdb[DBORIGFLAG_]==DBFLAGDIR):
3935
3936 if doout:
3937 dbg(u'do_action: add idb to dl = "%s"' % z_u(idb))
3938 dl.append(idb)
3939
3940
3941 tm = time.time() - tm
3942 prt4(u'\nForce time is %.3f' % tm)
3943
3944 except Exception, exc:
3945 prt0(u'ERROR in program.',place=u'frmMain.set_force',error=exc)
3946 log(u'frmMain.set_force: end')
3947
3948
3949 - def set_force2(self):
3950 """
3951 """
3952 cfg.LOCK[LI_UPDATEFILTER] = True
3953 self.listFiles.FilterKeys()
3954
3955 - def do_stat(self):
3956 """
3957 Calculate statistics.
3958
3959 Resultat save into self._stat_info variable.
3960 """
3961 cmd = command_class()
3962 setattr(cmd,'r',[])
3963 setattr(cmd,'x',[])
3964 prt1()
3965 cfg.LOCK[LI_PERCENTPART] = 100
3966 cfg.LOCK[LI_PERCENTGLOBAL] = 0
3967 prt1(u'Calculate statistics, please wait...')
3968 self._stat_info = f_stat(cmd)
3969 prt(self._stat_info,verbosity=-100)
3970
3971 - def do_stat2(self):
3972 if not cfg.LOCK[LI_CANCEL]:
3973 self.InfoDlg.txtInfo.SetValue(TermColors.skipTags(self._stat_info))
3974 self.InfoDlg.ShowModal()
3975 del self._stat_info
3976
3977 - def do_cleandb(self):
3978 """
3979 Calculate statistics.
3980
3981 Resultat save into self._stat_info variable.
3982 """
3983 cmd = command_class()
3984 setattr(cmd,'r',[])
3985 prt1()
3986 cfg.LOCK[LI_PERCENTPART] = 100
3987 cfg.LOCK[LI_PERCENTGLOBAL] = 0
3988 prt1(u'Clean DB, please wait...')
3989 try:
3990 cmd = command_class()
3991
3992 cmd_cleandb(cmd)
3993 except Exception,exc:
3994 prt0(u'ERROR in program %s.' % (traceback.format_exc(),),place=u'mnuFileCleanDB_handler',
3995 error=exc)
3996
3997 - def do_cleandb2(self):
4001
4002 - def do_read(self):
4003 """
4004 Thread function.
4005 """
4006 log(u'frmMain.do_readdb: start')
4007 z_r.clear()
4008
4009 try:
4010 prt1()
4011 cfg.LOCK[LI_PERCENTPART] = 100
4012 cfg.LOCK[LI_PERCENTGLOBAL] = 0
4013 if cfg.LOCK[LI_CANCEL]:
4014
4015 dbg(u'frmMain.do_read: canceled')
4016 return
4017 prt1(u'Reading ...\n')
4018 cmd = command_class()
4019 cmd.fs = []
4020 cmd.f = []
4021 cmd.x = []
4022 cnt = self.clboxRoots.GetCount()
4023 for i in range(cnt):
4024 if self.clboxRoots.IsChecked(i):
4025 rn = self.clboxRoots.GetString(i)
4026 prt1(u'\tRoot "%s" marked for synchronization.' % rn)
4027 cmd.f.append(rn)
4028 if not cmd.f:
4029 prt1(u'No roots selected. Cancel.')
4030 cfg.LOCK[LI_CANCEL] = True
4031 return
4032 tm0 = time.time()
4033
4034 cfg.IsDBReaded = False
4035 cfg.IsDBSynced = False
4036 cfg.IsDBCompared = False
4037 self.listFiles.Clear()
4038 self.read_ign = f_syncread(cmd)
4039 if cfg.LOCK[LI_CANCEL]:
4040
4041 dbg(u'frmMain.do_read: canceled')
4042 return
4043 cfg.IsDBReaded = True
4044 tm1 = time.time()
4045 prt1()
4046 prt1(u'\tIgnored %d items in bag and origin.' % self.read_ign)
4047 prt1()
4048 prt1( u'\t all items = %d' % len(cfg.Z_DB))
4049 self.readdur = tm1-tm0
4050 prt1(u'Reading duration is %.3f sec.' % (self.readdur,))
4051 prt1()
4052 if z_r.e:
4053 prt0( u'ERROR occur:', error=z_r.e)
4054 z_r.clear()
4055
4056 except Exception, exc:
4057 prt0(u'\nError then reading DB.\n', place=u'frmMain.do_readdb', error=exc)
4058
4059 log(u'frmMain.do_readdb: end')
4060
4061
4062 - def do_read2(self):
4063
4064 self.TSReset()
4065 self.lblErrors.SetLabel(u'')
4066 self.lblConflicts.SetLabel(u'')
4067 self.lblWarnings.SetLabel(u'')
4068 self.lblAllItems.SetLabel(u'All items: %d' % len(cfg.Z_DB))
4069 self.lblNewBag.SetLabel(u'')
4070 self.lblNewOrig.SetLabel(u'')
4071 self.lblChangeBag.SetLabel(u'')
4072 self.lblChangeOrig.SetLabel(u'')
4073 self.lblDelBag.SetLabel(u'')
4074 self.lblDelOrig.SetLabel(u'')
4075 self.lblIgnored.SetLabel(u'Ignored: %d' % self.read_ign)
4076 self.lblTimeshifted.SetLabel(u'')
4077 self.sizerMain.Show(self.sizerInfo1,False,True)
4078 self.sizerMain.Show(self.sizerInfo2,True,True)
4079 self.sizerMain.Show(self.sizerSelDesc,True,True)
4080 self.sizerMain.Show(self.sizerSelFile,True,True)
4081 self.sizerMain.Layout()
4082
4083
4084 self.listFiles.FillKeys()
4085
4086 - def do_compare(self):
4087 """
4088 Compare files in GUI.
4089
4090 Thread function.
4091 """
4092 log(u'frmMain.do_compare: start')
4093 try:
4094
4095 if not cfg.IsDBReaded:
4096 self.do_read()
4097
4098
4099 d = self.cboxAutoAction.GetSelection()
4100 if cfg.LOCK[LI_CANCEL]:
4101
4102 dbg(u'frmMain.do_compare: canceled')
4103 return
4104 _dir = z_action_choise[d][1]
4105 dbg( u'frmMain.do_compare: _dir=%s (%s)' % (z_u(_dir),z_action_choise[d][0]) )
4106 prt1()
4107 prt1(u'Comparing ...\n')
4108
4109 cfg.LOCK[LI_PERCENTPART] = 100
4110 cfg.LOCK[LI_PERCENTGLOBAL] = 0
4111
4112 prt1()
4113 tm0 = time.time()
4114 cfg.IsDBCompared = False
4115 cfg.IsDBSynced = False
4116 self.compare_re,self.compare_rc,self.compare_rw,self.compare_rbn,self.compare_ron, \
4117 self.compare_rbc,self.compare_roc,self.compare_rbd,self.compare_rod, \
4118 self.compare_rign, self.compare_rts = f_synccompare(_dir)
4119 if cfg.LOCK[LI_CANCEL]:
4120
4121 dbg(u'frmMain.do_compare: canceled')
4122 return
4123 cfg.IsDBCompared = True
4124 tm1 = time.time()
4125 prt1()
4126 prt1( u'\t errors = %d' % self.compare_re)
4127 prt1( u'\t conflicts = %d' % self.compare_rc)
4128 prt1( u'\t warnings = %d' % self.compare_rw)
4129 prt1( u'\t all items = %d' % len(cfg.Z_DB))
4130 prt1( u'\t new in bag = %d' % self.compare_rbn)
4131 prt1( u'\t new in origin = %d' % self.compare_ron)
4132 prt1( u'\t changed in bag = %d' % self.compare_rbc)
4133 prt1( u'\t changed in origin = %d' % self.compare_roc)
4134 prt1( u'\t deleted in bag = %d' % self.compare_rbd)
4135 prt1( u'\t deleted in origin = %d' % self.compare_rod)
4136 prt1( u'\t ignored = %d' % self.compare_rign)
4137 prt1( u'\t timeshifted = %d' % self.compare_rts)
4138 prt1()
4139 prt1(u'Reading duration is %.3f sec.' % (self.readdur,))
4140 prt1()
4141 self.cmpdur = tm1-tm0
4142 prt1(u'Comparing duration is %.3f sec.' % (self.cmpdur,))
4143 prt1()
4144 prt1(u'Summary reading and comparing duration is %.3f sec.' % (self.readdur+self.cmpdur,))
4145 prt1()
4146 z_r.clear()
4147
4148 except Exception, exc:
4149 prt0(u'\nERROR then compare.', place=u'frmMain.do_compare', error=exc)
4150
4151 log(u'frmMain.do_compare: end')
4152
4153 - def do_compare2(self):
4154
4155 self.lblErrors.SetLabel(u'Errors: %d' % (self.compare_re,))
4156 self.lblConflicts.SetLabel(u'Conflicts: %d' % (self.compare_rc,))
4157 self.lblWarnings.SetLabel(u'Warnings: %d' % (self.compare_rw,))
4158 self.lblAllItems.SetLabel(u'All items: %d' % len(cfg.Z_DB))
4159 self.lblNewBag.SetLabel(u'New in bag: %d' % (self.compare_rbn,))
4160 self.lblNewOrig.SetLabel(u'New in origin: %d' % (self.compare_ron,))
4161 self.lblChangeBag.SetLabel(u'Changed in bag: %d' % (self.compare_rbc,))
4162 self.lblChangeOrig.SetLabel(u'Changed in origin: %d' % (self.compare_roc,))
4163 self.lblDelBag.SetLabel(u'Deleted in bag: %d' % (self.compare_rbd,))
4164 self.lblDelOrig.SetLabel(u'Deleted in origin: %d' % (self.compare_rod,))
4165 self.lblIgnored.SetLabel(u'Ignored: %d' % (self.compare_rign,))
4166 self.lblTimeshifted.SetLabel(u'Timeshifted: %d' % (self.compare_rts,))
4167 self.sizerMain.Show(self.sizerInfo1,True,True)
4168 self.sizerMain.Show(self.sizerInfo2,True,True)
4169 self.sizerMain.Show(self.sizerSelDesc,True,True)
4170 self.sizerMain.Show(self.sizerSelFile,True,True)
4171 self.sizerMain.Layout()
4172 cfg.LOCK[LI_UPDATEFILTER] = True
4173 self.listFiles.FilterKeys()
4174
4175 - def do_sync(self):
4176 """
4177 Synchronize.
4178
4179 Thread function.
4180 """
4181 log(u'frmMain.do_sync: start')
4182 try:
4183
4184 if not cfg.IsDBCompared:
4185 self.do_compare()
4186
4187
4188
4189 prt1(u'Syncronizing ...\n')
4190 cfg.LOCK[LI_PERCENTPART] = 85
4191 cfg.LOCK[LI_PERCENTGLOBAL] = 0
4192 if cfg.LOCK[LI_CANCEL]:
4193
4194 dbg(u'frmMain.do_sync: canceled')
4195 return
4196 tm0 = time.time()
4197 cfg.IsDBCompared = False
4198 cfg.IsDBReaded = False
4199 cfg.IsDBSynced = False
4200
4201 self.sync_sd, self.sync_sn, self.sync_sc, self.sync_su, self.sync_se, self.sync_ts = f_syncsync()
4202 if cfg.LOCK[LI_CANCEL]:
4203
4204 dbg(u'frmMain.do_sync: canceled')
4205 return
4206 tm1 = time.time()
4207 prt1()
4208 prt1( u'\t all items = %d' % len(cfg.Z_DB))
4209 prt1( u'\t errors after comparing = %d' % self.sync_su)
4210 prt1( u'\t errors in syncronizing = %d' % self.sync_se)
4211 prt1( u'\t new = %d' % self.sync_sn)
4212 prt1( u'\t copied = %d' % self.sync_sc)
4213 prt1( u'\t deleted = %d' % self.sync_sd)
4214 prt1( u'\t timeshifted = %d' % self.sync_ts)
4215 z_r.clear()
4216 prt1()
4217 prt1(u'Clearing ...\n')
4218 cfg.LOCK[LI_PERCENTPART] = 10
4219 cfg.LOCK[LI_PERCENTGLOBAL] = 85
4220 f_syncclear()
4221 tm2 = time.time()
4222 prt1()
4223 prt1(u'Save DB ...\n')
4224 cfg.LOCK[LI_PERCENTPART] = 5
4225 cfg.LOCK[LI_PERCENTGLOBAL] = 95
4226 cfg.LOCK[LI_DESC] = 'Save DB ...'
4227 dbsave(cfg.Z_DB)
4228 cfg.IsDBSynced = True
4229 tm3 = time.time()
4230 prt1()
4231 prt1(u'Syncronization compete.')
4232 prt1()
4233 prt1(u'Reading duration is %.3f sec.' % (self.readdur,))
4234 prt1()
4235 prt1(u'Comparing duration is %.3f sec.' % (self.cmpdur,))
4236 prt1()
4237 prt1(u'Synchronization duration is %.3f sec.' % (tm1-tm0,))
4238 prt1(u'Clearing duration is %.3f sec.' % (tm2-tm1,))
4239 prt1(u'Save duration is %.3f sec.' % (tm3-tm2,))
4240 prt1()
4241 self.syncdur = tm3-tm0 + self.readdur + self.cmpdur
4242 prt1(u'Summary duration is %.3f sec.' % (self.syncdur,))
4243 prt1()
4244
4245 except Exception, exc:
4246 prt0(u'\nERROR then sync.', place=u'frmMain.do_sync', error=exc)
4247 log(u'end cmd_sync')
4248
4249 - def do_sync2(self):
4250
4251 self.TSReset()
4252 self.lblErrors.SetLabel(u'')
4253 self.lblConflicts.SetLabel(u'')
4254 self.lblWarnings.SetLabel(u'')
4255 self.lblAllItems.SetLabel(u'All items: %d' % len(cfg.Z_DB))
4256 self.lblNewBag.SetLabel(u'')
4257 self.lblNewOrig.SetLabel(u'')
4258 self.lblChangeBag.SetLabel(u'Comparing errors: %d' % (self.sync_su,))
4259 self.lblChangeOrig.SetLabel(u'Synchronization errors: %d' % (self.sync_se,))
4260 self.lblDelBag.SetLabel(u'New: %d' % (self.sync_sn,))
4261 self.lblDelOrig.SetLabel(u'Copied: %d' % (self.sync_sc,))
4262 self.lblIgnored.SetLabel(u'Deleted: %d' % (self.sync_sd,))
4263 self.lblTimeshifted.SetLabel(u'Timeshifted: %d' % (self.sync_ts,))
4264 self.sizerMain.Show(self.sizerInfo1,False,True)
4265 self.sizerMain.Show(self.sizerInfo2,True,True)
4266 self.sizerMain.Show(self.sizerSelDesc,True,True)
4267 self.sizerMain.Show(self.sizerSelFile,True,True)
4268 self.sizerMain.Layout()
4269 cfg.LOCK[LI_UPDATEFILTER] = True
4270 self.listFiles.FilterKeys()
4271
4272 - def StartWork(self, fun, fun2=None):
4273 """
4274 Launch "fun" as working thread. Return True for success, False otherwise.
4275 "fun2" will be running after thread exited.
4276 """
4277 log(u'frmMain.StartWork: start')
4278 ret = False
4279 if not self.thread:
4280
4281 self.thread = threading.Thread(target=fun, name=fun.__name__)
4282 cfg.LOCK[LI_CANCEL] = False
4283 cfg.LOCK[LI_FUN2] = fun2
4284 self.progress = None
4285 self.thread.start()
4286 self.progress = wx.ProgressDialog('Work progress.','Working ...',100,self, wx.PD_CAN_ABORT |
4287 wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_ESTIMATED_TIME |
4288 wx.PD_REMAINING_TIME | wx.PD_SMOOTH)
4289 ret = True
4290 else:
4291 prt0(u'One command already running!!!', place=u'frmMain.StartWork')
4292 log(u'frmMain.StartWork: end')
4293 return ret
4294
4295
4296
4297
4299 """
4300 Output stream. Accumulate all output and put it to txtOut control.
4301
4302 Used for replace sys.stdout.
4303 Have handler which called each time after writing.
4304
4305 @note: Safe for multithreading.
4306 """
4307
4309 """
4310 Write arguments to output text string.
4311 """
4312 def red(a,b):
4313 return a + unicode(b, cfg.z_outep, 'replace')
4314 try:
4315
4316 s = reduce(red, arg, u'')
4317 try:
4318 global _outtxt
4319 _outlock.acquire()
4320 _outtxt = _outtxt + s
4321 finally:
4322 _outlock.release()
4323
4324 except Exception, exc:
4325 pass
4326
4327
4328
4329
4331 """
4332 Show msg and return Yes (True) or No (False) result.
4333
4334 @param msg: Message for show.
4335 @type msg: string
4336 @param title: Window title.
4337 @type title: string
4338 @return: Yes or No result.
4339 @rtype: boolean
4340 """
4341 if cfg.Z_APP is None:
4342 cfg.Z_APP = wx.App()
4343 r = wx.MessageBox(msg,title,
4344 style = wx.YES_NO)
4345 r = r == wx.YES
4346 return r
4347
4348
4350 """
4351 Show msg with OK button.
4352 param msg: Message for show.
4353 @type msg: string
4354 @param title: Window title.
4355 @type title: string
4356 """
4357 if cfg.Z_APP is None:
4358 cfg.Z_APP = wx.App()
4359 wx.MessageBox(msg,title,style = wx.OK)
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371