From b158997260bf8dddd7977413ac18b685a6335b10 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Mon, 24 Oct 2011 03:47:11 +0000
Subject: [PATCH] Initial start of Code::Blocks user list project.

Not complete yet, but at least it lists users.
---
 src/sbbs3/userlist/SBBS_User_ListApp.cpp      |   69 +
 src/sbbs3/userlist/SBBS_User_ListApp.h        |   41 +
 src/sbbs3/userlist/SBBS_User_ListMain.cpp     |  215 +++
 src/sbbs3/userlist/SBBS_User_ListMain.h       |   70 +
 src/sbbs3/userlist/userlist.cbp               |   93 ++
 src/sbbs3/userlist/userlist.depend            | 1240 +++++++++++++++++
 .../userlist/wxsmith/SBBS_User_Listframe.wxs  |  133 ++
 7 files changed, 1861 insertions(+)
 create mode 100644 src/sbbs3/userlist/SBBS_User_ListApp.cpp
 create mode 100644 src/sbbs3/userlist/SBBS_User_ListApp.h
 create mode 100644 src/sbbs3/userlist/SBBS_User_ListMain.cpp
 create mode 100644 src/sbbs3/userlist/SBBS_User_ListMain.h
 create mode 100644 src/sbbs3/userlist/userlist.cbp
 create mode 100644 src/sbbs3/userlist/userlist.depend
 create mode 100644 src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs

