Regression: Settings_DumpTranslator broke with the new layout:

Under #174.

Introduced bolt._findAllBashModules() that should be more robust against
file moves. There is room for improvement - does double job - hacked
together from:

http://stackoverflow.com/a/1310912/281545

Due to 'pyw' extension we 're doing double job: we first call listdir()
and then iter_modules(). If we ignore u'Wrye Bash Launcher.pyw' we can
keep only the iter_modules loop (using bashPath.join(p[1] + u'.py'), see
the code as it was in settings_links.py). Not sure if iter_modules keeps
`__init__.py`s though. Consider also using pkgutil.walk_packages.

cwd: os.getcwdu() is the autohotkey script (I start Bash with) dir when
def is executed - so I moved it inside _findAllBashModules().

settings_link.py:
Some minimal wrapping and _basslang() function to factor out the common
code for getting the language.

Warnings from the translator:
*** bash\bish.py:794: Seen unexpected token "+"
*** bash\bolt.py:215: Seen unexpected token "text"
*** bash\bosh.py:11511: Seen unexpected token "settings"
*** bash\cint.py:76: Seen unexpected token "obj"
*** bash\basher\app_buttons.py:342: Seen unexpected token "%"
*** bash\basher\app_buttons.py:782: Seen unexpected token "+"
*** bash\basher\installer_links.py:612: Seen unexpected token "bush"
*** bash\basher\installer_links.py:1266: Seen unexpected token "%"

.gitignore: binary .mo files and 'NEW' translation files
UIList: tmp common superclass of Tank and List - TODOs OnItemSelected BSAList:

Tank and List must be unified.
UIList calls wx.Panel and wx.ListCtrl init

Notice MastersList did not register a callback for OnItemSelected, made it
event.Skip() # fixup IniList did not register a callback either
id parameter removed from Tank and List `__init__` and also from
balt.ListCtrl `__init__`
_sizeHints class parameter - notice it was set in some cases via
SetSizeHints - TODO: hunt this down
dndColumns=() - made immutable, should be OK

FIXUP BASW COMMIT
More stuff moved --- MOUSE OVER EDIITTTT

MouseOverItem vs MouseEnteredItem( ==== notice also GetIteeeemmmmmm

def MouseOverItem(self, item):
+        """Handle mouse over item by showing tip or similar."""
+        pass
+

EDIT """Handle mouse over item by showing tip or similar.""" to mention
the class it belongs = make it event.Skip()

,,,,

SWUASH WITH PREV Fix for event.Leaving ---- GetItem stuff escapes me
Callbacks to UIList - TODO:

List.OnDoubleClick -> UIList.OnDClick
OnDoubleClick was only registered as a callback for wx.EVT_LEFT_DCLICK in
Mod and Screens Lists - now registered in UIList as an event.Skip()

List.DoItemSort -> UIList.OnColumnClick

OnScroll, OnColumnResize Abstract

OnColumnResize: overrides were calling settings.setChanged() -
introduced self.colWidthsKey and self.colWidths in UIList.

OnScroll:: in List sets vScrollPosition - not used anywhere
TODO: vScrollPos attribute in UIList overridden by parameter at Tank to
use the data dict (duh)
colNames, colAligns moved to UIList - TODO: move rest of settings keys
mainMenu and itemMenu are now class attributes of UIList:

Notice now List and Tank constructors are comparable, at last
self.sort to UIList - TODO: self.colReverse
Tank init further simplification (dropped icons and style params)
Dropped self.checkboxes in List (now UIList/List.icons)
wx.Frame subclasses (apart from BashFrame) ripped from basher - TODO modChecker:

globals docBrowser and modChecker moved to Link.Frame, notice that modChecker
leaks (?)
style moved to base
SQUASH style params to UIList
bosh.py saveInfos table fixups under 176
modInfos table - entries deleted outside Bash were not removed TODO:

Under 176
TODO: check ini tweaks
New listData List.init parameter - TODO check screens when no screens initially:

Discrepancies:
bosh.BSAInfos are init outside basher while screensData and messages are
init in the panels ! Moreover messages is refreshed in the panel...
Mod Save and Ini panels use good old bosh singletons
Did not look at the SashTankPanels

Notice that the screens panel datadict is initialized to {} - fixup:

         # rest of List subclasses provide a non None listData
-        self.data = listData or {} # TODO(ut): to UIList
+        self.data = {} if listData is None else listData # TODO(ut): to UIList
         balt.UIList.__init__(self, parent, dndFiles=dndFiles, dndList=dndList,
Fix for IniList table not being persisted and keeping deleted items:

Used the listData notebook panels' new attribute.
Changes:
FileInfos.refresh now takes care of files deleted outside of bash.
Same goes for NotebookPanel.OnCloseWindow - see comments there
IniInfos.getBashDir creates the dirs as it should

Tried to raise on settings failure (was silent) but won't let the frame be
destroyed - despite finally (?)
UIList.colReverse - PeopleList.init absorbed to UIList and Tank inits:

colReverse is used by GetSortSettings which is used by SortItems in all
List subclasses - notice parallel in Tank - unify

Notice there are three variations:

settings.getChanged('bash.mods.colReverse') # List variation
settings['bash.masters.colReverse'].copy() # Master List variation - there
are two MasterList: SaveDetails and ModDetails
settings['bash.people.colReverse'] # Tank variation

Changed the MasterList one to `return {}` as MasterList.OnColumnClick()
is a noop - OnColumnClick is the callback that reverts column order.
This is set a value in basher:470 but this value is never used.
Clean settings from 'bash.masters.colReverse' is in the TODO list.

Alternate implementation:

    def _colReverse(self, _cache={}):
        """Should just return {}, see MasterList.OnColumnClick."""
        if not _cache: _cache.update(settings['bash.masters.colReverse'])
        return _cache

    colReverse = property(_colReverse, doc='Dictionary column->isReversed')

Not exactly equivalent to previous

Tank might as well be dropped and take _setColumnReverse along
_setSort should be a property

Note that PeopleList.__init__ disappeared - Tank + UIList = PeopleList
Nitpick balt UIList- TODO:

PeopleList further simplificastion
Tank init parameter types