diff options
| -rw-r--r-- | protocols/IRCG/res/IRC.rc | 201 | ||||
| -rw-r--r-- | protocols/IRCG/res/quick.ico | bin | 5430 -> 0 bytes | |||
| -rw-r--r-- | protocols/IRCG/src/commandmonitor.cpp | 24 | ||||
| -rw-r--r-- | protocols/IRCG/src/input.cpp | 3 | ||||
| -rw-r--r-- | protocols/IRCG/src/irc_dlg.h | 155 | ||||
| -rw-r--r-- | protocols/IRCG/src/irclib.cpp | 4 | ||||
| -rw-r--r-- | protocols/IRCG/src/irclib.h | 5 | ||||
| -rw-r--r-- | protocols/IRCG/src/ircproto.cpp | 83 | ||||
| -rw-r--r-- | protocols/IRCG/src/ircproto.h | 7 | ||||
| -rw-r--r-- | protocols/IRCG/src/main.cpp | 10 | ||||
| -rw-r--r-- | protocols/IRCG/src/options.cpp | 2098 | ||||
| -rw-r--r-- | protocols/IRCG/src/resource.h | 15 | ||||
| -rw-r--r-- | protocols/IRCG/src/scripting.cpp | 3 | ||||
| -rw-r--r-- | protocols/IRCG/src/services.cpp | 32 | ||||
| -rw-r--r-- | protocols/IRCG/src/stdafx.h | 13 | ||||
| -rw-r--r-- | protocols/IRCG/src/tools.cpp | 16 | ||||
| -rw-r--r-- | protocols/IRCG/src/version.h | 4 | ||||
| -rw-r--r-- | protocols/IRCG/src/windows.cpp | 167 | 
18 files changed, 981 insertions, 1859 deletions
| diff --git a/protocols/IRCG/res/IRC.rc b/protocols/IRCG/res/IRC.rc index f758d79c89..1e1662ac9a 100644 --- a/protocols/IRCG/res/IRC.rc +++ b/protocols/IRCG/res/IRC.rc @@ -17,7 +17,7 @@  #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
  LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 -#pragma code_page(1252)
 +#pragma code_page(1251)
  /////////////////////////////////////////////////////////////////////////////
  //
 @@ -27,22 +27,36 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL  // Icon with lowest ID value placed first to ensure application icon
  // remains consistent on all systems.
  IDI_MAIN                ICON                    "irc.ico"
 +
  IDI_ADD                 ICON                    "add.ico"
 +
  IDI_BLOCK               ICON                    "block.ico"
 +
  IDI_DELETE              ICON                    "delete.ico"
 +
  IDI_APPLY               ICON                    "apply.ico"
 +
  IDI_WHOIS               ICON                    "whois.ico"
 +
  IDI_LIST                ICON                    "list.ico"
 +
  IDI_MANAGER             ICON                    "manager.ico"
 -IDI_QUICK               ICON                    "quick.ico"
 +
  IDI_RENAME              ICON                    "rename.ico"
 +
  IDI_SHOW                ICON                    "show.ico"
 +
  IDI_LOGO                ICON                    "world.ico"
 +
  IDI_DCC                 ICON                    "dcc.ico"
 +
  IDI_SERVER              ICON                    "server.ico"
 +
  IDI_EDIT                ICON                    "edit.ico"
 +
  IDI_IRCQUESTION         ICON                    "question.ico"
 +
  /////////////////////////////////////////////////////////////////////////////
  //
  // Dialog
 @@ -53,46 +67,39 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD  EXSTYLE WS_EX_CONTROLPARENT
  FONT 8, "MS Shell Dlg", 0, 0, 0x1
  BEGIN
 -    GROUPBOX        "Default network",IDC_STATIC,2,0,142,134
 -    CONTROL         "Enable",IDC_STARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,11,125,10
 -    LTEXT           "Server name",IDC_STATIC,10,22,125,8,0,WS_EX_TRANSPARENT
 -    COMBOBOX        IDC_SERVERCOMBO,10,30,125,90,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
 -    CONTROL         "Internet address",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,10,45,81,8,WS_EX_TRANSPARENT
 -    EDITTEXT        IDC_SERVER,10,53,88,12,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP
 -    LTEXT           "SSL",IDC_STATIC,107,45,28,8,0,WS_EX_TRANSPARENT
 -    EDITTEXT        IDC_SSL,107,53,28,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER,WS_EX_RIGHT
 -    LTEXT           "Port range",IDC_STATIC,10,67,79,8,0,WS_EX_TRANSPARENT
 -    EDITTEXT        IDC_PORT,10,75,33,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER,WS_EX_RIGHT
 -    LTEXT           "->",IDC_STATIC,45,76,8,8
 -    EDITTEXT        IDC_PORT2,54,75,33,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER,WS_EX_RIGHT
 -    LTEXT           "Password",IDC_STATIC,10,90,125,8,0,WS_EX_TRANSPARENT
 -    EDITTEXT        IDC_PASS,10,100,125,12,ES_PASSWORD | ES_AUTOHSCROLL
 -    CONTROL         "&Add",IDC_ADDSERVER,"MButtonClass",WS_DISABLED | WS_TABSTOP,16,116,27,14,WS_EX_NOACTIVATE | 0x10000000L
 -    CONTROL         "&Edit",IDC_EDITSERVER,"MButtonClass",WS_DISABLED | WS_TABSTOP,59,116,27,14,WS_EX_NOACTIVATE | 0x10000000L
 -    CONTROL         "&Del",IDC_DELETESERVER,"MButtonClass",WS_DISABLED | WS_TABSTOP,102,116,27,14,WS_EX_NOACTIVATE | 0x10000000L
 +    GROUPBOX        "Server",IDC_STATIC,2,0,142,134
 +    CONTROL         "Host address",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,8,11,81,8,WS_EX_TRANSPARENT
 +    EDITTEXT        IDC_SERVER,8,21,127,12,ES_AUTOHSCROLL | WS_GROUP
 +    LTEXT           "SSL",IDC_STATIC,8,64,28,8,0,WS_EX_TRANSPARENT
 +    LTEXT           "Port range",IDC_STATIC,8,37,79,8,0,WS_EX_TRANSPARENT
 +    EDITTEXT        IDC_PORT,8,47,39,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
 +    LTEXT           "->",IDC_STATIC,55,49,8,8
 +    EDITTEXT        IDC_PORT2,68,47,39,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
 +    LTEXT           "Password",IDC_STATIC,8,105,127,8,0,WS_EX_TRANSPARENT
 +    EDITTEXT        IDC_PASS,8,115,127,12,ES_PASSWORD | ES_AUTOHSCROLL
      GROUPBOX        "User info - Required",IDC_STATIC,150,0,154,90
 -    RTEXT           "Nick",IDC_STATIC,158,16,75,8,0,WS_EX_TRANSPARENT
 +    RTEXT           "Nick",IDC_STATIC,157,16,76,8,0,WS_EX_TRANSPARENT
      EDITTEXT        IDC_NICK,237,13,63,13,ES_AUTOHSCROLL
 -    RTEXT           "Alternative nick",IDC_STATIC,158,34,75,8,0,WS_EX_TRANSPARENT
 +    RTEXT           "Alternative nick",IDC_STATIC,157,34,76,8,0,WS_EX_TRANSPARENT
      EDITTEXT        IDC_NICK2,237,32,63,13,ES_AUTOHSCROLL
 -    RTEXT           "Full name (e-mail)",IDC_STATIC,158,53,75,8,0,WS_EX_TRANSPARENT
 +    RTEXT           "Full name (e-mail)",IDC_STATIC,157,53,76,8,0,WS_EX_TRANSPARENT
      EDITTEXT        IDC_NAME,237,51,63,13,ES_AUTOHSCROLL
 -    RTEXT           "User ID (Ident)",IDC_STATIC,158,73,75,8,0,WS_EX_TRANSPARENT
 +    RTEXT           "User ID (Ident)",IDC_STATIC,157,73,76,8,0,WS_EX_TRANSPARENT
      EDITTEXT        IDC_USERID,237,71,63,13,ES_AUTOHSCROLL
      GROUPBOX        "Ident",IDC_STATIC,150,92,154,42
 -    CONTROL         "Enable",IDC_IDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,158,106,46,15
 +    CONTROL         "Enable",IDC_IDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,157,106,46,15
      LTEXT           "System",IDC_STATIC,210,98,39,8,0,WS_EX_TRANSPARENT
      EDITTEXT        IDC_IDENTSYSTEM,210,106,39,12,ES_AUTOHSCROLL
      LTEXT           "Port",IDC_STATIC,256,98,35,8,0,WS_EX_TRANSPARENT
      EDITTEXT        IDC_IDENTPORT,256,106,39,12,ES_AUTOHSCROLL | ES_NUMBER
      CONTROL         "only while connecting",IDC_IDENT_TIMED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,120,124,11
      GROUPBOX        "Other",IDC_STATIC,2,134,302,92
 -    CONTROL         "Force visible (-i)",IDC_FORCEVISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,145,134,10
 -    CONTROL         "Rejoin channel if kicked",IDC_REJOINONKICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,156,134,10
 -    CONTROL         "Rejoin channels on reconnect",IDC_REJOINCHANNELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,167,134,10
 -    CONTROL         "Disable tray balloon on error",IDC_DISABLEERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,178,134,10
 -    CONTROL         "Show addresses",IDC_ADDRESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,189,134,10
 -    CONTROL         "Use server window",IDC_USESERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,200,134,10
 +    CONTROL         "Force visible (-i)",IDC_FORCEVISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,145,136,10
 +    CONTROL         "Rejoin channel if kicked",IDC_REJOINONKICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,156,136,10
 +    CONTROL         "Rejoin channels on reconnect",IDC_REJOINCHANNELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,167,136,10
 +    CONTROL         "Disable tray balloon on error",IDC_DISABLEERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,178,136,10
 +    CONTROL         "Show addresses",IDC_ADDRESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,189,136,10
 +    CONTROL         "Use server window",IDC_USESERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,200,136,10
      CONTROL         "Show server window on startup",IDC_SHOWSERVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,211,129,10
      CONTROL         "Keep connection alive",IDC_KEEPALIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,144,145,154,10
      CONTROL         "Automatically join on invite",IDC_AUTOJOIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,144,156,154,10
 @@ -107,7 +114,8 @@ BEGIN      RTEXT           "Don't check if more than (users):",IDC_STATIC,142,212,124,8
      EDITTEXT        IDC_LIMIT,267,210,29,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
      CONTROL         "Spin2",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,284,209,11,14
 -    CONTROL         "SASL",IDC_SASL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,103,77,32,10
 +    CONTROL         "Enable SASL",IDC_SASL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,92,55,10
 +    COMBOBOX        IDC_SSL,8,74,48,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
  END
  IDD_INFO DIALOGEX 0, 0, 267, 214
 @@ -192,30 +200,6 @@ BEGIN      CONTROL         "Enable UTF-8 autodetection",IDC_UTF_AUTODETECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,208,287,10
  END
 -IDD_ADDSERVER DIALOGEX 0, 0, 182, 136
 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 -EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT
 -CAPTION "Add server"
 -FONT 8, "MS Shell Dlg", 0, 0, 0x1
 -BEGIN
 -    COMBOBOX        IDC_ADD_COMBO,7,20,168,90,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
 -    EDITTEXT        IDC_ADD_SERVER,7,44,120,12,ES_AUTOHSCROLL
 -    EDITTEXT        IDC_ADD_ADDRESS,7,68,120,12,ES_AUTOHSCROLL | WS_GROUP
 -    EDITTEXT        IDC_ADD_PORT,7,92,47,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
 -    EDITTEXT        IDC_ADD_PORT2,80,92,47,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
 -    CONTROL         "Auto",IDC_AUTO,"Button",BS_AUTORADIOBUTTON  | WS_GROUP,139,52,32,10
 -    CONTROL         "On",IDC_ON,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,139,69,32,10
 -    CONTROL         "Off",IDC_OFF,"Button",BS_AUTORADIOBUTTON,139,86,32,10
 -    DEFPUSHBUTTON   "&OK",IDOK,63,115,50,14
 -    PUSHBUTTON      "&Cancel",IDCANCEL,125,115,50,14
 -    CONTROL         "Host address",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,7,60,120,8,WS_EX_TRANSPARENT
 -    LTEXT           "->",IDC_STATIC,64,94,8,8
 -    LTEXT           "Port range",IDC_STATIC,7,84,87,8,0,WS_EX_TRANSPARENT
 -    LTEXT           "Server description",IDC_STATIC,7,36,120,8,0,WS_EX_TRANSPARENT
 -    LTEXT           "Network",IDC_STATIC,7,12,107,8,0,WS_EX_TRANSPARENT
 -    GROUPBOX        "SSL",IDC_STATIC,136,38,39,67
 -END
 -
  IDD_LIST DIALOGEX 0, 0, 360, 212
  STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
  CAPTION "Channels on server"
 @@ -230,35 +214,6 @@ BEGIN      EDITTEXT        IDC_TEXT,4,200,351,10,ES_AUTOHSCROLL | WS_DISABLED | NOT WS_BORDER,WS_EX_STATICEDGE
  END
 -IDD_QUICKCONN DIALOGEX 0, 0, 201, 165
 -STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
 -EXSTYLE WS_EX_CONTROLPARENT
 -FONT 8, "MS Shell Dlg", 0, 0, 0x1
 -BEGIN
 -    COMBOBOX        IDC_SERVERCOMBO,12,54,177,69,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
 -    EDITTEXT        IDC_SERVER,12,78,177,12,ES_AUTOHSCROLL
 -    GROUPBOX        "SSL",IDC_GRBOX_SSL,12,94,177,21,WS_GROUP | WS_TABSTOP
 -    CONTROL         "Off",IDC_SSL_OFF,"Button",BS_AUTORADIOBUTTON,36,102,42,10
 -    CONTROL         "Auto",IDC_SSL_AUTO,"Button",BS_AUTORADIOBUTTON,87,102,42,10
 -    CONTROL         "On",IDC_SSL_ON,"Button",BS_AUTORADIOBUTTON,138,102,44,10
 -    EDITTEXT        IDC_PORT,12,124,36,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
 -    EDITTEXT        IDC_PORT2,63,124,36,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
 -    EDITTEXT        IDC_PASS,116,124,73,12,ES_PASSWORD | ES_AUTOHSCROLL
 -    DEFPUSHBUTTON   "C&onnect",IDOK,83,146,50,14
 -    PUSHBUTTON      "&Cancel",IDCANCEL,139,146,50,14
 -    CONTROL         "Internet address",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP,12,70,130,8,WS_EX_TRANSPARENT
 -    LTEXT           "Port range",IDC_STATIC,12,116,63,8,0,WS_EX_TRANSPARENT
 -    LTEXT           "Password",IDC_STATIC,116,116,73,8,0,WS_EX_TRANSPARENT
 -    LTEXT           "Server name",IDC_STATIC,12,46,177,8,0,WS_EX_TRANSPARENT
 -    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,140,201,1
 -    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,38,201,1
 -    LTEXT           "",IDC_WHITERECT,0,0,201,38
 -    ICON            "",IDC_LOGO,159,5,20,20,SS_REALSIZEIMAGE
 -    LTEXT           "",IDC_TEXT,18,16,138,18
 -    LTEXT           "",IDC_CAPTION,12,5,143,11
 -    LTEXT           "->",IDC_STATIC,51,126,8,8,0,WS_EX_TRANSPARENT
 -END
 -
  IDD_USERINFO DIALOGEX 0, 0, 222, 132
  STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
  EXSTYLE WS_EX_CONTROLPARENT
 @@ -408,7 +363,6 @@ EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT  FONT 8, "MS Shell Dlg", 0, 0, 0x1
  BEGIN
      EDITTEXT        IDC_MASK,7,15,137,14,ES_AUTOHSCROLL
 -    EDITTEXT        IDC_NETWORK,150,15,63,14,ES_AUTOHSCROLL
      CONTROL         "Queries",IDC_Q,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,47,54,10
      CONTROL         "Messages",IDC_M,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,47,64,10
      CONTROL         "Notices",IDC_N,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,47,57,10
 @@ -423,27 +377,29 @@ BEGIN      CTEXT           "(*) blank to set this mask for all networks",IDC_STATIC,7,90,206,8
  END
 -IDD_ACCMGRUI DIALOGEX 0, 0, 186, 134
 +IDD_ACCMGRUI DIALOGEX 0, 0, 186, 135
  STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
  EXSTYLE WS_EX_CONTROLPARENT
  FONT 8, "MS Shell Dlg", 0, 0, 0x1
  BEGIN
 -    COMBOBOX        IDC_SERVERCOMBO,55,5,123,90,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
 -    EDITTEXT        IDC_SERVER,5,21,88,12,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
 -    EDITTEXT        IDC_PORT,96,21,27,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER | NOT WS_TABSTOP,WS_EX_RIGHT
 -    EDITTEXT        IDC_PORT2,126,21,27,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER | NOT WS_TABSTOP,WS_EX_RIGHT
 -    EDITTEXT        IDC_PASS,55,38,123,12,ES_PASSWORD | ES_AUTOHSCROLL
 -    EDITTEXT        IDC_NICK,87,64,91,13,ES_AUTOHSCROLL
 -    EDITTEXT        IDC_NICK2,87,81,91,13,ES_AUTOHSCROLL
 -    EDITTEXT        IDC_NAME,87,98,91,13,ES_AUTOHSCROLL
 -    EDITTEXT        IDC_USERID,87,115,91,13,ES_AUTOHSCROLL
 -    RTEXT           "Server:",IDC_STATIC,5,7,45,8
 -    RTEXT           "Password:",IDC_STATIC,5,41,45,8
 -    RTEXT           "Nick",IDC_STATIC,5,66,79,8
 -    RTEXT           "Alternative nick",IDC_STATIC,5,83,79,8
 -    RTEXT           "Full name (e-mail)",IDC_STATIC,5,100,79,8
 -    RTEXT           "User ID (Ident)",IDC_STATIC,5,117,79,8
 -    EDITTEXT        IDC_SSL,155,21,23,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER | NOT WS_TABSTOP,WS_EX_RIGHT
 +    EDITTEXT        IDC_SERVER,87,6,91,12,ES_AUTOHSCROLL | WS_GROUP | NOT WS_TABSTOP
 +    EDITTEXT        IDC_PORT,87,22,34,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP,WS_EX_RIGHT
 +    EDITTEXT        IDC_PORT2,144,22,34,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP,WS_EX_RIGHT
 +    EDITTEXT        IDC_PASS,87,52,91,12,ES_PASSWORD | ES_AUTOHSCROLL
 +    EDITTEXT        IDC_NICK,87,68,91,13,ES_AUTOHSCROLL
 +    EDITTEXT        IDC_NICK2,87,84,91,13,ES_AUTOHSCROLL
 +    EDITTEXT        IDC_NAME,87,100,91,13,ES_AUTOHSCROLL
 +    EDITTEXT        IDC_USERID,87,116,91,13,ES_AUTOHSCROLL
 +    LTEXT           "Password",IDC_STATIC,5,55,79,8
 +    LTEXT           "Nick",IDC_STATIC,5,70,79,8
 +    LTEXT           "Alternative nick",IDC_STATIC,5,86,79,8
 +    LTEXT           "Full name (e-mail)",IDC_STATIC,5,102,79,8
 +    LTEXT           "User ID (Ident)",IDC_STATIC,5,118,79,8
 +    LTEXT           "Host",IDC_STATIC,5,8,79,8
 +    LTEXT           "Port range",IDC_STATIC,5,22,79,8
 +    LTEXT           "->",IDC_STATIC,130,24,10,8
 +    LTEXT           "SSL",IDC_STATIC,5,39,79,8
 +    COMBOBOX        IDC_SSL,87,37,48,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
  END
 @@ -458,10 +414,10 @@ BEGIN      IDD_PREFS_CONNECT, DIALOG
      BEGIN
          LEFTMARGIN, 2
 -        VERTGUIDE, 10
 +        VERTGUIDE, 8
          VERTGUIDE, 135
          VERTGUIDE, 144
 -        VERTGUIDE, 158
 +        VERTGUIDE, 157
          VERTGUIDE, 210
          VERTGUIDE, 233
          VERTGUIDE, 237
 @@ -526,21 +482,6 @@ BEGIN          HORZGUIDE, 174
      END
 -    IDD_ADDSERVER, DIALOG
 -    BEGIN
 -        LEFTMARGIN, 7
 -        RIGHTMARGIN, 175
 -        VERTGUIDE, 127
 -        VERTGUIDE, 136
 -        VERTGUIDE, 143
 -        TOPMARGIN, 7
 -        BOTTOMMARGIN, 129
 -        HORZGUIDE, 20
 -        HORZGUIDE, 44
 -        HORZGUIDE, 68
 -        HORZGUIDE, 92
 -    END
 -
      IDD_LIST, DIALOG
      BEGIN
          LEFTMARGIN, 4
 @@ -556,19 +497,6 @@ BEGIN          HORZGUIDE, 179
      END
 -    IDD_QUICKCONN, DIALOG
 -    BEGIN
 -        VERTGUIDE, 12
 -        VERTGUIDE, 189
 -        BOTTOMMARGIN, 160
 -        HORZGUIDE, 5
 -        HORZGUIDE, 38
 -        HORZGUIDE, 54
 -        HORZGUIDE, 78
 -        HORZGUIDE, 124
 -        HORZGUIDE, 140
 -    END
 -
      IDD_USERINFO, DIALOG
      BEGIN
          LEFTMARGIN, 6
 @@ -679,15 +607,15 @@ BEGIN      IDD_ACCMGRUI, DIALOG
      BEGIN
          VERTGUIDE, 5
 -        VERTGUIDE, 50
 -        VERTGUIDE, 55
          VERTGUIDE, 84
          VERTGUIDE, 87
          VERTGUIDE, 178
 +        BOTTOMMARGIN, 134
      END
  END
  #endif    // APSTUDIO_INVOKED
 +
  /////////////////////////////////////////////////////////////////////////////
  //
  // AFX_DIALOG_LAYOUT
 @@ -698,6 +626,11 @@ BEGIN      0
  END
 +IDD_ACCMGRUI AFX_DIALOG_LAYOUT
 +BEGIN
 +    0
 +END
 +
  #endif    // Neutral resources
  /////////////////////////////////////////////////////////////////////////////
 diff --git a/protocols/IRCG/res/quick.ico b/protocols/IRCG/res/quick.icoBinary files differ deleted file mode 100644 index 9638e6e948..0000000000 --- a/protocols/IRCG/res/quick.ico +++ /dev/null diff --git a/protocols/IRCG/src/commandmonitor.cpp b/protocols/IRCG/src/commandmonitor.cpp index a402668e45..c3f356564a 100644 --- a/protocols/IRCG/src/commandmonitor.cpp +++ b/protocols/IRCG/src/commandmonitor.cpp @@ -599,12 +599,10 @@ bool CIrcProto::OnIrc_NOTICE(const CIrcMessage *pmsg)  		if (!m_ignore || !IsIgnored(pmsg->prefix.sNick, pmsg->prefix.sUser, pmsg->prefix.sHost, 'n')) {
  			CMStringW S;
  			CMStringW S2;
 -			CMStringW S3;
 +
  			if (pmsg->prefix.sNick.GetLength() > 0)
  				S = pmsg->prefix.sNick;
 -			else
 -				S = m_info.sNetwork;
 -			S3 = m_info.sNetwork;
 +
  			if (IsChannel(pmsg->parameters[0]))
  				S2 = pmsg->parameters[0];
  			else {
 @@ -625,7 +623,7 @@ bool CIrcProto::OnIrc_NOTICE(const CIrcMessage *pmsg)  				}
  				else S2 = L"";
  			}
 -			DoEvent(GC_EVENT_NOTICE, S2.IsEmpty() ? nullptr : S2.c_str(), S, pmsg->parameters[1], nullptr, S3, NULL, true, false);
 +			DoEvent(GC_EVENT_NOTICE, S2.IsEmpty() ? nullptr : S2.c_str(), S, pmsg->parameters[1], nullptr, L"IRC", NULL, true, false);
  		}
  	}
  	else ShowMessage(pmsg);
 @@ -2338,9 +2336,8 @@ bool CIrcProto::DoOnConnect(const CIrcMessage*)  		PostIrcMessage(L"/AWAY " + m_statusMessage.Mid(0, 450));
  	if (m_perform) {
 -		DoPerform("ALL NETWORKS");
  		if (IsConnected()) {
 -			DoPerform(_T2A(m_info.sNetwork));
 +			DoPerform("Connect");
  			switch (Temp) {
  				case ID_STATUS_FREECHAT:   DoPerform("Event: Free for chat");   break;
  				case ID_STATUS_ONLINE:     DoPerform("Event: Available");       break;
 @@ -2418,19 +2415,14 @@ int CIrcProto::IsIgnored(CMStringW user, char type)  			return i + 1;
  		bool bUserContainsWild = (wcschr(user, '*') != nullptr || wcschr(user, '?') != nullptr);
 -		if (!bUserContainsWild && WCCmp(C.mask, user) ||
 -			bUserContainsWild && !mir_wstrcmpi(user, C.mask)) {
 +		if (!bUserContainsWild && WCCmp(C.mask, user) || bUserContainsWild && !mir_wstrcmpi(user, C.mask)) {
  			if (C.flags.IsEmpty() || C.flags[0] != '+')
  				continue;
  			if (!wcschr(C.flags, type))
  				continue;
 -			if (C.network.IsEmpty())
 -				return i + 1;
 -
 -			if (IsConnected() && !mir_wstrcmpi(C.network, m_info.sNetwork))
 -				return i + 1;
 +			return i + 1;
  		}
  	}
 @@ -2444,7 +2436,7 @@ bool CIrcProto::AddIgnore(const wchar_t* mask, const wchar_t* flags, const wchar  	RewriteIgnoreSettings();
  	if (m_ignoreDlg)
 -		m_ignoreDlg->RebuildList();
 +		m_ignoreDlg->Update();
  	return true;
  }
 @@ -2457,6 +2449,6 @@ bool CIrcProto::RemoveIgnore(const wchar_t* mask)  	RewriteIgnoreSettings();
  	if (m_ignoreDlg)
 -		m_ignoreDlg->RebuildList();
 +		m_ignoreDlg->Update();
  	return true;
  }
 diff --git a/protocols/IRCG/src/input.cpp b/protocols/IRCG/src/input.cpp index 934d56abd5..fe5f53ebde 100644 --- a/protocols/IRCG/src/input.cpp +++ b/protocols/IRCG/src/input.cpp @@ -170,7 +170,6 @@ CMStringW CIrcProto::DoIdentifiers(CMStringW text, const wchar_t*)  	text.Replace(L"%module", _A2T(m_szModuleName));
  	text.Replace(L"%name", m_name);
  	text.Replace(L"%newl", L"\r\n");
 -	text.Replace(L"%network", m_info.sNetwork.c_str());
  	text.Replace(L"%me", m_info.sNick.c_str());
  	char mirver[100];
 @@ -294,7 +293,7 @@ BOOL CIrcProto::DoHardcodedCommand(CMStringW text, wchar_t *window, MCONTACT hCo  			CMStringW szNetwork;
  			if (three.IsEmpty())
 -				szNetwork = m_info.sNetwork;
 +				szNetwork = "IRC";
  			else
  				szNetwork = three;
 diff --git a/protocols/IRCG/src/irc_dlg.h b/protocols/IRCG/src/irc_dlg.h index b070217fd7..082973dd2f 100644 --- a/protocols/IRCG/src/irc_dlg.h +++ b/protocols/IRCG/src/irc_dlg.h @@ -21,10 +21,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  #pragma once
 +struct CIrcBaseDlg : public CProtoDlgBase<CIrcProto>
 +{
 +	CIrcBaseDlg(CIrcProto *ppro, int dlgId) :
 +		CProtoDlgBase<CIrcProto>(ppro, dlgId)
 +	{}
 +
 +	virtual void Update() {};
 +};
 +
  /////////////////////////////////////////////////////////////////////////////////////////
  // Dialogs
 -struct CMessageBoxDlg : public CProtoDlgBase < CIrcProto >
 +struct CMessageBoxDlg : public CIrcBaseDlg
  {
  	DCCINFO *pdci;
 @@ -33,7 +42,7 @@ struct CMessageBoxDlg : public CProtoDlgBase < CIrcProto >  	bool OnApply() override;
  };
 -struct CCoolIrcDlg : public CProtoDlgBase < CIrcProto >
 +struct CCoolIrcDlg : public CIrcBaseDlg
  {
  	CCoolIrcDlg(CIrcProto* _pro, int dlgId);
 @@ -79,7 +88,7 @@ struct CNickDlg : public CCoolIrcDlg  	void OnDestroy() override;
  };
 -struct CListDlg : public CProtoDlgBase < CIrcProto >
 +struct CListDlg : public CIrcBaseDlg
  {
  	CListDlg(CIrcProto* _pro);
 @@ -111,21 +120,6 @@ struct CJoinDlg : public CCoolIrcDlg  	void OnDestroy() override;
  };
 -struct CQuickDlg : public CCoolIrcDlg
 -{
 -	CQuickDlg(CIrcProto* _pro);
 -
 -	bool OnInitDialog() override;
 -	bool OnApply() override;
 -	void OnDestroy() override;
 -
 -	CCtrlCombo m_serverCombo;
 -	void OnServerCombo(CCtrlData*);
 -
 -private:
 -	struct SERVER_INFO* m_si;
 -};
 -
  struct CManagerDlg : public CCoolIrcDlg
  {
  	CManagerDlg(CIrcProto* _pro);
 @@ -176,128 +170,3 @@ struct CQuestionDlg : public CCoolIrcDlg  private:
  	CManagerDlg* m_owner;
  };
 -
 -/////////////////////////////////////////////////////////////////////////////////////////
 -// options
 -
 -//---- the first property page: Account -------------------------------------------------
 -
 -struct CConnectPrefsDlg : public CProtoDlgBase < CIrcProto >
 -{
 -	bool m_serverlistModified;
 -
 -	CCtrlCombo   m_serverCombo;
 -	CCtrlEdit    m_server, m_port, m_port2, m_pass;
 -	CCtrlMButton m_add, m_edit, m_del;
 -	CCtrlEdit    m_nick, m_nick2, m_name, m_userID;
 -
 -	CCtrlCheck   m_ident, m_identTimer;
 -	CCtrlEdit    m_identSystem, m_identPort;
 -
 -	CCtrlCheck   m_forceVisible, m_rejoinOnKick, m_rejoinChannels, m_disableError,
 -		m_address, m_useServer, m_showServer, m_keepAlive, m_autoJoin,
 -		m_oldStyle, m_onlineNotif, m_channelAway, m_enableServer, m_useSasl;
 -	CCtrlEdit    m_onlineTimer, m_limit, m_ssl;
 -	CCtrlSpin    m_spin1, m_spin2;
 -
 -	CConnectPrefsDlg(CIrcProto* _pro);
 -
 -	bool OnInitDialog() override;
 -	bool OnApply() override;
 -
 -	void OnServerCombo(CCtrlData*);
 -	void OnAddServer(CCtrlButton*);
 -	void OnDeleteServer(CCtrlButton*);
 -	void OnEditServer(CCtrlButton*);
 -	void OnStartup(CCtrlData*);
 -	void OnIdent(CCtrlData*);
 -	void OnUseServer(CCtrlData*);
 -	void OnOnlineNotif(CCtrlData*);
 -	void OnChannelAway(CCtrlData*);
 -};
 -
 -//---- the second property page: DCC/CTCP -----------------------------------------------
 -
 -struct CCtcpPrefsDlg : public CProtoDlgBase < CIrcProto >
 -{
 -	CCtrlCombo m_combo;
 -	CCtrlCheck m_slow, m_fast, m_disc, m_passive, m_sendNotice, m_enableIP, m_fromServer;
 -	CCtrlEdit m_ip, m_userInfo;
 -	CCtrlCheck m_radio1, m_radio2, m_radio3;
 -
 -	CCtcpPrefsDlg(CIrcProto* _pro);
 -
 -	bool OnInitDialog() override;
 -	bool OnApply() override;
 -
 -	void OnClicked(CCtrlData*);
 -};
 -
 -//---- the third property page: Other ---------------------------------------------------
 -
 -struct COtherPrefsDlg : public CProtoDlgBase < CIrcProto >
 -{
 -	bool m_performlistModified;
 -
 -	CCtrlButton  m_url;
 -	CCtrlMButton m_add, m_delete;
 -	CCtrlCombo   m_performCombo, m_codepage;
 -	CCtrlEdit    m_pertormEdit, m_quitMessage, m_alias;
 -	CCtrlCheck   m_perform, m_scripting, m_autodetect;
 -
 -	COtherPrefsDlg(CIrcProto* _pro);
 -
 -	bool OnInitDialog() override;
 -	bool OnApply() override;
 -	void OnDestroy() override;
 -
 -	void OnPerformCombo(CCtrlData*);
 -	void OnCodePage(CCtrlData*);
 -	void OnPerformEdit(CCtrlData*);
 -	void OnPerform(CCtrlData*);
 -	void OnAdd(CCtrlButton*);
 -	void OnDelete(CCtrlButton*);
 -
 -	void addPerformComboValue(int idx, const char* szValueName);
 -};
 -
 -//---- the fourth property page: Ignore -------------------------------------------------
 -
 -struct CIgnorePrefsDlg : public CProtoDlgBase < CIrcProto >
 -{
 -	CCtrlMButton m_add, m_edit, m_del;
 -	CCtrlCheck m_enable, m_ignoreChat, m_ignoreFile, m_ignoreChannel, m_ignoreUnknown;
 -	CCtrlListView m_list;
 -
 -	CIgnorePrefsDlg(CIrcProto* _pro);
 -
 -	bool OnInitDialog() override;
 -	bool OnApply() override;
 -	void OnDestroy() override;
 -
 -	INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override;
 -
 -	void List_OnColumnClick(CCtrlListView::TEventInfo*);
 -	void OnEnableIgnore(CCtrlData*);
 -	void OnIgnoreChat(CCtrlData*);
 -	void OnAdd(CCtrlButton*);
 -	void OnEdit(CCtrlButton*);
 -	void OnDelete(CCtrlButton*);
 -
 -	void FixButtons(void);
 -	void RebuildList(void);
 -	void UpdateList(void);
 -};
 -
 -struct CAddIgnoreDlg : public CProtoDlgBase < CIrcProto >
 -{
 -	CIgnorePrefsDlg* m_owner;
 -
 -	wchar_t szOldMask[500];
 -
 -	CAddIgnoreDlg(CIrcProto* _pro, const wchar_t* mask, CIgnorePrefsDlg* parent);
 -
 -	bool OnInitDialog() override;
 -	bool OnApply() override;
 -	void OnDestroy() override;
 -};
 diff --git a/protocols/IRCG/src/irclib.cpp b/protocols/IRCG/src/irclib.cpp index 4c4ac7e045..50a5b51079 100644 --- a/protocols/IRCG/src/irclib.cpp +++ b/protocols/IRCG/src/irclib.cpp @@ -200,7 +200,7 @@ bool CIrcProto::Connect(const CIrcSessionInfo& info)  	con = Netlib_OpenConnection(m_hNetlibUser, &ncon);  	if (con == nullptr) {  		wchar_t szTemp[300]; -		mir_snwprintf(szTemp, L"%c5%s %c%s%c (%S: %u).", irc::COLOR, TranslateT("Failed to connect to"), irc::BOLD, m_sessionInfo.sNetwork.c_str(), irc::BOLD, m_sessionInfo.sServer.c_str(), m_sessionInfo.iPort); +		mir_snwprintf(szTemp, L"%c%s (%S: %u).", irc::COLOR, TranslateT("Failed to connect to"), m_sessionInfo.sServer.c_str(), m_sessionInfo.iPort);  		DoEvent(GC_EVENT_INFORMATION, SERVERWINDOW, nullptr, szTemp, nullptr, nullptr, NULL, true, false);  		return false;  	} @@ -619,7 +619,6 @@ CIrcSessionInfo::CIrcSessionInfo(const CIrcSessionInfo& si) :  	bIdentServer(si.bIdentServer),  	m_iSSL(si.m_iSSL),  	sIdentServerType(si.sIdentServerType), -	sNetwork(si.sNetwork),  	iIdentServerPort(si.iIdentServerPort)  {  } @@ -638,7 +637,6 @@ void CIrcSessionInfo::Reset()  	m_iSSL = 0;  	sIdentServerType = L"";  	iIdentServerPort = 0; -	sNetwork = L"";  }  //////////////////////////////////////////////////////////////////// diff --git a/protocols/IRCG/src/irclib.h b/protocols/IRCG/src/irclib.h index 7677956762..9b32b78ebf 100644 --- a/protocols/IRCG/src/irclib.h +++ b/protocols/IRCG/src/irclib.h @@ -92,14 +92,13 @@ private :  struct CIrcSessionInfo
  {
 -	CMStringA  sServer;
 +	CMStringA sServer;
  	CMStringW sServerName;
  	CMStringW sNick;
  	CMStringW sUserID;
  	CMStringW sFullName;
 -	CMStringA  sPassword;
 +	CMStringA sPassword;
  	CMStringW sIdentServerType;
 -	CMStringW sNetwork;
  	bool bIdentServer;
  	bool bNickFlag;
  	int m_iSSL;
 diff --git a/protocols/IRCG/src/ircproto.cpp b/protocols/IRCG/src/ircproto.cpp index 2d6a97709c..dc96b7342a 100644 --- a/protocols/IRCG/src/ircproto.cpp +++ b/protocols/IRCG/src/ircproto.cpp @@ -46,7 +46,6 @@ CIrcProto::CIrcProto(const char* szModuleName, const wchar_t* tszUserName) :  	CreateProtoService(PS_LEAVECHAT, &CIrcProto::OnLeaveChat);
  	CreateProtoService(IRC_JOINCHANNEL, &CIrcProto::OnJoinMenuCommand);
 -	CreateProtoService(IRC_QUICKCONNECT, &CIrcProto::OnQuickConnectMenuCommand);
  	CreateProtoService(IRC_CHANGENICK, &CIrcProto::OnChangeNickMenuCommand);
  	CreateProtoService(IRC_SHOWLIST, &CIrcProto::OnShowListMenuCommand);
  	CreateProtoService(IRC_SHOWSERVER, &CIrcProto::OnShowServerMenuCommand);
 @@ -171,19 +170,6 @@ CIrcProto::~CIrcProto()  ////////////////////////////////////////////////////////////////////////////////////////
  // OnModulesLoaded - performs hook registration
 -static int sttCheckPerform(const char *szSetting, void *lParam)
 -{
 -	if (!_strnicmp(szSetting, "PERFORM:", 8)) {
 -		CMStringA s = szSetting;
 -		s.MakeUpper();
 -		if (s != szSetting) {
 -			OBJLIST<CMStringA>* p = (OBJLIST<CMStringA>*)lParam;
 -			p->insert(new CMStringA(szSetting));
 -		}
 -	}
 -	return 0;
 -}
 -
  void CIrcProto::OnModulesLoaded()
  {
  	wchar_t name[128];
 @@ -205,54 +191,24 @@ void CIrcProto::OnModulesLoaded()  	nlu.szDescriptiveName.w = name;
  	hNetlibDCC = Netlib_RegisterUser(&nlu);
 -	m_pServer = Chat_NewSession(GCW_SERVER, m_szModuleName, SERVERWINDOW, _A2T(m_network));
 +	m_pServer = Chat_NewSession(GCW_SERVER, m_szModuleName, SERVERWINDOW, TranslateT("Server window"));
  	if (m_useServer && !m_hideServerWindow)
  		Chat_Control(m_szModuleName, SERVERWINDOW, WINDOW_VISIBLE);
  	else
  		Chat_Control(m_szModuleName, SERVERWINDOW, WINDOW_HIDDEN);
 -	wchar_t szTemp[MAX_PATH];
 -	mir_snwprintf(szTemp, L"%%miranda_path%%\\Plugins\\%S_perform.ini", m_szModuleName);
 -	wchar_t *szLoadFileName = Utils_ReplaceVarsW(szTemp);
 -	char* pszPerformData = IrcLoadFile(szLoadFileName);
 -	if (pszPerformData != nullptr) {
 -		char *p1 = pszPerformData, *p2 = pszPerformData;
 -		while ((p1 = strstr(p2, "NETWORK: ")) != nullptr) {
 -			p1 += 9;
 -			p2 = strchr(p1, '\n');
 -			CMStringA sNetwork(p1, int(p2 - p1 - 1));
 -			sNetwork.MakeUpper();
 -			p1 = p2;
 -			p2 = strstr(++p1, "\nNETWORK: ");
 -			if (!p2)
 -				p2 = p1 + mir_strlen(p1) - 1;
 -			if (p1 == p2)
 -				break;
 +	ptrA szNetwork(getStringA("Network"));
 +	if (szNetwork) {
 +		CMStringA szSetting(FORMAT, "PERFORM:%s", szNetwork);
 +		szSetting.MakeUpper();
 -			*p2++ = 0;
 -			setString(("PERFORM:" + sNetwork).c_str(), rtrim(p1));
 +		CMStringW wszValue(getMStringW(szSetting));
 +		if (!wszValue.IsEmpty()) {
 +			setWString("PERFORM:EVENT: CONNECT", wszValue);
 +			delSetting(szSetting);
  		}
 -		delete[] pszPerformData;
 -		::_wremove(szLoadFileName);
 -	}
 -	mir_free(szLoadFileName);
 -
 -	if (!getByte("PerformConversionDone", 0)) {
 -		OBJLIST<CMStringA> performToConvert(10);
 -		db_enum_settings(NULL, sttCheckPerform, m_szModuleName, &performToConvert);
 -
 -		for (auto &it : performToConvert) {
 -			DBVARIANT dbv;
 -			if (!getWString(*it, &dbv)) {
 -				db_unset(0, m_szModuleName, *it);
 -				it->MakeUpper();
 -				setWString(*it, dbv.pwszVal);
 -				db_free(&dbv);
 -			}
 -		}
 -
 -		setByte("PerformConversionDone", 1);
 +		delSetting("Network");
  	}
  	InitIgnore();
 @@ -664,25 +620,6 @@ int CIrcProto::SetStatus(int iNewStatus)  int CIrcProto::SetStatusInternal(int iNewStatus, bool bIsInternal)
  {
 -	if (iNewStatus != ID_STATUS_OFFLINE && !m_network[0]) {
 -		if (m_nick[0] && !m_disableDefaultServer) {
 -			if (m_quickDlg == nullptr) {
 -				m_quickDlg = new CQuickDlg(this);
 -				m_quickComboSelection = m_serverComboSelection + 1;
 -				m_quickDlg->Show();
 -			}
 -			
 -			HWND hwnd = m_quickDlg->GetHwnd();
 -			SetWindowTextA(hwnd, "Miranda IRC");
 -			SetDlgItemText(hwnd, IDC_TEXT, TranslateT("Please choose an IRC-network to go online. This network will be the default."));
 -			SetDlgItemText(hwnd, IDC_CAPTION, TranslateT("Default network"));
 -			Window_SetIcon_IcoLib(hwnd, g_plugin.getIconHandle(IDI_MAIN));
 -			ShowWindow(hwnd, SW_SHOW);
 -			SetActiveWindow(hwnd);
 -		}
 -		return 0;
 -	}
 -
  	if (iNewStatus != ID_STATUS_OFFLINE && !m_nick[0] || !m_userID[0] || !m_name[0]) {
  		Clist_TrayNotifyW(m_szModuleName, TranslateT("IRC error"), TranslateT("Connection cannot be established! You have not completed all necessary fields (Nickname, User ID and Full name)."), NIIF_ERROR, 15000);
  		return 0;
 diff --git a/protocols/IRCG/src/ircproto.h b/protocols/IRCG/src/ircproto.h index 6c344ef45d..bbf980d830 100644 --- a/protocols/IRCG/src/ircproto.h +++ b/protocols/IRCG/src/ircproto.h @@ -87,7 +87,6 @@ struct CIrcProto : public PROTO<CIrcProto>  	INT_PTR __cdecl OnMenuDisconnect(WPARAM, LPARAM);  	INT_PTR __cdecl OnMenuIgnore(WPARAM, LPARAM);  	INT_PTR __cdecl OnMenuWhois(WPARAM, LPARAM); -	INT_PTR __cdecl OnQuickConnectMenuCommand(WPARAM, LPARAM);  	INT_PTR __cdecl OnShowListMenuCommand(WPARAM, LPARAM);  	INT_PTR __cdecl OnShowServerMenuCommand(WPARAM, LPARAM); @@ -105,7 +104,6 @@ struct CIrcProto : public PROTO<CIrcProto>  	char     m_serverName[100];  	char     m_password[500];  	wchar_t  m_identSystem[10]; -	char     m_network[30];  	char     m_portStart[10];  	char     m_portEnd[10];  	int      m_iSSL; @@ -122,7 +120,6 @@ struct CIrcProto : public PROTO<CIrcProto>  	char     m_myLocalHost[50];  	WORD     m_myLocalPort;  	wchar_t *m_alias; -	int      m_serverComboSelection;  	int      m_quickComboSelection;  	int      m_onlineNotificationTime;  	int      m_onlineNotificationLimit; @@ -136,7 +133,6 @@ struct CIrcProto : public PROTO<CIrcProto>  	BYTE     m_hideServerWindow;  	BYTE     m_ident;  	BYTE     m_identTimer; -	BYTE     m_disableDefaultServer;  	BYTE     m_autoOnlineNotification;  	BYTE     m_sendKeepAlive;  	BYTE     m_joinOnInvite; @@ -189,9 +185,8 @@ struct CIrcProto : public PROTO<CIrcProto>  	CListDlg *m_listDlg;  	CNickDlg *m_nickDlg;  	CWhoisDlg *m_whoisDlg; -	CQuickDlg *m_quickDlg;  	CManagerDlg *m_managerDlg; -	CIgnorePrefsDlg *m_ignoreDlg; +	CIrcBaseDlg *m_ignoreDlg;  	int m_noOfChannels, m_manualWhoisCount;  	CMStringA sChannelModes, sUserModes; diff --git a/protocols/IRCG/src/main.cpp b/protocols/IRCG/src/main.cpp index 69ffe7aa1e..c80a013e46 100644 --- a/protocols/IRCG/src/main.cpp +++ b/protocols/IRCG/src/main.cpp @@ -24,15 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  CMPlugin g_plugin;
 -/////////////////////////////////////////////////////////////////////////////////////////
 -
 -static int CompareServers(const SERVER_INFO* p1, const SERVER_INFO* p2)
 -{
 -	return mir_strcmp(p1->m_name, p2->m_name);
 -}
 -
 -OBJLIST<SERVER_INFO> g_servers(20, CompareServers);
 -
  void UninitTimers(void);
  /////////////////////////////////////////////////////////////////////////////////////////
 @@ -67,7 +58,6 @@ extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOC  int CMPlugin::Load()
  {
  	InitIcons();
 -	InitServers();
  	InitContactMenus();
  	return 0;
  }
 diff --git a/protocols/IRCG/src/options.cpp b/protocols/IRCG/src/options.cpp index 4390e41d31..74df705b51 100644 --- a/protocols/IRCG/src/options.cpp +++ b/protocols/IRCG/src/options.cpp @@ -22,7 +22,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  #include "stdafx.h"
  #include <win2k.h>
 -static const CIrcProto *pZero = nullptr;
 +static void removeSpaces(wchar_t* p)
 +{
 +	while (*p) {
 +		if (*p == ' ')
 +			memmove(p, p + 1, sizeof(wchar_t)*mir_wstrlen(p));
 +		p++;
 +	}
 +}
 +
 +/////////////////////////////////////////////////////////////////////////////////////////
  void CIrcProto::ReadSettings(TDbSetting *sets, int count)
  {
 @@ -113,78 +122,6 @@ void CIrcProto::WriteSettings(TDbSetting *sets, int count)  }
  /////////////////////////////////////////////////////////////////////////////////////////
 -
 -static int sttServerEnum(const char *szSetting, void *)
 -{
 -	CMStringA szValue(db_get_sm(0, SERVERSMODULE, szSetting));
 -	if (szValue.IsEmpty())
 -		return 0;
 -
 -	int iStart = 0;
 -	CMStringA szName, szAddress, szPort, szGroup;
 -	szName = szValue.Tokenize(":", iStart); // skip SERVER
 -	szAddress = szValue.Tokenize(":", iStart);
 -	if (szName.IsEmpty() || szAddress.IsEmpty())
 -		return 0;
 -
 -	szPort = szValue.Tokenize(":", iStart);
 -	szGroup = szValue.Tokenize(":", iStart);
 -
 -	SERVER_INFO *pData = new SERVER_INFO;
 -	pData->m_name = mir_strdup(szSetting);
 -
 -	pData->m_iSSL = 0;
 -	if (!_strnicmp(szAddress, "SSL", 3)) {
 -		if (szAddress[3] == '1')
 -			pData->m_iSSL = 1;
 -		else if (szAddress[3] == '2')
 -			pData->m_iSSL = 2;
 -		szAddress.Delete(0, 4);
 -	}
 -
 -	pData->m_address = mir_strdup(szAddress);
 -
 -	for (iStart = 0; iStart < szPort.GetLength(); iStart++)
 -		if (szPort[iStart] == 'G' || szPort[iStart] == '-')
 -			break;
 -
 -	pData->m_portStart = atoi(szPort.Left(iStart));
 -
 -	if (szPort[iStart] == 'G')
 -		pData->m_portEnd = pData->m_portStart;
 -	else {
 -		int iEnd = szPort.Find('G', ++iStart);
 -		if (iEnd == -1)
 -			return 0;
 -
 -		pData->m_portEnd = atoi(szPort.Mid(iStart, iEnd - iStart));
 -	}
 -
 -	pData->m_group = mir_strdup(szGroup);
 -
 -	g_servers.insert(pData);
 -	return 0;
 -}
 -
 -void RereadServers()
 -{
 -	g_servers.destroy();
 -
 -	db_enum_settings(NULL, sttServerEnum, SERVERSMODULE);
 -}
 -
 -/////////////////////////////////////////////////////////////////////////////////////////
 -
 -static void removeSpaces(wchar_t* p)
 -{
 -	while (*p) {
 -		if (*p == ' ')
 -			memmove(p, p + 1, sizeof(wchar_t)*mir_wstrlen(p));
 -		p++;
 -	}
 -}
 -
 -/////////////////////////////////////////////////////////////////////////////////////////
  // add icons to the skinning module
  static IconItem iconList[] =
 @@ -198,7 +135,6 @@ static IconItem iconList[] =  	{ LPGEN("Ignore"),            "block",   IDI_BLOCK,       0 },
  	{ LPGEN("Channel list"),      "list",    IDI_LIST,        0 },
  	{ LPGEN("Channel manager"),   "manager", IDI_MANAGER,     0 },
 -	{ LPGEN("Quick connect"),     "quick",   IDI_QUICK,       0 },
  	{ LPGEN("Server window"),     "server",  IDI_SERVER,      0 },
  	{ LPGEN("Show channel"),      "show",    IDI_SHOW,        0 },
  	{ LPGEN("Question"),          "question",IDI_IRCQUESTION, 0 },
 @@ -258,147 +194,27 @@ static BOOL CALLBACK sttLangAddCallback(wchar_t *str)  }
  /////////////////////////////////////////////////////////////////////////////////////////
 -// 'Add server' dialog
 -
 -static int sttRequiredFields[] = { IDC_ADD_SERVER, IDC_ADD_ADDRESS, IDC_ADD_PORT, IDC_ADD_PORT2, IDC_ADD_COMBO };
 -
 -struct CServerDlg : public CProtoDlgBase<CIrcProto>
 -{
 -	CConnectPrefsDlg *m_owner;
 -	int m_action;
 -
 -	CCtrlEdit m_server, m_address, m_port, m_port2;
 -	CCtrlCombo m_groupCombo;
 -
 -	CServerDlg(CIrcProto *_pro, CConnectPrefsDlg *_owner, int _action)
 -		: CProtoDlgBase<CIrcProto>(_pro, IDD_ADDSERVER),
 -		m_owner(_owner),
 -		m_action(_action),
 -		m_groupCombo(this, IDC_ADD_COMBO),
 -		m_address(this, IDC_ADD_ADDRESS),
 -		m_server(this, IDC_ADD_SERVER),
 -		m_port(this, IDC_ADD_PORT),
 -		m_port2(this, IDC_ADD_PORT2)
 -	{
 -		m_hwndParent = _owner->GetHwnd();
 -	}
 -
 -	bool OnInitDialog() override
 -	{
 -		int i = m_owner->m_serverCombo.GetCount();
 -		for (int index = 0; index < i; index++) {
 -			SERVER_INFO *pData = (SERVER_INFO*)m_owner->m_serverCombo.GetItemData(index);
 -			if (m_groupCombo.FindStringA(pData->m_group, -1, true) == CB_ERR)
 -				m_groupCombo.AddStringA(pData->m_group);
 -		}
 -
 -		if (m_action == 2) {
 -			int j = m_owner->m_serverCombo.GetCurSel();
 -			SERVER_INFO *pData = (SERVER_INFO*)m_owner->m_serverCombo.GetItemData(j);
 -			m_address.SetTextA(pData->m_address);
 -			m_groupCombo.SetTextA(pData->m_group);
 -			m_port.SetInt(pData->m_portStart);
 -			m_port2.SetInt(pData->m_portEnd);
 -
 -			char *p = strstr(pData->m_name, ": ");
 -			if (p)
 -				m_server.SetTextA(p + 2);
 -
 -			if (pData->m_iSSL == 0)
 -				CheckDlgButton(m_hwnd, IDC_OFF, BST_CHECKED);
 -			if (pData->m_iSSL == 1)
 -				CheckDlgButton(m_hwnd, IDC_AUTO, BST_CHECKED);
 -			if (pData->m_iSSL == 2)
 -				CheckDlgButton(m_hwnd, IDC_ON, BST_CHECKED);
 -		}
 -		else {
 -			CheckDlgButton(m_hwnd, IDC_OFF, BST_CHECKED);
 -			m_port.SetInt(6667);
 -			m_port2.SetInt(6667);
 -		}
 -
 -		int bEnableSsl = TRUE;
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_ON), bEnableSsl);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_OFF), bEnableSsl);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_AUTO), bEnableSsl);
 -
 -		SetFocus(m_groupCombo.GetHwnd());
 -		return true;
 -	}
 -
 -	bool OnApply() override
 -	{
 -		for (auto &it : sttRequiredFields)
 -			if (!GetWindowTextLength(GetDlgItem(m_hwnd, it))) {
 -				MessageBox(m_hwnd, TranslateT("Please complete all fields"), TranslateT("IRC error"), MB_OK | MB_ICONERROR);
 -				return false;
 -			}
 -
 -		SERVER_INFO *pData;
 -		if (m_action == 2) {
 -			int j = m_owner->m_serverCombo.GetCurSel();
 -			pData = (SERVER_INFO*)m_owner->m_serverCombo.GetItemData(j);
 -		}
 -		else pData = new SERVER_INFO;
 -
 -		pData->m_iSSL = 0;
 -		if (IsDlgButtonChecked(m_hwnd, IDC_ON))
 -			pData->m_iSSL = 2;
 -		if (IsDlgButtonChecked(m_hwnd, IDC_AUTO))
 -			pData->m_iSSL = 1;
 -
 -		pData->m_portStart = m_port.GetInt();
 -		pData->m_portEnd = m_port2.GetInt();
 -		pData->m_address = rtrim(m_address.GetTextA());
 -		pData->m_group = m_groupCombo.GetTextA();
 -		pData->m_name = m_server.GetTextA();
 -
 -		char temp[255];
 -		mir_snprintf(temp, "%s: %s", pData->m_group, pData->m_name);
 -		mir_free(pData->m_name);
 -		pData->m_name = mir_strdup(temp);
 -
 -		int iItem = m_owner->m_serverCombo.AddStringA(pData->m_name, (LPARAM)pData);
 -		m_owner->m_serverCombo.SetCurSel(iItem);
 -		m_owner->OnServerCombo(nullptr);
 -
 -		m_owner->m_serverlistModified = true;
 -		return true;
 -	}
 -
 -	void OnDestroy() override
 -	{
 -		m_owner->m_serverCombo.Enable();
 -		m_owner->m_add.Enable();
 -		m_owner->m_edit.Enable();
 -		m_owner->m_del.Enable();
 -	}
 -};
 -
 -/////////////////////////////////////////////////////////////////////////////////////////
  // 'Connect preferences' dialog
  static TDbSetting ConnectSettings[] =
  {
 -	{ FIELD_OFFSET(CIrcProto, m_userID), "UserID", DBVT_WCHAR, _countof(pZero->m_userID) },
 -	{ FIELD_OFFSET(CIrcProto, m_identSystem), "IdentSystem", DBVT_WCHAR, _countof(pZero->m_identSystem) },
 -	{ FIELD_OFFSET(CIrcProto, m_identPort), "IdentPort", DBVT_WCHAR, _countof(pZero->m_identPort) },
 -
 -	{ FIELD_OFFSET(CIrcProto, m_serverName), "ServerName", DBVT_ASCIIZ, _countof(pZero->m_serverName) },
 -	{ FIELD_OFFSET(CIrcProto, m_portStart), "PortStart", DBVT_ASCIIZ, _countof(pZero->m_portStart) },
 -	{ FIELD_OFFSET(CIrcProto, m_portEnd), "PortEnd", DBVT_ASCIIZ, _countof(pZero->m_portEnd) },
 -	{ FIELD_OFFSET(CIrcProto, m_password), "Password", DBVT_ASCIIZ, _countof(pZero->m_password) },
 +	{ FIELD_OFFSET(CIrcProto, m_userID), "UserID", DBVT_WCHAR, _countof(CIrcProto::m_userID) },
 +	{ FIELD_OFFSET(CIrcProto, m_identSystem), "IdentSystem", DBVT_WCHAR, _countof(CIrcProto::m_identSystem) },
 +	{ FIELD_OFFSET(CIrcProto, m_identPort), "IdentPort", DBVT_WCHAR, _countof(CIrcProto::m_identPort) },
 +
 +	{ FIELD_OFFSET(CIrcProto, m_serverName), "ServerName", DBVT_ASCIIZ, _countof(CIrcProto::m_serverName) },
 +	{ FIELD_OFFSET(CIrcProto, m_portStart), "PortStart", DBVT_ASCIIZ, _countof(CIrcProto::m_portStart) },
 +	{ FIELD_OFFSET(CIrcProto, m_portEnd), "PortEnd", DBVT_ASCIIZ, _countof(CIrcProto::m_portEnd) },
 +	{ FIELD_OFFSET(CIrcProto, m_password), "Password", DBVT_ASCIIZ, _countof(CIrcProto::m_password) },
  	{ FIELD_OFFSET(CIrcProto, m_joinOnInvite), "JoinOnInvite", DBVT_BYTE },
 -	{ FIELD_OFFSET(CIrcProto, m_network), "Network", DBVT_ASCIIZ, _countof(pZero->m_network) },
  	{ FIELD_OFFSET(CIrcProto, m_iSSL), "UseSSL", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_onlineNotificationTime) , "OnlineNotificationTime", DBVT_WORD, 0, 30 },
  	{ FIELD_OFFSET(CIrcProto, m_onlineNotificationLimit) , "OnlineNotificationLimit", DBVT_WORD, 0, 50 },
  	{ FIELD_OFFSET(CIrcProto, m_channelAwayNotification), "ChannelAwayNotification", DBVT_BYTE, 0, 1 },
 -	{ FIELD_OFFSET(CIrcProto, m_nick), "Nick", DBVT_WCHAR, _countof(pZero->m_nick) },
 -	{ FIELD_OFFSET(CIrcProto, m_pNick), "PNick", DBVT_WCHAR, _countof(pZero->m_pNick) },
 -	{ FIELD_OFFSET(CIrcProto, m_alternativeNick), "AlernativeNick", DBVT_WCHAR, _countof(pZero->m_alternativeNick) },
 -	{ FIELD_OFFSET(CIrcProto, m_name), "Name", DBVT_WCHAR, _countof(pZero->m_name) },
 -	{ FIELD_OFFSET(CIrcProto, m_disableDefaultServer), "DisableDefaultServer", DBVT_BYTE },
 +	{ FIELD_OFFSET(CIrcProto, m_nick), "Nick", DBVT_WCHAR, _countof(CIrcProto::m_nick) },
 +	{ FIELD_OFFSET(CIrcProto, m_pNick), "PNick", DBVT_WCHAR, _countof(CIrcProto::m_pNick) },
 +	{ FIELD_OFFSET(CIrcProto, m_alternativeNick), "AlernativeNick", DBVT_WCHAR, _countof(CIrcProto::m_alternativeNick) },
 +	{ FIELD_OFFSET(CIrcProto, m_name), "Name", DBVT_WCHAR, _countof(CIrcProto::m_name) },
  	{ FIELD_OFFSET(CIrcProto, m_ident), "Ident", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_identTimer), "IdentTimer", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_forceVisible), "ForceVisible", DBVT_BYTE },
 @@ -410,492 +226,360 @@ static TDbSetting ConnectSettings[] =  	{ FIELD_OFFSET(CIrcProto, m_useServer), "UseServer", DBVT_BYTE, 0, 1 },
  	{ FIELD_OFFSET(CIrcProto, m_bUseSASL), "UseSASL", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_hideServerWindow), "HideServerWindow", DBVT_BYTE, 0, 1 },
 -	{ FIELD_OFFSET(CIrcProto, m_serverComboSelection), "ServerComboSelection", DBVT_DWORD, 0 },
  	{ FIELD_OFFSET(CIrcProto, m_sendKeepAlive), "SendKeepAlive", DBVT_BYTE, 0, 1 },
  	{ FIELD_OFFSET(CIrcProto, m_autoOnlineNotification), "AutoOnlineNotification", DBVT_BYTE },
  };
 -CConnectPrefsDlg::CConnectPrefsDlg(CIrcProto *_pro)
 -	: CProtoDlgBase<CIrcProto>(_pro, IDD_PREFS_CONNECT),
 -	m_serverCombo(this, IDC_SERVERCOMBO),
 -	m_server(this, IDC_SERVER),
 -	m_port(this, IDC_PORT),
 -	m_port2(this, IDC_PORT2),
 -	m_pass(this, IDC_PASS),
 -	m_add(this, IDC_ADDSERVER, g_plugin.getIcon(IDI_ADD), LPGEN("Add a new network")),
 -	m_edit(this, IDC_EDITSERVER, g_plugin.getIcon(IDI_EDIT), LPGEN("Edit this network")),
 -	m_del(this, IDC_DELETESERVER, g_plugin.getIcon(IDI_DELETE), LPGEN("Delete this network")),
 -	m_nick(this, IDC_NICK),
 -	m_nick2(this, IDC_NICK2),
 -	m_name(this, IDC_NAME),
 -	m_userID(this, IDC_USERID),
 -	m_ident(this, IDC_IDENT),
 -	m_identSystem(this, IDC_IDENTSYSTEM),
 -	m_identPort(this, IDC_IDENTPORT),
 -	m_identTimer(this, IDC_IDENT_TIMED),
 -	m_forceVisible(this, IDC_FORCEVISIBLE),
 -	m_rejoinOnKick(this, IDC_REJOINONKICK),
 -	m_rejoinChannels(this, IDC_REJOINCHANNELS),
 -	m_disableError(this, IDC_DISABLEERROR),
 -	m_address(this, IDC_ADDRESS),
 -	m_useServer(this, IDC_USESERVER),
 -	m_showServer(this, IDC_SHOWSERVER),
 -	m_keepAlive(this, IDC_KEEPALIVE),
 -	m_autoJoin(this, IDC_AUTOJOIN),
 -	m_oldStyle(this, IDC_OLDSTYLE),
 -	m_useSasl(this, IDC_SASL),
 -	m_onlineNotif(this, IDC_ONLINENOTIF),
 -	m_channelAway(this, IDC_CHANNELAWAY),
 -	m_enableServer(this, IDC_STARTUP),
 -	m_onlineTimer(this, IDC_ONLINETIMER),
 -	m_limit(this, IDC_LIMIT),
 -	m_spin1(this, IDC_SPIN1, 999, 20),
 -	m_spin2(this, IDC_SPIN2, 200),
 -	m_ssl(this, IDC_SSL),
 -	m_serverlistModified(false)
 +class CConnectPrefsDlg : public CIrcBaseDlg
  {
 -	m_serverCombo.OnChange = Callback(this, &CConnectPrefsDlg::OnServerCombo);
 -	m_add.OnClick = Callback(this, &CConnectPrefsDlg::OnAddServer);
 -	m_del.OnClick = Callback(this, &CConnectPrefsDlg::OnDeleteServer);
 -	m_edit.OnClick = Callback(this, &CConnectPrefsDlg::OnEditServer);
 -	m_enableServer.OnChange = Callback(this, &CConnectPrefsDlg::OnStartup);
 -	m_ident.OnChange = Callback(this, &CConnectPrefsDlg::OnIdent);
 -	m_useServer.OnChange = Callback(this, &CConnectPrefsDlg::OnUseServer);
 -	m_onlineNotif.OnChange = Callback(this, &CConnectPrefsDlg::OnOnlineNotif);
 -	m_channelAway.OnChange = Callback(this, &CConnectPrefsDlg::OnChannelAway);
 -}
 +	CCtrlEdit    m_server, m_port, m_port2, m_pass;
 +	CCtrlEdit    m_nick, m_nick2, m_name, m_userID;
 +	CCtrlCombo   m_ssl;
 -bool CConnectPrefsDlg::OnInitDialog()
 -{
 -	m_proto->m_hwndConnect = m_hwnd;
 -
 -	//	Fill the servers combo box and create SERVER_INFO structures
 -	for (auto &it : g_servers)
 -		m_serverCombo.AddStringA(it->m_name, LPARAM(it));
 -
 -	m_serverCombo.SetCurSel(m_proto->m_serverComboSelection);
 -	m_server.SetTextA(m_proto->m_serverName);
 -	m_port.SetTextA(m_proto->m_portStart);
 -	m_port2.SetTextA(m_proto->m_portEnd);
 -
 -	if (m_proto->m_iSSL == 0)
 -		m_ssl.SetText(TranslateT("Off"));
 -	if (m_proto->m_iSSL == 1)
 -		m_ssl.SetText(TranslateT("Auto"));
 -	if (m_proto->m_iSSL == 2)
 -		m_ssl.SetText(TranslateT("On"));
 -
 -	if (m_proto->m_serverComboSelection != -1) {
 -		SERVER_INFO *pData = (SERVER_INFO*)m_serverCombo.GetItemData(m_proto->m_serverComboSelection);
 -		if ((INT_PTR)pData != CB_ERR) {
 -			m_server.SetTextA(pData->m_address);
 -			m_port.SetInt(pData->m_portStart);
 -			m_port2.SetInt(pData->m_portEnd);
 -		}
 -	}
 -
 -	m_spin1.SetPosition(m_proto->m_onlineNotificationTime);
 -	m_spin2.SetPosition(m_proto->m_onlineNotificationLimit);
 -
 -	m_nick.SetText(m_proto->m_nick);
 -	m_nick2.SetText(m_proto->m_alternativeNick);
 -	m_userID.SetText(m_proto->m_userID);
 -	m_name.SetText(m_proto->m_name);
 -	m_pass.SetTextA(m_proto->m_password);
 -	m_identSystem.SetText(m_proto->m_identSystem);
 -	m_identPort.SetText(m_proto->m_identPort);
 -	m_address.SetState(m_proto->m_showAddresses);
 -	m_oldStyle.SetState(m_proto->m_oldStyleModes);
 -	m_useSasl.SetState(m_proto->m_bUseSASL);
 -	m_channelAway.SetState(m_proto->m_channelAwayNotification);
 -	m_onlineNotif.SetState(m_proto->m_autoOnlineNotification);
 -	m_ident.SetState(m_proto->m_ident);
 -	m_identTimer.SetState(m_proto->m_identTimer);
 -	m_disableError.SetState(m_proto->m_disableErrorPopups);
 -	m_forceVisible.SetState(m_proto->m_forceVisible);
 -	m_rejoinChannels.SetState(m_proto->m_rejoinChannels);
 -	m_rejoinOnKick.SetState(m_proto->m_rejoinIfKicked);
 -	m_enableServer.SetState(!m_proto->m_disableDefaultServer);
 -	m_keepAlive.SetState(m_proto->m_sendKeepAlive);
 -	m_useServer.SetState(m_proto->m_useServer);
 -	m_showServer.SetState(!m_proto->m_hideServerWindow);
 -	m_showServer.Enable(m_proto->m_useServer);
 -	m_autoJoin.SetState(m_proto->m_joinOnInvite);
 -	return true;
 -}
 +	CCtrlCheck   m_ident, m_identTimer;
 +	CCtrlEdit    m_identSystem, m_identPort;
 -void CConnectPrefsDlg::OnServerCombo(CCtrlData*)
 -{
 -	int i = m_serverCombo.GetCurSel();
 -	SERVER_INFO *pData = (SERVER_INFO*)m_serverCombo.GetItemData(i);
 -	if (pData && (INT_PTR)pData != CB_ERR) {
 -		m_server.SetTextA(pData->m_address);
 -		m_port.SetInt(pData->m_portStart);
 -		m_port2.SetInt(pData->m_portEnd);
 -		m_pass.SetTextA("");
 -
 -		if (pData->m_iSSL == 0)
 -			m_ssl.SetText(TranslateT("Off"));
 -		if (pData->m_iSSL == 1)
 -			m_ssl.SetText(TranslateT("Auto"));
 -		if (pData->m_iSSL == 2)
 -			m_ssl.SetText(TranslateT("On"));
 -
 -		SendMessage(GetParent(m_hwnd), PSM_CHANGED, 0, 0);
 -	}
 -}
 +	CCtrlCheck   m_forceVisible, m_rejoinOnKick, m_rejoinChannels, m_disableError;
 +	CCtrlCheck   m_address, m_useServer, m_showServer, m_keepAlive, m_autoJoin;
 +	CCtrlCheck   m_oldStyle, m_onlineNotif, m_channelAway, m_useSasl;
 -void CConnectPrefsDlg::OnAddServer(CCtrlButton*)
 -{
 -	m_serverCombo.Disable();
 -	m_add.Disable();
 -	m_edit.Disable();
 -	m_del.Disable();
 -	CServerDlg *dlg = new CServerDlg(m_proto, this, 1);
 -	dlg->Show();
 -}
 +	CCtrlEdit    m_onlineTimer, m_limit;
 +	CCtrlSpin    m_spin1, m_spin2;
 -void CConnectPrefsDlg::OnDeleteServer(CCtrlButton*)
 -{
 -	int i = m_serverCombo.GetCurSel();
 -	if (i == CB_ERR)
 -		return;
 -
 -	m_serverCombo.Disable();
 -	m_add.Disable();
 -	m_edit.Disable();
 -	m_del.Disable();
 -
 -	SERVER_INFO *pData = (SERVER_INFO*)m_serverCombo.GetItemData(i);
 -	wchar_t temp[200];
 -	mir_snwprintf(temp, TranslateT("Do you want to delete\r\n%s"), (wchar_t*)_A2T(pData->m_name));
 -	if (MessageBox(m_hwnd, temp, TranslateT("Delete server"), MB_YESNO | MB_ICONQUESTION) == IDYES) {
 -		g_servers.remove(pData);
 -
 -		m_serverCombo.DeleteString(i);
 -		if (i >= m_serverCombo.GetCount())
 -			i--;
 -		m_serverCombo.SetCurSel(i);
 -		OnServerCombo(nullptr);
 -		SendMessage(GetParent(m_hwnd), PSM_CHANGED, 0, 0);
 -		m_serverlistModified = true;
 +public:
 +	CConnectPrefsDlg::CConnectPrefsDlg(CIrcProto *_pro) :
 +		CIrcBaseDlg(_pro, IDD_PREFS_CONNECT),
 +		m_server(this, IDC_SERVER),
 +		m_port(this, IDC_PORT),
 +		m_port2(this, IDC_PORT2),
 +		m_pass(this, IDC_PASS),
 +		m_nick(this, IDC_NICK),
 +		m_nick2(this, IDC_NICK2),
 +		m_name(this, IDC_NAME),
 +		m_userID(this, IDC_USERID),
 +		m_ident(this, IDC_IDENT),
 +		m_identSystem(this, IDC_IDENTSYSTEM),
 +		m_identPort(this, IDC_IDENTPORT),
 +		m_identTimer(this, IDC_IDENT_TIMED),
 +		m_forceVisible(this, IDC_FORCEVISIBLE),
 +		m_rejoinOnKick(this, IDC_REJOINONKICK),
 +		m_rejoinChannels(this, IDC_REJOINCHANNELS),
 +		m_disableError(this, IDC_DISABLEERROR),
 +		m_address(this, IDC_ADDRESS),
 +		m_useServer(this, IDC_USESERVER),
 +		m_showServer(this, IDC_SHOWSERVER),
 +		m_keepAlive(this, IDC_KEEPALIVE),
 +		m_autoJoin(this, IDC_AUTOJOIN),
 +		m_oldStyle(this, IDC_OLDSTYLE),
 +		m_useSasl(this, IDC_SASL),
 +		m_onlineNotif(this, IDC_ONLINENOTIF),
 +		m_channelAway(this, IDC_CHANNELAWAY),
 +		m_onlineTimer(this, IDC_ONLINETIMER),
 +		m_limit(this, IDC_LIMIT),
 +		m_spin1(this, IDC_SPIN1, 999, 20),
 +		m_spin2(this, IDC_SPIN2, 200),
 +		m_ssl(this, IDC_SSL)
 +	{
 +		m_ident.OnChange = Callback(this, &CConnectPrefsDlg::OnIdent);
 +		m_useServer.OnChange = Callback(this, &CConnectPrefsDlg::OnUseServer);
 +		m_onlineNotif.OnChange = Callback(this, &CConnectPrefsDlg::OnOnlineNotif);
 +		m_channelAway.OnChange = Callback(this, &CConnectPrefsDlg::OnChannelAway);
  	}
 -	m_serverCombo.Enable();
 -	m_add.Enable();
 -	m_edit.Enable();
 -	m_del.Enable();
 -}
 -
 -void CConnectPrefsDlg::OnEditServer(CCtrlButton*)
 -{
 -	int i = m_serverCombo.GetCurSel();
 -	if (i == CB_ERR)
 -		return;
 -
 -	m_serverCombo.Disable();
 -	m_add.Disable();
 -	m_edit.Disable();
 -	m_del.Disable();
 -	CServerDlg *dlg = new CServerDlg(m_proto, this, 2);
 -	dlg->Show();
 -	SetWindowText(dlg->GetHwnd(), TranslateT("Edit server"));
 -}
 -
 -void CConnectPrefsDlg::OnStartup(CCtrlData*)
 -{
 -	m_serverCombo.Enable(m_enableServer.GetState());
 -	m_add.Enable(m_enableServer.GetState());
 -	m_edit.Enable(m_enableServer.GetState());
 -	m_del.Enable(m_enableServer.GetState());
 -	m_server.Enable(m_enableServer.GetState());
 -	m_port.Enable(m_enableServer.GetState());
 -	m_port2.Enable(m_enableServer.GetState());
 -	m_pass.Enable(m_enableServer.GetState());
 -	m_ssl.Enable(m_enableServer.GetState());
 -}
 +	bool OnInitDialog() override
 +	{
 +		m_proto->m_hwndConnect = m_hwnd;
 -void CConnectPrefsDlg::OnIdent(CCtrlData*)
 -{
 -	m_identSystem.Enable(m_ident.GetState());
 -	m_identPort.Enable(m_ident.GetState());
 -	m_identTimer.Enable(m_ident.GetState());
 -}
 +		m_server.SetTextA(m_proto->m_serverName);
 +		m_port.SetTextA(m_proto->m_portStart);
 +		m_port2.SetTextA(m_proto->m_portEnd);
 +		m_pass.SetTextA(m_proto->m_password);
 +		m_useSasl.SetState(m_proto->m_bUseSASL);
 -void CConnectPrefsDlg::OnUseServer(CCtrlData*)
 -{
 -	EnableWindow(GetDlgItem(m_hwnd, IDC_SHOWSERVER), m_useServer.GetState());
 -}
 +		m_ssl.AddString(TranslateT("Off"), 0);
 +		m_ssl.AddString(TranslateT("Auto"), 1);
 +		m_ssl.AddString(TranslateT("On"), 2);
 +		m_ssl.SetCurSel(m_proto->m_iSSL);
 -void CConnectPrefsDlg::OnOnlineNotif(CCtrlData*)
 -{
 -	m_channelAway.Enable(m_onlineNotif.GetState());
 -	m_onlineTimer.Enable(m_onlineNotif.GetState());
 -	m_spin1.Enable(m_onlineNotif.GetState());
 -	m_spin2.Enable(m_onlineNotif.GetState());
 -	m_limit.Enable(m_onlineNotif.GetState() && m_channelAway.GetState());
 -}
 +		m_spin1.SetPosition(m_proto->m_onlineNotificationTime);
 +		m_spin2.SetPosition(m_proto->m_onlineNotificationLimit);
 -void CConnectPrefsDlg::OnChannelAway(CCtrlData*)
 -{
 -	m_spin2.Enable(m_onlineNotif.GetState() && m_channelAway.GetState());
 -	m_limit.Enable(m_onlineNotif.GetState() && m_channelAway.GetState());
 -}
 +		m_nick.SetText(m_proto->m_nick);
 +		m_nick2.SetText(m_proto->m_alternativeNick);
 +		m_userID.SetText(m_proto->m_userID);
 +		m_name.SetText(m_proto->m_name);
 +		m_identSystem.SetText(m_proto->m_identSystem);
 +		m_identPort.SetText(m_proto->m_identPort);
 +		m_address.SetState(m_proto->m_showAddresses);
 +		m_oldStyle.SetState(m_proto->m_oldStyleModes);
 +		m_channelAway.SetState(m_proto->m_channelAwayNotification);
 +		m_onlineNotif.SetState(m_proto->m_autoOnlineNotification);
 +		m_ident.SetState(m_proto->m_ident);
 +		m_identTimer.SetState(m_proto->m_identTimer);
 +		m_disableError.SetState(m_proto->m_disableErrorPopups);
 +		m_forceVisible.SetState(m_proto->m_forceVisible);
 +		m_rejoinChannels.SetState(m_proto->m_rejoinChannels);
 +		m_rejoinOnKick.SetState(m_proto->m_rejoinIfKicked);
 +		m_keepAlive.SetState(m_proto->m_sendKeepAlive);
 +		m_useServer.SetState(m_proto->m_useServer);
 +		m_showServer.SetState(!m_proto->m_hideServerWindow);
 +		m_showServer.Enable(m_proto->m_useServer);
 +		m_autoJoin.SetState(m_proto->m_joinOnInvite);
 +		return true;
 +	}
 -bool CConnectPrefsDlg::OnApply()
 -{
 -	//Save the setting in the CONNECT dialog
 -	if (m_enableServer.GetState()) {
 +	bool OnApply() override
 +	{
 +		// Save the setting in the CONNECT dialog
  		m_server.GetTextA(m_proto->m_serverName, _countof(m_proto->m_serverName));
  		m_port.GetTextA(m_proto->m_portStart, _countof(m_proto->m_portStart));
  		m_port2.GetTextA(m_proto->m_portEnd, _countof(m_proto->m_portEnd));
  		m_pass.GetTextA(m_proto->m_password, _countof(m_proto->m_password));
 -	}
 -	else m_proto->m_serverName[0] = m_proto->m_portStart[0] = m_proto->m_portEnd[0] = m_proto->m_password[0] = 0;
 -
 -	m_proto->m_onlineNotificationTime = SendDlgItemMessage(m_hwnd, IDC_SPIN1, UDM_GETPOS, 0, 0);
 -	m_proto->m_onlineNotificationLimit = SendDlgItemMessage(m_hwnd, IDC_SPIN2, UDM_GETPOS, 0, 0);
 -	m_proto->m_channelAwayNotification = m_channelAway.GetState();
 -
 -	m_nick.GetText(m_proto->m_nick, _countof(m_proto->m_nick));
 -	removeSpaces(m_proto->m_nick);
 -	wcsncpy_s(m_proto->m_pNick, m_proto->m_nick, _TRUNCATE);
 -	m_nick2.GetText(m_proto->m_alternativeNick, _countof(m_proto->m_alternativeNick));
 -	removeSpaces(m_proto->m_alternativeNick);
 -	m_userID.GetText(m_proto->m_userID, _countof(m_proto->m_userID));
 -	removeSpaces(m_proto->m_userID);
 -	m_name.GetText(m_proto->m_name, _countof(m_proto->m_name));
 -	m_identSystem.GetText(m_proto->m_identSystem, _countof(m_proto->m_identSystem));
 -	m_identPort.GetText(m_proto->m_identPort, _countof(m_proto->m_identPort));
 -	m_proto->m_disableDefaultServer = !m_enableServer.GetState();
 -	m_proto->m_ident = m_ident.GetState();
 -	m_proto->m_identTimer = m_identTimer.GetState();
 -	m_proto->m_forceVisible = m_forceVisible.GetState();
 -	m_proto->m_disableErrorPopups = m_disableError.GetState();
 -	m_proto->m_rejoinChannels = m_rejoinChannels.GetState();
 -	m_proto->m_rejoinIfKicked = m_rejoinOnKick.GetState();
 -	m_proto->m_showAddresses = m_address.GetState();
 -	m_proto->m_oldStyleModes = m_oldStyle.GetState();
 -	m_proto->m_useServer = m_useServer.GetState();
 -	m_proto->m_bUseSASL = m_useSasl.GetState();
 -
 -	Menu_EnableItem(m_proto->hMenuServer, m_proto->m_useServer != 0);
 -
 -	m_proto->m_joinOnInvite = m_autoJoin.GetState();
 -	m_proto->m_hideServerWindow = !m_showServer.GetState();
 -	m_proto->m_serverComboSelection = m_serverCombo.GetCurSel();
 -	if (m_proto->m_sendKeepAlive = m_keepAlive.GetState())
 -		m_proto->SetChatTimer(m_proto->KeepAliveTimer, 60 * 1000, KeepAliveTimerProc);
 -	else
 -		m_proto->KillChatTimer(m_proto->KeepAliveTimer);
 -
 -	m_proto->m_autoOnlineNotification = m_onlineNotif.GetState();
 -	if (m_proto->m_autoOnlineNotification) {
 -		if (!m_proto->bTempDisableCheck) {
 -			m_proto->SetChatTimer(m_proto->OnlineNotifTimer, 500, OnlineNotifTimerProc);
 -			if (m_proto->m_channelAwayNotification)
 -				m_proto->SetChatTimer(m_proto->OnlineNotifTimer3, 1500, OnlineNotifTimerProc3);
 -		}
 -	}
 -	else if (!m_proto->bTempForceCheck) {
 -		m_proto->KillChatTimer(m_proto->OnlineNotifTimer);
 -		m_proto->KillChatTimer(m_proto->OnlineNotifTimer3);
 -	}
 +		m_proto->m_iSSL = m_ssl.GetCurSel();
 +		m_proto->m_bUseSASL = m_useSasl.GetState();
 -	int i = m_serverCombo.GetCurSel();
 -	SERVER_INFO *pData = (SERVER_INFO*)m_serverCombo.GetItemData(i);
 -	if (pData && (INT_PTR)pData != CB_ERR) {
 -		if (m_enableServer.GetState())
 -			mir_strcpy(m_proto->m_network, pData->m_group);
 +		m_proto->m_onlineNotificationTime = SendDlgItemMessage(m_hwnd, IDC_SPIN1, UDM_GETPOS, 0, 0);
 +		m_proto->m_onlineNotificationLimit = SendDlgItemMessage(m_hwnd, IDC_SPIN2, UDM_GETPOS, 0, 0);
 +		m_proto->m_channelAwayNotification = m_channelAway.GetState();
 +
 +		m_nick.GetText(m_proto->m_nick, _countof(m_proto->m_nick));
 +		removeSpaces(m_proto->m_nick);
 +		wcsncpy_s(m_proto->m_pNick, m_proto->m_nick, _TRUNCATE);
 +		m_nick2.GetText(m_proto->m_alternativeNick, _countof(m_proto->m_alternativeNick));
 +		removeSpaces(m_proto->m_alternativeNick);
 +		m_userID.GetText(m_proto->m_userID, _countof(m_proto->m_userID));
 +		removeSpaces(m_proto->m_userID);
 +		m_name.GetText(m_proto->m_name, _countof(m_proto->m_name));
 +		m_identSystem.GetText(m_proto->m_identSystem, _countof(m_proto->m_identSystem));
 +		m_identPort.GetText(m_proto->m_identPort, _countof(m_proto->m_identPort));
 +		m_proto->m_ident = m_ident.GetState();
 +		m_proto->m_identTimer = m_identTimer.GetState();
 +		m_proto->m_forceVisible = m_forceVisible.GetState();
 +		m_proto->m_disableErrorPopups = m_disableError.GetState();
 +		m_proto->m_rejoinChannels = m_rejoinChannels.GetState();
 +		m_proto->m_rejoinIfKicked = m_rejoinOnKick.GetState();
 +		m_proto->m_showAddresses = m_address.GetState();
 +		m_proto->m_oldStyleModes = m_oldStyle.GetState();
 +		m_proto->m_useServer = m_useServer.GetState();
 +
 +		Menu_EnableItem(m_proto->hMenuServer, m_proto->m_useServer != 0);
 +
 +		m_proto->m_joinOnInvite = m_autoJoin.GetState();
 +		m_proto->m_hideServerWindow = !m_showServer.GetState();
 +		if (m_proto->m_sendKeepAlive = m_keepAlive.GetState())
 +			m_proto->SetChatTimer(m_proto->KeepAliveTimer, 60 * 1000, KeepAliveTimerProc);
  		else
 -			mir_strcpy(m_proto->m_network, "");
 -		m_proto->m_iSSL = pData->m_iSSL;
 -	}
 +			m_proto->KillChatTimer(m_proto->KeepAliveTimer);
 +
 +		m_proto->m_autoOnlineNotification = m_onlineNotif.GetState();
 +		if (m_proto->m_autoOnlineNotification) {
 +			if (!m_proto->bTempDisableCheck) {
 +				m_proto->SetChatTimer(m_proto->OnlineNotifTimer, 500, OnlineNotifTimerProc);
 +				if (m_proto->m_channelAwayNotification)
 +					m_proto->SetChatTimer(m_proto->OnlineNotifTimer3, 1500, OnlineNotifTimerProc3);
 +			}
 +		}
 +		else if (!m_proto->bTempForceCheck) {
 +			m_proto->KillChatTimer(m_proto->OnlineNotifTimer);
 +			m_proto->KillChatTimer(m_proto->OnlineNotifTimer3);
 +		}
 -	if (m_serverlistModified) {
 -		m_serverlistModified = false;
 -		db_delete_module(0, SERVERSMODULE);
 +		m_proto->WriteSettings(ConnectSettings, _countof(ConnectSettings));
 +		return true;
 +	}
 -		int j = m_serverCombo.GetCount();
 -		if (j != CB_ERR && j != 0) {
 -			for (int index2 = 0; index2 < j; index2++) {
 -				pData = (SERVER_INFO*)m_serverCombo.GetItemData(index2);
 -				if (pData == nullptr || (INT_PTR)pData == CB_ERR)
 -					continue;
 +	void OnIdent(CCtrlData *)
 +	{
 +		m_identSystem.Enable(m_ident.GetState());
 +		m_identPort.Enable(m_ident.GetState());
 +		m_identTimer.Enable(m_ident.GetState());
 +	}
 -				char TextLine[512];
 -				if (pData->m_iSSL > 0)
 -					mir_snprintf(TextLine, "SERVER:SSL%u%s:%d-%dGROUP:%s", pData->m_iSSL, pData->m_address, pData->m_portStart, pData->m_portEnd, pData->m_group);
 -				else
 -					mir_snprintf(TextLine, "SERVER:%s:%d-%dGROUP:%s", pData->m_address, pData->m_portStart, pData->m_portEnd, pData->m_group);
 -				db_set_s(0, SERVERSMODULE, pData->m_name, TextLine);
 +	void OnUseServer(CCtrlData *)
 +	{
 +		EnableWindow(GetDlgItem(m_hwnd, IDC_SHOWSERVER), m_useServer.GetState());
 +	}
 -				// combobox might contain new items
 -				if (g_servers.find(pData) == nullptr)
 -					g_servers.insert(pData);
 -			}
 -		}
 +	void OnOnlineNotif(CCtrlData *)
 +	{
 +		m_channelAway.Enable(m_onlineNotif.GetState());
 +		m_onlineTimer.Enable(m_onlineNotif.GetState());
 +		m_spin1.Enable(m_onlineNotif.GetState());
 +		m_spin2.Enable(m_onlineNotif.GetState());
 +		m_limit.Enable(m_onlineNotif.GetState() && m_channelAway.GetState());
  	}
 -	m_proto->WriteSettings(ConnectSettings, _countof(ConnectSettings));
 -	return true;
 -}
 +	void OnChannelAway(CCtrlData *)
 +	{
 +		m_spin2.Enable(m_onlineNotif.GetState() && m_channelAway.GetState());
 +		m_limit.Enable(m_onlineNotif.GetState() && m_channelAway.GetState());
 +	}
 +};
  /////////////////////////////////////////////////////////////////////////////////////////
  // 'CTCP preferences' dialog
  static TDbSetting CtcpSettings[] =
  {
 -	{ FIELD_OFFSET(CIrcProto, m_userInfo), "UserInfo", DBVT_WCHAR, _countof(pZero->m_userInfo) },
 +	{ FIELD_OFFSET(CIrcProto, m_userInfo), "UserInfo", DBVT_WCHAR, _countof(CIrcProto::m_userInfo) },
  	{ FIELD_OFFSET(CIrcProto, m_DCCPacketSize), "DccPacketSize", DBVT_WORD, 0, 4096 },
  	{ FIELD_OFFSET(CIrcProto, m_DCCPassive), "DccPassive", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_DCCMode), "DCCMode", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_manualHost), "ManualHost", DBVT_BYTE },
  	{ FIELD_OFFSET(CIrcProto, m_IPFromServer), "IPFromServer", DBVT_BYTE, 0, 1 },
  	{ FIELD_OFFSET(CIrcProto, m_disconnectDCCChats), "DisconnectDCCChats", DBVT_BYTE },
 -	{ FIELD_OFFSET(CIrcProto, m_mySpecifiedHost), "SpecHost", DBVT_ASCIIZ, _countof(pZero->m_mySpecifiedHost) },
 +	{ FIELD_OFFSET(CIrcProto, m_mySpecifiedHost), "SpecHost", DBVT_ASCIIZ, _countof(CIrcProto::m_mySpecifiedHost) },
  	{ FIELD_OFFSET(CIrcProto, m_DCCChatAccept), "CtcpChatAccept", DBVT_BYTE, 0, 1 },
  	{ FIELD_OFFSET(CIrcProto, m_sendNotice), "SendNotice", DBVT_BYTE, 0, 1 }
  };
 -CCtcpPrefsDlg::CCtcpPrefsDlg(CIrcProto* _pro)
 -	: CProtoDlgBase<CIrcProto>(_pro, IDD_PREFS_CTCP),
 -	m_enableIP(this, IDC_ENABLEIP),
 -	m_fromServer(this, IDC_FROMSERVER),
 -	m_combo(this, IDC_COMBO),
 -	m_slow(this, IDC_SLOW),
 -	m_fast(this, IDC_FAST),
 -	m_disc(this, IDC_DISC),
 -	m_passive(this, IDC_PASSIVE),
 -	m_sendNotice(this, IDC_SENDNOTICE),
 -	m_ip(this, IDC_IP),
 -	m_userInfo(this, IDC_USERINFO),
 -	m_radio1(this, IDC_RADIO1),
 -	m_radio2(this, IDC_RADIO2),
 -	m_radio3(this, IDC_RADIO3)
 -{
 -	m_enableIP.OnChange = Callback(this, &CCtcpPrefsDlg::OnClicked);
 -	m_fromServer.OnChange = Callback(this, &CCtcpPrefsDlg::OnClicked);
 -}
 +class CCtcpPrefsDlg : public CIrcBaseDlg
 +{
 +	CCtrlCombo m_combo;
 +	CCtrlCheck m_slow, m_fast, m_disc, m_passive, m_sendNotice, m_enableIP, m_fromServer;
 +	CCtrlEdit m_ip, m_userInfo;
 +	CCtrlCheck m_radio1, m_radio2, m_radio3;
 +
 +public:
 +	CCtcpPrefsDlg(CIrcProto *_pro) :
 +		CIrcBaseDlg(_pro, IDD_PREFS_CTCP),
 +		m_enableIP(this, IDC_ENABLEIP),
 +		m_fromServer(this, IDC_FROMSERVER),
 +		m_combo(this, IDC_COMBO),
 +		m_slow(this, IDC_SLOW),
 +		m_fast(this, IDC_FAST),
 +		m_disc(this, IDC_DISC),
 +		m_passive(this, IDC_PASSIVE),
 +		m_sendNotice(this, IDC_SENDNOTICE),
 +		m_ip(this, IDC_IP),
 +		m_userInfo(this, IDC_USERINFO),
 +		m_radio1(this, IDC_RADIO1),
 +		m_radio2(this, IDC_RADIO2),
 +		m_radio3(this, IDC_RADIO3)
 +	{
 +		m_enableIP.OnChange = Callback(this, &CCtcpPrefsDlg::OnClicked);
 +		m_fromServer.OnChange = Callback(this, &CCtcpPrefsDlg::OnClicked);
 +	}
 -bool CCtcpPrefsDlg::OnInitDialog()
 -{
 -	m_userInfo.SetText(m_proto->m_userInfo);
 -
 -	m_slow.SetState(m_proto->m_DCCMode == 0);
 -	m_fast.SetState(m_proto->m_DCCMode == 1);
 -	m_disc.SetState(m_proto->m_disconnectDCCChats);
 -	m_passive.SetState(m_proto->m_DCCPassive);
 -	m_sendNotice.SetState(m_proto->m_sendNotice);
 -
 -	m_combo.AddStringA("256");
 -	m_combo.AddStringA("512");
 -	m_combo.AddStringA("1024");
 -	m_combo.AddStringA("2048");
 -	m_combo.AddStringA("4096");
 -	m_combo.AddStringA("8192");
 -
 -	wchar_t szTemp[10];
 -	mir_snwprintf(szTemp, L"%u", m_proto->m_DCCPacketSize);
 -	int i = m_combo.SelectString(szTemp);
 -	if (i == CB_ERR)
 -		m_combo.SelectString(L"4096");
 -
 -	if (m_proto->m_DCCChatAccept == 1)
 -		m_radio1.SetState(true);
 -	if (m_proto->m_DCCChatAccept == 2)
 -		m_radio2.SetState(true);
 -	if (m_proto->m_DCCChatAccept == 3)
 -		m_radio3.SetState(true);
 -
 -	m_fromServer.SetState(m_proto->m_IPFromServer);
 -	m_enableIP.SetState(m_proto->m_manualHost);
 -	m_ip.Enable(m_proto->m_manualHost);
 -	m_fromServer.Enable(!m_proto->m_manualHost);
 -	if (m_proto->m_manualHost)
 -		m_ip.SetTextA(m_proto->m_mySpecifiedHost);
 -	else {
 -		if (m_proto->m_IPFromServer) {
 -			if (m_proto->m_myHost[0]) {
 -				CMStringW s = (CMStringW)TranslateT("<Resolved IP: ") + (wchar_t*)_A2T(m_proto->m_myHost) + L">";
 -				m_ip.SetText(s.c_str());
 -			}
 -			else m_ip.SetText(TranslateT("<Automatic>"));
 -		}
 +	bool OnInitDialog() override
 +	{
 +		m_userInfo.SetText(m_proto->m_userInfo);
 +
 +		m_slow.SetState(m_proto->m_DCCMode == 0);
 +		m_fast.SetState(m_proto->m_DCCMode == 1);
 +		m_disc.SetState(m_proto->m_disconnectDCCChats);
 +		m_passive.SetState(m_proto->m_DCCPassive);
 +		m_sendNotice.SetState(m_proto->m_sendNotice);
 +
 +		m_combo.AddStringA("256");
 +		m_combo.AddStringA("512");
 +		m_combo.AddStringA("1024");
 +		m_combo.AddStringA("2048");
 +		m_combo.AddStringA("4096");
 +		m_combo.AddStringA("8192");
 +
 +		wchar_t szTemp[10];
 +		mir_snwprintf(szTemp, L"%u", m_proto->m_DCCPacketSize);
 +		int i = m_combo.SelectString(szTemp);
 +		if (i == CB_ERR)
 +			m_combo.SelectString(L"4096");
 +
 +		if (m_proto->m_DCCChatAccept == 1)
 +			m_radio1.SetState(true);
 +		if (m_proto->m_DCCChatAccept == 2)
 +			m_radio2.SetState(true);
 +		if (m_proto->m_DCCChatAccept == 3)
 +			m_radio3.SetState(true);
 +
 +		m_fromServer.SetState(m_proto->m_IPFromServer);
 +		m_enableIP.SetState(m_proto->m_manualHost);
 +		m_ip.Enable(m_proto->m_manualHost);
 +		m_fromServer.Enable(!m_proto->m_manualHost);
 +		if (m_proto->m_manualHost)
 +			m_ip.SetTextA(m_proto->m_mySpecifiedHost);
  		else {
 -			if (m_proto->m_myLocalHost[0]) {
 -				CMStringW s = (CMStringW)TranslateT("<Local IP: ") + (wchar_t*)_A2T(m_proto->m_myLocalHost) + L">";
 -				m_ip.SetText(s.c_str());
 +			if (m_proto->m_IPFromServer) {
 +				if (m_proto->m_myHost[0]) {
 +					CMStringW s = (CMStringW)TranslateT("<Resolved IP: ") + (wchar_t *)_A2T(m_proto->m_myHost) + L">";
 +					m_ip.SetText(s.c_str());
 +				}
 +				else m_ip.SetText(TranslateT("<Automatic>"));
 +			}
 +			else {
 +				if (m_proto->m_myLocalHost[0]) {
 +					CMStringW s = (CMStringW)TranslateT("<Local IP: ") + (wchar_t *)_A2T(m_proto->m_myLocalHost) + L">";
 +					m_ip.SetText(s.c_str());
 +				}
 +				else m_ip.SetText(TranslateT("<Automatic>"));
  			}
 -			else m_ip.SetText(TranslateT("<Automatic>"));
  		}
 +		return true;
  	}
 -	return true;
 -}
 -
 -void CCtcpPrefsDlg::OnClicked(CCtrlData*)
 -{
 -	m_ip.Enable(m_enableIP.GetState());
 -	m_fromServer.Enable(!m_enableIP.GetState());
 -	if (m_enableIP.GetState())
 -		m_ip.SetTextA(m_proto->m_mySpecifiedHost);
 -	else {
 -		if (m_fromServer.GetState()) {
 -			if (m_proto->m_myHost[0]) {
 -				CMStringW s = (CMStringW)TranslateT("<Resolved IP: ") + (wchar_t*)_A2T(m_proto->m_myHost) + L">";
 -				m_ip.SetText(s.c_str());
 -			}
 -			else m_ip.SetText(TranslateT("<Automatic>"));
 -		}
 -		else {
 -			if (m_proto->m_myLocalHost[0]) {
 -				CMStringW s = (CMStringW)TranslateT("<Local IP: ") + (wchar_t*)_A2T(m_proto->m_myLocalHost) + L">";
 -				m_ip.SetText(s.c_str());
 -			}
 -			else m_ip.SetText(TranslateT("<Automatic>"));
 +	bool OnApply() override
 +	{
 +		m_userInfo.GetText(m_proto->m_userInfo, _countof(m_proto->m_userInfo));
 +
 +		m_proto->m_DCCPacketSize = m_combo.GetInt();
 +		m_proto->m_DCCPassive = m_passive.GetState();
 +		m_proto->m_sendNotice = m_sendNotice.GetState();
 +		m_proto->m_DCCMode = m_fast.GetState();
 +		m_proto->m_manualHost = m_enableIP.GetState();
 +		m_proto->m_IPFromServer = m_fromServer.GetState();
 +		m_proto->m_disconnectDCCChats = m_disc.GetState();
 +
 +		if (m_enableIP.GetState()) {
 +			char szTemp[500];
 +			m_ip.GetTextA(szTemp, sizeof(szTemp));
 +			mir_strncpy(m_proto->m_mySpecifiedHost, GetWord(szTemp, 0).c_str(), 499);
 +			if (mir_strlen(m_proto->m_mySpecifiedHost))
 +				m_proto->ForkThread(&CIrcProto::ResolveIPThread, new IPRESOLVE(m_proto->m_mySpecifiedHost, IP_MANUAL));
  		}
 -	}
 -}
 +		else m_proto->m_mySpecifiedHost[0] = 0;
 -bool CCtcpPrefsDlg::OnApply()
 -{
 -	m_userInfo.GetText(m_proto->m_userInfo, _countof(m_proto->m_userInfo));
 -
 -	m_proto->m_DCCPacketSize = m_combo.GetInt();
 -	m_proto->m_DCCPassive = m_passive.GetState();
 -	m_proto->m_sendNotice = m_sendNotice.GetState();
 -	m_proto->m_DCCMode = m_fast.GetState();
 -	m_proto->m_manualHost = m_enableIP.GetState();
 -	m_proto->m_IPFromServer = m_fromServer.GetState();
 -	m_proto->m_disconnectDCCChats = m_disc.GetState();
 -
 -	if (m_enableIP.GetState()) {
 -		char szTemp[500];
 -		m_ip.GetTextA(szTemp, sizeof(szTemp));
 -		mir_strncpy(m_proto->m_mySpecifiedHost, GetWord(szTemp, 0).c_str(), 499);
 -		if (mir_strlen(m_proto->m_mySpecifiedHost))
 -			m_proto->ForkThread(&CIrcProto::ResolveIPThread, new IPRESOLVE(m_proto->m_mySpecifiedHost, IP_MANUAL));
 +		if (m_radio1.GetState())
 +			m_proto->m_DCCChatAccept = 1;
 +		if (m_radio2.GetState())
 +			m_proto->m_DCCChatAccept = 2;
 +		if (m_radio3.GetState())
 +			m_proto->m_DCCChatAccept = 3;
 +
 +		m_proto->WriteSettings(CtcpSettings, _countof(CtcpSettings));
 +		return true;
  	}
 -	else m_proto->m_mySpecifiedHost[0] = 0;
 -	if (m_radio1.GetState())
 -		m_proto->m_DCCChatAccept = 1;
 -	if (m_radio2.GetState())
 -		m_proto->m_DCCChatAccept = 2;
 -	if (m_radio3.GetState())
 -		m_proto->m_DCCChatAccept = 3;
 +	void OnClicked(CCtrlData *)
 +	{
 +		m_ip.Enable(m_enableIP.GetState());
 +		m_fromServer.Enable(!m_enableIP.GetState());
 -	m_proto->WriteSettings(CtcpSettings, _countof(CtcpSettings));
 -	return true;
 -}
 +		if (m_enableIP.GetState())
 +			m_ip.SetTextA(m_proto->m_mySpecifiedHost);
 +		else {
 +			if (m_fromServer.GetState()) {
 +				if (m_proto->m_myHost[0]) {
 +					CMStringW s = (CMStringW)TranslateT("<Resolved IP: ") + (wchar_t *)_A2T(m_proto->m_myHost) + L">";
 +					m_ip.SetText(s.c_str());
 +				}
 +				else m_ip.SetText(TranslateT("<Automatic>"));
 +			}
 +			else {
 +				if (m_proto->m_myLocalHost[0]) {
 +					CMStringW s = (CMStringW)TranslateT("<Local IP: ") + (wchar_t *)_A2T(m_proto->m_myLocalHost) + L">";
 +					m_ip.SetText(s.c_str());
 +				}
 +				else m_ip.SetText(TranslateT("<Automatic>"));
 +			}
 +		}
 +	}
 +};
  /////////////////////////////////////////////////////////////////////////////////////////
  // 'Advanced preferences' dialog
  static TDbSetting OtherSettings[] =
  {
 -	{ FIELD_OFFSET(CIrcProto, m_quitMessage), "QuitMessage", DBVT_WCHAR, _countof(pZero->m_quitMessage) },
 +	{ FIELD_OFFSET(CIrcProto, m_quitMessage), "QuitMessage", DBVT_WCHAR, _countof(CIrcProto::m_quitMessage) },
  	{ FIELD_OFFSET(CIrcProto, m_alias), "Alias", DBVT_WCHAR, (size_t)-1 },
  	{ FIELD_OFFSET(CIrcProto, m_codepage), "Codepage", DBVT_DWORD, 0, CP_ACP },
  	{ FIELD_OFFSET(CIrcProto, m_utfAutodetect), "UtfAutodetect", DBVT_BYTE },
 @@ -904,14 +588,14 @@ static TDbSetting OtherSettings[] =  };
  static char* sttPerformEvents[] = {
 +	LPGEN("Event: Connect"),
  	LPGEN("Event: Available"),
  	LPGEN("Event: Away"),
  	LPGEN("Event: Not available"),
  	LPGEN("Event: Occupied"),
  	LPGEN("Event: Do not disturb"),
  	LPGEN("Event: Free for chat"),
 -	LPGEN("Event: Disconnect"),
 -	LPGEN("ALL NETWORKS")
 +	LPGEN("Event: Disconnect")
  };
  static LRESULT CALLBACK EditSubclassProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 @@ -937,276 +621,268 @@ static LRESULT CALLBACK EditSubclassProc(HWND hwndDlg, UINT msg, WPARAM wParam,  	return mir_callNextSubclass(hwndDlg, EditSubclassProc, msg, wParam, lParam);
  }
 -COtherPrefsDlg::COtherPrefsDlg(CIrcProto *_pro) :
 -	CProtoDlgBase<CIrcProto>(_pro, IDD_PREFS_OTHER),
 -	m_url(this, IDC_CUSTOM),
 -	m_performCombo(this, IDC_PERFORMCOMBO),
 -	m_codepage(this, IDC_CODEPAGE),
 -	m_pertormEdit(this, IDC_PERFORMEDIT),
 -	m_perform(this, IDC_PERFORM),
 -	m_scripting(this, IDC_SCRIPT),
 -	m_autodetect(this, IDC_UTF_AUTODETECT),
 -	m_quitMessage(this, IDC_QUITMESSAGE),
 -	m_alias(this, IDC_ALIASEDIT),
 -	m_add(this, IDC_ADD, g_plugin.getIcon(IDI_ADD), LPGEN("Click to set commands that will be performed for this event")),
 -	m_delete(this, IDC_DELETE, g_plugin.getIcon(IDI_DELETE), LPGEN("Click to delete the commands for this event")),
 -	m_performlistModified(false)
 -{
 -	m_performCombo.OnChange = Callback(this, &COtherPrefsDlg::OnPerformCombo);
 -	m_codepage.OnChange = Callback(this, &COtherPrefsDlg::OnCodePage);
 -	m_pertormEdit.OnChange = Callback(this, &COtherPrefsDlg::OnPerformEdit);
 -	m_perform.OnChange = Callback(this, &COtherPrefsDlg::OnPerform);
 -	m_add.OnClick = Callback(this, &COtherPrefsDlg::OnAdd);
 -	m_delete.OnClick = Callback(this, &COtherPrefsDlg::OnDelete);
 -}
 -
 -bool COtherPrefsDlg::OnInitDialog()
 -{
 -	mir_subclassWindow(m_alias.GetHwnd(), EditSubclassProc);
 -	mir_subclassWindow(m_quitMessage.GetHwnd(), EditSubclassProc);
 -	mir_subclassWindow(m_pertormEdit.GetHwnd(), EditSubclassProc);
 -
 -	m_alias.SetText(m_proto->m_alias);
 -	m_quitMessage.SetText(m_proto->m_quitMessage);
 -	m_perform.SetState(m_proto->m_perform);
 -	m_scripting.SetState(m_proto->m_scriptingEnabled);
 -	m_performCombo.Enable(m_proto->m_perform);
 -	m_pertormEdit.Enable(m_proto->m_perform);
 -	m_add.Enable(m_proto->m_perform);
 -	m_delete.Enable(m_proto->m_perform);
 -
 -	m_codepage.AddString(TranslateT("Default ANSI codepage"), CP_ACP);
 -
 -	sttCombo = &m_codepage;
 -	EnumSystemCodePages(sttLangAddCallback, CP_INSTALLED);
 -
 -	for (int i = m_codepage.GetCount(); i >= 0; i--) {
 -		if (m_codepage.GetItemData(i) == m_proto->m_codepage) {
 -			m_codepage.SetCurSel(i);
 -			break;
 -		}
 +class COtherPrefsDlg : public CIrcBaseDlg
 +{
 +	bool m_performlistModified;
 +
 +	CCtrlButton  m_url;
 +	CCtrlMButton m_add, m_delete;
 +	CCtrlCombo   m_performCombo, m_codepage;
 +	CCtrlEdit    m_pertormEdit, m_quitMessage, m_alias;
 +	CCtrlCheck   m_perform, m_scripting, m_autodetect;
 +
 +public:
 +	COtherPrefsDlg(CIrcProto *_pro) :
 +		CIrcBaseDlg(_pro, IDD_PREFS_OTHER),
 +		m_url(this, IDC_CUSTOM),
 +		m_performCombo(this, IDC_PERFORMCOMBO),
 +		m_codepage(this, IDC_CODEPAGE),
 +		m_pertormEdit(this, IDC_PERFORMEDIT),
 +		m_perform(this, IDC_PERFORM),
 +		m_scripting(this, IDC_SCRIPT),
 +		m_autodetect(this, IDC_UTF_AUTODETECT),
 +		m_quitMessage(this, IDC_QUITMESSAGE),
 +		m_alias(this, IDC_ALIASEDIT),
 +		m_add(this, IDC_ADD, g_plugin.getIcon(IDI_ADD), LPGEN("Click to set commands that will be performed for this event")),
 +		m_delete(this, IDC_DELETE, g_plugin.getIcon(IDI_DELETE), LPGEN("Click to delete the commands for this event")),
 +		m_performlistModified(false)
 +	{
 +		m_performCombo.OnChange = Callback(this, &COtherPrefsDlg::OnPerformCombo);
 +		m_codepage.OnChange = Callback(this, &COtherPrefsDlg::OnCodePage);
 +		m_pertormEdit.OnChange = Callback(this, &COtherPrefsDlg::OnPerformEdit);
 +		m_perform.OnChange = Callback(this, &COtherPrefsDlg::OnPerform);
 +		m_add.OnClick = Callback(this, &COtherPrefsDlg::OnAdd);
 +		m_delete.OnClick = Callback(this, &COtherPrefsDlg::OnDelete);
  	}
 -	if (m_proto->m_codepage == CP_UTF8)
 -		m_autodetect.Disable();
 -
 -	for (auto &si : g_servers) {
 -		int idx = m_performCombo.FindStringA(si->m_group, -1, true);
 -		if (idx == CB_ERR) {
 -			idx = m_performCombo.AddStringA(si->m_group);
 -			addPerformComboValue(idx, si->m_group);
 +	bool OnInitDialog()
 +	{
 +		mir_subclassWindow(m_alias.GetHwnd(), EditSubclassProc);
 +		mir_subclassWindow(m_quitMessage.GetHwnd(), EditSubclassProc);
 +		mir_subclassWindow(m_pertormEdit.GetHwnd(), EditSubclassProc);
 +
 +		m_alias.SetText(m_proto->m_alias);
 +		m_quitMessage.SetText(m_proto->m_quitMessage);
 +		m_perform.SetState(m_proto->m_perform);
 +		m_scripting.SetState(m_proto->m_scriptingEnabled);
 +		m_performCombo.Enable(m_proto->m_perform);
 +		m_pertormEdit.Enable(m_proto->m_perform);
 +		m_add.Enable(m_proto->m_perform);
 +		m_delete.Enable(m_proto->m_perform);
 +
 +		m_codepage.AddString(TranslateT("Default ANSI codepage"), CP_ACP);
 +
 +		sttCombo = &m_codepage;
 +		EnumSystemCodePages(sttLangAddCallback, CP_INSTALLED);
 +
 +		for (int i = m_codepage.GetCount(); i >= 0; i--) {
 +			if (m_codepage.GetItemData(i) == m_proto->m_codepage) {
 +				m_codepage.SetCurSel(i);
 +				break;
 +			}
  		}
 -	}
 -
 -	for (int i = 0; i < _countof(sttPerformEvents); i++) {
 -		int idx = m_performCombo.InsertString(_A2T(Translate(sttPerformEvents[i])), i);
 -		addPerformComboValue(idx, sttPerformEvents[i]);
 -	}
 -
 -	m_performCombo.SetCurSel(0);
 -	OnPerformCombo(nullptr);
 -	m_autodetect.SetState(m_proto->m_utfAutodetect);
 -	return true;
 -}
 -void COtherPrefsDlg::OnPerformCombo(CCtrlData*)
 -{
 -	int i = m_performCombo.GetCurSel();
 -	PERFORM_INFO *pPerf = (PERFORM_INFO*)m_performCombo.GetItemData(i);
 -	if (pPerf == nullptr)
 -		m_pertormEdit.SetTextA("");
 -	else
 -		m_pertormEdit.SetText(pPerf->mText.c_str());
 -	m_add.Disable();
 -	if (GetWindowTextLength(m_pertormEdit.GetHwnd()) != 0)
 -		m_delete.Enable();
 -	else
 -		m_delete.Disable();
 -}
 +		if (m_proto->m_codepage == CP_UTF8)
 +			m_autodetect.Disable();
 -void COtherPrefsDlg::OnCodePage(CCtrlData*)
 -{
 -	int curSel = m_codepage.GetCurSel();
 -	m_autodetect.Enable(m_codepage.GetItemData(curSel) != CP_UTF8);
 -}
 +		for (auto &it: sttPerformEvents) {
 +			CMStringA sSetting = CMStringA("PERFORM:") + it;
 +			sSetting.MakeUpper();
 -void COtherPrefsDlg::OnPerformEdit(CCtrlData*)
 -{
 -	m_add.Enable();
 +			PERFORM_INFO *pPref = new PERFORM_INFO(sSetting.c_str(), m_proto->getMStringW(sSetting.c_str()));
 +			m_performCombo.AddString(_A2T(Translate(it)), (LPARAM)pPref);
 +		}
 -	if (GetWindowTextLength(m_pertormEdit.GetHwnd()) != 0)
 -		m_delete.Enable();
 -	else
 -		m_delete.Disable();
 -}
 +		m_performCombo.SetCurSel(0);
 +		OnPerformCombo(nullptr);
 +		m_autodetect.SetState(m_proto->m_utfAutodetect);
 +		return true;
 +	}
 -void COtherPrefsDlg::OnPerform(CCtrlData*)
 -{
 -	m_performCombo.Enable(m_perform.GetState());
 -	m_pertormEdit.Enable(m_perform.GetState());
 -	m_add.Enable(m_perform.GetState());
 -	m_delete.Enable(m_perform.GetState());
 -}
 +	bool OnApply() override
 +	{
 +		mir_free(m_proto->m_alias);
 +		m_proto->m_alias = m_alias.GetText();
 +		m_quitMessage.GetText(m_proto->m_quitMessage, _countof(m_proto->m_quitMessage));
 -void COtherPrefsDlg::OnAdd(CCtrlButton*)
 -{
 -	wchar_t *temp = m_pertormEdit.GetText();
 +		int curSel = m_codepage.GetCurSel();
 +		m_proto->m_codepage = m_codepage.GetItemData(curSel);
 +		if (m_proto->IsConnected())
 +			m_proto->setCodepage(m_proto->m_codepage);
 +
 +		m_proto->m_utfAutodetect = m_autodetect.GetState();
 +		m_proto->m_perform = m_perform.GetState();
 +		m_proto->m_scriptingEnabled = m_scripting.GetState();
 +		if (m_add.Enabled())
 +			OnAdd(nullptr);
 +
 +		if (m_performlistModified) {
 +			int count = m_performCombo.GetCount();
 +			for (int i = 0; i < count; i++) {
 +				PERFORM_INFO *pPerf = (PERFORM_INFO *)m_performCombo.GetItemData(i);
 +				if ((INT_PTR)pPerf == CB_ERR)
 +					continue;
 -	if (my_strstri(temp, L"/away"))
 -		MessageBox(nullptr, TranslateT("The usage of /AWAY in your perform buffer is restricted\n as IRC sends this command automatically."), TranslateT("IRC Error"), MB_OK);
 -	else {
 -		int i = m_performCombo.GetCurSel();
 -		if (i != CB_ERR) {
 -			PERFORM_INFO *pPerf = (PERFORM_INFO*)m_performCombo.GetItemData(i);
 -			if (pPerf != nullptr)
 -				pPerf->mText = temp;
 +				if (pPerf->mText.IsEmpty())
 +					m_proto->delSetting(pPerf->mSetting.c_str());
 +				else
 +					m_proto->setWString(pPerf->mSetting.c_str(), pPerf->mText.c_str());
 +			}
 +		}
 +		m_proto->WriteSettings(OtherSettings, _countof(OtherSettings));
 +		return true;
 +	}
 -			m_add.Disable();
 -			m_performlistModified = true;
 +	void OnDestroy() override
 +	{
 +		int i = m_performCombo.GetCount();
 +		if (i != CB_ERR && i != 0) {
 +			for (int index = 0; index < i; index++) {
 +				PERFORM_INFO *pPerf = (PERFORM_INFO *)m_performCombo.GetItemData(index);
 +				if ((INT_PTR)pPerf != CB_ERR && pPerf != nullptr)
 +					delete pPerf;
 +			}
  		}
  	}
 -	mir_free(temp);
 -}
 -void COtherPrefsDlg::OnDelete(CCtrlButton*)
 -{
 -	int i = m_performCombo.GetCurSel();
 -	if (i != CB_ERR) {
 -		PERFORM_INFO *pPerf = (PERFORM_INFO*)m_performCombo.GetItemData(i);
 -		if (pPerf != nullptr) {
 -			pPerf->mText = L"";
 +	void OnPerformCombo(CCtrlData *)
 +	{
 +		int i = m_performCombo.GetCurSel();
 +		if (i == CB_ERR)
 +			return;
 +
 +		PERFORM_INFO *pPerf = (PERFORM_INFO *)m_performCombo.GetItemData(i);
 +		if (pPerf == nullptr)
  			m_pertormEdit.SetTextA("");
 +		else
 +			m_pertormEdit.SetText(pPerf->mText.c_str());
 +		m_add.Disable();
 +		if (GetWindowTextLength(m_pertormEdit.GetHwnd()) != 0)
 +			m_delete.Enable();
 +		else
  			m_delete.Disable();
 -			m_add.Disable();
 -		}
 +	}
 -		m_performlistModified = true;
 +	void OnCodePage(CCtrlData *)
 +	{
 +		int curSel = m_codepage.GetCurSel();
 +		m_autodetect.Enable(m_codepage.GetItemData(curSel) != CP_UTF8);
  	}
 -}
 -void COtherPrefsDlg::OnDestroy()
 -{
 -	int i = m_performCombo.GetCount();
 -	if (i != CB_ERR && i != 0) {
 -		for (int index = 0; index < i; index++) {
 -			PERFORM_INFO *pPerf = (PERFORM_INFO*)m_performCombo.GetItemData(index);
 -			if ((INT_PTR)pPerf != CB_ERR && pPerf != nullptr)
 -				delete pPerf;
 -		}
 +	void OnPerformEdit(CCtrlData *)
 +	{
 +		m_add.Enable();
 +
 +		if (GetWindowTextLength(m_pertormEdit.GetHwnd()) != 0)
 +			m_delete.Enable();
 +		else
 +			m_delete.Disable();
  	}
 -}
 -bool COtherPrefsDlg::OnApply()
 -{
 -	mir_free(m_proto->m_alias);
 -	m_proto->m_alias = m_alias.GetText();
 -	m_quitMessage.GetText(m_proto->m_quitMessage, _countof(m_proto->m_quitMessage));
 -
 -	int curSel = m_codepage.GetCurSel();
 -	m_proto->m_codepage = m_codepage.GetItemData(curSel);
 -	if (m_proto->IsConnected())
 -		m_proto->setCodepage(m_proto->m_codepage);
 -
 -	m_proto->m_utfAutodetect = m_autodetect.GetState();
 -	m_proto->m_perform = m_perform.GetState();
 -	m_proto->m_scriptingEnabled = m_scripting.GetState();
 -	if (m_add.Enabled())
 -		OnAdd(nullptr);
 -
 -	if (m_performlistModified) {
 -		int count = m_performCombo.GetCount();
 -		for (int i = 0; i < count; i++) {
 -			PERFORM_INFO *pPerf = (PERFORM_INFO*)m_performCombo.GetItemData(i);
 -			if ((INT_PTR)pPerf == CB_ERR)
 -				continue;
 +	void OnPerform(CCtrlData *)
 +	{
 +		m_performCombo.Enable(m_perform.GetState());
 +		m_pertormEdit.Enable(m_perform.GetState());
 +		m_add.Enable(m_perform.GetState());
 +		m_delete.Enable(m_perform.GetState());
 +	}
 -			if (!pPerf->mText.IsEmpty())
 -				m_proto->setWString(pPerf->mSetting.c_str(), pPerf->mText.c_str());
 -			else
 -				db_unset(0, m_proto->m_szModuleName, pPerf->mSetting.c_str());
 +	void OnAdd(CCtrlButton *)
 +	{
 +		wchar_t *temp = m_pertormEdit.GetText();
 +
 +		if (my_strstri(temp, L"/away"))
 +			MessageBox(nullptr, TranslateT("The usage of /AWAY in your perform buffer is restricted\n as IRC sends this command automatically."), TranslateT("IRC Error"), MB_OK);
 +		else {
 +			int i = m_performCombo.GetCurSel();
 +			if (i != CB_ERR) {
 +				PERFORM_INFO *pPerf = (PERFORM_INFO *)m_performCombo.GetItemData(i);
 +				if (pPerf != nullptr)
 +					pPerf->mText = temp;
 +
 +				m_add.Disable();
 +				m_performlistModified = true;
 +			}
  		}
 +		mir_free(temp);
  	}
 -	m_proto->WriteSettings(OtherSettings, _countof(OtherSettings));
 -	return true;
 -}
 -void COtherPrefsDlg::addPerformComboValue(int idx, const char* szValueName)
 -{
 -	CMStringA sSetting = CMStringA("PERFORM:") + szValueName;
 -	sSetting.MakeUpper();
 +	void OnDelete(CCtrlButton *)
 +	{
 +		int i = m_performCombo.GetCurSel();
 +		if (i != CB_ERR) {
 +			PERFORM_INFO *pPerf = (PERFORM_INFO *)m_performCombo.GetItemData(i);
 +			if (pPerf != nullptr) {
 +				pPerf->mText = L"";
 +				m_pertormEdit.SetTextA("");
 +				m_delete.Disable();
 +				m_add.Disable();
 +			}
 -	PERFORM_INFO *pPref;
 -	DBVARIANT dbv;
 -	if (!m_proto->getWString(sSetting.c_str(), &dbv)) {
 -		pPref = new PERFORM_INFO(sSetting.c_str(), dbv.pwszVal);
 -		db_free(&dbv);
 +			m_performlistModified = true;
 +		}
  	}
 -	else pPref = new PERFORM_INFO(sSetting.c_str(), L"");
 -	m_performCombo.SetItemData(idx, (LPARAM)pPref);
 -}
 +};
  /////////////////////////////////////////////////////////////////////////////////////////
  // 'add ignore' preferences dialog
 -CAddIgnoreDlg::CAddIgnoreDlg(CIrcProto* _pro, const wchar_t* mask, CIgnorePrefsDlg* _owner)
 -	: CProtoDlgBase<CIrcProto>(_pro, IDD_ADDIGNORE),
 -	m_owner(_owner)
 +struct CAddIgnoreDlg : public CIrcBaseDlg
  {
 -	m_hwndParent = _owner->GetHwnd();
 +	wchar_t szOldMask[500];
 -	if (mask == nullptr)
 -		szOldMask[0] = 0;
 -	else
 -		wcsncpy(szOldMask, mask, _countof(szOldMask));
 -}
 +	CAddIgnoreDlg::CAddIgnoreDlg(CIrcProto *_pro, const wchar_t *mask, CDlgBase *_owner) :
 +		CIrcBaseDlg(_pro, IDD_ADDIGNORE)
 +	{
 +		m_hwndParent = _owner->GetHwnd();
 -bool CAddIgnoreDlg::OnInitDialog()
 -{
 -	if (szOldMask[0] == 0) {
 -		if (m_proto->IsConnected())
 -			SetDlgItemText(m_hwnd, IDC_NETWORK, m_proto->m_info.sNetwork.c_str());
 -		CheckDlgButton(m_hwnd, IDC_Q, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_N, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_I, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_D, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_C, BST_CHECKED);
 +		if (mask == nullptr)
 +			szOldMask[0] = 0;
 +		else
 +			wcsncpy(szOldMask, mask, _countof(szOldMask));
  	}
 -	return true;
 -}
 -bool CAddIgnoreDlg::OnApply()
 -{
 -	wchar_t szMask[500];
 -	wchar_t szNetwork[500];
 -	CMStringW flags;
 -	if (IsDlgButtonChecked(m_hwnd, IDC_Q) == BST_CHECKED) flags += 'q';
 -	if (IsDlgButtonChecked(m_hwnd, IDC_N) == BST_CHECKED) flags += 'n';
 -	if (IsDlgButtonChecked(m_hwnd, IDC_I) == BST_CHECKED) flags += 'i';
 -	if (IsDlgButtonChecked(m_hwnd, IDC_D) == BST_CHECKED) flags += 'd';
 -	if (IsDlgButtonChecked(m_hwnd, IDC_C) == BST_CHECKED) flags += 'c';
 -	if (IsDlgButtonChecked(m_hwnd, IDC_M) == BST_CHECKED) flags += 'm';
 -
 -	GetDlgItemText(m_hwnd, IDC_MASK, szMask, _countof(szMask));
 -	GetDlgItemText(m_hwnd, IDC_NETWORK, szNetwork, _countof(szNetwork));
 -
 -	CMStringW Mask = GetWord(szMask, 0);
 -	if (Mask.GetLength() != 0) {
 -		if (!wcschr(Mask.c_str(), '!') && !wcschr(Mask.c_str(), '@'))
 -			Mask += L"!*@*";
 -
 -		if (!flags.IsEmpty()) {
 -			if (*szOldMask)
 -				m_proto->RemoveIgnore(szOldMask);
 -			m_proto->AddIgnore(Mask.c_str(), flags.c_str(), szNetwork);
 +	bool OnInitDialog() override
 +	{
 +		if (szOldMask[0] == 0) {
 +			CheckDlgButton(m_hwnd, IDC_Q, BST_CHECKED);
 +			CheckDlgButton(m_hwnd, IDC_N, BST_CHECKED);
 +			CheckDlgButton(m_hwnd, IDC_I, BST_CHECKED);
 +			CheckDlgButton(m_hwnd, IDC_D, BST_CHECKED);
 +			CheckDlgButton(m_hwnd, IDC_C, BST_CHECKED);
  		}
 +		return true;
  	}
 -	return true;
 -}
 -void CAddIgnoreDlg::OnDestroy()
 -{
 -	m_owner->FixButtons();
 -}
 +	bool OnApply() override
 +	{
 +		wchar_t szMask[500];
 +		wchar_t szNetwork[500];
 +		CMStringW flags;
 +		if (IsDlgButtonChecked(m_hwnd, IDC_Q) == BST_CHECKED) flags += 'q';
 +		if (IsDlgButtonChecked(m_hwnd, IDC_N) == BST_CHECKED) flags += 'n';
 +		if (IsDlgButtonChecked(m_hwnd, IDC_I) == BST_CHECKED) flags += 'i';
 +		if (IsDlgButtonChecked(m_hwnd, IDC_D) == BST_CHECKED) flags += 'd';
 +		if (IsDlgButtonChecked(m_hwnd, IDC_C) == BST_CHECKED) flags += 'c';
 +		if (IsDlgButtonChecked(m_hwnd, IDC_M) == BST_CHECKED) flags += 'm';
 +
 +		GetDlgItemText(m_hwnd, IDC_MASK, szMask, _countof(szMask));
 +		GetDlgItemText(m_hwnd, IDC_NETWORK, szNetwork, _countof(szNetwork));
 +
 +		CMStringW Mask = GetWord(szMask, 0);
 +		if (Mask.GetLength() != 0) {
 +			if (!wcschr(Mask.c_str(), '!') && !wcschr(Mask.c_str(), '@'))
 +				Mask += L"!*@*";
 +
 +			if (!flags.IsEmpty()) {
 +				if (*szOldMask)
 +					m_proto->RemoveIgnore(szOldMask);
 +				m_proto->AddIgnore(Mask.c_str(), flags.c_str(), szNetwork);
 +			}
 +		}
 +		return true;
 +	}
 +};
  /////////////////////////////////////////////////////////////////////////////////////////
  // 'Ignore' preferences dialog
 @@ -1220,34 +896,6 @@ static TDbSetting IgnoreSettings[] =  	{ FIELD_OFFSET(CIrcProto, m_ignoreChannelDefault), "IgnoreChannelDefault", DBVT_BYTE },
  };
 -static int CALLBACK IgnoreListSort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
 -{
 -	CIgnorePrefsDlg *hwndDlg = (CIgnorePrefsDlg*)lParamSort;
 -	if (!hwndDlg->GetHwnd())
 -		return 1;
 -
 -	wchar_t temp1[512];
 -	wchar_t temp2[512];
 -
 -	LVITEM lvm;
 -	lvm.mask = LVIF_TEXT;
 -	lvm.iSubItem = 0;
 -	lvm.cchTextMax = _countof(temp1);
 -
 -	lvm.iItem = lParam1;
 -	lvm.pszText = temp1;
 -	hwndDlg->m_list.GetItem(&lvm);
 -
 -	lvm.iItem = lParam2;
 -	lvm.pszText = temp2;
 -	hwndDlg->m_list.GetItem(&lvm);
 -
 -	if (temp1[0] && temp2[0])
 -		return mir_wstrcmpi(temp1, temp2);
 -
 -	return (temp1[0] == 0) ? 1 : -1;
 -}
 -
  static LRESULT CALLBACK ListviewSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  {
  	switch (msg) {
 @@ -1348,250 +996,292 @@ void CIrcProto::RewriteIgnoreSettings(void)  	}
  }
 -CIgnorePrefsDlg::CIgnorePrefsDlg(CIrcProto* _pro)
 -	: CProtoDlgBase<CIrcProto>(_pro, IDD_PREFS_IGNORE),
 -	m_list(this, IDC_LIST),
 -	m_add(this, IDC_ADD, g_plugin.getIcon(IDI_ADD), LPGEN("Add new ignore")),
 -	m_edit(this, IDC_EDIT, g_plugin.getIcon(IDI_EDIT), LPGEN("Edit this ignore")),
 -	m_del(this, IDC_DELETE, g_plugin.getIcon(IDI_DELETE), LPGEN("Delete this ignore")),
 -	m_enable(this, IDC_ENABLEIGNORE),
 -	m_ignoreChat(this, IDC_IGNORECHAT),
 -	m_ignoreFile(this, IDC_IGNOREFILE),
 -	m_ignoreChannel(this, IDC_IGNORECHANNEL),
 -	m_ignoreUnknown(this, IDC_IGNOREUNKNOWN)
 +class CIgnorePrefsDlg : public CIrcBaseDlg
  {
 -	m_enable.OnChange = Callback(this, &CIgnorePrefsDlg::OnEnableIgnore);
 -	m_ignoreChat.OnChange = Callback(this, &CIgnorePrefsDlg::OnIgnoreChat);
 -	m_add.OnClick = Callback(this, &CIgnorePrefsDlg::OnAdd);
 -	m_list.OnDoubleClick = m_edit.OnClick = Callback(this, &CIgnorePrefsDlg::OnEdit);
 -	m_del.OnClick = Callback(this, &CIgnorePrefsDlg::OnDelete);
 -	m_list.OnColumnClick = Callback(this, &CIgnorePrefsDlg::List_OnColumnClick);
 -}
 -
 -bool CIgnorePrefsDlg::OnInitDialog()
 -{
 -	m_proto->m_ignoreDlg = this;
 -	mir_subclassWindow(m_list.GetHwnd(), ListviewSubclassProc);
 -
 -	m_enable.SetState(m_proto->m_ignore);
 -	m_ignoreFile.SetState(!m_proto->m_DCCFileEnabled);
 -	m_ignoreChat.SetState(!m_proto->m_DCCChatEnabled);
 -	m_ignoreChannel.SetState(m_proto->m_ignoreChannelDefault);
 -	if (m_proto->m_DCCChatIgnore == 2)
 -		m_ignoreUnknown.SetState(BST_CHECKED);
 -
 -	m_ignoreUnknown.Enable(m_proto->m_DCCChatEnabled);
 -	m_list.Enable(m_proto->m_ignore);
 -	m_ignoreChannel.Enable(m_proto->m_ignore);
 -	m_add.Enable(m_proto->m_ignore);
 -
 -	static int COLUMNS_SIZES[3] = { 195, 60, 80 };
 -	LV_COLUMN lvC;
 -	lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
 -	lvC.fmt = LVCFMT_LEFT;
 -	for (int index = 0; index < 3; index++) {
 -		lvC.iSubItem = index;
 -		lvC.cx = COLUMNS_SIZES[index];
 -
 -		wchar_t *text = nullptr;
 -		switch (index) {
 -		case 0: text = TranslateT("Ignore mask"); break;
 -		case 1: text = TranslateT("Flags"); break;
 -		case 2: text = TranslateT("Network"); break;
 +	void FixButtons()
 +	{
 +		m_add.Enable(m_enable.GetState());
 +		if (m_list.GetSelectionMark() != -1) {
 +			m_edit.Enable();
 +			m_del.Enable();
 +		}
 +		else {
 +			m_edit.Disable();
 +			m_del.Disable();
  		}
 -		lvC.pszText = text;
 -		ListView_InsertColumn(GetDlgItem(m_hwnd, IDC_INFO_LISTVIEW), index, &lvC);
  	}
 -	ListView_SetExtendedListViewStyle(GetDlgItem(m_hwnd, IDC_INFO_LISTVIEW), LVS_EX_FULLROWSELECT);
 -	RebuildList();
 -	return true;
 -}
 +	static int CALLBACK IgnoreListSort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
 +	{
 +		CIgnorePrefsDlg *hwndDlg = (CIgnorePrefsDlg*)lParamSort;
 +		if (!hwndDlg->GetHwnd())
 +			return 1;
 -INT_PTR CIgnorePrefsDlg::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
 -{
 -	switch (msg) {
 -	case WM_NOTIFY:
 -		switch (((LPNMHDR)lParam)->idFrom) {
 -		case IDC_LIST:
 -			switch (((NMHDR*)lParam)->code) {
 -			case NM_CLICK:
 -			case NM_RCLICK:
 -				if (m_list.GetSelectionMark() != -1)
 -					FixButtons();
 -				break;
 -			}
 +		wchar_t temp1[512];
 +		wchar_t temp2[512];
 +
 +		LVITEM lvm;
 +		lvm.mask = LVIF_TEXT;
 +		lvm.iSubItem = 0;
 +		lvm.cchTextMax = _countof(temp1);
 +
 +		lvm.iItem = lParam1;
 +		lvm.pszText = temp1;
 +		hwndDlg->m_list.GetItem(&lvm);
 +
 +		lvm.iItem = lParam2;
 +		lvm.pszText = temp2;
 +		hwndDlg->m_list.GetItem(&lvm);
 +
 +		if (temp1[0] && temp2[0])
 +			return mir_wstrcmpi(temp1, temp2);
 +
 +		return (temp1[0] == 0) ? 1 : -1;
 +	}
 +
 +	void RebuildList()
 +	{
 +		m_list.DeleteAllItems();
 +
 +		for (auto &C : m_proto->m_ignoreItems) {
 +			if (C->mask.IsEmpty() || C->flags[0] != '+')
 +				continue;
 +
 +			LVITEM lvItem;
 +			lvItem.iItem = m_list.GetItemCount();
 +			lvItem.mask = LVIF_TEXT | LVIF_PARAM;
 +			lvItem.iSubItem = 0;
 +			lvItem.lParam = lvItem.iItem;
 +			lvItem.pszText = (wchar_t *)C->mask.c_str();
 +			lvItem.iItem = m_list.InsertItem(&lvItem);
 +
 +			lvItem.mask = LVIF_TEXT;
 +			lvItem.iSubItem = 1;
 +			lvItem.pszText = (wchar_t *)C->flags.c_str();
 +			m_list.SetItem(&lvItem);
 +
 +			lvItem.mask = LVIF_TEXT;
 +			lvItem.iSubItem = 2;
 +			lvItem.pszText = (wchar_t *)C->network.c_str();
 +			m_list.SetItem(&lvItem);
  		}
 -		break;
 +
 +		UpdateList();
 +		m_list.SortItems(IgnoreListSort, (LPARAM)this);
 +		UpdateList();
 +
 +		FixButtons();
  	}
 -	return CDlgBase::DlgProc(msg, wParam, lParam);
 -}
 -void CIgnorePrefsDlg::OnEnableIgnore(CCtrlData*)
 -{
 -	m_ignoreChannel.Enable(m_enable.GetState());
 -	m_list.Enable(m_enable.GetState());
 -	m_add.Enable(m_enable.GetState());
 -}
 +	void UpdateList()
 +	{
 +		int j = m_list.GetItemCount();
 +		if (j > 0) {
 +			LVITEM lvm;
 +			lvm.mask = LVIF_PARAM;
 +			lvm.iSubItem = 0;
 +			for (int i = 0; i < j; i++) {
 +				lvm.iItem = i;
 +				lvm.lParam = i;
 +				m_list.SetItem(&lvm);
 +			}
 +		}
 +	}
 -void CIgnorePrefsDlg::OnIgnoreChat(CCtrlData*)
 -{
 -	m_ignoreUnknown.Enable(m_ignoreChat.GetState() == BST_UNCHECKED);
 -}
 +	CCtrlMButton m_add, m_edit, m_del;
 +	CCtrlCheck m_enable, m_ignoreChat, m_ignoreFile, m_ignoreChannel, m_ignoreUnknown;
 +	CCtrlListView m_list;
 +
 +public:
 +	CIgnorePrefsDlg(CIrcProto *_pro) :
 +		CIrcBaseDlg(_pro, IDD_PREFS_IGNORE),
 +		m_list(this, IDC_LIST),
 +		m_add(this, IDC_ADD, g_plugin.getIcon(IDI_ADD), LPGEN("Add new ignore")),
 +		m_edit(this, IDC_EDIT, g_plugin.getIcon(IDI_EDIT), LPGEN("Edit this ignore")),
 +		m_del(this, IDC_DELETE, g_plugin.getIcon(IDI_DELETE), LPGEN("Delete this ignore")),
 +		m_enable(this, IDC_ENABLEIGNORE),
 +		m_ignoreChat(this, IDC_IGNORECHAT),
 +		m_ignoreFile(this, IDC_IGNOREFILE),
 +		m_ignoreChannel(this, IDC_IGNORECHANNEL),
 +		m_ignoreUnknown(this, IDC_IGNOREUNKNOWN)
 +	{
 +		m_enable.OnChange = Callback(this, &CIgnorePrefsDlg::OnEnableIgnore);
 +		m_ignoreChat.OnChange = Callback(this, &CIgnorePrefsDlg::OnIgnoreChat);
 +		m_add.OnClick = Callback(this, &CIgnorePrefsDlg::OnAdd);
 +		m_list.OnDoubleClick = m_edit.OnClick = Callback(this, &CIgnorePrefsDlg::OnEdit);
 +		m_del.OnClick = Callback(this, &CIgnorePrefsDlg::OnDelete);
 +		m_list.OnColumnClick = Callback(this, &CIgnorePrefsDlg::List_OnColumnClick);
 +	}
 -void CIgnorePrefsDlg::OnAdd(CCtrlButton*)
 -{
 -	CAddIgnoreDlg *dlg = new CAddIgnoreDlg(m_proto, nullptr, this);
 -	dlg->Show();
 -	SetWindowText(dlg->GetHwnd(), TranslateT("Add ignore"));
 -	m_add.Disable();
 -	m_edit.Disable();
 -	m_del.Disable();
 -}
 +	bool OnInitDialog() override
 +	{
 +		m_proto->m_ignoreDlg = this;
 +		mir_subclassWindow(m_list.GetHwnd(), ListviewSubclassProc);
 +
 +		m_enable.SetState(m_proto->m_ignore);
 +		m_ignoreFile.SetState(!m_proto->m_DCCFileEnabled);
 +		m_ignoreChat.SetState(!m_proto->m_DCCChatEnabled);
 +		m_ignoreChannel.SetState(m_proto->m_ignoreChannelDefault);
 +		if (m_proto->m_DCCChatIgnore == 2)
 +			m_ignoreUnknown.SetState(BST_CHECKED);
 +
 +		m_ignoreUnknown.Enable(m_proto->m_DCCChatEnabled);
 +		m_list.Enable(m_proto->m_ignore);
 +		m_ignoreChannel.Enable(m_proto->m_ignore);
 +		m_add.Enable(m_proto->m_ignore);
 +
 +		static int COLUMNS_SIZES[3] = { 195, 60, 80 };
 +		LV_COLUMN lvC;
 +		lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
 +		lvC.fmt = LVCFMT_LEFT;
 +		for (int index = 0; index < 3; index++) {
 +			lvC.iSubItem = index;
 +			lvC.cx = COLUMNS_SIZES[index];
 +
 +			wchar_t *text = nullptr;
 +			switch (index) {
 +			case 0: text = TranslateT("Ignore mask"); break;
 +			case 1: text = TranslateT("Flags"); break;
 +			case 2: text = TranslateT("Network"); break;
 +			}
 +			lvC.pszText = text;
 +			ListView_InsertColumn(GetDlgItem(m_hwnd, IDC_INFO_LISTVIEW), index, &lvC);
 +		}
 -void CIgnorePrefsDlg::OnEdit(CCtrlButton*)
 -{
 -	if (!m_add.Enabled())
 -		return;
 -
 -	wchar_t szMask[512];
 -	wchar_t szFlags[512];
 -	wchar_t szNetwork[512];
 -	int i = m_list.GetSelectionMark();
 -	m_list.GetItemText(i, 0, szMask, 511);
 -	m_list.GetItemText(i, 1, szFlags, 511);
 -	m_list.GetItemText(i, 2, szNetwork, 511);
 -	CAddIgnoreDlg* dlg = new CAddIgnoreDlg(m_proto, szMask, this);
 -	dlg->Show();
 -	HWND hWnd = dlg->GetHwnd();
 -	SetWindowText(hWnd, TranslateT("Edit ignore"));
 -	if (szFlags[0]) {
 -		if (wcschr(szFlags, 'q'))
 -			CheckDlgButton(hWnd, IDC_Q, BST_CHECKED);
 -		if (wcschr(szFlags, 'n'))
 -			CheckDlgButton(hWnd, IDC_N, BST_CHECKED);
 -		if (wcschr(szFlags, 'i'))
 -			CheckDlgButton(hWnd, IDC_I, BST_CHECKED);
 -		if (wcschr(szFlags, 'd'))
 -			CheckDlgButton(hWnd, IDC_D, BST_CHECKED);
 -		if (wcschr(szFlags, 'c'))
 -			CheckDlgButton(hWnd, IDC_C, BST_CHECKED);
 -		if (wcschr(szFlags, 'm'))
 -			CheckDlgButton(hWnd, IDC_M, BST_CHECKED);
 +		ListView_SetExtendedListViewStyle(GetDlgItem(m_hwnd, IDC_INFO_LISTVIEW), LVS_EX_FULLROWSELECT);
 +		RebuildList();
 +		return true;
  	}
 -	SetDlgItemText(hWnd, IDC_MASK, szMask);
 -	SetDlgItemText(hWnd, IDC_NETWORK, szNetwork);
 -	m_add.Disable();
 -	m_edit.Disable();
 -	m_del.Disable();
 -}
 -void CIgnorePrefsDlg::OnDelete(CCtrlButton*)
 -{
 -	if (!m_del.Enabled())
 -		return;
 +	bool OnApply() override
 +	{
 +		m_proto->m_DCCFileEnabled = !m_ignoreFile.GetState();
 +		m_proto->m_DCCChatEnabled = !m_ignoreChat.GetState();
 +		m_proto->m_ignore = m_enable.GetState();
 +		m_proto->m_ignoreChannelDefault = m_ignoreChannel.GetState();
 +		m_proto->m_DCCChatIgnore = m_ignoreUnknown.GetState() ? 2 : 1;
 +		m_proto->WriteSettings(IgnoreSettings, _countof(IgnoreSettings));
 +		return true;
 +	}
 -	wchar_t szMask[512];
 -	int i = m_list.GetSelectionMark();
 -	m_list.GetItemText(i, 0, szMask, _countof(szMask));
 -	m_proto->RemoveIgnore(szMask);
 -}
 +	void OnDestroy() override
 +	{
 +		m_proto->m_ignoreDlg = nullptr;
 +		m_proto->m_ignoreItems.destroy();
 +
 +		int i = m_list.GetItemCount();
 +		for (int j = 0; j < i; j++) {
 +			wchar_t szMask[512], szFlags[40], szNetwork[100];
 +			m_list.GetItemText(j, 0, szMask, _countof(szMask));
 +			m_list.GetItemText(j, 1, szFlags, _countof(szFlags));
 +			m_list.GetItemText(j, 2, szNetwork, _countof(szNetwork));
 +			m_proto->m_ignoreItems.insert(new CIrcIgnoreItem(szMask, szFlags, szNetwork));
 +		}
 -void CIgnorePrefsDlg::List_OnColumnClick(CCtrlListView::TEventInfo*)
 -{
 -	m_list.SortItems(IgnoreListSort, (LPARAM)this);
 -	UpdateList();
 -}
 +		m_proto->RewriteIgnoreSettings();
 +	}
 -bool CIgnorePrefsDlg::OnApply()
 -{
 -	m_proto->m_DCCFileEnabled = !m_ignoreFile.GetState();
 -	m_proto->m_DCCChatEnabled = !m_ignoreChat.GetState();
 -	m_proto->m_ignore = m_enable.GetState();
 -	m_proto->m_ignoreChannelDefault = m_ignoreChannel.GetState();
 -	m_proto->m_DCCChatIgnore = m_ignoreUnknown.GetState() ? 2 : 1;
 -	m_proto->WriteSettings(IgnoreSettings, _countof(IgnoreSettings));
 -	return true;
 -}
 +	INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override
 +	{
 +		switch (msg) {
 +		case WM_NOTIFY:
 +			switch (((LPNMHDR)lParam)->idFrom) {
 +			case IDC_LIST:
 +				switch (((NMHDR *)lParam)->code) {
 +				case NM_CLICK:
 +				case NM_RCLICK:
 +					if (m_list.GetSelectionMark() != -1)
 +						FixButtons();
 +					break;
 +				}
 +			}
 +			break;
 +		}
 +		return CDlgBase::DlgProc(msg, wParam, lParam);
 +	}
 -void CIgnorePrefsDlg::OnDestroy()
 -{
 -	m_proto->m_ignoreDlg = nullptr;
 -	m_proto->m_ignoreItems.destroy();
 -
 -	int i = m_list.GetItemCount();
 -	for (int j = 0; j < i; j++) {
 -		wchar_t szMask[512], szFlags[40], szNetwork[100];
 -		m_list.GetItemText(j, 0, szMask, _countof(szMask));
 -		m_list.GetItemText(j, 1, szFlags, _countof(szFlags));
 -		m_list.GetItemText(j, 2, szNetwork, _countof(szNetwork));
 -		m_proto->m_ignoreItems.insert(new CIrcIgnoreItem(szMask, szFlags, szNetwork));
 +	void Update() override
 +	{
 +		RebuildList();
  	}
 -	m_proto->RewriteIgnoreSettings();
 -}
 +	void OnEnableIgnore(CCtrlData *)
 +	{
 +		m_ignoreChannel.Enable(m_enable.GetState());
 +		m_list.Enable(m_enable.GetState());
 +		m_add.Enable(m_enable.GetState());
 +	}
 -void CIgnorePrefsDlg::FixButtons()
 -{
 -	m_add.Enable(m_enable.GetState());
 -	if (m_list.GetSelectionMark() != -1) {
 -		m_edit.Enable();
 -		m_del.Enable();
 +	void OnIgnoreChat(CCtrlData *)
 +	{
 +		m_ignoreUnknown.Enable(m_ignoreChat.GetState() == BST_UNCHECKED);
  	}
 -	else {
 +
 +	void OnAdd(CCtrlButton *)
 +	{
 +		CAddIgnoreDlg *dlg = new CAddIgnoreDlg(m_proto, nullptr, this);
 +		dlg->Show();
 +		SetWindowText(dlg->GetHwnd(), TranslateT("Add ignore"));
 +		m_add.Disable();
  		m_edit.Disable();
  		m_del.Disable();
  	}
 -}
 -void CIgnorePrefsDlg::RebuildList()
 -{
 -	m_list.DeleteAllItems();
 -
 -	for (auto &C : m_proto->m_ignoreItems) {
 -		if (C->mask.IsEmpty() || C->flags[0] != '+')
 -			continue;
 -
 -		LVITEM lvItem;
 -		lvItem.iItem = m_list.GetItemCount();
 -		lvItem.mask = LVIF_TEXT | LVIF_PARAM;
 -		lvItem.iSubItem = 0;
 -		lvItem.lParam = lvItem.iItem;
 -		lvItem.pszText = (wchar_t*)C->mask.c_str();
 -		lvItem.iItem = m_list.InsertItem(&lvItem);
 -
 -		lvItem.mask = LVIF_TEXT;
 -		lvItem.iSubItem = 1;
 -		lvItem.pszText = (wchar_t*)C->flags.c_str();
 -		m_list.SetItem(&lvItem);
 -
 -		lvItem.mask = LVIF_TEXT;
 -		lvItem.iSubItem = 2;
 -		lvItem.pszText = (wchar_t*)C->network.c_str();
 -		m_list.SetItem(&lvItem);
 +	void OnEdit(CCtrlButton *)
 +	{
 +		if (!m_add.Enabled())
 +			return;
 +
 +		wchar_t szMask[512];
 +		wchar_t szFlags[512];
 +		wchar_t szNetwork[512];
 +		int i = m_list.GetSelectionMark();
 +		m_list.GetItemText(i, 0, szMask, 511);
 +		m_list.GetItemText(i, 1, szFlags, 511);
 +		m_list.GetItemText(i, 2, szNetwork, 511);
 +		CAddIgnoreDlg *dlg = new CAddIgnoreDlg(m_proto, szMask, this);
 +		dlg->Show();
 +		HWND hWnd = dlg->GetHwnd();
 +		SetWindowText(hWnd, TranslateT("Edit ignore"));
 +		if (szFlags[0]) {
 +			if (wcschr(szFlags, 'q'))
 +				CheckDlgButton(hWnd, IDC_Q, BST_CHECKED);
 +			if (wcschr(szFlags, 'n'))
 +				CheckDlgButton(hWnd, IDC_N, BST_CHECKED);
 +			if (wcschr(szFlags, 'i'))
 +				CheckDlgButton(hWnd, IDC_I, BST_CHECKED);
 +			if (wcschr(szFlags, 'd'))
 +				CheckDlgButton(hWnd, IDC_D, BST_CHECKED);
 +			if (wcschr(szFlags, 'c'))
 +				CheckDlgButton(hWnd, IDC_C, BST_CHECKED);
 +			if (wcschr(szFlags, 'm'))
 +				CheckDlgButton(hWnd, IDC_M, BST_CHECKED);
 +		}
 +
 +		SetDlgItemText(hWnd, IDC_MASK, szMask);
 +		SetDlgItemText(hWnd, IDC_NETWORK, szNetwork);
 +		m_add.Disable();
 +		m_edit.Disable();
 +		m_del.Disable();
  	}
 -	UpdateList();
 -	m_list.SortItems(IgnoreListSort, (LPARAM)this);
 -	UpdateList();
 +	void OnDelete(CCtrlButton *)
 +	{
 +		if (!m_del.Enabled())
 +			return;
 -	FixButtons();
 -}
 +		wchar_t szMask[512];
 +		int i = m_list.GetSelectionMark();
 +		m_list.GetItemText(i, 0, szMask, _countof(szMask));
 +		m_proto->RemoveIgnore(szMask);
 +	}
 -void CIgnorePrefsDlg::UpdateList()
 -{
 -	int j = m_list.GetItemCount();
 -	if (j > 0) {
 -		LVITEM lvm;
 -		lvm.mask = LVIF_PARAM;
 -		lvm.iSubItem = 0;
 -		for (int i = 0; i < j; i++) {
 -			lvm.iItem = i;
 -			lvm.lParam = i;
 -			m_list.SetItem(&lvm);
 -		}
 +	void List_OnColumnClick(CCtrlListView::TEventInfo *)
 +	{
 +		m_list.SortItems(IgnoreListSort, (LPARAM)this);
 +		UpdateList();
  	}
 -}
 +};
  /////////////////////////////////////////////////////////////////////////////////////////
 @@ -1620,83 +1310,17 @@ int CIrcProto::OnInitOptionsPages(WPARAM wParam, LPARAM)  	return 0;
  }
 -/////////////////////////////////////////////////////////////////////////////////////////
 -
 -void CIrcProto::InitPrefs(void)
 -{
 -	ConnectSettings[0].defStr = L"Miranda";
 -	ConnectSettings[1].defStr = L"UNIX";
 -	ConnectSettings[2].defStr = L"113";
 -	ConnectSettings[3].defStr = L"30";
 -	ConnectSettings[4].defStr = L"10";
 -
 -	CtcpSettings[0].defStr = STR_USERINFO;
 -
 -	OtherSettings[0].defStr = STR_QUITMESSAGE;
 -
 -	ReadSettings(ConnectSettings, _countof(ConnectSettings));
 -	ReadSettings(CtcpSettings, _countof(CtcpSettings));
 -	ReadSettings(OtherSettings, _countof(OtherSettings));
 -	ReadSettings(IgnoreSettings, _countof(IgnoreSettings));
 -
 -	int x = getDword("SizeOfListBottom", -1);
 -	if (x != -1) {
 -		db_unset(0, m_szModuleName, "SizeOfListBottom");
 -		setDword("channelList_height", x);
 -	}
 -	if ((x = getDword("SizeOfListWidth", -1)) != -1) {
 -		db_unset(0, m_szModuleName, "SizeOfListWidth");
 -		setDword("channelList_width", x);
 -	}
 -
 -	if (m_pNick[0] == 0) {
 -		if (m_nick[0] != 0) {
 -			memcpy(m_pNick, m_nick, sizeof(m_pNick));
 -			setWString("PNick", m_nick);
 -		}
 -	}
 -	else {
 -		memcpy(m_nick, m_pNick, sizeof(m_nick));
 -		setWString("Nick", m_nick);
 -	}
 -
 -	m_mySpecifiedHostIP[0] = 0;
 -
 -	if (m_alias == nullptr)
 -		m_alias = mir_wstrdup(L"/op /mode ## +ooo $1 $2 $3\r\n/dop /mode ## -ooo $1 $2 $3\r\n/voice /mode ## +vvv $1 $2 $3\r\n/dvoice /mode ## -vvv $1 $2 $3\r\n/j /join #$1 $2-\r\n/p /part ## $1-\r\n/w /whois $1\r\n/k /kick ## $1 $2-\r\n/q /query $1\r\n/logon /log on ##\r\n/logoff /log off ##\r\n/save /log buffer $1\r\n/slap /me slaps $1 around a bit with a large trout");
 -
 -	m_quickComboSelection = getDword("QuickComboSelection", m_serverComboSelection + 1);
 -	m_myHost[0] = 0;
 -
 -	colors[0] = RGB(255, 255, 255);
 -	colors[1] = RGB(0, 0, 0);
 -	colors[2] = RGB(0, 0, 127);
 -	colors[3] = RGB(0, 147, 0);
 -	colors[4] = RGB(255, 0, 0);
 -	colors[5] = RGB(127, 0, 0);
 -	colors[6] = RGB(156, 0, 156);
 -	colors[7] = RGB(252, 127, 0);
 -	colors[8] = RGB(255, 255, 0);
 -	colors[9] = RGB(0, 252, 0);
 -	colors[10] = RGB(0, 147, 147);
 -	colors[11] = RGB(0, 255, 255);
 -	colors[12] = RGB(0, 0, 252);
 -	colors[13] = RGB(255, 0, 255);
 -	colors[14] = RGB(127, 127, 127);
 -	colors[15] = RGB(210, 210, 210);
 -}
 -
  ///////////////////////////////////////////////////////////////////////////////
  // Account manager UI
 -struct CDlgAccMgrUI : public CProtoDlgBase<CIrcProto>
 +class CDlgAccMgrUI : public CIrcBaseDlg
  {
 -	CCtrlCombo m_serverCombo;
 -	CCtrlEdit  m_server, m_port, m_port2, m_pass, m_nick, m_nick2, m_name, m_userID, m_ssl;
 +	CCtrlEdit m_server, m_port, m_port2, m_pass, m_nick, m_nick2, m_name, m_userID;
 +	CCtrlCombo m_ssl;
 -	CDlgAccMgrUI(CIrcProto* _pro, HWND _owner)
 -		: CProtoDlgBase<CIrcProto>(_pro, IDD_ACCMGRUI),
 -		m_serverCombo(this, IDC_SERVERCOMBO),
 +public:
 +	CDlgAccMgrUI(CIrcProto* _pro, HWND _owner) :
 +		CIrcBaseDlg(_pro, IDD_ACCMGRUI),
  		m_server(this, IDC_SERVER),
  		m_port(this, IDC_PORT),
  		m_port2(this, IDC_PORT2),
 @@ -1708,24 +1332,19 @@ struct CDlgAccMgrUI : public CProtoDlgBase<CIrcProto>  		m_userID(this, IDC_USERID)
  	{
  		m_hwndParent = _owner;
 -		m_serverCombo.OnChange = Callback(this, &CDlgAccMgrUI::OnChangeCombo);
  	}
  	bool OnInitDialog() override
  	{
 -		for (auto &si : g_servers)
 -			m_serverCombo.AddStringA(si->m_name, LPARAM(si));
 -
 -		m_serverCombo.SetCurSel(m_proto->m_serverComboSelection);
  		m_server.SetTextA(m_proto->m_serverName);
  		m_port.SetTextA(m_proto->m_portStart);
  		m_port2.SetTextA(m_proto->m_portEnd);
  		m_pass.SetTextA(m_proto->m_password);
 -		switch (m_proto->m_iSSL) {
 -			case 0:  m_ssl.SetTextA("Off");  break;
 -			case 1:  m_ssl.SetTextA("Auto"); break;
 -			case 2:  m_ssl.SetTextA("On");   break;
 -		}
 +
 +		m_ssl.AddString(TranslateT("Off"), 0);
 +		m_ssl.AddString(TranslateT("Auto"), 1);
 +		m_ssl.AddString(TranslateT("On"), 2);
 +		m_ssl.SetCurSel(m_proto->m_iSSL);
  		m_nick.SetText(m_proto->m_nick);
  		m_nick2.SetText(m_proto->m_alternativeNick);
 @@ -1736,12 +1355,13 @@ struct CDlgAccMgrUI : public CProtoDlgBase<CIrcProto>  	bool OnApply() override
  	{
 -		m_proto->m_serverComboSelection = m_serverCombo.GetCurSel();
  		m_server.GetTextA(m_proto->m_serverName, _countof(m_proto->m_serverName));
  		m_port.GetTextA(m_proto->m_portStart, _countof(m_proto->m_portStart));
  		m_port2.GetTextA(m_proto->m_portEnd, _countof(m_proto->m_portEnd));
  		m_pass.GetTextA(m_proto->m_password, _countof(m_proto->m_password));
 +		m_proto->m_iSSL = m_ssl.GetCurSel();
 +
  		m_nick.GetText(m_proto->m_nick, _countof(m_proto->m_nick));
  		removeSpaces(m_proto->m_nick);
  		wcsncpy_s(m_proto->m_pNick, m_proto->m_nick, _TRUNCATE);
 @@ -1753,23 +1373,6 @@ struct CDlgAccMgrUI : public CProtoDlgBase<CIrcProto>  		m_proto->WriteSettings(ConnectSettings, _countof(ConnectSettings));
  		return true;
  	}
 -
 -	void OnChangeCombo(CCtrlCombo*)
 -	{
 -		int i = m_serverCombo.GetCurSel();
 -		SERVER_INFO *pData = (SERVER_INFO*)m_serverCombo.GetItemData(i);
 -		if (pData && (INT_PTR)pData != CB_ERR) {
 -			m_server.SetTextA(pData->m_address);
 -			m_port.SetInt(pData->m_portStart);
 -			m_port2.SetInt(pData->m_portEnd);
 -			m_pass.SetTextA("");
 -			switch (pData->m_iSSL) {
 -			case 0:  m_ssl.SetTextA("Off");  break;
 -			case 1:  m_ssl.SetTextA("Auto"); break;
 -			case 2:  m_ssl.SetTextA("On");   break;
 -			}
 -		}
 -	}
  };
  INT_PTR CIrcProto::SvcCreateAccMgrUI(WPARAM, LPARAM lParam)
 @@ -1780,39 +1383,66 @@ INT_PTR CIrcProto::SvcCreateAccMgrUI(WPARAM, LPARAM lParam)  }
  /////////////////////////////////////////////////////////////////////////////////////////
 -// Initialize servers list
 -static void sttImportIni(const wchar_t* szIniFile)
 +void CIrcProto::InitPrefs(void)
  {
 -	FILE *serverFile = _wfopen(szIniFile, L"r");
 -	if (serverFile == nullptr)
 -		return;
 +	ConnectSettings[0].defStr = L"Miranda";
 +	ConnectSettings[1].defStr = L"UNIX";
 +	ConnectSettings[2].defStr = L"113";
 +	ConnectSettings[3].defStr = L"30";
 +	ConnectSettings[4].defStr = L"10";
 +
 +	CtcpSettings[0].defStr = STR_USERINFO;
 -	char buf1[500], buf2[200];
 -	while (fgets(buf1, sizeof(buf1), serverFile)) {
 -		char *p = strchr(buf1, '=');
 -		if (!p)
 -			continue;
 +	OtherSettings[0].defStr = STR_QUITMESSAGE;
 -		p++;
 -		rtrim(p);
 -		char *p1 = strstr(p, "SERVER:");
 -		if (!p1)
 -			continue;
 -
 -		memcpy(buf2, p, int(p1 - p));
 -		buf2[int(p1 - p)] = 0;
 -		db_set_s(0, SERVERSMODULE, buf2, p1);
 +	ReadSettings(ConnectSettings, _countof(ConnectSettings));
 +	ReadSettings(CtcpSettings, _countof(CtcpSettings));
 +	ReadSettings(OtherSettings, _countof(OtherSettings));
 +	ReadSettings(IgnoreSettings, _countof(IgnoreSettings));
 +
 +	int x = getDword("SizeOfListBottom", -1);
 +	if (x != -1) {
 +		db_unset(0, m_szModuleName, "SizeOfListBottom");
 +		setDword("channelList_height", x);
 +	}
 +	if ((x = getDword("SizeOfListWidth", -1)) != -1) {
 +		db_unset(0, m_szModuleName, "SizeOfListWidth");
 +		setDword("channelList_width", x);
  	}
 -	fclose(serverFile);
 -	::_wremove(szIniFile);
 -}
 -void InitServers()
 -{
 -	wchar_t *szTemp = Utils_ReplaceVarsW(L"%miranda_path%\\Plugins\\IRC_servers.ini");
 -	sttImportIni(szTemp);
 -	mir_free(szTemp);
 +	if (m_pNick[0] == 0) {
 +		if (m_nick[0] != 0) {
 +			memcpy(m_pNick, m_nick, sizeof(m_pNick));
 +			setWString("PNick", m_nick);
 +		}
 +	}
 +	else {
 +		memcpy(m_nick, m_pNick, sizeof(m_nick));
 +		setWString("Nick", m_nick);
 +	}
 +
 +	m_mySpecifiedHostIP[0] = 0;
 +
 +	if (m_alias == nullptr)
 +		m_alias = mir_wstrdup(L"/op /mode ## +ooo $1 $2 $3\r\n/dop /mode ## -ooo $1 $2 $3\r\n/voice /mode ## +vvv $1 $2 $3\r\n/dvoice /mode ## -vvv $1 $2 $3\r\n/j /join #$1 $2-\r\n/p /part ## $1-\r\n/w /whois $1\r\n/k /kick ## $1 $2-\r\n/q /query $1\r\n/logon /log on ##\r\n/logoff /log off ##\r\n/save /log buffer $1\r\n/slap /me slaps $1 around a bit with a large trout");
 +
 +	m_myHost[0] = 0;
 -	RereadServers();
 +	colors[0] = RGB(255, 255, 255);
 +	colors[1] = RGB(0, 0, 0);
 +	colors[2] = RGB(0, 0, 127);
 +	colors[3] = RGB(0, 147, 0);
 +	colors[4] = RGB(255, 0, 0);
 +	colors[5] = RGB(127, 0, 0);
 +	colors[6] = RGB(156, 0, 156);
 +	colors[7] = RGB(252, 127, 0);
 +	colors[8] = RGB(255, 255, 0);
 +	colors[9] = RGB(0, 252, 0);
 +	colors[10] = RGB(0, 147, 147);
 +	colors[11] = RGB(0, 255, 255);
 +	colors[12] = RGB(0, 0, 252);
 +	colors[13] = RGB(255, 0, 255);
 +	colors[14] = RGB(127, 127, 127);
 +	colors[15] = RGB(210, 210, 210);
  }
 diff --git a/protocols/IRCG/src/resource.h b/protocols/IRCG/src/resource.h index 89630cf71d..913211493f 100644 --- a/protocols/IRCG/src/resource.h +++ b/protocols/IRCG/src/resource.h @@ -9,7 +9,6 @@  #define IDD_INFO                        106
  #define IDD_NICK                        107
  #define IDD_PREFS_OTHER                 113
 -#define IDD_ADDSERVER                   120
  #define IDD_LIST                        123
  #define IDD_QUICKCONN                   133
  #define IDI_MAIN                        136
 @@ -27,7 +26,6 @@  #define IDI_WHOIS                       179
  #define IDI_LIST                        181
  #define IDI_MANAGER                     182
 -#define IDI_QUICK                       184
  #define IDI_GO                          185
  #define IDI_APPLY                       185
  #define IDI_SHOW                        186
 @@ -66,11 +64,8 @@  #define IDC_INFO_NICK                   1013
  #define IDC_EDIT2                       1013
  #define ID_INFO_GO                      1017
 -#define IDC_SERVERCOMBO                 1022
  #define IDC_IDENT                       1023
  #define IDC_IDENT_TIMED                 1024
 -#define IDC_ADDSERVER                   1031
 -#define IDC_EDITSERVER                  1032
  #define IDC_IDENTSYSTEM                 1036
  #define IDC_IDENTPORT                   1037
  #define IDC_ONLINETIMER                 1038
 @@ -95,16 +90,9 @@  #define IDC_REMOVE                      1094
  #define IDC_APPLYTOPIC                  1095
  #define IDC_APPLYMODES                  1096
 -#define IDC_DELETESERVER                1097
 -#define IDC_ADD_COMBO                   1100
 -#define IDC_ADD_SERVER                  1101
 -#define IDC_ADD_ADDRESS                 1102
 -#define IDC_ADD_PORT                    1103
 -#define IDC_ADD_PORT2                   1104
  #define IDC_CLOSE                       1108
  #define IDC_JOIN                        1109
  #define ID_INFO_OK                      1110
 -#define IDC_STARTUP                     1133
  #define IDC_TEXT                        1134
  #define IDC_DEFAULT                     1139
  #define IDC_WILDCARD                    1140
 @@ -131,9 +119,6 @@  #define IDC_WHITERECT                   1179
  #define IDC_LOGO                        1180
  #define IDC_CAPTION                     1181
 -#define IDC_OFF                         1184
 -#define IDC_AUTO                        1185
 -#define IDC_ON                          1186
  #define IDC_QUITMESSAGE                 1187
  #define IDC_USERINFO                    1189
  #define IDC_PING                        1190
 diff --git a/protocols/IRCG/src/scripting.cpp b/protocols/IRCG/src/scripting.cpp index 620072fa8e..07bd9f533e 100644 --- a/protocols/IRCG/src/scripting.cpp +++ b/protocols/IRCG/src/scripting.cpp @@ -113,9 +113,6 @@ INT_PTR __cdecl CIrcProto::Scripting_GetIrcData(WPARAM, LPARAM lparam)  		if (sRequest == "ownnick" && IsConnected())
  			sOutput = m_info.sNick;
 -		else if (sRequest == "network" && IsConnected())
 -			sOutput = m_info.sNetwork;
 -
  		else if (sRequest == "primarynick")
  			sOutput = m_nick;
 diff --git a/protocols/IRCG/src/services.cpp b/protocols/IRCG/src/services.cpp index 917842b0e7..2e7cf56bfb 100644 --- a/protocols/IRCG/src/services.cpp +++ b/protocols/IRCG/src/services.cpp @@ -25,14 +25,8 @@ void CIrcProto::OnBuildProtoMenu()  {
  	CMenuItem mi(&g_plugin);
  	mi.root = Menu_GetProtocolRoot(this);
 -
 -	mi.name.a = LPGEN("&Quick connect");
 -	mi.hIcolibItem = g_plugin.getIconHandle(IDI_QUICK);
 -	mi.pszService = IRC_QUICKCONNECT;
 -	mi.position = 201001;
 -	hMenuQuick = Menu_AddProtoMenuItem(&mi, m_szModuleName);
 -
 -	if (m_iStatus != ID_STATUS_OFFLINE) mi.flags |= CMIF_GRAYED;
 +	if (m_iStatus != ID_STATUS_OFFLINE)
 +		mi.flags |= CMIF_GRAYED;
  	mi.name.a = LPGEN("&Join channel");
  	mi.hIcolibItem = Skin_GetIconHandle(SKINICON_CHAT_JOIN);
 @@ -315,23 +309,6 @@ INT_PTR __cdecl CIrcProto::OnJoinMenuCommand(WPARAM, LPARAM)  	return 0;
  }
 -INT_PTR __cdecl CIrcProto::OnQuickConnectMenuCommand(WPARAM, LPARAM)
 -{
 -	if (!m_quickDlg) {
 -		m_quickDlg = new CQuickDlg(this);
 -		m_quickDlg->Show();
 -
 -		SetWindowText(m_quickDlg->GetHwnd(), TranslateT("Quick connect"));
 -		SetDlgItemText(m_quickDlg->GetHwnd(), IDC_TEXT, TranslateT("Please select IRC network and enter the password if needed"));
 -		SetDlgItemText(m_quickDlg->GetHwnd(), IDC_CAPTION, TranslateT("Quick connect"));
 -		Window_SetIcon_IcoLib(m_quickDlg->GetHwnd(), g_plugin.getIconHandle(IDI_QUICK));
 -	}
 -
 -	ShowWindow(m_quickDlg->GetHwnd(), SW_SHOW);
 -	SetActiveWindow(m_quickDlg->GetHwnd());
 -	return 0;
 -}
 -
  INT_PTR __cdecl CIrcProto::OnShowListMenuCommand(WPARAM, LPARAM)
  {
  	PostIrcMessage(L"/LIST");
 @@ -948,8 +925,6 @@ void __cdecl CIrcProto::ConnectServerThread(void*)  		if (IsConnected()) {
  			if (m_mySpecifiedHost[0])
  				ForkThread(&CIrcProto::ResolveIPThread, new IPRESOLVE(m_mySpecifiedHost, IP_MANUAL));
 -
 -			Chat_ChangeSessionName(m_szModuleName, SERVERWINDOW, m_info.sNetwork);
  		}
  		else {
  			Temp = m_iDesiredStatus;
 @@ -985,7 +960,6 @@ void CIrcProto::ConnectToServer(void)  	m_sessionInfo.iIdentServerPort = _wtoi(m_identPort);
  	m_sessionInfo.sIdentServerType = m_identSystem;
  	m_sessionInfo.m_iSSL = m_iSSL;
 -	m_sessionInfo.sNetwork = m_network;
  	bPerformDone = false;
  	bTempDisableCheck = false;
 @@ -1002,7 +976,7 @@ void CIrcProto::ConnectToServer(void)  		InterlockedIncrement((long *)&m_bConnectRequested);
  	wchar_t szTemp[300];
 -	mir_snwprintf(szTemp, L"\033%s %c%s%c (%S: %u)", TranslateT("Connecting to"), irc::BOLD, m_sessionInfo.sNetwork.c_str(), irc::BOLD, m_sessionInfo.sServer.c_str(), m_sessionInfo.iPort);
 +	mir_snwprintf(szTemp, L"\033%s %S:%u", TranslateT("Connecting to"), m_sessionInfo.sServer.c_str(), m_sessionInfo.iPort);
  	DoEvent(GC_EVENT_INFORMATION, SERVERWINDOW, nullptr, szTemp, nullptr, nullptr, NULL, true, false);
  }
 diff --git a/protocols/IRCG/src/stdafx.h b/protocols/IRCG/src/stdafx.h index 4f79b0249a..35d3d6ca94 100644 --- a/protocols/IRCG/src/stdafx.h +++ b/protocols/IRCG/src/stdafx.h @@ -69,7 +69,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  #include "resource.h"
 -#define IRC_QUICKCONNECT      "/QuickConnectMenu"
  #define IRC_JOINCHANNEL       "/JoinChannelMenu"
  #define IRC_CHANGENICK        "/ChangeNickMenu"
  #define IRC_SHOWLIST          "/ShowListMenu"
 @@ -136,14 +135,6 @@ struct CHANNELINFO   // Contains info about the channels  	int    codepage;
  };
 -struct SERVER_INFO  // Contains info about different servers
 -{
 -	~SERVER_INFO();
 -
 -	char *m_name, *m_address, *m_group;
 -	int  m_portStart, m_portEnd, m_iSSL;
 -};
 -
  struct PERFORM_INFO  // Contains 'm_perform buffer' for different networks
  {
  	PERFORM_INFO(const char* szSetting, const wchar_t* value) :
 @@ -199,7 +190,6 @@ using namespace irc;  // Functions
  // main.cpp
 -extern OBJLIST<SERVER_INFO> g_servers;
  CIrcProto* GetTimerOwner(UINT_PTR eventId);
 @@ -212,9 +202,6 @@ VOID CALLBACK DCCTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)  // options.cpp
 -void    InitServers(void);
 -void    RereadServers(void);
 -
  void    InitContactMenus(void);
  void    UninitContactMenus(void);
 diff --git a/protocols/IRCG/src/tools.cpp b/protocols/IRCG/src/tools.cpp index 02ca2c5b6d..e0ebfd64fe 100644 --- a/protocols/IRCG/src/tools.cpp +++ b/protocols/IRCG/src/tools.cpp @@ -373,10 +373,7 @@ INT_PTR CIrcProto::DoEvent(int iEvent, const wchar_t* pszWindow, const wchar_t*  	GCEVENT gce = { m_szModuleName, nullptr, iEvent };
  	if (pszWindow) {
 -		if (mir_wstrcmpi(pszWindow, SERVERWINDOW))
 -			sID = pszWindow + (CMStringW)L" - " + m_info.sNetwork;
 -		else
 -			sID = pszWindow;
 +		sID = pszWindow;
  		gce.pszID.w = (wchar_t*)sID.c_str();
  	}
  	else gce.pszID.w = nullptr;
 @@ -521,7 +518,7 @@ int CIrcProto::SetChannelSBText(CMStringW sWindow, CHANNELINFO * wi)  CMStringW CIrcProto::MakeWndID(const wchar_t* sWindow)
  {
  	wchar_t buf[200];
 -	mir_snwprintf(buf, L"%s - %s", sWindow, (IsConnected()) ? m_info.sNetwork.c_str() : TranslateT("Offline"));
 +	mir_snwprintf(buf, L"%s - %s", sWindow, (IsConnected()) ? m_tszUserName : TranslateT("Offline"));
  	return CMStringW(buf);
  }
 @@ -670,12 +667,3 @@ void CIrcProto::ClearUserhostReasons(int type)  		break;
  	}
  }
 -
 -////////////////////////////////////////////////////////////////////
 -
 -SERVER_INFO::~SERVER_INFO()
 -{
 -	mir_free(m_name);
 -	mir_free(m_address);
 -	mir_free(m_group);
 -}
 diff --git a/protocols/IRCG/src/version.h b/protocols/IRCG/src/version.h index f1f90eb4cf..0e67ee5bb7 100644 --- a/protocols/IRCG/src/version.h +++ b/protocols/IRCG/src/version.h @@ -1,6 +1,6 @@  #define __MAJOR_VERSION          0
 -#define __MINOR_VERSION          95
 -#define __RELEASE_NUM            10
 +#define __MINOR_VERSION          96
 +#define __RELEASE_NUM            1
  #define __BUILD_NUM              1
  #include <stdver.h>
 diff --git a/protocols/IRCG/src/windows.cpp b/protocols/IRCG/src/windows.cpp index 44a5d90d79..8a16147cfa 100644 --- a/protocols/IRCG/src/windows.cpp +++ b/protocols/IRCG/src/windows.cpp @@ -24,8 +24,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  /////////////////////////////////////////////////////////////////////////////////////////
  // Message Box
 -CMessageBoxDlg::CMessageBoxDlg(CIrcProto *_pro, DCCINFO *_dci)
 -	: CProtoDlgBase<CIrcProto>(_pro, IDD_MESSAGEBOX),
 +CMessageBoxDlg::CMessageBoxDlg(CIrcProto *_pro, DCCINFO *_dci) :
 +	CIrcBaseDlg(_pro, IDD_MESSAGEBOX),
  	pdci(_dci)
  {
  }
 @@ -244,8 +244,8 @@ bool CNickDlg::OnApply()  #define LIST_TIMER 10
 -CListDlg::CListDlg(CIrcProto *_pro)
 -	: CProtoDlgBase<CIrcProto>(_pro, IDD_LIST),
 +CListDlg::CListDlg(CIrcProto *_pro) :
 +	CIrcBaseDlg(_pro, IDD_LIST),
  	m_Join(this, IDC_JOIN),
  	m_list(this, IDC_INFO_LISTVIEW),
  	m_list2(this, IDC_INFO_LISTVIEW2),
 @@ -546,157 +546,6 @@ bool CJoinDlg::OnApply()  }
  /////////////////////////////////////////////////////////////////////////////////////////
 -// 'Quick' dialog
 -
 -CQuickDlg::CQuickDlg(CIrcProto *_pro)
 -	: CCoolIrcDlg(_pro, IDD_QUICKCONN),
 -	m_serverCombo(this, IDC_SERVERCOMBO)
 -{
 -	m_serverCombo.OnChange = Callback(this, &CQuickDlg::OnServerCombo);
 -}
 -
 -bool CQuickDlg::OnInitDialog()
 -{
 -	CCoolIrcDlg::OnInitDialog();
 -
 -	if (g_servers.getCount() > 0) {
 -		for (auto &si : g_servers)
 -			m_serverCombo.AddStringA(si->m_name, (LPARAM)si);
 -	}
 -	else EnableWindow(GetDlgItem(m_hwnd, IDOK), false);
 -
 -	CMStringA szName(FORMAT, "---- %s ----", Translate("Not listed server"));
 -	m_si = new SERVER_INFO;
 -	m_si->m_group = mir_strdup("");
 -	m_si->m_name = szName.Detach();
 -
 -	DBVARIANT dbv;
 -	if (!m_proto->getString("ServerName", &dbv)) {
 -		m_si->m_address = mir_strdup(dbv.pszVal);
 -		db_free(&dbv);
 -	}
 -	else m_si->m_address = mir_strdup(Translate("Type new server address here"));
 -
 -	if (!m_proto->getString("PortStart", &dbv)) {
 -		m_si->m_portStart = atoi(dbv.pszVal);
 -		db_free(&dbv);
 -	}
 -	else m_si->m_portStart = 6667;
 -
 -	if (!m_proto->getString("PortEnd", &dbv)) {
 -		m_si->m_portEnd = atoi(dbv.pszVal);
 -		db_free(&dbv);
 -	}
 -	else m_si->m_portEnd = 6667;
 -
 -	m_si->m_iSSL = m_proto->getByte("UseSSL", 0);
 -
 -	m_serverCombo.AddStringA(m_si->m_name, (LPARAM)m_si);
 -
 -	if (m_proto->m_quickComboSelection != -1) {
 -		m_serverCombo.SetCurSel(m_proto->m_quickComboSelection);
 -		OnServerCombo(nullptr);
 -	}
 -	else EnableWindow(GetDlgItem(m_hwnd, IDOK), false);
 -	return true;
 -}
 -
 -void CQuickDlg::OnDestroy()
 -{
 -	CCoolIrcDlg::OnDestroy();
 -
 -	delete m_si;
 -	m_proto->m_quickDlg = nullptr;
 -}
 -
 -bool CQuickDlg::OnApply()
 -{
 -	GetDlgItemTextA(m_hwnd, IDC_SERVER, m_proto->m_serverName, _countof(m_proto->m_serverName));
 -	GetDlgItemTextA(m_hwnd, IDC_PORT, m_proto->m_portStart, _countof(m_proto->m_portStart));
 -	GetDlgItemTextA(m_hwnd, IDC_PORT2, m_proto->m_portEnd, _countof(m_proto->m_portEnd));
 -	GetDlgItemTextA(m_hwnd, IDC_PASS, m_proto->m_password, _countof(m_proto->m_password));
 -
 -	int i = m_serverCombo.GetCurSel();
 -	SERVER_INFO* pData = (SERVER_INFO*)m_serverCombo.GetItemData(i);
 -	if (pData && (INT_PTR)pData != CB_ERR) {
 -		mir_strcpy(m_proto->m_network, pData->m_group);
 -		pData->m_iSSL = 0;
 -		if (IsDlgButtonChecked(m_hwnd, IDC_SSL_ON))
 -			pData->m_iSSL = 2;
 -		if (IsDlgButtonChecked(m_hwnd, IDC_SSL_AUTO))
 -			pData->m_iSSL = 1;
 -		m_proto->m_iSSL = pData->m_iSSL;
 -	}
 -
 -	wchar_t windowname[20];
 -	GetWindowText(m_hwnd, windowname, _countof(windowname));
 -	if (mir_wstrcmpi(windowname, L"Miranda IRC") == 0) {
 -		m_proto->m_serverComboSelection = m_serverCombo.GetCurSel() - 1;
 -		m_proto->setDword("ServerComboSelection", m_proto->m_serverComboSelection);
 -		m_proto->setString("ServerName", m_proto->m_serverName);
 -		m_proto->setString("PortStart", m_proto->m_portStart);
 -		m_proto->setString("PortEnd", m_proto->m_portEnd);
 -		m_proto->setString("Password", m_proto->m_password);
 -		m_proto->setString("Network", m_proto->m_network);
 -		m_proto->setByte("UseSSL", m_proto->m_iSSL);
 -	}
 -	m_proto->m_quickComboSelection = m_serverCombo.GetCurSel();
 -	m_proto->setDword("QuickComboSelection", m_proto->m_quickComboSelection);
 -	m_proto->DisconnectFromServer();
 -	m_proto->ConnectToServer();
 -	return true;
 -}
 -
 -void CQuickDlg::OnServerCombo(CCtrlData*)
 -{
 -	int i = m_serverCombo.GetCurSel();
 -	if (i == CB_ERR)
 -		return;
 -
 -	SERVER_INFO* pData = (SERVER_INFO*)m_serverCombo.GetItemData(i);
 -	SetDlgItemTextA(m_hwnd, IDC_SERVER, pData->m_address);
 -	SetDlgItemTextA(m_hwnd, IDC_PASS, "");
 -	SetDlgItemInt(m_hwnd, IDC_PORT, pData->m_portStart, FALSE);
 -	SetDlgItemInt(m_hwnd, IDC_PORT2, pData->m_portEnd, FALSE);
 -
 -	if (pData->m_iSSL == 0) {
 -		CheckDlgButton(m_hwnd, IDC_SSL_OFF, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_SSL_AUTO, BST_UNCHECKED);
 -		CheckDlgButton(m_hwnd, IDC_SSL_ON, BST_UNCHECKED);
 -	}
 -	if (pData->m_iSSL == 1) {
 -		CheckDlgButton(m_hwnd, IDC_SSL_AUTO, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_SSL_OFF, BST_UNCHECKED);
 -		CheckDlgButton(m_hwnd, IDC_SSL_ON, BST_UNCHECKED);
 -	}
 -	if (pData->m_iSSL == 2) {
 -		CheckDlgButton(m_hwnd, IDC_SSL_ON, BST_CHECKED);
 -		CheckDlgButton(m_hwnd, IDC_SSL_OFF, BST_UNCHECKED);
 -		CheckDlgButton(m_hwnd, IDC_SSL_AUTO, BST_UNCHECKED);
 -	}
 -
 -	CMStringA szDefault(FORMAT, "---- %s ----", Translate("Not listed server"));
 -	if (!mir_strcmp(pData->m_name, szDefault)) {
 -		SendDlgItemMessage(m_hwnd, IDC_SERVER, EM_SETREADONLY, false, 0);
 -		SendDlgItemMessage(m_hwnd, IDC_PORT, EM_SETREADONLY, false, 0);
 -		SendDlgItemMessage(m_hwnd, IDC_PORT2, EM_SETREADONLY, false, 0);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_SSL_OFF), TRUE);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_SSL_AUTO), TRUE);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_SSL_ON), TRUE);
 -	}
 -	else {
 -		SendDlgItemMessage(m_hwnd, IDC_SERVER, EM_SETREADONLY, true, 0);
 -		SendDlgItemMessage(m_hwnd, IDC_PORT, EM_SETREADONLY, true, 0);
 -		SendDlgItemMessage(m_hwnd, IDC_PORT2, EM_SETREADONLY, true, 0);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_SSL_OFF), FALSE);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_SSL_AUTO), FALSE);
 -		EnableWindow(GetDlgItem(m_hwnd, IDC_SSL_ON), FALSE);
 -	}
 -
 -	EnableWindow(GetDlgItem(m_hwnd, IDOK), true);
 -}
 -
 -/////////////////////////////////////////////////////////////////////////////////////////
  // 'Question' dialog
  CQuestionDlg::CQuestionDlg(CIrcProto *_pro, CManagerDlg *owner) :
 @@ -921,7 +770,7 @@ bool CManagerDlg::OnClose()  	}
  	if (!S.IsEmpty() && m_proto->IsConnected()) {
 -		mir_snwprintf(temp, L"Topic%s%s", window, m_proto->m_info.sNetwork.c_str());
 +		mir_snwprintf(temp, L"Topic%s", window);
  		char* p = mir_u2a(temp);
  		m_proto->setWString(p, S.c_str());
  		mir_free(p);
 @@ -1277,7 +1126,7 @@ void CManagerDlg::InitManager(int mode, const wchar_t* window)  	if (wi) {
  		if (m_proto->IsConnected()) {
  			wchar_t temp[1000];
 -			mir_snwprintf(temp, L"Topic%s%s", window, m_proto->m_info.sNetwork.c_str());
 +			mir_snwprintf(temp, L"Topic%s", window);
  			char* p = mir_u2a(temp);
 @@ -1370,8 +1219,8 @@ void CManagerDlg::InitManager(int mode, const wchar_t* window)  /////////////////////////////////////////////////////////////////////////////////////////
  // 'cool' dialog
 -CCoolIrcDlg::CCoolIrcDlg(CIrcProto* _pro, int dlgId)
 -	: CProtoDlgBase<CIrcProto>(_pro, dlgId)
 +CCoolIrcDlg::CCoolIrcDlg(CIrcProto* _pro, int dlgId) :
 +	CIrcBaseDlg(_pro, dlgId)
  {}
  bool CCoolIrcDlg::OnInitDialog()
 | 