diff --git a/src/sbbs3/userlist/SBBS_User_ListApp.cpp b/src/sbbs3/userlist/SBBS_User_ListApp.cpp
new file mode 100644
index 0000000000..d6e8fc6b69
--- /dev/null
+++ b/src/sbbs3/userlist/SBBS_User_ListApp.cpp
@@ -0,0 +1,69 @@
+/***************************************************************
+ * Name:      SBBS_User_ListApp.cpp
+ * Purpose:   Code for Application Class
+ * Author:    Stephen Hurd (sysop@nix.synchro.net)
+ * Created:   2011-10-23
+ * Copyright: Stephen Hurd (http://www.synchro.net/)
+ * License:
+ **************************************************************/
+
+#include "SBBS_User_ListApp.h"
+
+//(*AppHeaders
+#include "SBBS_User_ListMain.h"
+#include <wx/image.h>
+//*)
+#include <wx/msgdlg.h>
+#include <wx/strconv.h>
+
+IMPLEMENT_APP(SBBS_User_ListApp);
+
+extern "C" int lprintf(int level, const char *fmt, ...) /* log output */
+{
+    return 0;
+}
+
+SBBS_User_ListApp *App;
+
+bool SBBS_User_ListApp::OnInit()
+{
+    //(*AppInitialize
+    bool        wxsOK = true;
+    wxString    ctrlDir;
+    char        errstr[1024];
+
+    App=this;
+    wxInitAllImageHandlers();
+
+    /* Check config... */
+    if(!wxGetEnv(_("SBBSCTRL"), &ctrlDir)) {
+        wxMessageDialog *dlg = new wxMessageDialog(NULL, _("SBBSCTRL environment variable not set.  This variable must be set to the ctrl directory (ie: /sbbs/ctrl)."), _("SBBSCTRL Not Set"));
+        dlg->ShowModal();
+        return false;
+    }
+    memset(&cfg, 0, sizeof(cfg));
+    cfg.size=sizeof(cfg);
+    SAFECOPY(cfg.ctrl_dir, ctrlDir.fn_str());
+    prep_dir("", cfg.ctrl_dir, sizeof(cfg.ctrl_dir));
+    if(!isdir(cfg.ctrl_dir)) {
+        wxMessageDialog *dlg = new wxMessageDialog(NULL, _("SBBSCTRL environment variable is not set to a directory.  This variable must be set to the ctrl directory (ie: /sbbs/ctrl)."), _("SBBSCTRL Not A Directory"));
+        dlg->ShowModal();
+        return false;
+    }
+    if(!load_cfg(&cfg, NULL, TRUE, errstr)) {
+        wxString str(errstr,wxConvUTF8);
+        wxMessageDialog *dlg = new wxMessageDialog(NULL, _("ERROR: \"")+str+_("\"loading config"), _("Config Error"));
+        dlg->ShowModal();
+        return false;
+    }
+
+    if ( wxsOK )
+    {
+    	SBBS_User_ListFrame* Frame = new SBBS_User_ListFrame(0);
+    	Frame->Show();
+    	SetTopWindow(Frame);
+    }
+    //*)
+    return wxsOK;
+
+}
diff --git a/src/sbbs3/userlist/SBBS_User_ListApp.h b/src/sbbs3/userlist/SBBS_User_ListApp.h
new file mode 100644
index 0000000000..3c22a3673e
--- /dev/null
+++ b/src/sbbs3/userlist/SBBS_User_ListApp.h
@@ -0,0 +1,41 @@
+/***************************************************************
+ * Name:      SBBS_User_ListApp.h
+ * Purpose:   Defines Application Class
+ * Author:    Stephen Hurd (sysop@nix.synchro.net)
+ * Created:   2011-10-23
+ * Copyright: Stephen Hurd (http://www.synchro.net/)
+ * License:
+ **************************************************************/
+
+#ifndef SBBS_USER_LISTAPP_H
+#define SBBS_USER_LISTAPP_H
+
+#include <wx/app.h>
+#include <sbbs.h>
+#undef AST          // TODO: Hack hack... conflicts with wxDateTime
+#undef ADT
+#undef EST
+#undef EDT
+#undef CST
+#undef CDT
+#undef MST
+#undef MDT
+#undef PST
+#undef PDT
+#undef HST
+#undef HDT
+#undef BST
+#undef BDT
+#undef eof
+
+class SBBS_User_ListApp : public wxApp
+{
+    public:
+        virtual bool OnInit();
+        scfg_t  cfg;
+};
+
+DECLARE_APP(SBBS_User_ListApp);
+extern SBBS_User_ListApp *App;
+
+#endif // SBBS_USER_LISTAPP_H
diff --git a/src/sbbs3/userlist/SBBS_User_ListMain.cpp b/src/sbbs3/userlist/SBBS_User_ListMain.cpp
new file mode 100644
index 0000000000..1391e9444a
--- /dev/null
+++ b/src/sbbs3/userlist/SBBS_User_ListMain.cpp
@@ -0,0 +1,215 @@
+/***************************************************************
+ * Name:      SBBS_User_ListMain.cpp
+ * Purpose:   Code for Application Frame
+ * Author:    Stephen Hurd (sysop@nix.synchro.net)
+ * Created:   2011-10-23
+ * Copyright: Stephen Hurd (http://www.synchro.net/)
+ * License:
+ **************************************************************/
+
+#include "SBBS_User_ListMain.h"
+#include <wx/msgdlg.h>
+
+//(*InternalHeaders(SBBS_User_ListFrame)
+#include <wx/intl.h>
+#include <wx/string.h>
+//*)
+
+//helper functions
+enum wxbuildinfoformat {
+    short_f, long_f };
+
+wxString wxbuildinfo(wxbuildinfoformat format)
+{
+    wxString wxbuild(wxVERSION_STRING);
+
+    if (format == long_f )
+    {
+#if defined(__WXMSW__)
+        wxbuild << _T("-Windows");
+#elif defined(__UNIX__)
+        wxbuild << _T("-Linux");
+#endif
+
+#if wxUSE_UNICODE
+        wxbuild << _T("-Unicode build");
+#else
+        wxbuild << _T("-ANSI build");
+#endif // wxUSE_UNICODE
+    }
+
+    return wxbuild;
+}
+
+//(*IdInit(SBBS_User_ListFrame)
+const long SBBS_User_ListFrame::ID_STATICTEXT1 = wxNewId();
+const long SBBS_User_ListFrame::ID_TEXTCTRL1 = wxNewId();
+const long SBBS_User_ListFrame::ID_CLEARBUTTON = wxNewId();
+const long SBBS_User_ListFrame::ID_USERLISTCTRL = wxNewId();
+const long SBBS_User_ListFrame::ID_STATICTEXT2 = wxNewId();
+const long SBBS_User_ListFrame::ID_CHOICE1 = wxNewId();
+const long SBBS_User_ListFrame::ID_REFRESHBUTTON = wxNewId();
+const long SBBS_User_ListFrame::ID_EDITBUTTON = wxNewId();
+const long SBBS_User_ListFrame::idMenuQuit = wxNewId();
+const long SBBS_User_ListFrame::idMenuAbout = wxNewId();
+const long SBBS_User_ListFrame::ID_STATUSBAR1 = wxNewId();
+//*)
+
+BEGIN_EVENT_TABLE(SBBS_User_ListFrame,wxFrame)
+    //(*EventTable(SBBS_User_ListFrame)
+    //*)
+END_EVENT_TABLE()
+
+void fillUserList(wxListCtrl *UserList)
+{
+    int         totalusers=lastuser(&App->cfg);
+    int         i;
+    user_t      user;
+    int         item;
+    wxString    buf;
+    char        datebuf[9];
+
+    UserList->DeleteAllItems();
+    for(i=0; i<totalusers; i++) {
+        user.number=i;
+        if(getuserdat(&App->cfg, &user)!=0)
+            continue;
+        buf.Printf(_("%d"), i);
+        item=UserList->InsertItem(i, buf, 0);
+
+        UserList->SetItem(item, 1, wxString::From8BitData(user.alias));
+        UserList->SetItem(item, 2, wxString::From8BitData(user.name));
+        buf.Printf(_("%d"), user.level);
+        UserList->SetItem(item, 3, buf);
+        buf.Printf(_("%d"), getage(&App->cfg, user.birth));
+        UserList->SetItem(item, 4, buf);
+        buf.Printf(_("%c"), user.sex);
+        UserList->SetItem(item, 5, buf);
+        UserList->SetItem(item, 6, wxString::From8BitData(user.location));
+        UserList->SetItem(item, 7, wxString::From8BitData(user.modem));
+        UserList->SetItem(item, 8, wxString::From8BitData(user.note));
+        UserList->SetItem(item, 9, wxString::From8BitData(user.comp));
+        UserList->SetItem(item,10, wxString::From8BitData(user.phone));
+        UserList->SetItem(item,11, wxString::From8BitData(user.netmail));
+        buf.Printf(_("%d"), user.logons);
+        UserList->SetItem(item,12, buf);
+        unixtodstr(&App->cfg, user.firston, datebuf);
+        UserList->SetItem(item,13, wxString::From8BitData(datebuf));
+        unixtodstr(&App->cfg, user.laston, datebuf);
+        UserList->SetItem(item,14, wxString::From8BitData(datebuf));
+    }
+}
+
+SBBS_User_ListFrame::SBBS_User_ListFrame(wxWindow* parent,wxWindowID id)
+{
+    //(*Initialize(SBBS_User_ListFrame)
+    wxBoxSizer* BoxSizer4;
+    wxBoxSizer* BoxSizer5;
+    wxMenuItem* MenuItem2;
+    wxMenuItem* MenuItem1;
+    wxBoxSizer* BoxSizer2;
+    wxMenu* Menu1;
+    wxBoxSizer* BoxSizer1;
+    wxMenuBar* MenuBar1;
+    wxBoxSizer* BoxSizer3;
+    wxMenu* Menu2;
+
+    Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id"));
+    BoxSizer1 = new wxBoxSizer(wxVERTICAL);
+    BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
+    StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("ARS Filter"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
+    BoxSizer2->Add(StaticText1, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
+    TextCtrl1 = new wxTextCtrl(this, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
+    TextCtrl1->SetToolTip(_("Enter an ARS string to filter users with"));
+    BoxSizer2->Add(TextCtrl1, 1, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    ClearButton = new wxButton(this, ID_CLEARBUTTON, _("Clear"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CLEARBUTTON"));
+    ClearButton->SetToolTip(_("Clears the ARS filter"));
+    BoxSizer2->Add(ClearButton, 0, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    BoxSizer1->Add(BoxSizer2, 0, wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    UserList = new wxListCtrl(this, ID_USERLISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_HRULES, wxDefaultValidator, _T("ID_USERLISTCTRL"));
+    UserList->InsertColumn(0, wxString(_("Num")));
+    UserList->InsertColumn(1, wxString(_("Alias")));
+    UserList->InsertColumn(2, wxString(_("Name")));
+    UserList->InsertColumn(3, wxString(_("Level")));
+    UserList->InsertColumn(4, wxString(_("Age")));
+    UserList->InsertColumn(5, wxString(_("Sex")));
+    UserList->InsertColumn(6, wxString(_("Location")));
+    UserList->InsertColumn(7, wxString(_("Protocol")));
+    UserList->InsertColumn(8, wxString(_("Address")));
+    UserList->InsertColumn(9, wxString(_("Host Name")));
+    UserList->InsertColumn(10, wxString(_("Phone")));
+    UserList->InsertColumn(11, wxString(_("Email")));
+    UserList->InsertColumn(12, wxString(_("Logons")));
+    UserList->InsertColumn(13, wxString(_("First On")));
+    UserList->InsertColumn(14, wxString(_("Last On")));
+    fillUserList(UserList);
+    BoxSizer1->Add(UserList, 1, wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
+    BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
+    StaticText2 = new wxStaticText(this, ID_STATICTEXT2, _("Quick Validation Sets"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
+    BoxSizer4->Add(StaticText2, 0, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    Choice1 = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1"));
+    Choice1->SetSelection( Choice1->Append(_("Select a set")) );
+    Choice1->Append(_("1 SL:10 F1:                          "));
+    Choice1->Append(_("2 SL:20 F1:                          "));
+    Choice1->Append(_("3 SL:30 F1:                          "));
+    Choice1->Append(_("4 SL:40 F1:                          "));
+    Choice1->Append(_("5 SL:50 F1:                          "));
+    Choice1->Append(_("6 SL:60 F1:                          "));
+    Choice1->Append(_("7 SL:70 F1:                          "));
+    Choice1->Append(_("8 SL:80 F1:                          "));
+    Choice1->Append(_("9 SL:90 F1:                          "));
+    Choice1->Append(_("10 SL:100 F1:                          "));
+    Choice1->Disable();
+    BoxSizer4->Add(Choice1, 0, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    BoxSizer3->Add(BoxSizer4, 1, wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    BoxSizer5 = new wxBoxSizer(wxHORIZONTAL);
+    RefreshButton = new wxButton(this, ID_REFRESHBUTTON, _("Refresh"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_REFRESHBUTTON"));
+    RefreshButton->SetToolTip(_("Reloads the user database"));
+    BoxSizer5->Add(RefreshButton, 0, wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    EditButton = new wxButton(this, ID_EDITBUTTON, _("Edit"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_EDITBUTTON"));
+    EditButton->Disable();
+    BoxSizer5->Add(EditButton, 0, wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    BoxSizer3->Add(BoxSizer5, 0, wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    BoxSizer1->Add(BoxSizer3, 0, wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    SetSizer(BoxSizer1);
+    MenuBar1 = new wxMenuBar();
+    Menu1 = new wxMenu();
+    MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL);
+    Menu1->Append(MenuItem1);
+    MenuBar1->Append(Menu1, _("&File"));
+    Menu2 = new wxMenu();
+    MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL);
+    Menu2->Append(MenuItem2);
+    MenuBar1->Append(Menu2, _("Help"));
+    SetMenuBar(MenuBar1);
+    StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1"));
+    int __wxStatusBarWidths_1[1] = { -1 };
+    int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
+    StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1);
+    StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1);
+    SetStatusBar(StatusBar1);
+    BoxSizer1->Fit(this);
+    BoxSizer1->SetSizeHints(this);
+
+    Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnQuit);
+    Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnAbout);
+    //*)
+}
+
+SBBS_User_ListFrame::~SBBS_User_ListFrame()
+{
+    //(*Destroy(SBBS_User_ListFrame)
+    //*)
+}
+
+void SBBS_User_ListFrame::OnQuit(wxCommandEvent& event)
+{
+    Close();
+}
+
+void SBBS_User_ListFrame::OnAbout(wxCommandEvent& event)
+{
+    wxString msg = wxbuildinfo(long_f);
+    wxMessageBox(msg, _("Welcome to..."));
+}
diff --git a/src/sbbs3/userlist/SBBS_User_ListMain.h b/src/sbbs3/userlist/SBBS_User_ListMain.h
new file mode 100644
index 0000000000..1de9ca9780
--- /dev/null
+++ b/src/sbbs3/userlist/SBBS_User_ListMain.h
@@ -0,0 +1,70 @@
+/***************************************************************
+ * Name:      SBBS_User_ListMain.h
+ * Purpose:   Defines Application Frame
+ * Author:    Stephen Hurd (sysop@nix.synchro.net)
+ * Created:   2011-10-23
+ * Copyright: Stephen Hurd (http://www.synchro.net/)
+ * License:
+ **************************************************************/
+
+#ifndef SBBS_USER_LISTMAIN_H
+#define SBBS_USER_LISTMAIN_H
+
+//(*Headers(SBBS_User_ListFrame)
+#include <wx/listctrl.h>
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/menu.h>
+#include <wx/textctrl.h>
+#include <wx/choice.h>
+#include <wx/button.h>
+#include <wx/frame.h>
+#include <wx/statusbr.h>
+//*)
+
+#include "SBBS_User_ListApp.h"
+
+class SBBS_User_ListFrame: public wxFrame
+{
+    public:
+
+        SBBS_User_ListFrame(wxWindow* parent,wxWindowID id = -1);
+        virtual ~SBBS_User_ListFrame();
+
+    private:
+
+        //(*Handlers(SBBS_User_ListFrame)
+        void OnQuit(wxCommandEvent& event);
+        void OnAbout(wxCommandEvent& event);
+        //*)
+
+        //(*Identifiers(SBBS_User_ListFrame)
+        static const long ID_STATICTEXT1;
+        static const long ID_TEXTCTRL1;
+        static const long ID_CLEARBUTTON;
+        static const long ID_USERLISTCTRL;
+        static const long ID_STATICTEXT2;
+        static const long ID_CHOICE1;
+        static const long ID_REFRESHBUTTON;
+        static const long ID_EDITBUTTON;
+        static const long idMenuQuit;
+        static const long idMenuAbout;
+        static const long ID_STATUSBAR1;
+        //*)
+
+        //(*Declarations(SBBS_User_ListFrame)
+        wxButton* RefreshButton;
+        wxStaticText* StaticText2;
+        wxStaticText* StaticText1;
+        wxListCtrl* UserList;
+        wxStatusBar* StatusBar1;
+        wxButton* ClearButton;
+        wxTextCtrl* TextCtrl1;
+        wxButton* EditButton;
+        wxChoice* Choice1;
+        //*)
+
+        DECLARE_EVENT_TABLE()
+};
+
+#endif // SBBS_USER_LISTMAIN_H
diff --git a/src/sbbs3/userlist/userlist.cbp b/src/sbbs3/userlist/userlist.cbp
new file mode 100644
index 0000000000..08aea03f1a
--- /dev/null
+++ b/src/sbbs3/userlist/userlist.cbp
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+	<FileVersion major="1" minor="6" />
+	<Project>
+		<Option title="SBBS User List" />
+		<Option pch_mode="2" />
+		<Option compiler="gcc" />
+		<Build>
+			<Target title="Debug">
+				<Option output="gcc.freebsd.exe.debug/SBBS User List" prefix_auto="1" extension_auto="1" />
+				<Option object_output="gcc.freebsd.obj.debug/" />
+				<Option type="0" />
+				<Option compiler="gcc" />
+				<Option projectLinkerOptionsRelation="2" />
+				<Compiler>
+					<Add option="-g" />
+					<Add option="-DHAS_INTTYPES_H=1" />
+					<Add directory=".." />
+					<Add directory="../../xpdev" />
+					<Add directory="../../smblib" />
+				</Compiler>
+				<Linker>
+					<Add library="xpdev" />
+					<Add directory="../../xpdev/gcc.freebsd.lib.release" />
+				</Linker>
+			</Target>
+			<Target title="Release">
+				<Option output="gcc.freebsd.exe.release/SBBS User List" prefix_auto="1" extension_auto="1" />
+				<Option object_output="gcc.freebsd.exe.release/" />
+				<Option type="0" />
+				<Option compiler="gcc" />
+				<Option projectLinkerOptionsRelation="2" />
+				<Compiler>
+					<Add option="-O2" />
+				</Compiler>
+				<Linker>
+					<Add option="-s" />
+				</Linker>
+			</Target>
+		</Build>
+		<Compiler>
+			<Add option="-Wall" />
+			<Add option="`wxgtk2u-2.8-config --cflags`" />
+		</Compiler>
+		<Linker>
+			<Add option="`wxgtk2u-2.8-config --libs`" />
+		</Linker>
+		<Unit filename="../ars.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../dat_rec.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../date_str.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../load_cfg.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../nopen.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../scfglib1.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../scfglib2.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../str_util.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="../userdat.c">
+			<Option compilerVar="CC" />
+		</Unit>
+		<Unit filename="SBBS_User_ListApp.cpp" />
+		<Unit filename="SBBS_User_ListApp.h" />
+		<Unit filename="SBBS_User_ListMain.cpp" />
+		<Unit filename="SBBS_User_ListMain.h" />
+		<Unit filename="wxsmith/SBBS_User_Listframe.wxs" />
+		<Extensions>
+			<code_completion />
+			<envvars />
+			<debugger />
+			<wxsmith version="1">
+				<gui name="wxWidgets" src="SBBS_User_ListApp.cpp" main="SBBS_User_ListFrame" init_handlers="necessary" language="CPP" />
+				<resources>
+					<wxFrame wxs="wxsmith/SBBS_User_Listframe.wxs" src="SBBS_User_ListMain.cpp" hdr="SBBS_User_ListMain.h" name="SBBS_User_ListFrame" language="CPP" />
+				</resources>
+			</wxsmith>
+			<lib_finder disable_auto="1" />
+		</Extensions>
+	</Project>
+</CodeBlocks_project_file>
diff --git a/src/sbbs3/userlist/userlist.depend b/src/sbbs3/userlist/userlist.depend
new file mode 100644
index 0000000000..26abf06b43
--- /dev/null
+++ b/src/sbbs3/userlist/userlist.depend
@@ -0,0 +1,1240 @@
+# depslib dependency file v1.0
+1319425215 source:/synchronet/src/src/sbbs3/userlist/SBBS_User_ListApp.cpp
+	"SBBS_User_ListApp.h"
+	"SBBS_User_ListMain.h"
+	<wx/image.h>
+	<wx/msgdlg.h>
+	<wx/strconv.h>
+
+1319425086 /synchronet/src/src/sbbs3/userlist/SBBS_User_ListApp.h
+	<wx/app.h>
+	<sbbs.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/app.h
+	"wx/event.h"
+	"wx/build.h"
+	"wx/init.h"
+	"wx/intl.h"
+	"wx/palmos/app.h"
+	"wx/msw/app.h"
+	"wx/motif/app.h"
+	"wx/mgl/app.h"
+	"wx/dfb/app.h"
+	"wx/gtk/app.h"
+	"wx/gtk1/app.h"
+	"wx/x11/app.h"
+	"wx/mac/app.h"
+	"wx/cocoa/app.h"
+	"wx/os2/app.h"
+	"wx/univ/theme.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/event.h
+	"wx/defs.h"
+	"wx/cpp.h"
+	"wx/object.h"
+	"wx/clntdata.h"
+	"wx/gdicmn.h"
+	"wx/cursor.h"
+	"wx/thread.h"
+	"wx/dynarray.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/defs.h
+	"wx/platform.h"
+	"wx/features.h"
+	"wx/version.h"
+	"wx/dlimpexp.h"
+	"wx/debug.h"
+	<stddef.h>
+	<sys/types.h>
+	<unistd.h>
+	"wx/msw/winundef.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/platform.h
+	<stddef.h>
+	<AvailabilityMacros.h>
+	<unistd.h>
+	"wx/mac/carbon/config_xcode.h"
+	"wx/setup.h"
+	"wx/chkconf.h"
+	"wx/msw/wince/libraries.h"
+	"wx/msw/libraries.h"
+	"wx/msw/gccpriv.h"
+	<AvailabilityMacros.h>
+
+1319272866 /usr/local/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h
+
+1316588507 /usr/local/include/wx-2.8/wx/chkconf.h
+	"wx/palmos/chkconf.h"
+	"wx/msw/wince/chkconf.h"
+	"wx/msw/chkconf.h"
+	"wx/mac/chkconf.h"
+	"wx/os2/chkconf.h"
+	"wx/mgl/chkconf.h"
+	"wx/dfb/chkconf.h"
+	"wx/motif/chkconf.h"
+	"wx/x11/chkconf.h"
+	"wx/univ/chkconf.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/features.h
+
+1316588508 /usr/local/include/wx-2.8/wx/version.h
+	"wx/cpp.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/cpp.h
+
+1316588507 /usr/local/include/wx-2.8/wx/dlimpexp.h
+
+1316588507 /usr/local/include/wx-2.8/wx/debug.h
+	<assert.h>
+	<limits.h>
+	"wx/wxchar.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/wxchar.h
+	"wx/platform.h"
+	"wx/dlimpexp.h"
+	<stdio.h>
+	<stdarg.h>
+	<sys/types.h>
+	<wchar.h>
+	<wcstr.h>
+	<stdlib.h>
+	<widec.h>
+	<ctype.h>
+	<memory.h>
+	<stddef.h>
+	<stddef.h>
+	<string.h>
+	<ctype.h>
+	<tchar.h>
+	<ctype.h>
+	<ctype.h>
+	<stdio.h>
+	<wctype.h>
+	<stdio.h>
+	<stdio.h>
+	<ctype.h>
+	<string.h>
+	<stdio.h>
+	<time.h>
+	<time.h>
+	<string.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/object.h
+	"wx/memory.h"
+	"wx/xti.h"
+	"wx/msw/msvcrt.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/memory.h
+	"wx/defs.h"
+	"wx/string.h"
+	"wx/msgout.h"
+	<stddef.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/string.h
+	"wx/defs.h"
+	<ctype.h>
+	<stdio.h>
+	<string.h>
+	<stdarg.h>
+	<limits.h>
+	<string.h>
+	<stdio.h>
+	<stdarg.h>
+	<limits.h>
+	<stdlib.h>
+	<strings.h>
+	<StringMgr.h>
+	"wx/wxchar.h"
+	"wx/buffer.h"
+	"wx/strconv.h"
+	"wx/beforestd.h"
+	<string>
+	"wx/afterstd.h"
+	"wx/arrstr.h"
+	"wx/iosfwrap.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/buffer.h
+	"wx/wxchar.h"
+	<stdlib.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/strconv.h
+	"wx/defs.h"
+	"wx/wxchar.h"
+	"wx/buffer.h"
+	"typeinfo.h"
+	<stdlib.h>
+	"wx/fontenc.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/fontenc.h
+
+1316588507 /usr/local/include/wx-2.8/wx/beforestd.h
+
+1316588507 /usr/local/include/wx-2.8/wx/afterstd.h
+	"wx/msw/winundef.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/arrstr.h
+	"wx/defs.h"
+	"wx/string.h"
+	"wx/dynarray.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/dynarray.h
+	"wx/defs.h"
+	"wx/beforestd.h"
+	<vector>
+	<algorithm>
+	"wx/afterstd.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/iosfwrap.h
+	<iostream.h>
+	<iosfwd>
+	"wx/msw/winundef.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/msgout.h
+	"wx/defs.h"
+	"wx/wxchar.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/xti.h
+	"wx/defs.h"
+	"wx/memory.h"
+	"wx/flags.h"
+	"wx/string.h"
+	"wx/arrstr.h"
+	"wx/hashmap.h"
+	"wx/log.h"
+	"wx/intl.h"
+	<typeinfo>
+	"wx/dynarray.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/hashmap.h
+	"wx/string.h"
+	<unordered_map>
+	<tr1/unordered_map>
+	<ext/hash_map>
+	<hash_map>
+	<stddef.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/log.h
+	"wx/defs.h"
+	"wx/string.h"
+	"wx/arrstr.h"
+	<time.h>
+	"wx/dynarray.h"
+	"wx/iosfwrap.h"
+	"wx/generic/logg.h"
+	"wx/cocoa/log.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/generic/logg.h
+
+1316588507 /usr/local/include/wx-2.8/wx/intl.h
+	"wx/defs.h"
+	"wx/string.h"
+	"wx/fontenc.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/clntdata.h
+	"wx/defs.h"
+	"wx/string.h"
+	"wx/hashmap.h"
+	"wx/vector.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/vector.h
+	"wx/defs.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/gdicmn.h
+	"wx/defs.h"
+	"wx/list.h"
+	"wx/string.h"
+	"wx/fontenc.h"
+	"wx/hashmap.h"
+	"wx/math.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/list.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/string.h"
+	"wx/beforestd.h"
+	<algorithm>
+	<iterator>
+	<list>
+	"wx/afterstd.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/math.h
+	"wx/defs.h"
+	<math.h>
+	<float.h>
+
+1316588508 /usr/local/include/wx-2.8/wx/cursor.h
+	"wx/defs.h"
+	"wx/palmos/cursor.h"
+	"wx/msw/cursor.h"
+	"wx/motif/cursor.h"
+	"wx/gtk/cursor.h"
+	"wx/gtk1/cursor.h"
+	"wx/x11/cursor.h"
+	"wx/mgl/cursor.h"
+	"wx/dfb/cursor.h"
+	"wx/mac/cursor.h"
+	"wx/cocoa/cursor.h"
+	"wx/os2/cursor.h"
+	"wx/utils.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/cursor.h
+	"wx/object.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/utils.h
+	"wx/object.h"
+	"wx/list.h"
+	"wx/filefn.h"
+	"wx/gdicmn.h"
+	"wx/longlong.h"
+	"wx/platinfo.h"
+	<direct.h>
+	<dirent.h>
+	<unistd.h>
+	<stdio.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/filefn.h
+	"wx/list.h"
+	"wx/arrstr.h"
+	"wx/msw/wince/time.h"
+	"wx/msw/private.h"
+	<time.h>
+	<sys/types.h>
+	<sys/stat.h>
+	<sys/types.h>
+	<utime.h>
+	<sys/stat.h>
+	<unistd.h>
+	<stat.h>
+	<unistd.h>
+	<unix.h>
+	<process.h>
+	"wx/os2/private.h"
+	<direct.h>
+	<io.h>
+	<unistd.h>
+	<unistd.h>
+	<dirent.h>
+	<direct.h>
+	<dos.h>
+	<io.h>
+	<direct.h>
+	<dos.h>
+	<io.h>
+	<io.h>
+	<unistd.h>
+	<dir.h>
+	<dir.h>
+	<unix.h>
+	<fcntl.h>
+	<sys/types.h>
+
+1316588507 /usr/local/include/wx-2.8/wx/longlong.h
+	"wx/defs.h"
+	"wx/string.h"
+	<limits.h>
+	"wx/iosfwrap.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/platinfo.h
+	"wx/string.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/thread.h
+	"wx/defs.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/build.h
+	"wx/version.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/init.h
+	"wx/defs.h"
+	"wx/wxchar.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/app.h
+
+1319424883 /synchronet/src/src/sbbs3/userlist/SBBS_User_ListMain.h
+	<wx/listctrl.h>
+	<wx/sizer.h>
+	<wx/stattext.h>
+	<wx/menu.h>
+	<wx/textctrl.h>
+	<wx/choice.h>
+	<wx/button.h>
+	<wx/frame.h>
+	<wx/statusbr.h>
+	"SBBS_User_ListApp.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/sizer.h
+	"wx/defs.h"
+	"wx/window.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/window.h
+	"wx/event.h"
+	"wx/list.h"
+	"wx/cursor.h"
+	"wx/font.h"
+	"wx/colour.h"
+	"wx/region.h"
+	"wx/utils.h"
+	"wx/intl.h"
+	"wx/validate.h"
+	"wx/palette.h"
+	"wx/accel.h"
+	"wx/access.h"
+	"wx/palmos/window.h"
+	"wx/msw/window.h"
+	"wx/motif/window.h"
+	"wx/gtk/window.h"
+	"wx/gtk1/window.h"
+	"wx/x11/window.h"
+	"wx/mgl/window.h"
+	"wx/dfb/window.h"
+	"wx/mac/window.h"
+	"wx/cocoa/window.h"
+	"wx/os2/window.h"
+	"wx/univ/window.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/font.h
+	"wx/defs.h"
+	"wx/fontenc.h"
+	"wx/gdiobj.h"
+	"wx/palmos/font.h"
+	"wx/msw/font.h"
+	"wx/motif/font.h"
+	"wx/gtk/font.h"
+	"wx/gtk1/font.h"
+	"wx/x11/font.h"
+	"wx/mgl/font.h"
+	"wx/dfb/font.h"
+	"wx/mac/font.h"
+	"wx/cocoa/font.h"
+	"wx/os2/font.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/gdiobj.h
+	"wx/object.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/font.h
+
+1316588508 /usr/local/include/wx-2.8/wx/colour.h
+	"wx/defs.h"
+	"wx/gdiobj.h"
+	"wx/variant.h"
+	"wx/generic/colour.h"
+	"wx/msw/colour.h"
+	"wx/motif/colour.h"
+	"wx/gtk/colour.h"
+	"wx/gtk1/colour.h"
+	"wx/generic/colour.h"
+	"wx/generic/colour.h"
+	"wx/x11/colour.h"
+	"wx/mac/colour.h"
+	"wx/cocoa/colour.h"
+	"wx/os2/colour.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/variant.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/string.h"
+	"wx/arrstr.h"
+	"wx/list.h"
+	"wx/cpp.h"
+	"wx/datetime.h"
+	"wx/db.h"
+	"wx/iosfwrap.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/datetime.h
+	"wx/defs.h"
+	<time.h>
+	"wx/msw/wince/time.h"
+	<limits.h>
+	"wx/longlong.h"
+	"wx/dynarray.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/db.h
+	"wx/defs.h"
+	"wx/string.h"
+	<afxwin.h>
+	"wx/msw/wrapwin.h"
+	"sql.h"
+	"sqlext.h"
+	"odbcinst.h"
+	"wx/msw/wrapwin.h"
+	"wx/isql.h"
+	"wx/isqlext.h"
+	<sql.h>
+	<sqlext.h>
+	<sql.h>
+	<sqlext.h>
+	"wx/object.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/isql.h
+
+1316588507 /usr/local/include/wx-2.8/wx/isqlext.h
+	"wx/isql.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/colour.h
+
+1316588509 /usr/local/include/wx-2.8/wx/region.h
+	"wx/gdiobj.h"
+	"wx/gdicmn.h"
+	"wx/palmos/region.h"
+	"wx/msw/region.h"
+	"wx/gtk/region.h"
+	"wx/gtk1/region.h"
+	"wx/x11/region.h"
+	"wx/mgl/region.h"
+	"wx/dfb/region.h"
+	"wx/mac/region.h"
+	"wx/cocoa/region.h"
+	"wx/os2/region.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/region.h
+
+1316588508 /usr/local/include/wx-2.8/wx/validate.h
+	"wx/defs.h"
+	"wx/event.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/palette.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/gdiobj.h"
+	"wx/palmos/palette.h"
+	"wx/msw/palette.h"
+	"wx/motif/palette.h"
+	"wx/generic/paletteg.h"
+	"wx/x11/palette.h"
+	"wx/mgl/palette.h"
+	"wx/mac/palette.h"
+	"wx/os2/palette.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/generic/paletteg.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/gdiobj.h"
+	"wx/gdicmn.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/accel.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/generic/accel.h"
+	"wx/msw/accel.h"
+	"wx/motif/accel.h"
+	"wx/gtk/accel.h"
+	"wx/gtk1/accel.h"
+	"wx/mac/accel.h"
+	"wx/generic/accel.h"
+	"wx/os2/accel.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/generic/accel.h
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/accel.h
+	"wx/generic/accel.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/access.h
+	"wx/defs.h"
+	"wx/variant.h"
+	"wx/msw/ole/access.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/window.h
+	"wx/dynarray.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/stattext.h
+	"wx/defs.h"
+	"wx/control.h"
+	"wx/univ/stattext.h"
+	"wx/msw/stattext.h"
+	"wx/motif/stattext.h"
+	"wx/gtk/stattext.h"
+	"wx/gtk1/stattext.h"
+	"wx/mac/stattext.h"
+	"wx/cocoa/stattext.h"
+	"wx/os2/stattext.h"
+	"wx/palmos/stattext.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/control.h
+	"wx/defs.h"
+	"wx/window.h"
+	"wx/univ/control.h"
+	"wx/palmos/control.h"
+	"wx/msw/control.h"
+	"wx/motif/control.h"
+	"wx/gtk/control.h"
+	"wx/gtk1/control.h"
+	"wx/mac/control.h"
+	"wx/cocoa/control.h"
+	"wx/os2/control.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/control.h
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/stattext.h
+
+1316588508 /usr/local/include/wx-2.8/wx/menu.h
+	"wx/defs.h"
+	"wx/list.h"
+	"wx/window.h"
+	"wx/menuitem.h"
+	"wx/univ/menu.h"
+	"wx/palmos/menu.h"
+	"wx/msw/menu.h"
+	"wx/motif/menu.h"
+	"wx/gtk/menu.h"
+	"wx/gtk1/menu.h"
+	"wx/mac/menu.h"
+	"wx/cocoa/menu.h"
+	"wx/os2/menu.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/menuitem.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/univ/menuitem.h"
+	"wx/palmos/menuitem.h"
+	"wx/msw/menuitem.h"
+	"wx/motif/menuitem.h"
+	"wx/gtk/menuitem.h"
+	"wx/gtk1/menuitem.h"
+	"wx/mac/menuitem.h"
+	"wx/cocoa/menuitem.h"
+	"wx/os2/menuitem.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/menuitem.h
+	"wx/bitmap.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/bitmap.h
+	"wx/string.h"
+	"wx/gdicmn.h"
+	"wx/colour.h"
+	"wx/variant.h"
+	"wx/palmos/bitmap.h"
+	"wx/msw/bitmap.h"
+	"wx/x11/bitmap.h"
+	"wx/gtk/bitmap.h"
+	"wx/gtk1/bitmap.h"
+	"wx/x11/bitmap.h"
+	"wx/mgl/bitmap.h"
+	"wx/dfb/bitmap.h"
+	"wx/mac/bitmap.h"
+	"wx/cocoa/bitmap.h"
+	"wx/os2/bitmap.h"
+	"wx/generic/mask.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/bitmap.h
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/menu.h
+
+1316588508 /usr/local/include/wx-2.8/wx/textctrl.h
+	"wx/defs.h"
+	"wx/control.h"
+	"wx/dynarray.h"
+	"wx/gdicmn.h"
+	"wx/ioswrap.h"
+	"wx/x11/textctrl.h"
+	"wx/univ/textctrl.h"
+	"wx/msw/wince/textctrlce.h"
+	"wx/msw/textctrl.h"
+	"wx/motif/textctrl.h"
+	"wx/gtk/textctrl.h"
+	"wx/gtk1/textctrl.h"
+	"wx/mac/textctrl.h"
+	"wx/cocoa/textctrl.h"
+	"wx/os2/textctrl.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/ioswrap.h
+	<iostream.h>
+	<iostream>
+	"wx/msw/winundef.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/textctrl.h
+
+1316588509 /usr/local/include/wx-2.8/wx/grid.h
+	"wx/generic/grid.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/generic/grid.h
+	"wx/defs.h"
+	"wx/scrolwin.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/scrolwin.h
+	"wx/panel.h"
+	"wx/gtk/scrolwin.h"
+	"wx/gtk1/scrolwin.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/panel.h
+	"wx/generic/panelg.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/generic/panelg.h
+	"wx/window.h"
+	"wx/containr.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/containr.h
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/scrolwin.h
+
+1316588508 /usr/local/include/wx-2.8/wx/choice.h
+	"wx/defs.h"
+	"wx/ctrlsub.h"
+	"wx/univ/choice.h"
+	"wx/msw/wince/choicece.h"
+	"wx/msw/choice.h"
+	"wx/motif/choice.h"
+	"wx/gtk/choice.h"
+	"wx/gtk1/choice.h"
+	"wx/mac/choice.h"
+	"wx/cocoa/choice.h"
+	"wx/os2/choice.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/ctrlsub.h
+	"wx/defs.h"
+	"wx/control.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/choice.h
+
+1316588508 /usr/local/include/wx-2.8/wx/button.h
+	"wx/defs.h"
+	"wx/control.h"
+	"wx/univ/button.h"
+	"wx/msw/button.h"
+	"wx/motif/button.h"
+	"wx/gtk/button.h"
+	"wx/gtk1/button.h"
+	"wx/mac/button.h"
+	"wx/cocoa/button.h"
+	"wx/os2/button.h"
+	"wx/palmos/button.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/button.h
+
+1316588508 /usr/local/include/wx-2.8/wx/frame.h
+	"wx/toplevel.h"
+	"wx/univ/frame.h"
+	"wx/palmos/frame.h"
+	"wx/msw/frame.h"
+	"wx/gtk/frame.h"
+	"wx/gtk1/frame.h"
+	"wx/motif/frame.h"
+	"wx/mac/frame.h"
+	"wx/cocoa/frame.h"
+	"wx/os2/frame.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/toplevel.h
+	"wx/window.h"
+	"wx/iconbndl.h"
+	"wx/palmos/toplevel.h"
+	"wx/msw/toplevel.h"
+	"wx/gtk/toplevel.h"
+	"wx/gtk1/toplevel.h"
+	"wx/x11/toplevel.h"
+	"wx/mgl/toplevel.h"
+	"wx/dfb/toplevel.h"
+	"wx/mac/toplevel.h"
+	"wx/cocoa/toplevel.h"
+	"wx/os2/toplevel.h"
+	"wx/motif/toplevel.h"
+	"wx/univ/toplevel.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/iconbndl.h
+	"wx/dynarray.h"
+	"wx/gdicmn.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/toplevel.h
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/frame.h
+
+1316588508 /usr/local/include/wx-2.8/wx/statusbr.h
+	"wx/defs.h"
+	"wx/window.h"
+	"wx/list.h"
+	"wx/dynarray.h"
+	"wx/univ/statusbr.h"
+	"wx/palmos/statusbr.h"
+	"wx/msw/statbr95.h"
+	"wx/generic/statusbr.h"
+	"wx/mac/statusbr.h"
+	"wx/generic/statusbr.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/generic/statusbr.h
+	"wx/defs.h"
+	"wx/pen.h"
+	"wx/arrstr.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/pen.h
+	"wx/defs.h"
+	"wx/palmos/pen.h"
+	"wx/msw/pen.h"
+	"wx/x11/pen.h"
+	"wx/gtk/pen.h"
+	"wx/gtk1/pen.h"
+	"wx/mgl/pen.h"
+	"wx/dfb/pen.h"
+	"wx/mac/pen.h"
+	"wx/cocoa/pen.h"
+	"wx/os2/pen.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/pen.h
+	"wx/gdiobj.h"
+	"wx/gdicmn.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/image.h
+	"wx/defs.h"
+	"wx/object.h"
+	"wx/string.h"
+	"wx/gdicmn.h"
+	"wx/hashmap.h"
+	"wx/stream.h"
+	"wx/variant.h"
+	"wx/imagbmp.h"
+	"wx/imagpng.h"
+	"wx/imaggif.h"
+	"wx/imagpcx.h"
+	"wx/imagjpeg.h"
+	"wx/imagtga.h"
+	"wx/imagtiff.h"
+	"wx/imagpnm.h"
+	"wx/imagxpm.h"
+	"wx/imagiff.h"
+
+1316588507 /usr/local/include/wx-2.8/wx/stream.h
+	"wx/defs.h"
+	<stdio.h>
+	"wx/object.h"
+	"wx/string.h"
+	"wx/filefn.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/imagbmp.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagpng.h
+	"wx/defs.h"
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imaggif.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagpcx.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagjpeg.h
+	"wx/defs.h"
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagtga.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagtiff.h
+	"wx/defs.h"
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagpnm.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagxpm.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/imagiff.h
+	"wx/image.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/listctrl.h
+	"wx/defs.h"
+	"wx/listbase.h"
+	"wx/msw/listctrl.h"
+	"wx/mac/carbon/listctrl.h"
+	"wx/generic/listctrl.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/listbase.h
+	"wx/colour.h"
+	"wx/font.h"
+	"wx/gdicmn.h"
+	"wx/event.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/generic/listctrl.h
+	"wx/textctrl.h"
+
+1319425188 source:/synchronet/src/src/sbbs3/userlist/SBBS_User_ListMain.cpp
+	"SBBS_User_ListMain.h"
+	<wx/msgdlg.h>
+	<wx/intl.h>
+	<wx/string.h>
+
+1316588508 /usr/local/include/wx-2.8/wx/msgdlg.h
+	"wx/defs.h"
+	"wx/generic/msgdlgg.h"
+	"wx/generic/msgdlgg.h"
+	"wx/palmos/msgdlg.h"
+	"wx/msw/msgdlg.h"
+	"wx/motif/msgdlg.h"
+	"wx/gtk/msgdlg.h"
+	"wx/generic/msgdlgg.h"
+	"wx/generic/msgdlgg.h"
+	"wx/mac/msgdlg.h"
+	"wx/cocoa/msgdlg.h"
+	"wx/os2/msgdlg.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/generic/msgdlgg.h
+	"wx/defs.h"
+	"wx/dialog.h"
+
+1316588508 /usr/local/include/wx-2.8/wx/dialog.h
+	"wx/defs.h"
+	"wx/containr.h"
+	"wx/toplevel.h"
+	"wx/univ/dialog.h"
+	"wx/palmos/dialog.h"
+	"wx/msw/dialog.h"
+	"wx/motif/dialog.h"
+	"wx/gtk/dialog.h"
+	"wx/gtk1/dialog.h"
+	"wx/mac/dialog.h"
+	"wx/cocoa/dialog.h"
+	"wx/os2/dialog.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/dialog.h
+	"wx/defs.h"
+
+1316588509 /usr/local/include/wx-2.8/wx/gtk/msgdlg.h
+	"wx/defs.h"
+	"wx/dialog.h"
+
+1319009529 /synchronet/src/src/sbbs3/sbbs.h
+	<io.h>
+	<share.h>
+	<windows.h>
+	<process.h>
+	<direct.h>
+	<mmsystem.h>
+	<crtdbg.h>
+	<unistd.h>
+	<time.h>
+	<errno.h>
+	<stdio.h>
+	<ctype.h>
+	<fcntl.h>
+	<stdarg.h>
+	<stdlib.h>
+	<string.h>
+	<malloc.h>
+	<sys/stat.h>
+	"comio.h"
+	<jsversion.h>
+	<jsapi.h>
+	<cryptlib.h>
+	"genwrap.h"
+	"semfile.h"
+	"netwrap.h"
+	"dirwrap.h"
+	"filewrap.h"
+	"datewrap.h"
+	"sockwrap.h"
+	"eventwrap.h"
+	"link_list.h"
+	"msg_queue.h"
+	"xpdatetime.h"
+	"startup.h"
+	"threadwrap.h"
+	"smblib.h"
+	"ars_defs.h"
+	"scfgdefs.h"
+	"scfglib.h"
+	"userdat.h"
+	"riodefs.h"
+	"cmdshell.h"
+	"ringbuf.h"
+	"client.h"
+	"crc16.h"
+	"crc32.h"
+	"telnet.h"
+	"nopen.h"
+	"text.h"
+
+1318548475 /synchronet/src/src/sbbs3/startup.h
+	<stddef.h>
+	"client.h"
+	"ringbuf.h"
+	"semwrap.h"
+	"ini_file.h"
+	"sbbsdefs.h"
+	"link_list.h"
+
+1319009525 /synchronet/src/src/sbbs3/client.h
+	"gen_defs.h"
+	<time.h>
+
+1318548475 /synchronet/src/src/sbbs3/ringbuf.h
+	"gen_defs.h"
+	"semwrap.h"
+	"eventwrap.h"
+	"threadwrap.h"
+
+1319180359 /synchronet/src/src/sbbs3/sbbsdefs.h
+	<time.h>
+	"gen_defs.h"
+	"nodedefs.h"
+	"fidodefs.h"
+	"xpbeep.h"
+	"str_list.h"
+
+1318548475 /synchronet/src/src/sbbs3/nodedefs.h
+	"smbdefs.h"
+	"limits.h"
+
+1318548475 /synchronet/src/src/sbbs3/fidodefs.h
+	"gen_defs.h"
+
+1318548475 /synchronet/src/src/sbbs3/ars_defs.h
+	<stdio.h>
+	<stdlib.h>
+	<string.h>
+	<ctype.h>
+	"gen_defs.h"
+	"scfgdefs.h"
+
+1318548475 /synchronet/src/src/sbbs3/scfgdefs.h
+	"sbbsdefs.h"
+
+1318548475 /synchronet/src/src/sbbs3/scfglib.h
+	"scfgdefs.h"
+
+1319009532 /synchronet/src/src/sbbs3/userdat.h
+	"scfgdefs.h"
+	"dat_rec.h"
+	"client.h"
+
+1318548475 /synchronet/src/src/sbbs3/dat_rec.h
+
+1318548475 /synchronet/src/src/sbbs3/riodefs.h
+
+1318548475 /synchronet/src/src/sbbs3/cmdshell.h
+	"gen_defs.h"
+	"dirwrap.h"
+	"sockwrap.h"
+
+1318548475 /synchronet/src/src/sbbs3/telnet.h
+	"gen_defs.h"
+
+1318548475 /synchronet/src/src/sbbs3/nopen.h
+	<stdio.h>
+	"gen_defs.h"
+
+1318548475 /synchronet/src/src/sbbs3/text.h
+
+1318932160 /synchronet/src/src/xpdev/genwrap.h
+	<stdio.h>
+	<string.h>
+	<time.h>
+	"gen_defs.h"
+	"wrapdll.h"
+	<sched.h>
+	<time.h>
+	<sys/time.h>
+	<strings.h>
+	<unistd.h>
+	<pthread.h>
+	<pth.h>
+	<process.h>
+	<sys/utime.h>
+	<utime.h>
+
+1318759346 /synchronet/src/src/xpdev/gen_defs.h
+	<errno.h>
+	<windows.h>
+	<os2.h>
+	<sys/types.h>
+	<inttypes.h>
+	<stdint.h>
+	<syslog.h>
+	<SDL.h>
+
+1095966104 /synchronet/src/src/xpdev/wrapdll.h
+
+1142328582 /synchronet/src/src/xpdev/semfile.h
+	<time.h>
+	"str_list.h"
+	"wrapdll.h"
+
+1250244142 /synchronet/src/src/xpdev/str_list.h
+	<stdio.h>
+	<stddef.h>
+	"gen_defs.h"
+
+1250495209 /synchronet/src/src/xpdev/netwrap.h
+	<stddef.h>
+	"str_list.h"
+
+1315476159 /synchronet/src/src/xpdev/dirwrap.h
+	<stdlib.h>
+	<sys/param.h>
+	<paths.h>
+	"gen_defs.h"
+	"wrapdll.h"
+	<sys/types.h>
+	<sys/stat.h>
+	<glob.h>
+	<direct.h>
+	<io.h>
+	<dirent.h>
+
+1319419091 /synchronet/src/src/xpdev/filewrap.h
+	"wrapdll.h"
+	"gen_defs.h"
+	<sys/stat.h>
+	<stdio.h>
+	<unistd.h>
+	<io.h>
+	<fcntl.h>
+	<windows.h>
+	<share.h>
+	<share.h>
+	<share.h>
+
+1319009557 /synchronet/src/src/xpdev/datewrap.h
+	"genwrap.h"
+	<time.h>
+	<dos.h>
+
+1274663632 /synchronet/src/src/xpdev/sockwrap.h
+	"gen_defs.h"
+	<winsock2.h>
+	<mswsock.h>
+	<netdb.h>
+	<sys/types.h>
+	<netinet/in.h>
+	<sys/socket.h>
+	<sys/time.h>
+	<arpa/inet.h>
+	<netinet/tcp.h>
+	<unistd.h>
+	<sys/filio.h>
+	<sys/ioctl.h>
+	<errno.h>
+
+1105663348 /synchronet/src/src/xpdev/eventwrap.h
+	"gen_defs.h"
+	"xpevent.h"
+
+1268270057 /synchronet/src/src/xpdev/xpevent.h
+	<pthread.h>
+	"gen_defs.h"
+	<xpsem.h>
+
+1126567478 /synchronet/src/src/xpdev/xpsem.h
+	<limits.h>
+	<sys/types.h>
+	<fcntl.h>
+	<pthread.h>
+
+1315476159 /synchronet/src/src/xpdev/link_list.h
+	<stddef.h>
+	"wrapdll.h"
+	"str_list.h"
+	"threadwrap.h"
+	"semwrap.h"
+
+1315562574 /synchronet/src/src/xpdev/threadwrap.h
+	"gen_defs.h"
+	"wrapdll.h"
+	<sys/param.h>
+	<pthread.h>
+	<unistd.h>
+	<process.h>
+	<limits.h>
+	<errno.h>
+	<pthread_np.h>
+	"semwrap.h"
+
+1193026620 /synchronet/src/src/xpdev/semwrap.h
+	"gen_defs.h"
+	"wrapdll.h"
+	"xpsem.h"
+	<semaphore.h>
+	<process.h>
+
+1314957744 /synchronet/src/src/xpdev/msg_queue.h
+	"link_list.h"
+	"threadwrap.h"
+
+1203800730 /synchronet/src/src/xpdev/xpdatetime.h
+	"gen_defs.h"
+
+1311328950 /synchronet/src/src/xpdev/ini_file.h
+	"genwrap.h"
+	"str_list.h"
+	"sockwrap.h"
+
+1222110885 /synchronet/src/src/xpdev/xpbeep.h
+	"gen_defs.h"
+
+1314784953 /synchronet/src/src/smblib/smbdefs.h
+	<stdio.h>
+	<time.h>
+	"genwrap.h"
+	"dirwrap.h"
+	"filewrap.h"
+	"md5.h"
+	<sys/types.h>
+
+1186946648 /synchronet/src/src/smblib/md5.h
+	<stddef.h>
+	<gen_defs.h>
+
+1318759346 /synchronet/src/src/smblib/smblib.h
+	"lzh.h"
+	"smbdefs.h"
+
+1034502258 /synchronet/src/src/smblib/lzh.h
+
+1212554384 /synchronet/src/src/smblib/crc16.h
+	"gen_defs.h"
+
+1212554384 /synchronet/src/src/smblib/crc32.h
+	<stdio.h>
+	"gen_defs.h"
+
+1319012416 source:/synchronet/src/src/sbbs3/load_cfg.c
+	"sbbs.h"
+	"text.h"
+
+1315520069 source:/synchronet/src/src/xpdev/dirwrap.c
+	<string.h>
+	<windows.h>
+	<io.h>
+	<unistd.h>
+	<fcntl.h>
+	<ctype.h>
+	<sys/param.h>
+	<sys/mount.h>
+	<sys/kbio.h>
+	<sys/statvfs.h>
+	<sys/ioctl.h>
+	<sys/vfs.h>
+	<sys/statvfs.h>
+	<dos.h>
+	<sys/types.h>
+	<sys/stat.h>
+	<stdio.h>
+	<stdlib.h>
+	<errno.h>
+	"genwrap.h"
+	"dirwrap.h"
+
+1318263565 source:/synchronet/src/src/sbbs3/scfglib1.c
+	"sbbs.h"
+	"scfglib.h"
+
+1318263565 source:/synchronet/src/src/sbbs3/scfglib2.c
+	"sbbs.h"
+	"scfglib.h"
+
+1318845808 source:/synchronet/src/src/sbbs3/nopen.c
+	"sbbs.h"
+	"crc32.h"
+
+1318263568 source:/synchronet/src/src/sbbs3/str_util.c
+	"sbbs.h"
+
+1318263531 source:/synchronet/src/src/sbbs3/ars.c
+	"sbbs.h"
+
+1319425356 source:/synchronet/src/src/sbbs3/userdat.c
+	"sbbs.h"
+	"cmdshell.h"
+
+1318263534 source:/synchronet/src/src/sbbs3/dat_rec.c
+	"sbbs.h"
+
+1319009526 source:/synchronet/src/src/sbbs3/date_str.c
+	"sbbs.h"
+
diff --git a/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs b/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs
new file mode 100644
index 0000000000..9d9a1ce865
--- /dev/null
+++ b/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<wxsmith>
+	<object class="wxFrame" name="SBBS_User_ListFrame">
+		<object class="wxBoxSizer" variable="BoxSizer1" member="no">
+			<orient>wxVERTICAL</orient>
+			<object class="sizeritem">
+				<object class="wxBoxSizer" variable="BoxSizer2" member="no">
+					<object class="sizeritem">
+						<object class="wxStaticText" name="ID_STATICTEXT1" variable="StaticText1" member="yes">
+							<label>ARS Filter</label>
+						</object>
+						<flag>wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</flag>
+						<border>5</border>
+					</object>
+					<object class="sizeritem">
+						<object class="wxTextCtrl" name="ID_TEXTCTRL1" variable="TextCtrl1" member="yes">
+							<tooltip>Enter an ARS string to filter users with</tooltip>
+						</object>
+						<flag>wxALL|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+						<border>5</border>
+						<option>1</option>
+					</object>
+					<object class="sizeritem">
+						<object class="wxButton" name="ID_CLEARBUTTON" variable="ClearButton" member="yes">
+							<label>Clear</label>
+							<tooltip>Clears the ARS filter</tooltip>
+						</object>
+						<flag>wxALL|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+						<border>5</border>
+					</object>
+				</object>
+				<flag>wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+				<border>5</border>
+			</object>
+			<object class="sizeritem">
+				<object class="wxListCtrl" name="ID_USERLISTCTRL" variable="UserList" member="yes">
+					<style>wxLC_REPORT|wxLC_HRULES</style>
+				</object>
+				<flag>wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+				<border>5</border>
+				<option>1</option>
+			</object>
+			<object class="sizeritem">
+				<object class="wxBoxSizer" variable="BoxSizer3" member="no">
+					<object class="sizeritem">
+						<object class="wxBoxSizer" variable="BoxSizer4" member="no">
+							<object class="sizeritem">
+								<object class="wxStaticText" name="ID_STATICTEXT2" variable="StaticText2" member="yes">
+									<label>Quick Validation Sets</label>
+								</object>
+								<flag>wxALL|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+								<border>5</border>
+							</object>
+							<object class="sizeritem">
+								<object class="wxChoice" name="ID_CHOICE1" variable="Choice1" member="yes">
+									<content>
+										<item>Select a set</item>
+										<item>1 SL:10 F1:                          </item>
+										<item>2 SL:20 F1:                          </item>
+										<item>3 SL:30 F1:                          </item>
+										<item>4 SL:40 F1:                          </item>
+										<item>5 SL:50 F1:                          </item>
+										<item>6 SL:60 F1:                          </item>
+										<item>7 SL:70 F1:                          </item>
+										<item>8 SL:80 F1:                          </item>
+										<item>9 SL:90 F1:                          </item>
+										<item>10 SL:100 F1:                          </item>
+									</content>
+									<selection>0</selection>
+									<enabled>0</enabled>
+								</object>
+								<flag>wxALL|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+								<border>5</border>
+							</object>
+						</object>
+						<flag>wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+						<border>5</border>
+						<option>1</option>
+					</object>
+					<object class="sizeritem">
+						<object class="wxBoxSizer" variable="BoxSizer5" member="no">
+							<object class="sizeritem">
+								<object class="wxButton" name="ID_REFRESHBUTTON" variable="RefreshButton" member="yes">
+									<label>Refresh</label>
+									<tooltip>Reloads the user database</tooltip>
+								</object>
+								<flag>wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+								<border>5</border>
+							</object>
+							<object class="sizeritem">
+								<object class="wxButton" name="ID_EDITBUTTON" variable="EditButton" member="yes">
+									<label>Edit</label>
+									<enabled>0</enabled>
+								</object>
+								<flag>wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+								<border>5</border>
+							</object>
+						</object>
+						<flag>wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+						<border>5</border>
+					</object>
+				</object>
+				<flag>wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
+				<border>5</border>
+			</object>
+		</object>
+		<object class="wxMenuBar" variable="MenuBar1" member="no">
+			<object class="wxMenu" variable="Menu1" member="no">
+				<label>&amp;File</label>
+				<object class="wxMenuItem" name="idMenuQuit" variable="MenuItem1" member="no">
+					<label>Quit</label>
+					<accel>Alt-F4</accel>
+					<help>Quit the application</help>
+					<handler function="OnQuit" entry="EVT_MENU" />
+				</object>
+			</object>
+			<object class="wxMenu" variable="Menu2" member="no">
+				<label>Help</label>
+				<object class="wxMenuItem" name="idMenuAbout" variable="MenuItem2" member="no">
+					<label>About</label>
+					<accel>F1</accel>
+					<help>Show info about this application</help>
+					<handler function="OnAbout" entry="EVT_MENU" />
+				</object>
+			</object>
+		</object>
+		<object class="wxStatusBar" name="ID_STATUSBAR1" variable="StatusBar1" member="yes">
+			<fields>1</fields>
+			<widths>-1</widths>
+			<styles>wxSB_NORMAL</styles>
+		</object>
+	</object>
+</wxsmith>
-- 
GitLab