1 /*
2  *      configdialog.cpp
3  *
4  *      Copyright 2008 David Vachulka <arch_dvx@users.sourceforge.net>
5  *      Copyright (C) 2004-2005 Sander Jansen (some code)
6  *
7  *      This program is free software; you can redistribute it and/or modify
8  *      it under the terms of the GNU General Public License as published by
9  *      the Free Software Foundation; either version 2 of the License, or
10  *      (at your option) any later version.
11  *
12  *      This program is distributed in the hope that it will be useful,
13  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *      GNU General Public License for more details.
16  *
17  *      You should have received a copy of the GNU General Public License
18  *      along with this program; if not, write to the Free Software
19  *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20  *      MA 02110-1301, USA.
21  */
22 
23 #include "configdialog.h"
24 #include "keybindingsdialog.h"
25 #include "config.h"
26 #include "i18n.h"
27 #include "icons.h"
28 #include "dxutils.h"
29 #include "dxirc.h"
30 
31 #define MAXBUFFER 2000
32 #define MAXVALUE  2000
33 #define HEADER "# dxirc smiley settings\n# path is relative to file\n# Example: /home/xxx/smile.png=:)\n"
34 #define preferences dxirc::instance()->getPreferences()
35 
createIconFromName(FXApp * app,const FXString & path)36 static FXIcon *createIconFromName(FXApp *app, const FXString& path)
37 {
38     FXIconSource iconsource(app);
39     FXIcon *icon = NULL;
40     if(!FXStat::exists(path))
41         return NULL;
42     icon = iconsource.loadScaledIconFile(path,16);
43     if(icon)
44     {
45         icon->blend(app->getBaseColor());
46         icon->create();
47         return icon;
48     }
49     return NULL;
50 }
51 
updateLabelIcon(FXApp * app,FXLabel * label,const FXString & path)52 static void updateLabelIcon(FXApp* app, FXLabel* label, const FXString& path)
53 {
54     FXIconSource iconsource(app);
55     FXIcon *icon = NULL;
56     if(label->getIcon())
57     {
58         icon = label->getIcon();
59         label->setIcon(NULL);
60         delete icon;
61         icon = NULL;
62     }
63     icon = iconsource.loadScaledIconFile(path,16);
64     if(icon)
65     {
66         icon->blend(app->getBaseColor());
67         icon->create();
68         label->setIcon(icon);
69     }
70 }
71 
72 // Check if quotes are needed
needquotes(const FXchar * text)73 static bool needquotes(const FXchar* text)
74 {
75     const FXchar *ptr=text;
76     FXuchar c;
77     while((c=*ptr++)!='\0')
78     {
79         if(0x7f<=c || c<0x20 || c=='"' || c=='\'' || c=='\\' || (c==' ' && (ptr==(text+1) || *ptr=='\0'))) return true;
80     }
81     return false;
82 }
83 
84 // Read string
readString(FXFile & file,FXchar * buffer,FXint & bol,FXint & eol,FXint & end)85 static bool readString(FXFile& file, FXchar *buffer, FXint& bol, FXint& eol, FXint& end)
86 {
87     FXint n;
88     do
89     {
90         if(eol >= end)
91         {
92             if(bol < end)
93             {
94                 memmove(buffer, buffer + bol, end - bol);
95             }
96             end = end - bol;
97             bol = 0;
98             eol = end;
99             n = file.readBlock(buffer + end, MAXBUFFER - end);
100             if(n < 0) return false;
101             end += n;
102         }
103     } while (eol < end && buffer[eol++] != '\n');
104     return bol<eol;
105 }
106 
107 // Write string
writeString(FXFile & file,const FXchar * string)108 static bool writeString(FXFile& file, const FXchar* string)
109 {
110     FXint len = strlen(string);
111     return file.writeBlock(string, len) == len;
112 }
113 
114 FXDEFMAP(SmileyDialog) SmileyDialogMap[] = {
115     FXMAPFUNC(SEL_COMMAND, SmileyDialog_ACCEPT, SmileyDialog::onAccept),
116     FXMAPFUNC(SEL_COMMAND, SmileyDialog_CANCEL, SmileyDialog::onCancel),
117     FXMAPFUNC(SEL_COMMAND, SmileyDialog_PATH, SmileyDialog::onPath)
118 };
119 
FXIMPLEMENT(SmileyDialog,FXDialogBox,SmileyDialogMap,ARRAYNUMBER (SmileyDialogMap))120 FXIMPLEMENT(SmileyDialog, FXDialogBox, SmileyDialogMap, ARRAYNUMBER(SmileyDialogMap))
121 
122 SmileyDialog::SmileyDialog(FXWindow* owner, FXString title, FXString smiley, FXString path)
123         : FXDialogBox(owner, title, DECOR_RESIZE|DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0)
124 {
125     FXHorizontalFrame *closeframe = new FXHorizontalFrame(this, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH);
126     new dxEXButton(closeframe, _("&Cancel"), NULL, this, SmileyDialog_CANCEL, LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0,0,0,0, 10,10,2,2);
127     dxEXButton *ok = new dxEXButton(closeframe, _("&OK"), NULL, this, SmileyDialog_ACCEPT, BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0,0,0,0, 10,10,2,2);
128     ok->addHotKey(KEY_Return);
129 
130     FXMatrix *matrix = new FXMatrix(this,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
131     new FXLabel(matrix, _("Smiley:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
132     m_smileyText = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
133     if(!smiley.empty()) m_smileyText->setText(smiley);
134     new FXLabel(matrix, _("Path:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
135     FXHorizontalFrame *pathframe = new FXHorizontalFrame(matrix, LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,0,0, 0,0,0,0);
136     m_pathText = new FXTextField(pathframe, 25, NULL, 0, TEXTFIELD_READONLY|FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X);
137     m_pathText->setBackColor(getApp()->getBaseColor());
138     if(!path.empty()) m_pathText->setText(path);
139     m_pathButton = new dxEXButton(pathframe, "...", NULL, this, SmileyDialog_PATH, FRAME_RAISED|FRAME_THICK);
140     new FXLabel(matrix, _("Preview:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
141     m_previewLabel = new FXLabel(matrix, "", path.empty() ? NULL : createIconFromName(getApp(), path), JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
142 }
143 
~SmileyDialog()144 SmileyDialog::~SmileyDialog()
145 {
146 
147 }
148 
onAccept(FXObject *,FXSelector,void *)149 long SmileyDialog::onAccept(FXObject*, FXSelector, void*)
150 {
151     getApp()->stopModal(this,TRUE);
152     hide();
153     return 1;
154 }
155 
onCancel(FXObject *,FXSelector,void *)156 long SmileyDialog::onCancel(FXObject*, FXSelector, void*)
157 {
158     getApp()->stopModal(this,FALSE);
159     hide();
160     return 1;
161 }
162 
onPath(FXObject *,FXSelector,void *)163 long SmileyDialog::onPath(FXObject*, FXSelector, void*)
164 {
165     dxEXFileDialog dialog(this, _("Select file"));
166     if(!m_pathText->getText().empty()) dialog.setFilename(m_pathText->getText());
167     else dialog.setFilename((FXString)DXIRC_DATADIR+PATHSEPSTRING+"icons"+PATHSEPSTRING+"smileys"+PATHSEPSTRING);
168     if(dialog.execute())
169     {
170         m_pathText->setText(dialog.getFilename());
171         updateLabelIcon(getApp(), m_previewLabel, dialog.getFilename());
172     }
173     return 1;
174 }
175 
iconExist()176 FXbool SmileyDialog::iconExist()
177 {
178     if(m_previewLabel->getIcon()) return TRUE;
179     return FALSE;
180 }
181 
182 FXDEFMAP(ConfigDialog) ConfigDialogMap[] = {
183     FXMAPFUNC(SEL_COMMAND, ConfigDialog_CLOSE, ConfigDialog::onClose),
184     FXMAPFUNC(SEL_SELECTED, ConfigDialog_COMMAND, ConfigDialog::onCommandsSelected),
185     FXMAPFUNC(SEL_DESELECTED, ConfigDialog_COMMAND, ConfigDialog::onCommandsDeselected),
186     FXMAPFUNC(SEL_COMMAND, ConfigDialog_ADDCOMMAND, ConfigDialog::onAddCommand),
187     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DELETECOMMAND, ConfigDialog::onDeleteCommand),
188     FXMAPFUNC(SEL_COMMAND, ConfigDialog_ADDUSER, ConfigDialog::onAddUser),
189     FXMAPFUNC(SEL_COMMAND, ConfigDialog_MODIFYUSER, ConfigDialog::onModifyUser),
190     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DELETEUSER, ConfigDialog::onDeleteUser),
191     FXMAPFUNC(SEL_COMMAND, ConfigDialog_ADDFRIEND, ConfigDialog::onAddFriend),
192     FXMAPFUNC(SEL_COMMAND, ConfigDialog_MODIFYFRIEND, ConfigDialog::onModifyFriend),
193     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DELETEFRIEND, ConfigDialog::onDeleteFriend),
194     FXMAPFUNC(SEL_COMMAND, ConfigDialog_ICONS, ConfigDialog::onIconsChanged),
195     FXMAPFUNC(SEL_COMMAND, ConfigDialog_ADDICONS, ConfigDialog::onAddIcons),
196     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DELETEICONS, ConfigDialog::onDeleteIcons),
197     FXMAPFUNC(SEL_COMMAND, ConfigDialog_TRAY, ConfigDialog::onTray),
198     FXMAPFUNC(SEL_COMMAND, ConfigDialog_LOG, ConfigDialog::onLogChanged),
199     FXMAPFUNC(SEL_COMMAND, ConfigDialog_LOGPATH, ConfigDialog::onPathSelect),
200     FXMAPFUNC(SEL_COMMAND, ConfigDialog_AUTOLOAD, ConfigDialog::onAutoloadChanged),
201     FXMAPFUNC(SEL_COMMAND, ConfigDialog_AUTOLOADPATH, ConfigDialog::onAutoloadPathSelect),
202     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DCCPATH, ConfigDialog::onDccPathSelect),
203     FXMAPFUNC(SEL_CHANGED, ConfigDialog_NICK, ConfigDialog::onNickCharChanged),
204     FXMAPFUNC(SEL_COMMAND, ConfigDialog_RECONNECT, ConfigDialog::onReconnect),
205     FXMAPFUNC(SEL_COMMAND, ConfigDialog_IRCCOLORS, ConfigDialog::onColor),
206     FXMAPFUNC(SEL_CHANGED, ConfigDialog_IRCCOLORS, ConfigDialog::onColor),
207     FXMAPFUNC(SEL_COMMAND, ConfigDialog_COLORS, ConfigDialog::onThemeColorChanged),
208     FXMAPFUNC(SEL_CHANGED, ConfigDialog_COLORS, ConfigDialog::onThemeColorChanged),
209     FXMAPFUNC(SEL_COMMAND, ConfigDialog_TABCOLORS, ConfigDialog::onTabColorChanged),
210     FXMAPFUNC(SEL_CHANGED, ConfigDialog_TABCOLORS, ConfigDialog::onTabColorChanged),
211     FXMAPFUNC(SEL_COMMAND, ConfigDialog_THEME, ConfigDialog::onTheme),
212     FXMAPFUNC(SEL_COMMAND, ConfigDialog_FONT, ConfigDialog::onFont),
213     FXMAPFUNC(SEL_COMMAND, ConfigDialog_IRCFONT, ConfigDialog::onIrcFont),
214     FXMAPFUNC(SEL_COMMAND, ConfigDialog_TABPOS, ConfigDialog::onTabPosition),
215     FXMAPFUNC(SEL_COMMAND, ConfigDialog_NOTIFYPOS, ConfigDialog::onNotifyPosition),
216     FXMAPFUNC(SEL_SELECTED, ConfigDialog_USER, ConfigDialog::onUsersSelected),
217     FXMAPFUNC(SEL_DESELECTED, ConfigDialog_USER, ConfigDialog::onUsersDeselected),
218     FXMAPFUNC(SEL_CHANGED, ConfigDialog_USER, ConfigDialog::onUsersChanged),
219     FXMAPFUNC(SEL_SELECTED, ConfigDialog_FRIEND, ConfigDialog::onFriendsSelected),
220     FXMAPFUNC(SEL_DESELECTED, ConfigDialog_FRIEND, ConfigDialog::onFriendsDeselected),
221     FXMAPFUNC(SEL_CHANGED, ConfigDialog_FRIEND, ConfigDialog::onFriendsChanged),
222     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DCCPORTD, ConfigDialog::onDccPortD),
223     FXMAPFUNC(SEL_CHANGED, ConfigDialog_DCCPORTD, ConfigDialog::onDccPortD),
224     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DCCPORTH, ConfigDialog::onDccPortH),
225     FXMAPFUNC(SEL_CHANGED, ConfigDialog_DCCPORTH, ConfigDialog::onDccPortH),
226     FXMAPFUNC(SEL_COMMAND, ConfigDialog_SOUNDS, ConfigDialog::onSounds),
227     FXMAPFUNC(SEL_COMMAND, ConfigDialog_SOUNDCONNECT, ConfigDialog::onSoundConnect),
228     FXMAPFUNC(SEL_COMMAND, ConfigDialog_SOUNDDISCONNECT, ConfigDialog::onSoundDisconnect),
229     FXMAPFUNC(SEL_COMMAND, ConfigDialog_SOUNDMESSAGE, ConfigDialog::onSoundMessage),
230     FXMAPFUNCS(SEL_COMMAND, ConfigDialog_PLAYCONNECT, ConfigDialog_PLAYMESSAGE, ConfigDialog::onPlay),
231     FXMAPFUNCS(SEL_COMMAND, ConfigDialog_SELECTCONNECT, ConfigDialog_SELECTMESSAGE, ConfigDialog::onSelectPath),
232     FXMAPFUNC(SEL_COMMAND, ConfigDialog_NOTIFY, ConfigDialog::onNotify),
233     FXMAPFUNC(SEL_COMMAND, ConfigDialog_SHOWNOTIFY, ConfigDialog::onShowNotify),
234     FXMAPFUNC(SEL_COMMAND, ConfigDialog_USESMILEYS, ConfigDialog::onUseSmileys),
235     FXMAPFUNC(SEL_COMMAND, ConfigDialog_ADDSMILEY, ConfigDialog::onAddSmiley),
236     FXMAPFUNC(SEL_COMMAND, ConfigDialog_MODIFYSMILEY, ConfigDialog::onModifySmiley),
237     FXMAPFUNC(SEL_DOUBLECLICKED, ConfigDialog_SMILEY, ConfigDialog::onModifySmiley),
238     FXMAPFUNC(SEL_COMMAND, ConfigDialog_DELETESMILEY, ConfigDialog::onDeleteSmiley),
239     FXMAPFUNC(SEL_COMMAND, ConfigDialog_IMPORTSMILEY, ConfigDialog::onImportSmiley),
240     FXMAPFUNC(SEL_COMMAND, ConfigDialog_EXPORTSMILEY, ConfigDialog::onExportSmiley),
241     FXMAPFUNC(SEL_COMMAND, ConfigDialog_LOADLOG, ConfigDialog::onLoadLog),
242     FXMAPFUNC(SEL_MOUSEWHEEL, ConfigDialog_TABS, ConfigDialog::onMouseWheel),
243     FXMAPFUNC(SEL_COMMAND, ConfigDialog_MODIFYBINDINGS, ConfigDialog::onModifyBindings),
244     FXMAPFUNC(SEL_COMMAND, ConfigDialog_REFRESHBINDINGS, ConfigDialog::onRefreshBindings)
245 };
246 
FXIMPLEMENT(ConfigDialog,FXDialogBox,ConfigDialogMap,ARRAYNUMBER (ConfigDialogMap))247 FXIMPLEMENT(ConfigDialog, FXDialogBox, ConfigDialogMap, ARRAYNUMBER(ConfigDialogMap))
248 
249 ConfigDialog::ConfigDialog(FXMainWindow *owner)
250     : FXDialogBox(owner, _("Preferences"), DECOR_RESIZE|DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0), m_owner(owner)
251 {
252     m_preferences = preferences;
253     //create m_ircFont
254     if(!m_preferences.m_ircFont.empty())
255     {
256         m_ircFont = new FXFont(getApp(), m_preferences.m_ircFont);
257         m_ircFont->create();
258     }
259     else
260     {
261         getApp()->getNormalFont()->create();
262         FXFontDesc fontdescription;
263         getApp()->getNormalFont()->getFontDesc(fontdescription);
264         m_ircFont = new FXFont(getApp(),fontdescription);
265         m_ircFont->create();
266     }
267     //set theme
268     m_themeCurrent = m_preferences.m_appTheme;
269 
270     m_showImportwarning = TRUE;
271 
272     //General settings tab
273     m_targetOneInstance.connect(m_preferences.m_oneInstance);
274     m_targetDisableSortTabs.connect(m_preferences.m_disableSortTabs);
275     m_targetReconnect.connect(m_preferences.m_reconnect);
276     m_targetReconnect.setTarget(this);
277     m_targetReconnect.setSelector(ConfigDialog_RECONNECT);
278     m_targetNumberAttempt.connect(m_preferences.m_numberAttempt);
279     m_targetDelayAttempt.connect(m_preferences.m_delayAttempt);
280     m_targetJoinDelay.connect(m_preferences.m_joinDelay);
281     m_targetMaxAway.connect(m_preferences.m_maxAway);
282     m_targetUseTray.connect(m_preferences.m_useTray);
283     m_targetUseTray.setTarget(this);
284     m_targetUseTray.setSelector(ConfigDialog_TRAY);
285     m_targetCloseToTray.connect(m_preferences.m_closeToTray);
286     m_targetUseSpell.connect(m_preferences.m_useSpell);
287     m_targetOwnServerWindow.connect(m_preferences.m_ownServerWindow);
288     m_targetLogging.connect(m_preferences.m_logging);
289     m_targetLogging.setTarget(this);
290     m_targetLogging.setSelector(ConfigDialog_LOG);
291     m_targetLogPath.connect(m_preferences.m_logPath);
292     m_targetAutoload.connect(m_preferences.m_autoload);
293     m_targetAutoload.setTarget(this);
294     m_targetAutoload.setSelector(ConfigDialog_AUTOLOAD);
295     m_targetAutoloadPath.connect(m_preferences.m_autoloadPath);
296 
297     //Look settings tab
298     m_targetThemeBack.connect(m_themeCurrent.back);
299     m_targetThemeBack.setTarget(this);
300     m_targetThemeBack.setSelector(ConfigDialog_COLORS);
301     m_targetThemeBase.connect(m_themeCurrent.base);
302     m_targetThemeBase.setTarget(this);
303     m_targetThemeBase.setSelector(ConfigDialog_COLORS);
304     m_targetThemeBorder.connect(m_themeCurrent.border);
305     m_targetThemeBorder.setTarget(this);
306     m_targetThemeBorder.setSelector(ConfigDialog_COLORS);
307     m_targetThemeFore.connect(m_themeCurrent.fore);
308     m_targetThemeFore.setTarget(this);
309     m_targetThemeFore.setSelector(ConfigDialog_COLORS);
310     m_targetThemeMenuback.connect(m_themeCurrent.menuback);
311     m_targetThemeMenuback.setTarget(this);
312     m_targetThemeMenuback.setSelector(ConfigDialog_COLORS);
313     m_targetThemeMenufore.connect(m_themeCurrent.menufore);
314     m_targetThemeMenufore.setTarget(this);
315     m_targetThemeMenufore.setSelector(ConfigDialog_COLORS);
316     m_targetThemeSelback.connect(m_themeCurrent.selback);
317     m_targetThemeSelback.setTarget(this);
318     m_targetThemeSelback.setSelector(ConfigDialog_COLORS);
319     m_targetThemeSelfore.connect(m_themeCurrent.selfore);
320     m_targetThemeSelfore.setTarget(this);
321     m_targetThemeSelfore.setSelector(ConfigDialog_COLORS);
322     m_targetThemeTipback.connect(m_themeCurrent.tipback);
323     m_targetThemeTipback.setTarget(this);
324     m_targetThemeTipback.setSelector(ConfigDialog_COLORS);
325     m_targetThemeTipfore.connect(m_themeCurrent.tipfore);
326     m_targetThemeTipfore.setTarget(this);
327     m_targetThemeTipfore.setSelector(ConfigDialog_COLORS);
328 
329     m_targetThemeNotifyback.connect(m_themeCurrent.notifyback);
330     m_targetThemeNotifyback.setTarget(this);
331     m_targetThemeNotifyback.setSelector(ConfigDialog_COLORS);
332     m_targetThemeNotifyfore.connect(m_themeCurrent.notifyfore);
333     m_targetThemeNotifyfore.setTarget(this);
334     m_targetThemeNotifyfore.setSelector(ConfigDialog_COLORS);
335     m_targetTrayColor.connect(m_preferences.m_trayColor);
336     m_targetUnreadColor.connect(m_preferences.m_unreadColor);
337     m_targetUnreadColor.setTarget(this);
338     m_targetUnreadColor.setSelector(ConfigDialog_TABCOLORS);
339     m_targetHighlightColor.connect(m_preferences.m_highlightColor);
340     m_targetHighlightColor.setTarget(this);
341     m_targetHighlightColor.setSelector(ConfigDialog_TABCOLORS);
342 
343     //Irc Text settings tab
344     m_targetIrccolorsText.connect(m_preferences.m_colors.text);
345     m_targetIrccolorsText.setTarget(this);
346     m_targetIrccolorsText.setSelector(ConfigDialog_IRCCOLORS);
347     m_targetIrccolorsBack.connect(m_preferences.m_colors.back);
348     m_targetIrccolorsBack.setTarget(this);
349     m_targetIrccolorsBack.setSelector(ConfigDialog_IRCCOLORS);
350     m_targetIrccolorsUser.connect(m_preferences.m_colors.user);
351     m_targetIrccolorsUser.setTarget(this);
352     m_targetIrccolorsUser.setSelector(ConfigDialog_IRCCOLORS);
353     m_targetIrccolorsAction.connect(m_preferences.m_colors.action);
354     m_targetIrccolorsAction.setTarget(this);
355     m_targetIrccolorsAction.setSelector(ConfigDialog_IRCCOLORS);
356     m_targetIrccolorsNotice.connect(m_preferences.m_colors.notice);
357     m_targetIrccolorsNotice.setTarget(this);
358     m_targetIrccolorsNotice.setSelector(ConfigDialog_IRCCOLORS);
359     m_targetIrccolorsError.connect(m_preferences.m_colors.error);
360     m_targetIrccolorsError.setTarget(this);
361     m_targetIrccolorsError.setSelector(ConfigDialog_IRCCOLORS);
362     m_targetIrccolorsHilight.connect(m_preferences.m_colors.hilight);
363     m_targetIrccolorsHilight.setTarget(this);
364     m_targetIrccolorsHilight.setSelector(ConfigDialog_IRCCOLORS);
365     m_targetIrccolorsLink.connect(m_preferences.m_colors.link);
366     m_targetIrccolorsLink.setTarget(this);
367     m_targetIrccolorsLink.setSelector(ConfigDialog_IRCCOLORS);
368     m_targetIrccolorsMymsg.connect(m_preferences.m_colors.mymsg);
369     m_targetIrccolorsMymsg.setTarget(this);
370     m_targetIrccolorsMymsg.setSelector(ConfigDialog_IRCCOLORS);
371     m_targetIrccolorsLog.connect(m_preferences.m_colors.log);
372     m_targetIrccolorsLog.setTarget(this);
373     m_targetIrccolorsLog.setSelector(ConfigDialog_IRCCOLORS);
374     m_targetSameCmd.connect(m_preferences.m_sameCmd);
375     m_targetSameList.connect(m_preferences.m_sameList);
376     m_targetColoredNick.connect(m_preferences.m_coloredNick);
377     m_targetStripColors.connect(m_preferences.m_stripColors);
378     m_targetLoadLog.connect(m_preferences.m_loadLog);
379     m_targetLoadLog.setTarget(this);
380     m_targetLoadLog.setSelector(ConfigDialog_LOADLOG);
381     m_targetLoadLine.connect(m_preferences.m_loadLines);
382 
383     //NickList settings tab
384     m_targetSortUserMode.connect(m_preferences.m_sortUserMode);
385 
386     //DCC settings
387     m_targetDccPath.connect(m_preferences.m_dccPath);
388     FXRex rex("\\l");
389     if(m_preferences.m_dccIP.empty() || m_preferences.m_dccIP.contains('.')!=3 || rex.match(m_preferences.m_dccIP))
390     {
391         m_dccIP1 = "";
392         m_dccIP2 = "";
393         m_dccIP3 = "";
394         m_dccIP4 = "";
395     }
396     else
397     {
398         m_dccIP1 = m_preferences.m_dccIP.section('.',0);
399         m_dccIP2 = m_preferences.m_dccIP.section('.',1);
400         m_dccIP3 = m_preferences.m_dccIP.section('.',2);
401         m_dccIP4 = m_preferences.m_dccIP.section('.',3);
402     }
403     m_targetDccIP1.connect(m_dccIP1);
404     m_targetDccIP2.connect(m_dccIP2);
405     m_targetDccIP3.connect(m_dccIP3);
406     m_targetDccIP4.connect(m_dccIP4);
407     m_targetDccPortD.connect(m_preferences.m_dccPortD);
408     m_targetDccPortD.setTarget(this);
409     m_targetDccPortD.setSelector(ConfigDialog_DCCPORTD);
410     m_targetDccPortH.connect(m_preferences.m_dccPortH);
411     m_targetDccPortH.setTarget(this);
412     m_targetDccPortH.setSelector(ConfigDialog_DCCPORTH);
413     m_targetDccTimeout.connect(m_preferences.m_dccTimeout);
414     m_targetAutoDccChat.connect(m_preferences.m_autoDccChat);
415     m_targetAutoDccFile.connect(m_preferences.m_autoDccFile);
416 
417     //Notification settings tab
418     m_targetSound.connect(m_preferences.m_sounds);
419     m_targetSound.setTarget(this);
420     m_targetSound.setSelector(ConfigDialog_SOUNDS);
421     m_targetSoundConnect.connect(m_preferences.m_soundConnect);
422     m_targetSoundConnect.setTarget(this);
423     m_targetSoundConnect.setSelector(ConfigDialog_SOUNDCONNECT);
424     m_targetSoundDisconnect.connect(m_preferences.m_soundDisconnect);
425     m_targetSoundDisconnect.setTarget(this);
426     m_targetSoundDisconnect.setSelector(ConfigDialog_SOUNDDISCONNECT);
427     m_targetSoundMessage.connect(m_preferences.m_soundMessage);
428     m_targetSoundMessage.setTarget(this);
429     m_targetSoundMessage.setSelector(ConfigDialog_SOUNDMESSAGE);
430     m_targetPathConnect.connect(m_preferences.m_pathConnect);
431     m_targetPathDisconnect.connect(m_preferences.m_pathDisconnect);
432     m_targetPathMessage.connect(m_preferences.m_pathMessage);
433     m_targetNotify.connect(m_preferences.m_notify);
434     m_targetNotify.setTarget(this);
435     m_targetNotify.setSelector(ConfigDialog_NOTIFY);
436     m_targetNotifyConnect.connect(m_preferences.m_notifyConnect);
437     m_targetNotifyDisconnect.connect(m_preferences.m_notifyDisconnect);
438     m_targetNotifyMessage.connect(m_preferences.m_notifyMessage);
439     m_targetNotifyTray.connect(m_preferences.m_notifyTray);
440 
441     //Smileys settings tab
442     m_targetUseSmileys.connect(m_preferences.m_useSmileys);
443     m_targetUseSmileys.setTarget(this);
444     m_targetUseSmileys.setSelector(ConfigDialog_USESMILEYS);
445 
446     getApp()->getNormalFont()->create();
447     FXFontDesc fontdescription;
448     getApp()->getNormalFont()->getFontDesc(fontdescription);
449     m_font = new FXFont(getApp(),fontdescription);
450     m_font->create();
451 
452     FXHorizontalFrame *closeframe = new FXHorizontalFrame(this, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH);
453     dxEXButton *ok = new dxEXButton(closeframe, _("&Save&&Close"), NULL, this, ConfigDialog_CLOSE, BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0,0,0,0, 10,10,2,2);
454     ok->addHotKey(KEY_Return);
455     new dxEXButton(closeframe, _("&Cancel"), NULL, this, FXDialogBox::ID_CANCEL, LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0,0,0,0, 10,10,2,2);
456 
457     FXVerticalFrame *contents = new FXVerticalFrame(this, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
458     m_tabbook = new dxTabBook(contents, this, ConfigDialog_TABS, PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y);
459     m_tabbook->setTabStyle(TABBOOK_LEFTTABS);
460 
461     createGeneralTab(m_tabbook);
462     createLookTab(m_tabbook);
463     createIrctextTab(m_tabbook);
464     createNicklistTab(m_tabbook);
465     createIgnoreTab(m_tabbook);
466     createDccTab(m_tabbook);
467     createNotificationTab(m_tabbook);
468     createSmileysTab(m_tabbook);
469     createKeybindingsTab(m_tabbook);
470 
471     updateColors();
472     updateFont();
473     updateIrcFont();
474 }
475 
476 
~ConfigDialog()477 ConfigDialog::~ConfigDialog()
478 {
479     delete m_font;
480     delete m_ircFont;
481 }
482 
createGeneralTab(dxTabBook * tabbook)483 void ConfigDialog::createGeneralTab(dxTabBook *tabbook)
484 {
485     new dxEXTabItem(tabbook, _("&General"), NULL, TAB_LEFT);
486     FXVerticalFrame *generalpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
487     new FXCheckButton(generalpane, _("Run one instance"), &m_targetOneInstance, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
488     new FXCheckButton(generalpane, _("Disable tabs sorting"), &m_targetDisableSortTabs, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
489     new FXCheckButton(generalpane, _("Reconnect after disconnection"), &m_targetReconnect, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
490     FXHorizontalFrame *napane = new FXHorizontalFrame(generalpane, LAYOUT_FILL_X);
491     m_numberAttemptLabel = new FXLabel(napane, _("Number of attempts (zero for unlimited)"), NULL, LAYOUT_LEFT);
492     if(!m_preferences.m_reconnect) m_numberAttemptLabel->disable();
493     m_numberAttemptSpinner = new FXSpinner(napane, 4, &m_targetNumberAttempt, FXDataTarget::ID_VALUE, SPIN_CYCLIC|FRAME_GROOVE);
494     m_numberAttemptSpinner->setRange(0,20);
495     if(!m_preferences.m_reconnect) m_numberAttemptSpinner->disable();
496     FXHorizontalFrame *dapane = new FXHorizontalFrame(generalpane, LAYOUT_FILL_X);
497     m_delayAttemptLabel = new FXLabel(dapane, _("Delay between two attempts in seconds"), NULL, LAYOUT_LEFT);
498     if(!m_preferences.m_reconnect) m_delayAttemptLabel->disable();
499     m_delayAttemptSpinner = new FXSpinner(dapane, 4, &m_targetDelayAttempt, FXDataTarget::ID_VALUE, SPIN_CYCLIC|FRAME_GROOVE);
500     m_delayAttemptSpinner->setRange(5,120);
501     if(!m_preferences.m_reconnect) m_delayAttemptSpinner->disable();
502     FXHorizontalFrame *jdpane = new FXHorizontalFrame(generalpane, LAYOUT_FILL_X);
503     new FXLabel(jdpane, _("Delay between join command and connection"), NULL, LAYOUT_LEFT);
504     new FXSpinner(jdpane, 4, &m_targetJoinDelay, FXDataTarget::ID_VALUE, SPIN_NOMAX|FRAME_GROOVE);
505     FXHorizontalFrame *maxpane = new FXHorizontalFrame(generalpane, LAYOUT_FILL_X);
506     new FXLabel(maxpane, _("Max. users number for checking away\tToo high number can be reason for ban"), NULL, LAYOUT_LEFT);
507     new FXSpinner(maxpane, 4, &m_targetMaxAway, FXDataTarget::ID_VALUE, SPIN_NOMAX|FRAME_GROOVE);
508 #ifdef HAVE_TRAY
509     new FXCheckButton(generalpane, _("Use trayicon"), &m_targetUseTray, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
510     m_closeToTrayButton = new FXCheckButton(generalpane, _("Close button hides application"), &m_targetCloseToTray, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
511     if(!m_preferences.m_useTray) m_closeToTrayButton->disable();
512 #endif
513 #ifdef HAVE_ENCHANT
514     FXCheckButton *spell = new FXCheckButton(generalpane, _("Use spellchecking"), &m_targetUseSpell, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
515     if(!dxutils::instance().getAvailableSpellLangsNum())
516     {
517         spell->disable();
518         m_preferences.m_useSpell = FALSE;
519     }
520     spell->setCheck(m_preferences.m_useSpell);
521 #endif
522     new FXCheckButton(generalpane, _("Special tab for server messages"), &m_targetOwnServerWindow, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
523     new FXCheckButton(generalpane, _("Logging chats"), &m_targetLogging, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
524     FXHorizontalFrame *logpane = new FXHorizontalFrame(generalpane, LAYOUT_FILL_X);
525     new FXLabel(logpane, _("Log path"), NULL, LAYOUT_LEFT);
526     (new FXTextField(logpane, 25, &m_targetLogPath, FXDataTarget::ID_VALUE, TEXTFIELD_READONLY|FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X))->disable();
527     if(!FXStat::exists(m_preferences.m_logPath)) m_preferences.m_logPath = FXSystem::getHomeDirectory();
528     m_selectPath = new dxEXButton(logpane, "...", NULL, this, ConfigDialog_LOGPATH, FRAME_RAISED|FRAME_THICK);
529     if(m_preferences.m_logging) m_selectPath->enable();
530     else m_selectPath->disable();
531 #ifdef HAVE_LUA
532     new FXCheckButton(generalpane, _("Automatically load scripts"), &m_targetAutoload, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
533     FXHorizontalFrame *aloadpane = new FXHorizontalFrame(generalpane, LAYOUT_FILL_X);
534     new FXLabel(aloadpane, _("Path"), NULL, LAYOUT_LEFT);
535     (new FXTextField(aloadpane, 25, &m_targetAutoloadPath, FXDataTarget::ID_VALUE, TEXTFIELD_READONLY|FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X))->disable();
536     if(!FXStat::exists(m_preferences.m_autoloadPath))
537     {
538 #ifdef WIN32
539         m_preferences.m_autoloadPath = dxutils::instance().localeToUtf8(FXSystem::getHomeDirectory()+PATHSEPSTRING+"scripts");
540 #else
541         m_preferences.m_autoloadPath = FXSystem::getHomeDirectory()+PATHSEPSTRING+".dxirc"+PATHSEPSTRING+"scripts";
542 #endif
543     }
544     m_selectAutoloadPath = new dxEXButton(aloadpane, "...", NULL, this, ConfigDialog_AUTOLOADPATH, FRAME_RAISED|FRAME_THICK);
545     if(m_preferences.m_autoload) m_selectAutoloadPath->enable();
546     else m_selectAutoloadPath->disable();
547 #endif
548 }
549 
createLookTab(dxTabBook * tabbook)550 void ConfigDialog::createLookTab(dxTabBook *tabbook)
551 {
552     new dxEXTabItem(tabbook, _("Loo&k"), NULL, TAB_LEFT);
553     FXVerticalFrame *lookpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
554     FXHorizontalFrame *hframe1 = new FXHorizontalFrame(lookpane, LAYOUT_FILL_X|LAYOUT_FILL_Y);
555     FXVerticalFrame *vframe1 = new FXVerticalFrame(hframe1, LAYOUT_FILL_X|LAYOUT_FILL_Y);
556     m_vframe2 = new FXVerticalFrame(hframe1, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK|FRAME_RAISED);
557     new FXLabel(vframe1, _("Theme:"), NULL, LAYOUT_CENTER_Y);
558     m_themes = new FXListBox(vframe1,this,ConfigDialog_THEME,LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK);
559     m_themes->setNumVisible(9);
560     fillThemes();
561     new FXSeparator(vframe1, SEPARATOR_GROOVE|LAYOUT_FILL_X);
562     FXMatrix *themeMatrix = new FXMatrix(vframe1, 2, LAYOUT_FILL_Y|MATRIX_BY_COLUMNS, 0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, 1,1);
563     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeBase, FXDataTarget::ID_VALUE);
564     new FXLabel(themeMatrix, _("Base Color"));
565     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeBorder, FXDataTarget::ID_VALUE);
566     new FXLabel(themeMatrix, _("Border Color"));
567     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeFore,FXDataTarget::ID_VALUE);
568     new FXLabel(themeMatrix, _("Text Color"));
569     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeBack, FXDataTarget::ID_VALUE);
570     new FXLabel(themeMatrix, _("Background Color"));
571     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeSelfore, FXDataTarget::ID_VALUE);
572     new FXLabel(themeMatrix, _("Selected Text Color"));
573     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeSelback, FXDataTarget::ID_VALUE);
574     new FXLabel(themeMatrix, _("Selected Background Color"));
575     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeMenufore, FXDataTarget::ID_VALUE);
576     new FXLabel(themeMatrix, _("Selected Menu Text Color"));
577     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeMenuback, FXDataTarget::ID_VALUE);
578     new FXLabel(themeMatrix, _("Selected Menu Background Color"));
579     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeTipfore, FXDataTarget::ID_VALUE);
580     new FXLabel(themeMatrix, _("Tip Text Color"));
581     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeTipback, FXDataTarget::ID_VALUE);
582     new FXLabel(themeMatrix, _("Tip Background Color"));
583     if(!dxUtils.haveNotify())
584     {
585         new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeNotifyfore, FXDataTarget::ID_VALUE);
586         new FXLabel(themeMatrix, _("Notify Text Color"));
587         new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetThemeNotifyback, FXDataTarget::ID_VALUE);
588         new FXLabel(themeMatrix, _("Notify Background Color"));
589     }
590 #ifndef WIN32
591 #ifdef HAVE_TRAY
592     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetTrayColor, FXDataTarget::ID_VALUE);
593     new FXLabel(themeMatrix, _("Tray Color"));
594 #endif
595 #endif
596     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetUnreadColor, FXDataTarget::ID_VALUE);
597     new FXLabel(themeMatrix, _("Unreaded Tab Color"));
598     new FXColorWell(themeMatrix, FXRGB(0,0,255), &m_targetHighlightColor, FXDataTarget::ID_VALUE);
599     new FXLabel(themeMatrix, _("Highlighted Tab Color"));
600     FXHorizontalFrame *tabpane = new FXHorizontalFrame(vframe1, LAYOUT_FILL_X);
601     new FXLabel(tabpane, _("Tab position"), NULL, LAYOUT_LEFT);
602     m_listTabs = new FXListBox(tabpane, this, ConfigDialog_TABPOS);
603     m_listTabs->appendItem(_("Bottom"));
604     m_listTabs->appendItem(_("Left"));
605     m_listTabs->appendItem(_("Top"));
606     m_listTabs->appendItem(_("Right"));
607     m_listTabs->setNumVisible(4);
608     if(m_preferences.m_tabPosition>=0 && m_preferences.m_tabPosition<4) m_listTabs->setCurrentItem(m_preferences.m_tabPosition);
609     m_label = new FXLabel(m_vframe2, "Label");
610     m_textFrame1 = new FXHorizontalFrame(m_vframe2, LAYOUT_FILL_X);
611     m_textTest = new FXTextField(m_textFrame1, 30, NULL, 0, LAYOUT_FILL_X|FRAME_THICK|FRAME_SUNKEN);
612     m_textTest->setText(_("Select this text, to see the selected colors"));
613     m_textFrame2 = new FXHorizontalFrame(m_vframe2, LAYOUT_FILL_X|FRAME_THICK|FRAME_SUNKEN, 0,0,0,0,2,2,2,2,0,0);
614     m_labelSelected = new FXLabel(m_textFrame2, _("Selected Text (with focus)"), NULL, LAYOUT_FILL_X, 0,0,0,0,1,1,1,1);
615     m_textFrame3 = new FXHorizontalFrame(m_vframe2, LAYOUT_FILL_X|FRAME_THICK|FRAME_SUNKEN, 0,0,0,0,2,2,2,2,0,0);
616     m_labelNocurrent = new FXLabel(m_textFrame3, _("Selected Text (no focus)"), NULL, LAYOUT_FILL_X, 0,0,0,0,1,1,1,1);
617     m_sep1 = new FXSeparator(m_vframe2, LAYOUT_FILL_X|SEPARATOR_LINE);
618     m_labelTip = new FXLabel(m_vframe2, _("Tooltip example"), NULL, FRAME_LINE|LAYOUT_CENTER_X);
619     m_menuGroup = new FXGroupBox(m_vframe2, _("Menu example"), FRAME_GROOVE|LAYOUT_FILL_Y|LAYOUT_FILL_X);
620     m_menuFrame = new FXVerticalFrame(m_menuGroup, FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y, 0,0,0,0,0,0,0,0,0,0);
621     m_menuLabels[0] = new FXLabel(m_menuFrame, _("&Server list"), NULL, LABEL_NORMAL, 0,0,0,0,16,4);
622     m_menuLabels[1] = new FXLabel(m_menuFrame, _("Selected Menu Entry"), NULL, LABEL_NORMAL, 0,0,0,0,16,4);
623     m_sep2 = new FXSeparator(m_menuFrame, LAYOUT_FILL_X|SEPARATOR_LINE);
624     m_menuLabels[2]=new FXLabel(m_menuFrame, _("&Quit"), NULL, LABEL_NORMAL, 0,0,0,0,16,4);
625     if(!dxUtils.haveNotify())
626     {
627         m_labelNotify = new FXLabel(m_vframe2, _("Notify example"), ICO_BIG, FRAME_LINE|LAYOUT_CENTER_X|ICON_BEFORE_TEXT);
628     }
629     m_tabFrame = new FXHorizontalFrame(m_vframe2, LAYOUT_FILL_X|LAYOUT_FILL_Y);
630     m_tabs = new dxTabBook(m_tabFrame, NULL, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y);
631     m_tab = new dxEXTabItem(m_tabs, "#abc", ICO_CHANNEL);
632     m_tabframe1 = new FXVerticalFrame(m_tabs, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
633     m_tabLabel1 = new FXLabel(m_tabframe1, _("Standard tab"));
634     m_unread = new dxEXTabItem(m_tabs, "#def", ICO_CHANNEL);
635     m_tabframe2 = new FXVerticalFrame(m_tabs, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
636     m_tabLabel2 = new FXLabel(m_tabframe2, _("Unreaded tab"));
637     m_highlight = new dxEXTabItem(m_tabs, "#ghi", ICO_CHANNELNEWMSG);
638     m_tabframe3 = new FXVerticalFrame(m_tabs, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
639     m_tabLabel3 = new FXLabel(m_tabframe3, _("Highlighted tab"));
640     updateTabPosition();
641     FXHorizontalFrame *fontframe = new FXHorizontalFrame(lookpane, LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING);
642     new FXLabel(fontframe, _("Font"));
643     m_fontButton = new dxEXButton(fontframe, " ", NULL, this, ConfigDialog_FONT, LAYOUT_CENTER_Y|FRAME_RAISED|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_X);
644 }
645 
createIrctextTab(dxTabBook * tabbook)646 void ConfigDialog::createIrctextTab(dxTabBook *tabbook)
647 {
648     new dxEXTabItem(tabbook, _("&Irc Text"), NULL, TAB_LEFT);
649     FXVerticalFrame *irctextpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
650     FXHorizontalFrame *hframe = new FXHorizontalFrame(irctextpane, LAYOUT_FILL_X|LAYOUT_FILL_Y);
651     FXVerticalFrame *cframe = new FXVerticalFrame(hframe, LAYOUT_FILL_X|LAYOUT_FILL_Y);
652     FXMatrix *colormatrix = new FXMatrix(cframe, 2, MATRIX_BY_COLUMNS, 0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, 1,1);
653     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsBack, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
654     new FXLabel(colormatrix, _("Text backround color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
655     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsText, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
656     new FXLabel(colormatrix, _("Text color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
657     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsUser, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
658     new FXLabel(colormatrix, _("User events text color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
659     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsAction, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
660     new FXLabel(colormatrix, _("Actions message text color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
661     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsNotice, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
662     new FXLabel(colormatrix, _("Notice text color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
663     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsError, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
664     new FXLabel(colormatrix, _("Error text color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
665     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsHilight, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
666     new FXLabel(colormatrix, _("Highlight message text color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
667     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsLink, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
668     new FXLabel(colormatrix, _("Link color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
669     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsMymsg, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
670     new FXLabel(colormatrix, _("My message color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
671     new FXColorWell(colormatrix, FXRGB(0,0,255), &m_targetIrccolorsLog, FXDataTarget::ID_VALUE, COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW, 0,0,40,24);
672     new FXLabel(colormatrix, _("Log line color"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
673     new FXLabel(colormatrix, _("Font"));
674     m_ircfontButton = new dxEXButton(colormatrix, " ", NULL, this, ConfigDialog_IRCFONT, LAYOUT_CENTER_Y|FRAME_RAISED|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_X, 0,0,0,0, 10,10,2,2);
675     FXHorizontalFrame *nickpane = new FXHorizontalFrame(cframe, LAYOUT_FILL_X);
676     new FXLabel(nickpane, _("Nick completion char"), NULL, LAYOUT_LEFT);
677     m_nickCharField = new FXTextField(nickpane, 1, this, ConfigDialog_NICK, TEXTFIELD_LIMITED|FRAME_THICK|FRAME_SUNKEN/*|LAYOUT_FILL_X*/);
678     m_nickCharField->setText(m_preferences.m_nickCompletionChar);
679     new FXCheckButton(cframe, _("Use same font for commandline"), &m_targetSameCmd, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
680     new FXCheckButton(cframe, _("Use same font for user list"), &m_targetSameList, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
681     new FXCheckButton(cframe, _("Use colored nick"), &m_targetColoredNick, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
682     new FXCheckButton(cframe, _("Strip colors in text"), &m_targetStripColors, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
683     m_loadLogButton = new FXCheckButton(cframe, _("Load logged lines"), &m_targetLoadLog, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
684     if(!m_preferences.m_logging) m_loadLogButton->disable();
685     FXHorizontalFrame *linepane = new FXHorizontalFrame(cframe, LAYOUT_FILL_X);
686     new FXLabel(linepane, _("Load max. number lines"), NULL, LAYOUT_LEFT);
687     m_loadLineSpinner = new FXSpinner(linepane, 4, &m_targetLoadLine, FXDataTarget::ID_VALUE, SPIN_NOMAX|FRAME_GROOVE);
688     if(!m_preferences.m_logging || !m_preferences.m_loadLog) m_loadLineSpinner->disable();
689     FXVerticalFrame *tframe = new FXVerticalFrame(hframe, FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y);
690     m_text = new FXText(tframe, NULL, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|TEXT_READONLY);
691     m_text->setScrollStyle(HSCROLLING_OFF);
692     for(int i=0; i<8; i++)
693     {
694         m_textStyle[i].normalForeColor = m_preferences.m_colors.text;
695         m_textStyle[i].normalBackColor = m_preferences.m_colors.back;
696         m_textStyle[i].selectForeColor = getApp()->getSelforeColor();
697         m_textStyle[i].selectBackColor = getApp()->getSelbackColor();
698         m_textStyle[i].hiliteForeColor = getApp()->getHiliteColor();
699         m_textStyle[i].hiliteBackColor = FXRGB(255, 128, 128); // from FXText.cpp
700         m_textStyle[i].activeBackColor = m_preferences.m_colors.back;
701         m_textStyle[i].style = 0;
702     }
703     //user commands
704     m_textStyle[0].normalForeColor = m_preferences.m_colors.user;
705     //Actions
706     m_textStyle[1].normalForeColor = m_preferences.m_colors.action;
707     //Notice
708     m_textStyle[2].normalForeColor = m_preferences.m_colors.notice;
709     //Errors
710     m_textStyle[3].normalForeColor = m_preferences.m_colors.error;
711     //Highlight
712     m_textStyle[4].normalForeColor = m_preferences.m_colors.hilight;
713     //link
714     m_textStyle[5].normalForeColor = m_preferences.m_colors.link;
715     m_textStyle[5].style = FXText::STYLE_UNDERLINE;
716     //My message
717     m_textStyle[6].normalForeColor = m_preferences.m_colors.mymsg;
718     //Log line
719     m_textStyle[7].normalForeColor = m_preferences.m_colors.log;
720     m_text->setStyled(TRUE);
721     m_text->setHiliteStyles(m_textStyle);
722     m_text->setTextColor(m_preferences.m_colors.text);
723     m_text->setBackColor(m_preferences.m_colors.back);
724     m_text->appendStyledText(FXString("[24.12.2008 00:08:00] dvx: dxirc 0.10.0\n"), 8);
725     m_text->appendText("[00:00:00] ");
726     m_text->appendStyledText(FXString("dvx has joined to #dxirc\n"), 1);
727     m_text->appendText("[00:00:00] ");
728     m_text->appendStyledText(FXString("dvx: Welcome in dxirc\n"), 7);
729     m_text->appendText("[00:00:00] ");
730     m_text->appendStyledText(FXString("bm: dvx, dxirc is nice\n"), 5);
731     m_text->appendText("[00:00:00] ");
732     m_text->appendStyledText(FXString("dvx is online\n"), 2);
733     m_text->appendText("[00:00:00] ");
734     m_text->appendStyledText(FXString("server's NOTICE: nice notice\n"), 3);
735     m_text->appendText("[00:00:00] ");
736     m_text->appendStyledText(FXString("No error\n"), 4);
737     m_text->appendText("[00:00:00] ");
738     m_text->appendStyledText(FXString("dvx: "), 7);
739     m_text->appendStyledText(FXString("http://dxirc.org"), 6);
740 }
741 
createNicklistTab(dxTabBook * tabbook)742 void ConfigDialog::createNicklistTab(dxTabBook *tabbook)
743 {
744     new dxEXTabItem(tabbook, _("Nick &list"), NULL, TAB_LEFT);
745     FXVerticalFrame *nicklistpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
746     FXGroupBox *themesgroup = new FXGroupBox(nicklistpane, _("Icons themes"), FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_SIDE_TOP);
747     FXVerticalFrame *themesbuttons = new FXVerticalFrame(themesgroup, LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
748     m_addTheme = new dxEXButton(themesbuttons, _("Add"), NULL, this, ConfigDialog_ADDICONS, FRAME_RAISED|FRAME_THICK);
749     m_deleteTheme = new dxEXButton(themesbuttons, _("Delete"), NULL, this, ConfigDialog_DELETEICONS, FRAME_RAISED|FRAME_THICK);
750     FXVerticalFrame *themeslist = new FXVerticalFrame(themesgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK);
751     m_icons = new FXList(themeslist, this, ConfigDialog_ICONS, LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y);
752     fillIcons();
753     for(FXint i=0; i<m_icons->getNumItems(); i++)
754     {
755         if(m_icons->getItemText(i) == m_preferences.m_themePath)
756         {
757             m_icons->setCurrentItem(i);
758             break;
759         }
760     }
761     m_icons->getNumItems()>1 ? m_deleteTheme->enable() : m_deleteTheme->disable();
762     FXMatrix *iconmatrix = new FXMatrix(themeslist, 2, MATRIX_BY_COLUMNS, 0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, 1,1);
763     new FXLabel(iconmatrix, _("Admin:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
764     m_icon1 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
765     new FXLabel(iconmatrix, _("Owner:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
766     m_icon2 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
767     new FXLabel(iconmatrix, _("Op:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
768     m_icon3 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
769     new FXLabel(iconmatrix, _("Halfop:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
770     m_icon4 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
771     new FXLabel(iconmatrix, _("Voice:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
772     m_icon5 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
773     new FXLabel(iconmatrix, _("Normal:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
774     m_icon6 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
775     new FXLabel(iconmatrix, _("Away:"), NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
776     m_icon7 = new FXLabel(iconmatrix, "", NULL, JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW);
777     updateNickIcons();
778     new FXCheckButton(nicklistpane, _("Sort nick list by user mode"), &m_targetSortUserMode, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
779 }
780 
createIgnoreTab(dxTabBook * tabbook)781 void ConfigDialog::createIgnoreTab(dxTabBook *tabbook)
782 {
783     new dxEXTabItem(tabbook, _("Ig&nore"), NULL, TAB_LEFT);
784     FXVerticalFrame *ignorepane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
785     FXGroupBox *commandsgroup = new FXGroupBox(ignorepane, _("Commands"), FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_SIDE_TOP);
786     FXVerticalFrame *commandsbuttons = new FXVerticalFrame(commandsgroup, LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
787     m_addCommand = new dxEXButton(commandsbuttons, _("Add"), NULL, this, ConfigDialog_ADDCOMMAND, FRAME_RAISED|FRAME_THICK);
788     m_deleteCommand = new dxEXButton(commandsbuttons, _("Delete"), NULL, this, ConfigDialog_DELETECOMMAND, FRAME_RAISED|FRAME_THICK);
789     FXVerticalFrame *commandslist = new FXVerticalFrame(commandsgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK);
790     m_commands = new FXList(commandslist, this, ConfigDialog_COMMAND, LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y);
791     FXGroupBox *usersgroup = new FXGroupBox(ignorepane, _("Users"), FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y);
792     FXVerticalFrame *usersbuttons = new FXVerticalFrame(usersgroup, LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
793     m_addUser = new dxEXButton(usersbuttons, _("Add"), NULL, this, ConfigDialog_ADDUSER, FRAME_RAISED|FRAME_THICK);
794     m_modifyUser = new dxEXButton(usersbuttons, _("Modify"), NULL, this, ConfigDialog_MODIFYUSER, FRAME_RAISED|FRAME_THICK);
795     m_deleteUser = new dxEXButton(usersbuttons, _("Delete"), NULL, this, ConfigDialog_DELETEUSER, FRAME_RAISED|FRAME_THICK);
796     FXVerticalFrame *userspane = new FXVerticalFrame(usersgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK);
797     FXHorizontalFrame *usersframe = new FXHorizontalFrame(userspane, LAYOUT_FILL_X|LAYOUT_FILL_Y);
798     m_users = new FXIconList(usersframe, this, ConfigDialog_USER, ICONLIST_AUTOSIZE|ICONLIST_DETAILED|ICONLIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y);
799     m_users->appendHeader(_("User"), NULL, 200);
800     m_users->appendHeader(_("Channel(s)"), NULL, 150);
801     m_users->appendHeader(_("Network"), NULL, 150);
802     fillCommnads();
803     fillUsers();
804     m_commands->getNumItems() ? m_deleteCommand->enable() : m_deleteCommand->disable();
805     if(m_preferences.m_ignoreUsersList.no())
806     {
807         m_deleteUser->enable();
808         m_modifyUser->enable();
809     }
810     else
811     {
812         m_deleteUser->disable();
813         m_modifyUser->disable();
814     }
815 }
816 
createDccTab(dxTabBook * tabbook)817 void ConfigDialog::createDccTab(dxTabBook *tabbook)
818 {
819     new dxEXTabItem(tabbook, _("&DCC"), NULL, TAB_LEFT);
820     FXVerticalFrame *dccpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
821     new FXLabel(dccpane, _("Directory for saving files:"), NULL, LAYOUT_LEFT);
822     FXHorizontalFrame *pathframe = new FXHorizontalFrame(dccpane, LAYOUT_FILL_X);
823     (new FXTextField(pathframe, 30, &m_targetDccPath, FXDataTarget::ID_VALUE, TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X))->disable();
824     new dxEXButton(pathframe, "...", NULL, this, ConfigDialog_DCCPATH, FRAME_RAISED|FRAME_THICK);
825     FXHorizontalFrame *ipframe = new FXHorizontalFrame(dccpane, LAYOUT_FILL_X);
826     new FXLabel(ipframe, _("DCC IP address:"), NULL, LAYOUT_LEFT);
827     new FXTextField(ipframe, 3, &m_targetDccIP1, FXDataTarget::ID_VALUE, TEXTFIELD_INTEGER|TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
828     new FXLabel(ipframe, ".", NULL, LAYOUT_LEFT);
829     new FXTextField(ipframe, 3, &m_targetDccIP2, FXDataTarget::ID_VALUE, TEXTFIELD_INTEGER|TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
830     new FXLabel(ipframe, ".", NULL, LAYOUT_LEFT);
831     new FXTextField(ipframe, 3, &m_targetDccIP3, FXDataTarget::ID_VALUE, TEXTFIELD_INTEGER|TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
832     new FXLabel(ipframe, ".", NULL, LAYOUT_LEFT);
833     new FXTextField(ipframe, 3, &m_targetDccIP4, FXDataTarget::ID_VALUE, TEXTFIELD_INTEGER|TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
834     new FXLabel(dccpane, _("(Leave blank for use IP address from server)"), NULL, LAYOUT_LEFT);
835     new FXSeparator(dccpane, LAYOUT_FILL_X);
836     FXHorizontalFrame *portframe = new FXHorizontalFrame(dccpane, LAYOUT_FILL_X);
837     new FXLabel(portframe, _("DCC ports:"), NULL, LAYOUT_LEFT);
838     FXSpinner *dspinner = new FXSpinner(portframe, 6, &m_targetDccPortD, FXDataTarget::ID_VALUE, FRAME_SUNKEN|FRAME_THICK);
839     dspinner->setRange(0, 65536);
840     new FXLabel(portframe, "-");
841     FXSpinner *hspinner = new FXSpinner(portframe, 6, &m_targetDccPortH, FXDataTarget::ID_VALUE, FRAME_SUNKEN|FRAME_THICK);
842     hspinner->setRange(0, 65536);
843     new FXLabel(dccpane, _("(Set 0 for use ports from OS)"), NULL, LAYOUT_LEFT);
844     FXHorizontalFrame *timeframe = new FXHorizontalFrame(dccpane, LAYOUT_FILL_X);
845     new FXLabel(timeframe, _("Time for waiting for connection in seconds"), NULL, LAYOUT_LEFT);
846     new FXSpinner(timeframe, 4, &m_targetDccTimeout, FXDataTarget::ID_VALUE, SPIN_NOMAX|SPIN_CYCLIC|FRAME_SUNKEN|FRAME_THICK);
847     new FXCheckButton(dccpane, _("Automatically connect offered chat"), &m_targetAutoDccChat, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
848     new FXCheckButton(dccpane, _("Automatically receive offered file"), &m_targetAutoDccFile, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
849 }
850 
createNotificationTab(dxTabBook * tabbook)851 void ConfigDialog::createNotificationTab(dxTabBook *tabbook)
852 {
853     new dxEXTabItem(tabbook, _("N&otification"), NULL, TAB_LEFT);
854     FXVerticalFrame *notificationpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
855     FXGroupBox *friendsgroup = new FXGroupBox(notificationpane, _("Friends"), FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y);
856     FXVerticalFrame *friendsbuttons = new FXVerticalFrame(friendsgroup, LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
857     m_addFriend = new dxEXButton(friendsbuttons, _("Add"), NULL, this, ConfigDialog_ADDFRIEND, FRAME_RAISED|FRAME_THICK);
858     m_modifyFriend = new dxEXButton(friendsbuttons, _("Modify"), NULL, this, ConfigDialog_MODIFYFRIEND, FRAME_RAISED|FRAME_THICK);
859     m_deleteFriend = new dxEXButton(friendsbuttons, _("Delete"), NULL, this, ConfigDialog_DELETEFRIEND, FRAME_RAISED|FRAME_THICK);
860     FXVerticalFrame *friendspane = new FXVerticalFrame(friendsgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK);
861     FXHorizontalFrame *friendsframe = new FXHorizontalFrame(friendspane, LAYOUT_FILL_X|LAYOUT_FILL_Y);
862     m_friends = new FXIconList(friendsframe, this, ConfigDialog_FRIEND, ICONLIST_AUTOSIZE|ICONLIST_DETAILED|ICONLIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y);
863     m_friends->appendHeader(_("Friend"), NULL, 150);
864     m_friends->appendHeader(_("Channel(s)"), NULL, 150);
865     m_friends->appendHeader(_("Network"), NULL, 150);
866     fillFriends();
867     if(m_preferences.m_friendsList.no())
868     {
869         m_deleteFriend->enable();
870         m_modifyFriend->enable();
871     }
872     else
873     {
874         m_deleteFriend->disable();
875         m_modifyFriend->disable();
876     }
877     new FXCheckButton(notificationpane, _("Use sounds"), &m_targetSound, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
878     FXGroupBox *eventsgroup = new FXGroupBox(notificationpane, _("Events"), FRAME_GROOVE|LAYOUT_FILL_X);
879     FXVerticalFrame *eventsframe = new FXVerticalFrame(eventsgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y);
880     m_checkConnect = new FXCheckButton(eventsframe, _("Friend connected"), &m_targetSoundConnect, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
881     if(!m_preferences.m_sounds)
882         m_checkConnect->disable();
883     FXHorizontalFrame *connectframe = new FXHorizontalFrame(eventsframe, LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT);
884     (new FXTextField(connectframe, 30, &m_targetPathConnect, FXDataTarget::ID_VALUE, TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X))->disable();
885     m_selectConnect = new dxEXButton(connectframe, "...", NULL, this, ConfigDialog_SELECTCONNECT, FRAME_RAISED|FRAME_THICK);
886     m_playConnect = new dxEXButton(connectframe, _("\tPlay"), ICO_PLAY, this, ConfigDialog_PLAYCONNECT, FRAME_RAISED|FRAME_THICK);
887     if(!m_preferences.m_soundConnect || !m_preferences.m_sounds)
888     {
889         m_selectConnect->disable();
890         m_playConnect->disable();
891     }
892     if(!FXStat::exists(m_preferences.m_pathConnect))
893         m_playConnect->disable();
894     m_checkDisconnect = new FXCheckButton(eventsframe, _("Friend disconnected"), &m_targetSoundDisconnect, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
895     if(!m_preferences.m_sounds)
896         m_checkDisconnect->disable();
897     FXHorizontalFrame *disconnectframe = new FXHorizontalFrame(eventsframe, LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT);
898     (new FXTextField(disconnectframe, 30, &m_targetPathDisconnect, FXDataTarget::ID_VALUE, TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X))->disable();
899     m_selectDisconnect = new dxEXButton(disconnectframe, "...", NULL, this, ConfigDialog_SELECTDISCONNECT, FRAME_RAISED|FRAME_THICK);
900     m_playDisconnect = new dxEXButton(disconnectframe, _("\tPlay"), ICO_PLAY, this, ConfigDialog_PLAYDISCONNECT, FRAME_RAISED|FRAME_THICK);
901     if(!m_preferences.m_soundDisconnect || !m_preferences.m_sounds)
902     {
903         m_selectDisconnect->disable();
904         m_playDisconnect->disable();
905     }
906     if(!FXStat::exists(m_preferences.m_pathDisconnect))
907         m_playDisconnect->disable();
908     m_checkMessage = new FXCheckButton(eventsframe, _("Highlighted message or query message"), &m_targetSoundMessage, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
909     if(!m_preferences.m_sounds)
910         m_checkMessage->disable();
911     FXHorizontalFrame *messageframe = new FXHorizontalFrame(eventsframe, LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT);
912     (new FXTextField(messageframe, 30, &m_targetPathMessage, FXDataTarget::ID_VALUE, TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X))->disable();
913     m_selectMessage = new dxEXButton(messageframe, "...", NULL, this, ConfigDialog_SELECTMESSAGE, FRAME_RAISED|FRAME_THICK);
914     m_playMessage = new dxEXButton(messageframe, _("\tPlay"), ICO_PLAY, this, ConfigDialog_PLAYMESSAGE, FRAME_RAISED|FRAME_THICK);
915     if(!m_preferences.m_soundMessage || !m_preferences.m_sounds)
916     {
917         m_selectMessage->disable();
918         m_playMessage->disable();
919     }
920     if(!FXStat::exists(m_preferences.m_pathMessage))
921         m_playMessage->disable();
922     FXHorizontalFrame *notifyframe = new FXHorizontalFrame(notificationpane, LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT);
923     new FXCheckButton(notifyframe, _("Use notify popup"), &m_targetNotify, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
924     new dxEXButton(notifyframe, _("Show"), NULL, this, ConfigDialog_SHOWNOTIFY, FRAME_RAISED|FRAME_THICK|LAYOUT_SIDE_LEFT);
925     if(!dxUtils.haveNotify())
926     {
927         FXHorizontalFrame *notifyposframe = new FXHorizontalFrame(notificationpane, LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT);
928         new FXLabel(notifyposframe, _("Notify position"), NULL, LAYOUT_LEFT);
929         m_listNotifyPos = new FXListBox(notifyposframe, this, ConfigDialog_NOTIFYPOS);
930         m_listNotifyPos->appendItem(_("Left Top"));
931         m_listNotifyPos->appendItem(_("Right Top"));
932         m_listNotifyPos->appendItem(_("Left Bottom"));
933         m_listNotifyPos->appendItem(_("Right Bottom"));
934         m_listNotifyPos->setNumVisible(4);
935         if(m_preferences.m_notifyPosition>=0 && m_preferences.m_notifyPosition<4) m_listNotifyPos->setCurrentItem(m_preferences.m_notifyPosition);
936     }
937     FXGroupBox *neventsgroup = new FXGroupBox(notificationpane, _("Events"), FRAME_GROOVE|LAYOUT_FILL_X);
938     FXVerticalFrame *neventsframe = new FXVerticalFrame(neventsgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y);
939     m_checkNotifyConnect = new FXCheckButton(neventsframe, _("Friend connected"), &m_targetNotifyConnect, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
940     if(!m_preferences.m_notify)
941         m_checkNotifyConnect->disable();
942     m_checkNotifyDisconnect = new FXCheckButton(neventsframe, _("Friend disconnected"), &m_targetNotifyDisconnect, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
943     if(!m_preferences.m_notify)
944         m_checkNotifyDisconnect->disable();
945     m_checkNotifyMessage = new FXCheckButton(neventsframe, _("Highlighted message or query message"), &m_targetNotifyMessage, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
946     if(!m_preferences.m_notify)
947         m_checkNotifyMessage->disable();
948     if(!m_preferences.m_sounds && !m_preferences.m_notify)
949     {
950         m_addFriend->disable();
951         m_deleteFriend->disable();
952         m_modifyFriend->disable();
953     }
954 #ifdef HAVE_TRAY
955     new FXCheckButton(notificationpane, _("Change tray icon for all messages if application in tray"), &m_targetNotifyTray, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
956 #endif
957 }
958 
createSmileysTab(dxTabBook * tabbook)959 void ConfigDialog::createSmileysTab(dxTabBook *tabbook)
960 {
961     new dxEXTabItem(tabbook, _("S&mileys"), NULL, TAB_LEFT);
962     FXVerticalFrame *smileypane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
963     new FXCheckButton(smileypane, _("Use smileys"), &m_targetUseSmileys, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_LEFT|JUSTIFY_LEFT);
964     FXGroupBox *smileysgroup = new FXGroupBox(smileypane, _("Smileys"), FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y);
965     FXVerticalFrame *smileysbuttons = new FXVerticalFrame(smileysgroup, LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
966     m_addSmiley = new dxEXButton(smileysbuttons, _("Add"), NULL, this, ConfigDialog_ADDSMILEY, FRAME_RAISED|FRAME_THICK);
967     m_modifySmiley = new dxEXButton(smileysbuttons, _("Modify"), NULL, this, ConfigDialog_MODIFYSMILEY, FRAME_RAISED|FRAME_THICK);
968     m_deleteSmiley = new dxEXButton(smileysbuttons, _("Delete"), NULL, this, ConfigDialog_DELETESMILEY, FRAME_RAISED|FRAME_THICK);
969     m_importSmiley = new dxEXButton(smileysbuttons, _("Import"), NULL, this, ConfigDialog_IMPORTSMILEY, FRAME_RAISED|FRAME_THICK);
970     m_exportSmiley = new dxEXButton(smileysbuttons, _("Export"), NULL, this, ConfigDialog_EXPORTSMILEY, FRAME_RAISED|FRAME_THICK);
971     if(m_preferences.m_useSmileys)
972     {
973         m_addSmiley->enable();
974         m_importSmiley->enable();
975         if((FXint)m_preferences.m_smileysMap.size())
976         {
977             m_modifySmiley->enable();
978             m_deleteSmiley->enable();
979             m_exportSmiley->enable();
980         }
981         else
982         {
983             m_modifySmiley->disable();
984             m_deleteSmiley->disable();
985             m_exportSmiley->disable();
986         }
987     }
988     else
989     {
990         m_addSmiley->disable();
991         m_modifySmiley->disable();
992         m_deleteSmiley->disable();
993         m_importSmiley->disable();
994         m_exportSmiley->disable();
995     }
996     FXVerticalFrame *smileyspane = new FXVerticalFrame(smileysgroup, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK);
997     FXHorizontalFrame *smileysframe = new FXHorizontalFrame(smileyspane, LAYOUT_FILL_X|LAYOUT_FILL_Y);
998     m_smileys = new FXList(smileysframe, this, ConfigDialog_SMILEY, LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y);
999     fillSmileys();
1000 }
1001 
createKeybindingsTab(dxTabBook * tabbook)1002 void ConfigDialog::createKeybindingsTab(dxTabBook* tabbook)
1003 {
1004     new dxEXTabItem(tabbook, _("Key&bindings"), NULL, TAB_LEFT);
1005     FXVerticalFrame *kbpane = new FXVerticalFrame(tabbook, FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y);
1006     FXPacker *kbpack = new FXPacker(kbpane, LAYOUT_FILL_X);
1007     new dxEXButton(kbpack, _("Modify key bindings..."), ICO_KEYBINDINGS, this, ConfigDialog_MODIFYBINDINGS, FRAME_RAISED|FRAME_THICK|ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
1008     new dxEXButton(kbpack, _("Restore default key bindings..."), ICO_REFRESH, this, ConfigDialog_REFRESHBINDINGS, FRAME_RAISED|FRAME_THICK|ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
1009 }
1010 
onCommandsSelected(FXObject *,FXSelector,void *)1011 long ConfigDialog::onCommandsSelected(FXObject*, FXSelector, void*)
1012 {
1013     m_deleteCommand->enable();
1014     return 1;
1015 }
1016 
onCommandsDeselected(FXObject *,FXSelector,void *)1017 long ConfigDialog::onCommandsDeselected(FXObject*, FXSelector, void*)
1018 {
1019     m_deleteCommand->disable();
1020     return 1;
1021 }
1022 
onUsersSelected(FXObject *,FXSelector,void * ptr)1023 long ConfigDialog::onUsersSelected(FXObject*, FXSelector, void *ptr)
1024 {
1025     FXint i = (FXint)(FXival)ptr;
1026     m_users->selectItem(i);
1027     m_deleteUser->enable();
1028     return 1;
1029 }
1030 
onUsersDeselected(FXObject *,FXSelector,void *)1031 long ConfigDialog::onUsersDeselected(FXObject*, FXSelector, void*)
1032 {
1033     m_deleteUser->disable();
1034     return 1;
1035 }
1036 
onUsersChanged(FXObject *,FXSelector,void * ptr)1037 long ConfigDialog::onUsersChanged(FXObject*, FXSelector, void *ptr)
1038 {
1039     FXint i = (FXint)(FXival)ptr;
1040     m_users->selectItem(i);
1041     return 1;
1042 }
1043 
onFriendsSelected(FXObject *,FXSelector,void * ptr)1044 long ConfigDialog::onFriendsSelected(FXObject*, FXSelector, void *ptr)
1045 {
1046     FXint i = (FXint)(FXival)ptr;
1047     m_friends->selectItem(i);
1048     m_deleteFriend->enable();
1049     return 1;
1050 }
1051 
onFriendsDeselected(FXObject *,FXSelector,void *)1052 long ConfigDialog::onFriendsDeselected(FXObject*, FXSelector, void*)
1053 {
1054     m_deleteFriend->disable();
1055     return 1;
1056 }
1057 
onFriendsChanged(FXObject *,FXSelector,void * ptr)1058 long ConfigDialog::onFriendsChanged(FXObject*, FXSelector, void *ptr)
1059 {
1060     FXint i = (FXint)(FXival)ptr;
1061     m_friends->selectItem(i);
1062     return 1;
1063 }
1064 
onColor(FXObject *,FXSelector,void *)1065 long ConfigDialog::onColor(FXObject*, FXSelector, void*)
1066 {
1067     m_text->setTextColor(m_preferences.m_colors.text);
1068     m_text->setBackColor(m_preferences.m_colors.back);
1069     for(int i=0; i<8; i++)
1070     {
1071         m_textStyle[i].normalBackColor = m_preferences.m_colors.back;
1072     }
1073     m_textStyle[0].normalForeColor = m_preferences.m_colors.user;
1074     m_textStyle[1].normalForeColor = m_preferences.m_colors.action;
1075     m_textStyle[2].normalForeColor = m_preferences.m_colors.notice;
1076     m_textStyle[3].normalForeColor = m_preferences.m_colors.error;
1077     m_textStyle[4].normalForeColor = m_preferences.m_colors.hilight;
1078     m_textStyle[5].normalForeColor = m_preferences.m_colors.link;
1079     m_textStyle[6].normalForeColor = m_preferences.m_colors.mymsg;
1080     m_textStyle[7].normalForeColor = m_preferences.m_colors.log;
1081     m_text->update();
1082     return 1;
1083 }
1084 
onTabPosition(FX::FXObject *,FX::FXSelector,void * ptr)1085 long ConfigDialog::onTabPosition(FX::FXObject *, FX::FXSelector, void *ptr)
1086 {
1087     m_preferences.m_tabPosition = (FXint)(FXival)ptr;
1088     updateTabPosition();
1089     return 1;
1090 }
1091 
onNotifyPosition(FX::FXObject *,FX::FXSelector,void * ptr)1092 long ConfigDialog::onNotifyPosition(FX::FXObject *, FX::FXSelector, void *ptr)
1093 {
1094     m_preferences.m_notifyPosition = (FXint)(FXival)ptr;
1095     return 1;
1096 }
1097 
onClose(FXObject *,FXSelector,void *)1098 long ConfigDialog::onClose(FXObject*, FXSelector, void*)
1099 {
1100     getApp()->stopModal(this,TRUE);
1101     m_preferences.m_appTheme = m_themeCurrent;
1102     m_preferences.m_dccIP = m_dccIP1+"."+m_dccIP2+"."+m_dccIP3+"."+m_dccIP4;
1103     m_preferences.m_font = m_font->getFont();
1104     m_preferences.m_ircFont = m_ircFont->getFont();
1105     preferences = m_preferences;
1106     preferences.save();
1107     hide();
1108     return 1;
1109 }
1110 
onAddCommand(FXObject *,FXSelector,void *)1111 long ConfigDialog::onAddCommand(FXObject*, FXSelector, void*)
1112 {
1113     FXDialogBox dialog(this, _("Select ignore command"), DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0);
1114     FXVerticalFrame *contents = new FXVerticalFrame(&dialog, LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 10,10,10,10, 0,0);
1115     FXMatrix *matrix = new FXMatrix(contents,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
1116 
1117     new FXLabel(matrix, _("Command:"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1118     FXComboBox *command = new FXComboBox(matrix, 1, NULL, 0, COMBOBOX_STATIC|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|FRAME_GROOVE);
1119     command->fillItems(fillCommandsCombo());
1120 
1121     FXHorizontalFrame *buttonframe = new FXHorizontalFrame(contents,LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
1122     new dxEXButton(buttonframe, _("&Cancel"), NULL, &dialog, FXDialogBox::ID_CANCEL, FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1123     new dxEXButton(buttonframe, _("&OK"), NULL, &dialog, FXDialogBox::ID_ACCEPT, BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1124 
1125     if(dialog.execute(PLACEMENT_CURSOR))
1126     {
1127         m_commands->appendItem(command->getItemText(command->getCurrentItem()));
1128     }
1129     updateCommands();
1130     return 1;
1131 }
1132 
onDeleteCommand(FXObject *,FXSelector,void *)1133 long ConfigDialog::onDeleteCommand(FXObject*, FXSelector, void*)
1134 {
1135     FXint i = m_commands->getCurrentItem();
1136     m_commands->removeItem(i);
1137     m_commands->getNumItems() ? m_deleteCommand->enable() : m_deleteCommand->disable();
1138     updateCommands();
1139     return 1;
1140 }
1141 
onAddUser(FXObject *,FXSelector,void *)1142 long ConfigDialog::onAddUser(FXObject*, FXSelector, void*)
1143 {
1144     FXDialogBox dialog(this, _("Add ignore user"), DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0);
1145     FXVerticalFrame *contents = new FXVerticalFrame(&dialog, LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 10,10,10,10, 0,0);
1146     FXMatrix *matrix = new FXMatrix(contents,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
1147 
1148     new FXLabel(matrix, _("Nick:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1149     FXTextField *nick = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1150     nick->setText("_example!example@example.com");
1151     new FXLabel(matrix, _("Channel(s):\tChannels need to be comma separated"), NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1152     FXTextField *channel = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1153     channel->setText("all");
1154     channel->setTipText(_("Channels need to be comma separated"));
1155     new FXLabel(matrix, _("Network:"), NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1156     FXTextField *network = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1157     network->setText("all");
1158 
1159     FXHorizontalFrame *buttonframe = new FXHorizontalFrame(contents,LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
1160     new dxEXButton(buttonframe, _("&Cancel"), NULL, &dialog, FXDialogBox::ID_CANCEL, FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1161     new dxEXButton(buttonframe, _("&OK"), NULL, &dialog, FXDialogBox::ID_ACCEPT, BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1162 
1163     if(dialog.execute(PLACEMENT_CURSOR))
1164     {
1165         if(!nick->getText().empty() && !nickExist(nick->getText()))
1166         {
1167             UserInfo user;
1168             user.nick = nick->getText();
1169             channel->getText().empty() ? user.channel = "all" : user.channel = channel->getText();
1170             network->getText().empty() ? user.network = "all" : user.network = network->getText();
1171             m_preferences.m_ignoreUsersList.append(user);
1172             m_users->appendItem(user.nick+"\t"+user.channel+"\t"+user.network);
1173             if(!m_deleteUser->isEnabled()) m_deleteUser->enable();
1174             if(!m_modifyUser->isEnabled()) m_modifyUser->enable();
1175         }
1176     }
1177     return 1;
1178 }
1179 
onModifyUser(FXObject *,FXSelector,void *)1180 long ConfigDialog::onModifyUser(FXObject*, FXSelector, void*)
1181 {
1182     FXint i = m_users->getCurrentItem();
1183     FXString oldnick = m_preferences.m_ignoreUsersList[i].nick;
1184 
1185     FXDialogBox dialog(this, _("Modify ignore user"), DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0);
1186     FXVerticalFrame *contents = new FXVerticalFrame(&dialog, LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 10,10,10,10, 0,0);
1187     FXMatrix *matrix = new FXMatrix(contents,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
1188 
1189     new FXLabel(matrix, _("Nick:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1190     FXTextField *nick = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1191     nick->setText(oldnick);
1192     new FXLabel(matrix, _("Channel(s):\tChannels need to be comma separated"), NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1193     FXTextField *channel = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1194     channel->setText(m_preferences.m_ignoreUsersList[i].channel);
1195     new FXLabel(matrix, _("Network:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1196     FXTextField *network = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1197     network->setText(m_preferences.m_ignoreUsersList[i].network);
1198 
1199     FXHorizontalFrame *buttonframe = new FXHorizontalFrame(contents,LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
1200     new dxEXButton(buttonframe, _("&Cancel"), NULL, &dialog, FXDialogBox::ID_CANCEL, FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1201     new dxEXButton(buttonframe, _("&OK"), NULL, &dialog, FXDialogBox::ID_ACCEPT, BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1202 
1203     if(dialog.execute(PLACEMENT_CURSOR))
1204     {
1205         if(!nick->getText().empty() && (!nickExist(nick->getText()) || oldnick == nick->getText()))
1206         {
1207             m_preferences.m_ignoreUsersList[i].nick = nick->getText();
1208             channel->getText().empty() ? m_preferences.m_ignoreUsersList[i].channel = "all" : m_preferences.m_ignoreUsersList[i].channel = channel->getText();
1209             network->getText().empty() ? m_preferences.m_ignoreUsersList[i].network = "all" : m_preferences.m_ignoreUsersList[i].network = network->getText();
1210             m_users->setItemText(i, m_preferences.m_ignoreUsersList[i].nick+"\t"+m_preferences.m_ignoreUsersList[i].channel+"\t"+m_preferences.m_ignoreUsersList[i].network);
1211         }
1212     }
1213     return 1;
1214 }
1215 
onDeleteUser(FXObject *,FXSelector,void *)1216 long ConfigDialog::onDeleteUser(FXObject*, FXSelector, void*)
1217 {
1218     FXint i = m_users->getCurrentItem();
1219     m_users->removeItem(i);
1220     m_preferences.m_ignoreUsersList.erase(i);
1221     if(m_preferences.m_ignoreUsersList.no())
1222     {
1223         m_deleteUser->enable();
1224         m_modifyUser->enable();
1225     }
1226     else
1227     {
1228         m_deleteUser->disable();
1229         m_modifyUser->disable();
1230     }
1231     return 1;
1232 }
1233 
onImportSmiley(FXObject *,FXSelector,void *)1234 long ConfigDialog::onImportSmiley(FXObject*, FXSelector, void*)
1235 {
1236     if(m_showImportwarning && m_preferences.m_smileysMap.size())
1237         if(dxEXMessageBox::warning(this, MBOX_OK_CANCEL, _("Warning"), "%s", _("File import overwrites current settings"))==4) {m_showImportwarning=FALSE; return 1;}
1238     dxEXFileDialog dialog(this, _("Select file"));
1239     if(m_showImportwarning) dialog.setFilename((FXString)DXIRC_DATADIR+PATHSEPSTRING+"icons"+PATHSEPSTRING+"smileys"+PATHSEPSTRING+"dxirc.smiley");
1240     if(dialog.execute())
1241     {
1242         m_smileys->clearItems();
1243         m_preferences.m_smileysMap.clear();
1244         FXFile file(dialog.getFilename(), FXIO::Reading);
1245         if(file.isOpen())
1246         {
1247             FXchar line[MAXBUFFER] = { '0' };
1248             FXint bol,eol,end,path,smiley,p,lineno;
1249             FXString pathstr, smileystr;
1250             lineno=bol=eol=end=0;
1251             // Read lines
1252             while(readString(file,line,bol,eol,end))
1253             {
1254                 lineno++;
1255                 // Skip leading spaces
1256                 while(bol<eol && Ascii::isBlank(line[bol])) bol++;
1257                 // Skip comment lines and empty lines
1258                 if(bol>=eol || line[bol]=='#' || line[bol]==';' || line[bol]=='\n' || line[bol]=='\r') goto next;
1259                 // Scan key path
1260                 for(path=bol; bol<eol && line[bol]!='=' && !Ascii::isControl(line[bol]); bol++);
1261                 // Check errors
1262                 if(bol>=eol || line[bol]!='='){ fxwarning("%s:%d: expected '=' to follow key.\n",dialog.getFilename().text(),lineno); goto next; }
1263                 // Remove trailing spaces after path
1264                 for(p=bol; path<p && Ascii::isBlank(line[p-1]); p--);
1265                 // Terminate path
1266                 line[p]='\0';
1267                 // Skip leading spaces
1268                 for(bol++; bol<eol && Ascii::isBlank(line[bol]); bol++);
1269                 // Scan smiley
1270                 for(smiley=bol; bol<eol && !Ascii::isControl(line[bol]); bol++);
1271                 // Remove trailing spaces after smiley
1272                 for(p=bol; smiley<p && Ascii::isBlank(line[p-1]); p--);
1273                 // Terminate smiley
1274                 line[p]='\0';
1275                 //Fill smiley map
1276                 pathstr = dequote(line+path);
1277                 if(pathstr.empty()) goto next;
1278                 smileystr = dequote(line+smiley);
1279                 if(smileystr.empty()) goto next;
1280                 pathstr = FXPath::absolute(FXPath::directory(dialog.getFilename()), pathstr);
1281                 m_preferences.m_smileysMap.insert(StringPair(smileystr,pathstr));
1282 
1283 next:           bol=eol;
1284             }
1285         }
1286         fillSmileys();
1287         if(m_preferences.m_smileysMap.size())
1288         {
1289             m_modifySmiley->enable();
1290             m_deleteSmiley->enable();
1291             m_exportSmiley->enable();
1292         }
1293     }
1294     m_showImportwarning=FALSE;
1295     return 1;
1296 }
1297 
onExportSmiley(FXObject *,FXSelector,void *)1298 long ConfigDialog::onExportSmiley(FXObject*, FXSelector, void*)
1299 {
1300     dxEXFileDialog dialog(this, _("Save smiley settings as"));
1301     if(dialog.execute())
1302     {
1303         FXFile file(dialog.getFilename(), FXIO::Writing);
1304         FXchar line[MAXVALUE];
1305         if(file.isOpen())
1306         {
1307             writeString(file, HEADER);
1308             if((FXint)m_preferences.m_smileysMap.size())
1309             {
1310                 StringIt it;
1311                 FXint i;
1312                 for(i=0, it=m_preferences.m_smileysMap.begin(); it!=m_preferences.m_smileysMap.end(); it++,i++)
1313                 {
1314                     writeString(file, enquote(line, FXPath::relative(FXPath::directory(dialog.getFilename()),(*it).second).text()));
1315                     writeString(file, "=");
1316                     writeString(file, enquote(line, (*it).first.text()));
1317                     writeString(file, ENDLINE);
1318                 }
1319             }
1320         }
1321     }
1322     return 1;
1323 }
1324 
onLoadLog(FXObject *,FXSelector,void *)1325 long ConfigDialog::onLoadLog(FXObject*, FXSelector, void*)
1326 {
1327     if(m_preferences.m_loadLog) m_loadLineSpinner->enable();
1328     else m_loadLineSpinner->disable();
1329     return 1;
1330 }
1331 
onMouseWheel(FXObject *,FXSelector,void * ptr)1332 long ConfigDialog::onMouseWheel(FXObject *, FXSelector, void *ptr)
1333 {
1334     FXEvent *event = (FXEvent*)ptr;
1335     FXint index = m_tabbook->getCurrent();
1336     if(event->code > 0) //positive movement
1337     {
1338         if(m_tabbook->numChildren())
1339         {
1340             if((index-1) >= 0) m_tabbook->setCurrent(index-1, TRUE);
1341             else m_tabbook->setCurrent(m_tabbook->numChildren()/2-1, TRUE);
1342         }
1343     }
1344     else
1345     {
1346         if(m_tabbook->numChildren())
1347         {
1348             if((index+1)*2 < m_tabbook->numChildren()) m_tabbook->setCurrent(index+1, m_tabbook->numChildren() > index*2 ? TRUE : FALSE);
1349             else m_tabbook->setCurrent(0, TRUE);
1350         }
1351     }
1352     return 1;
1353 }
1354 
onModifyBindings(FXObject *,FXSelector,void *)1355 long ConfigDialog::onModifyBindings(FXObject*, FXSelector, void*)
1356 {
1357     KeybindingsDialog dialog(this);
1358     dialog.execute();
1359     return 1;
1360 }
1361 
onRefreshBindings(FXObject *,FXSelector,void *)1362 long ConfigDialog::onRefreshBindings(FXObject*, FXSelector, void*)
1363 {
1364     dxEXMessageBox box(this, _("Restore default key bindings"), _("Do you really want to restore the default key bindings?\nAll your customizations will be lost!"), ICO_KEYBINDINGS, MBOX_OK_CANCEL|DECOR_TITLE|DECOR_BORDER);
1365     if(box.execute() != MBOX_CLICKED_OK)
1366         return 0;
1367     dxirc::instance()->setTempKeybindings(preferences.getDefaultKeybindings());
1368     if(dxEXMessageBox::question(this, MBOX_YES_NO, _("Restart"), "%s", _("Key bindings will be changed after restart.\nRestart dxirc now?"))==1)
1369     {
1370         dxirc::instance()->handle(this, FXSEL(SEL_COMMAND, dxirc_RESTART), NULL);
1371     }
1372     return 1;
1373 }
1374 
1375 // Enquote a value
enquote(FXchar * result,const FXchar * text)1376 FXchar* ConfigDialog::enquote(FXchar* result, const FXchar* text)
1377 {
1378     FXchar *end = result + MAXVALUE - 6;
1379     FXchar *ptr = result;
1380     FXuchar c;
1381     if (needquotes(text))
1382     {
1383         *ptr++ = '"';
1384         while((c = *text++) != '\0' && ptr < end)
1385         {
1386             switch (c) {
1387                 case '\n':
1388                     *ptr++ = '\\';
1389                     *ptr++ = 'n';
1390                     break;
1391                 case '\r':
1392                     *ptr++ = '\\';
1393                             *ptr++ = 'r';
1394                     break;
1395                 case '\b':
1396                     *ptr++ = '\\';
1397                             *ptr++ = 'b';
1398                     break;
1399                 case '\v':
1400                     *ptr++ = '\\';
1401                     *ptr++ = 'v';
1402                     break;
1403                 case '\a':
1404                     *ptr++ = '\\';
1405                     *ptr++ = 'a';
1406                     break;
1407                 case '\f':
1408                     *ptr++ = '\\';
1409                     *ptr++ = 'f';
1410                     break;
1411                 case '\t':
1412                     *ptr++ = '\\';
1413                     *ptr++ = 't';
1414                     break;
1415                 case '\\':
1416                     *ptr++ = '\\';
1417                     *ptr++ = '\\';
1418                     break;
1419                 case '"':
1420                     *ptr++ = '\\';
1421                     *ptr++ = '"';
1422                     break;
1423                 case '\'':
1424                     *ptr++ = '\\';
1425                     *ptr++ = '\'';
1426                     break;
1427                 default:
1428                     if(c < 0x20 || 0x7f < c)
1429                     {
1430                         *ptr++ = '\\';
1431                         *ptr++ = 'x';
1432                         *ptr++ = FXString::HEX[c >> 4];
1433                         *ptr++ = FXString::HEX[c & 15];
1434                     }
1435                     else
1436                     {
1437                         *ptr++ = c;
1438                     }
1439                     break;
1440             }
1441         }
1442         *ptr++ = '"';
1443     }
1444     else
1445     {
1446         while ((c = *text++) != '\0' && ptr < end)
1447         {
1448             *ptr++ = c;
1449         }
1450     }
1451     *ptr = '\0';
1452     return result;
1453 }
1454 
1455 // Dequote a value, in situ
dequote(FXchar * text) const1456 FXchar* ConfigDialog::dequote(FXchar* text) const
1457 {
1458     FXchar *result = text;
1459     FXchar *ptr = text;
1460     FXuint v;
1461     if(*text == '"')
1462     {
1463         text++;
1464         while((v = *text++) != '\0' && v != '\n' && v != '"')
1465         {
1466             if(v == '\\')
1467             {
1468                 v = *text++;
1469                 switch (v) {
1470                     case 'n':
1471                         v = '\n';
1472                         break;
1473                     case 'r':
1474                         v = '\r';
1475                         break;
1476                     case 'b':
1477                         v = '\b';
1478                         break;
1479                     case 'v':
1480                         v = '\v';
1481                         break;
1482                     case 'a':
1483                         v = '\a';
1484                         break;
1485                     case 'f':
1486                         v = '\f';
1487                         break;
1488                     case 't':
1489                         v = '\t';
1490                         break;
1491                     case '\\':
1492                         v = '\\';
1493                         break;
1494                     case '"':
1495                         v = '"';
1496                         break;
1497                     case '\'':
1498                         v = '\'';
1499                         break;
1500                     case 'x':
1501                         v = 'x';
1502                         if(Ascii::isHexDigit(*text))
1503                         {
1504                             v = Ascii::digitValue(*text++);
1505                             if(Ascii::isHexDigit(*text))
1506                             {
1507                                 v = (v << 4) + Ascii::digitValue(*text++);
1508                             }
1509                         }
1510                         break;
1511                     case '0':
1512                     case '1':
1513                     case '2':
1514                     case '3':
1515                     case '4':
1516                     case '5':
1517                     case '6':
1518                     case '7':
1519                         v = v - '0';
1520                         if('0' <= *text && *text <= '7')
1521                         {
1522                             v = (v << 3)+*text++-'0';
1523                             if('0' <= *text && *text <= '7')
1524                             {
1525                                 v = (v << 3)+*text++-'0';
1526                             }
1527                         }
1528                         break;
1529                 }
1530             }
1531             *ptr++ = v;
1532         }
1533         *ptr = '\0';
1534     }
1535     return result;
1536 }
1537 
onAddFriend(FXObject *,FXSelector,void *)1538 long ConfigDialog::onAddFriend(FXObject*, FXSelector, void*)
1539 {
1540     FXDialogBox dialog(this, _("Add friend"), DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0);
1541     FXVerticalFrame *contents = new FXVerticalFrame(&dialog, LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 10,10,10,10, 0,0);
1542     FXMatrix *matrix = new FXMatrix(contents,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
1543 
1544     new FXLabel(matrix, _("Nick:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1545     FXTextField *nick = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1546     nick->setText("example");
1547     new FXLabel(matrix, _("Channel(s):\tChannels need to be comma separated"), NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1548     FXTextField *channel = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1549     channel->setText("#dxirc,#prd");
1550     channel->setTipText(_("Channels need to be comma separated"));
1551     new FXLabel(matrix, _("Network:"), NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1552     FXTextField *network = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1553     network->setText("Libera.Chat");
1554 
1555     FXHorizontalFrame *buttonframe = new FXHorizontalFrame(contents,LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
1556     new dxEXButton(buttonframe, _("&Cancel"), NULL, &dialog, FXDialogBox::ID_CANCEL, FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1557     new dxEXButton(buttonframe, _("&OK"), NULL, &dialog, FXDialogBox::ID_ACCEPT, BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1558 
1559     if(dialog.execute(PLACEMENT_CURSOR))
1560     {
1561         if(!nick->getText().empty() && !nickExist(nick->getText(), FALSE))
1562         {
1563             UserInfo user;
1564             user.nick = nick->getText();
1565             channel->getText().empty() ? user.channel = "all" : user.channel = channel->getText();
1566             network->getText().empty() ? user.network = "all" : user.network = network->getText();
1567             m_preferences.m_friendsList.append(user);
1568             m_friends->appendItem(user.nick+"\t"+user.channel+"\t"+user.network);
1569             if(!m_deleteFriend->isEnabled()) m_deleteFriend->enable();
1570             if(!m_modifyFriend->isEnabled()) m_modifyFriend->enable();
1571         }
1572     }
1573     return 1;
1574 }
1575 
onModifyFriend(FXObject *,FXSelector,void *)1576 long ConfigDialog::onModifyFriend(FXObject*, FXSelector, void*)
1577 {
1578     FXint i = m_friends->getCurrentItem();
1579     FXString oldnick = m_preferences.m_friendsList[i].nick;
1580 
1581     FXDialogBox dialog(this, _("Modify friend"), DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0);
1582     FXVerticalFrame *contents = new FXVerticalFrame(&dialog, LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 10,10,10,10, 0,0);
1583     FXMatrix *matrix = new FXMatrix(contents,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
1584 
1585     new FXLabel(matrix, _("Nick:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1586     FXTextField *nick = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1587     nick->setText(oldnick);
1588     new FXLabel(matrix, _("Channel(s):\tChannels need to be comma separated"), NULL,JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1589     FXTextField *channel = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1590     channel->setText(m_preferences.m_friendsList[i].channel);
1591     new FXLabel(matrix, _("Network:"), NULL, JUSTIFY_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1592     FXTextField *network = new FXTextField(matrix, 25, NULL, 0, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW);
1593     network->setText(m_preferences.m_friendsList[i].network);
1594 
1595     FXHorizontalFrame *buttonframe = new FXHorizontalFrame(contents,LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH);
1596     new dxEXButton(buttonframe, _("&Cancel"), NULL, &dialog, FXDialogBox::ID_CANCEL, FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1597     new dxEXButton(buttonframe, _("&OK"), NULL, &dialog, FXDialogBox::ID_ACCEPT, BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT, 0,0,0,0, 10,10,2,2);
1598 
1599     if(dialog.execute(PLACEMENT_CURSOR))
1600     {
1601         if(!nick->getText().empty() && (!nickExist(nick->getText(), FALSE) || oldnick == nick->getText()))
1602         {
1603             m_preferences.m_friendsList[i].nick = nick->getText();
1604             channel->getText().empty() ? m_preferences.m_friendsList[i].channel = "all" : m_preferences.m_friendsList[i].channel = channel->getText();
1605             network->getText().empty() ? m_preferences.m_friendsList[i].network = "all" : m_preferences.m_friendsList[i].network = network->getText();
1606             m_friends->setItemText(i, m_preferences.m_friendsList[i].nick+"\t"+m_preferences.m_friendsList[i].channel+"\t"+m_preferences.m_friendsList[i].network);
1607         }
1608     }
1609     return 1;
1610 }
1611 
onDeleteFriend(FXObject *,FXSelector,void *)1612 long ConfigDialog::onDeleteFriend(FXObject*, FXSelector, void*)
1613 {
1614     FXint i = m_friends->getCurrentItem();
1615     m_friends->removeItem(i);
1616     m_preferences.m_friendsList.erase(i);
1617     if(m_preferences.m_friendsList.no())
1618     {
1619         m_deleteFriend->enable();
1620         m_modifyFriend->enable();
1621     }
1622     else
1623     {
1624         m_deleteFriend->disable();
1625         m_modifyFriend->disable();
1626     }
1627     return 1;
1628 }
1629 
onAddIcons(FXObject *,FXSelector,void *)1630 long ConfigDialog::onAddIcons(FXObject*, FXSelector, void*)
1631 {
1632     dxEXDirDialog dirdialog(this, _("Select theme directory"));
1633     if(dirdialog.execute(PLACEMENT_CURSOR))
1634     {
1635         if(!FXPath::search(dirdialog.getDirectory(), "irc_normal.png").empty() && !themeExist(dirdialog.getDirectory())) m_icons->appendItem(dirdialog.getDirectory());
1636     }
1637     m_icons->getNumItems()>1 ? m_deleteTheme->enable() : m_deleteTheme->disable();
1638     updateThemesList();
1639     updateNickIcons();
1640     return 1;
1641 }
1642 
onDeleteIcons(FXObject *,FXSelector,void *)1643 long ConfigDialog::onDeleteIcons(FXObject*, FXSelector, void*)
1644 {
1645     FXint i = m_icons->getCurrentItem();
1646     m_icons->removeItem(i);
1647     i = m_icons->getCurrentItem();
1648     m_preferences.m_themePath = m_icons->getItemText(i);
1649     m_icons->getNumItems()>1 ? m_deleteTheme->enable() : m_deleteTheme->disable();
1650     updateThemesList();
1651     updateNickIcons();
1652     return 1;
1653 }
1654 
onIconsChanged(FXObject *,FXSelector,void * ptr)1655 long ConfigDialog::onIconsChanged(FXObject*, FXSelector, void *ptr)
1656 {
1657     FXint i = (FXint)(FXival)ptr;
1658     m_preferences.m_themePath = m_icons->getItemText(i);
1659     updateNickIcons();
1660     return 1;
1661 }
1662 
onTheme(FXObject *,FXSelector,void * ptr)1663 long ConfigDialog::onTheme(FXObject*, FXSelector, void *ptr)
1664 {
1665     FXint no = (FXint)(FXival)ptr;
1666     ColorTheme *themeSelected = reinterpret_cast<ColorTheme*>(m_themes->getItemData(no));
1667     if(themeSelected)
1668     {
1669         m_themeCurrent.back = themeSelected->back;
1670         m_themeCurrent.base = themeSelected->base;
1671         m_themeCurrent.border = themeSelected->border;
1672         m_themeCurrent.fore = themeSelected->fore;
1673         m_themeCurrent.menuback = themeSelected->menuback;
1674         m_themeCurrent.menufore = themeSelected->menufore;
1675         m_themeCurrent.selback = themeSelected->selback;
1676         m_themeCurrent.selfore = themeSelected->selfore;
1677         m_themeCurrent.tipback = themeSelected->tipback;
1678         m_themeCurrent.tipfore = themeSelected->tipfore;
1679         m_themeCurrent.notifyback = themeSelected->notifyback;
1680         m_themeCurrent.notifyfore = themeSelected->notifyfore;
1681         if(m_themeCurrent.fore == m_preferences.m_unreadColor)
1682         {
1683             if(m_themeCurrent.fore != FXRGB(0,0,255)) m_preferences.m_unreadColor = FXRGB(0,0,255);
1684             else m_preferences.m_unreadColor = FXRGBA(FXREDVAL(m_themeCurrent.fore),FXGREENVAL(m_themeCurrent.fore),FXBLUEVAL(m_themeCurrent.fore)+1,FXALPHAVAL(m_themeCurrent.fore));
1685         }
1686         if(m_themeCurrent.fore == m_preferences.m_highlightColor)
1687         {
1688             if(m_themeCurrent.fore != FXRGB(255,0,0)) m_preferences.m_highlightColor = FXRGB(255,0,0);
1689             else m_preferences.m_highlightColor = FXRGBA(FXREDVAL(m_themeCurrent.fore)+1,FXGREENVAL(m_themeCurrent.fore),FXBLUEVAL(m_themeCurrent.fore),FXALPHAVAL(m_themeCurrent.fore));
1690         }
1691         updateColors();
1692     }
1693     return 1;
1694 }
1695 
onFont(FXObject *,FXSelector,void *)1696 long ConfigDialog::onFont(FXObject*, FXSelector, void*)
1697 {
1698     dxEXFontDialog dialog(this, _("Select font"));
1699     FXFontDesc fontdescription;
1700     m_font->getFontDesc(fontdescription);
1701     dialog.setFontSelection(fontdescription);
1702     if(dialog.execute(PLACEMENT_SCREEN))
1703     {
1704         FXFont *oldfont = m_font;
1705         dialog.getFontSelection(fontdescription);
1706         m_font = new FXFont(getApp(),fontdescription);
1707         m_font->create();
1708         delete oldfont;
1709         updateFont();
1710     }
1711     return 1;
1712 }
1713 
onIrcFont(FXObject *,FXSelector,void *)1714 long ConfigDialog::onIrcFont(FXObject*, FXSelector, void*)
1715 {
1716     dxEXFontDialog dialog(this, _("Select font"));
1717     FXFontDesc fontdescription;
1718     m_ircFont->getFontDesc(fontdescription);
1719     dialog.setFontSelection(fontdescription);
1720     if(dialog.execute(PLACEMENT_SCREEN))
1721     {
1722         FXFont *oldfont = m_ircFont;
1723         dialog.getFontSelection(fontdescription);
1724         m_ircFont = new FXFont(getApp(),fontdescription);
1725         m_ircFont->create();
1726         delete oldfont;
1727         updateIrcFont();
1728     }
1729     return 1;
1730 }
1731 
onThemeColorChanged(FXObject * obj,FXSelector,void *)1732 long ConfigDialog::onThemeColorChanged(FXObject*obj, FXSelector, void*)
1733 {
1734     m_themes->setCurrentItem(m_themes->getNumItems()-1);
1735     updateColors();
1736     return 1;
1737 }
1738 
updateColors()1739 void ConfigDialog::updateColors()
1740 {
1741     m_themeCurrent.shadow = makeShadowColor(m_themeCurrent.base);
1742     m_themeCurrent.hilite = makeHiliteColor(m_themeCurrent.base);
1743 
1744     m_vframe2->setBorderColor(m_themeCurrent.border);
1745     m_vframe2->setBaseColor(m_themeCurrent.base);
1746     m_vframe2->setBackColor(m_themeCurrent.base);
1747     m_vframe2->setShadowColor(m_themeCurrent.shadow);
1748     m_vframe2->setHiliteColor(m_themeCurrent.hilite);
1749 
1750     m_label->setBorderColor(m_themeCurrent.border);
1751     m_label->setBaseColor(m_themeCurrent.base);
1752     m_label->setBackColor(m_themeCurrent.base);
1753     m_label->setTextColor(m_themeCurrent.fore);
1754     m_label->setShadowColor(m_themeCurrent.shadow);
1755     m_label->setHiliteColor(m_themeCurrent.hilite);
1756 
1757     m_textFrame1->setBorderColor(m_themeCurrent.border);
1758     m_textFrame1->setBaseColor(m_themeCurrent.base);
1759     m_textFrame1->setBackColor(m_themeCurrent.base);
1760     m_textFrame1->setShadowColor(m_themeCurrent.shadow);
1761     m_textFrame1->setHiliteColor(m_themeCurrent.hilite);
1762     m_textTest->setBorderColor(m_themeCurrent.border);
1763     m_textTest->setBackColor(m_themeCurrent.back);
1764     m_textTest->setBaseColor(m_themeCurrent.base);
1765     m_textTest->setTextColor(m_themeCurrent.fore);
1766     m_textTest->setSelTextColor(m_themeCurrent.selfore);
1767     m_textTest->setSelBackColor(m_themeCurrent.selback);
1768     m_textTest->setCursorColor(m_themeCurrent.fore);
1769     m_textTest->setShadowColor(m_themeCurrent.shadow);
1770     m_textTest->setHiliteColor(m_themeCurrent.hilite);
1771 
1772     m_textFrame2->setBorderColor(m_themeCurrent.border);
1773     m_textFrame2->setBaseColor(m_themeCurrent.base);
1774     m_textFrame2->setBackColor(m_themeCurrent.back);
1775     m_textFrame2->setShadowColor(m_themeCurrent.shadow);
1776     m_textFrame2->setHiliteColor(m_themeCurrent.hilite);
1777     m_labelSelected->setBorderColor(m_themeCurrent.border);
1778     m_labelSelected->setBaseColor(m_themeCurrent.base);
1779     m_labelSelected->setBackColor(m_themeCurrent.selback);
1780     m_labelSelected->setTextColor(m_themeCurrent.selfore);
1781     m_labelSelected->setShadowColor(m_themeCurrent.shadow);
1782     m_labelSelected->setHiliteColor(m_themeCurrent.hilite);
1783 
1784     m_textFrame3->setBorderColor(m_themeCurrent.border);
1785     m_textFrame3->setBaseColor(m_themeCurrent.base);
1786     m_textFrame3->setBackColor(m_themeCurrent.back);
1787     m_textFrame3->setShadowColor(m_themeCurrent.shadow);
1788     m_textFrame3->setHiliteColor(m_themeCurrent.hilite);
1789     m_labelNocurrent->setBorderColor(m_themeCurrent.border);
1790     m_labelNocurrent->setBaseColor(m_themeCurrent.base);
1791     m_labelNocurrent->setBackColor(m_themeCurrent.base);
1792     m_labelNocurrent->setTextColor(m_themeCurrent.fore);
1793     m_labelNocurrent->setShadowColor(m_themeCurrent.shadow);
1794     m_labelNocurrent->setHiliteColor(m_themeCurrent.hilite);
1795 
1796     m_sep1->setBorderColor(m_themeCurrent.border);
1797     m_sep1->setBaseColor(m_themeCurrent.base);
1798     m_sep1->setBackColor(m_themeCurrent.base);
1799     m_sep1->setShadowColor(m_themeCurrent.shadow);
1800     m_sep1->setHiliteColor(m_themeCurrent.hilite);
1801 
1802     m_labelTip->setBorderColor(m_themeCurrent.tipfore);
1803     m_labelTip->setBaseColor(m_themeCurrent.tipback);
1804     m_labelTip->setBackColor(m_themeCurrent.tipback);
1805     m_labelTip->setTextColor(m_themeCurrent.tipfore);
1806     m_labelTip->setShadowColor(m_themeCurrent.shadow);
1807     m_labelTip->setHiliteColor(m_themeCurrent.hilite);
1808 
1809     if(!dxUtils.haveNotify())
1810     {
1811         m_labelNotify->setBorderColor(m_themeCurrent.notifyfore);
1812         m_labelNotify->setBaseColor(m_themeCurrent.notifyback);
1813         m_labelNotify->setBackColor(m_themeCurrent.notifyback);
1814         m_labelNotify->setTextColor(m_themeCurrent.notifyfore);
1815         m_labelNotify->setShadowColor(m_themeCurrent.shadow);
1816         m_labelNotify->setHiliteColor(m_themeCurrent.hilite);
1817     }
1818 
1819     m_menuGroup->setBorderColor(m_themeCurrent.border);
1820     m_menuGroup->setBaseColor(m_themeCurrent.base);
1821     m_menuGroup->setBackColor(m_themeCurrent.base);
1822     m_menuGroup->setShadowColor(m_themeCurrent.shadow);
1823     m_menuGroup->setHiliteColor(m_themeCurrent.hilite);
1824     m_menuGroup->setTextColor(m_themeCurrent.fore);
1825     m_menuFrame->setBorderColor(m_themeCurrent.border);
1826     m_menuFrame->setBaseColor(m_themeCurrent.base);
1827     m_menuFrame->setBackColor(m_themeCurrent.base);
1828     m_menuFrame->setShadowColor(m_themeCurrent.shadow);
1829     m_menuFrame->setHiliteColor(m_themeCurrent.hilite);
1830     m_sep2->setBorderColor(m_themeCurrent.border);
1831     m_sep2->setBaseColor(m_themeCurrent.base);
1832     m_sep2->setBackColor(m_themeCurrent.base);
1833     m_sep2->setShadowColor(m_themeCurrent.shadow);
1834     m_sep2->setHiliteColor(m_themeCurrent.hilite);
1835     for(int i=0; i<3; i++)
1836     {
1837         m_menuLabels[i]->setBorderColor(m_themeCurrent.border);
1838         m_menuLabels[i]->setBaseColor(m_themeCurrent.base);
1839         m_menuLabels[i]->setBackColor(m_themeCurrent.base);
1840         m_menuLabels[i]->setTextColor(m_themeCurrent.fore);
1841         m_menuLabels[i]->setShadowColor(m_themeCurrent.shadow);
1842         m_menuLabels[i]->setHiliteColor(m_themeCurrent.hilite);
1843     }
1844     m_menuLabels[1]->setBorderColor(m_themeCurrent.border);
1845     m_menuLabels[1]->setBaseColor(m_themeCurrent.menuback);
1846     m_menuLabels[1]->setBackColor(m_themeCurrent.menuback);
1847     m_menuLabels[1]->setTextColor(m_themeCurrent.menufore);
1848     m_menuLabels[1]->setShadowColor(m_themeCurrent.shadow);
1849     m_menuLabels[1]->setHiliteColor(m_themeCurrent.hilite);
1850 
1851     m_tabFrame->setBorderColor(m_themeCurrent.border);
1852     m_tabFrame->setBaseColor(m_themeCurrent.base);
1853     m_tabFrame->setBackColor(m_themeCurrent.base);
1854     m_tabFrame->setShadowColor(m_themeCurrent.shadow);
1855     m_tabFrame->setHiliteColor(m_themeCurrent.hilite);
1856     m_tabs->setBorderColor(m_themeCurrent.border);
1857     m_tabs->setBaseColor(m_themeCurrent.base);
1858     m_tabs->setBackColor(m_themeCurrent.base);
1859     m_tabs->setShadowColor(m_themeCurrent.shadow);
1860     m_tabs->setHiliteColor(m_themeCurrent.hilite);
1861     m_tabframe1->setBorderColor(m_themeCurrent.border);
1862     m_tabframe1->setBaseColor(m_themeCurrent.base);
1863     m_tabframe1->setBackColor(m_themeCurrent.base);
1864     m_tabframe1->setShadowColor(m_themeCurrent.shadow);
1865     m_tabframe1->setHiliteColor(m_themeCurrent.hilite);
1866     m_tabframe2->setBorderColor(m_themeCurrent.border);
1867     m_tabframe2->setBaseColor(m_themeCurrent.base);
1868     m_tabframe2->setBackColor(m_themeCurrent.base);
1869     m_tabframe2->setShadowColor(m_themeCurrent.shadow);
1870     m_tabframe2->setHiliteColor(m_themeCurrent.hilite);
1871     m_tabframe3->setBorderColor(m_themeCurrent.border);
1872     m_tabframe3->setBaseColor(m_themeCurrent.base);
1873     m_tabframe3->setBackColor(m_themeCurrent.base);
1874     m_tabframe3->setShadowColor(m_themeCurrent.shadow);
1875     m_tabframe3->setHiliteColor(m_themeCurrent.hilite);
1876     m_tab->setBorderColor(m_themeCurrent.border);
1877     m_tab->setBaseColor(m_themeCurrent.base);
1878     m_tab->setBackColor(m_themeCurrent.base);
1879     m_tab->setTextColor(m_themeCurrent.fore);
1880     m_tab->setShadowColor(m_themeCurrent.shadow);
1881     m_tab->setHiliteColor(m_themeCurrent.hilite);
1882     m_unread->setBorderColor(m_themeCurrent.border);
1883     m_unread->setBaseColor(m_themeCurrent.base);
1884     m_unread->setBackColor(m_themeCurrent.base);
1885     m_unread->setTextColor(m_preferences.m_unreadColor);
1886     m_unread->setShadowColor(m_themeCurrent.shadow);
1887     m_unread->setHiliteColor(m_themeCurrent.hilite);
1888     m_highlight->setBorderColor(m_themeCurrent.border);
1889     m_highlight->setBaseColor(m_themeCurrent.base);
1890     m_highlight->setBackColor(m_themeCurrent.base);
1891     m_highlight->setTextColor(m_preferences.m_highlightColor);
1892     m_highlight->setShadowColor(m_themeCurrent.shadow);
1893     m_highlight->setHiliteColor(m_themeCurrent.hilite);
1894     m_tabLabel1->setBorderColor(m_themeCurrent.border);
1895     m_tabLabel1->setBaseColor(m_themeCurrent.base);
1896     m_tabLabel1->setBackColor(m_themeCurrent.base);
1897     m_tabLabel1->setTextColor(m_themeCurrent.fore);
1898     m_tabLabel1->setShadowColor(m_themeCurrent.shadow);
1899     m_tabLabel1->setHiliteColor(m_themeCurrent.hilite);
1900     m_tabLabel2->setBorderColor(m_themeCurrent.border);
1901     m_tabLabel2->setBaseColor(m_themeCurrent.base);
1902     m_tabLabel2->setBackColor(m_themeCurrent.base);
1903     m_tabLabel2->setTextColor(m_themeCurrent.fore);
1904     m_tabLabel2->setShadowColor(m_themeCurrent.shadow);
1905     m_tabLabel2->setHiliteColor(m_themeCurrent.hilite);
1906     m_tabLabel3->setBorderColor(m_themeCurrent.border);
1907     m_tabLabel3->setBaseColor(m_themeCurrent.base);
1908     m_tabLabel3->setBackColor(m_themeCurrent.base);
1909     m_tabLabel3->setTextColor(m_themeCurrent.fore);
1910     m_tabLabel3->setShadowColor(m_themeCurrent.shadow);
1911     m_tabLabel3->setHiliteColor(m_themeCurrent.hilite);
1912 }
1913 
onTabColorChanged(FXObject * obj,FXSelector,void *)1914 long ConfigDialog::onTabColorChanged(FXObject*obj, FXSelector, void*)
1915 {
1916     if(m_themeCurrent.fore == m_preferences.m_unreadColor)
1917     {
1918         if(m_themeCurrent.fore != FXRGB(0,0,255)) m_preferences.m_unreadColor = FXRGB(0,0,255);
1919         else m_preferences.m_unreadColor = FXRGBA(FXREDVAL(m_themeCurrent.fore),FXGREENVAL(m_themeCurrent.fore),FXBLUEVAL(m_themeCurrent.fore)+1,FXALPHAVAL(m_themeCurrent.fore));
1920     }
1921     if(m_themeCurrent.fore == m_preferences.m_highlightColor)
1922     {
1923         if(m_themeCurrent.fore != FXRGB(255,0,0)) m_preferences.m_highlightColor = FXRGB(255,0,0);
1924         else m_preferences.m_highlightColor = FXRGBA(FXREDVAL(m_themeCurrent.fore)+1,FXGREENVAL(m_themeCurrent.fore),FXBLUEVAL(m_themeCurrent.fore),FXALPHAVAL(m_themeCurrent.fore));
1925     }
1926     m_unread->setTextColor(m_preferences.m_unreadColor);
1927     m_highlight->setTextColor(m_preferences.m_highlightColor);
1928     return 1;
1929 }
1930 
weightToString(FXuint weight)1931 static FXString weightToString(FXuint weight){
1932     switch(weight)
1933     {
1934         case FXFont::Thin      : return "thin";
1935         case FXFont::ExtraLight: return "extralight";
1936         case FXFont::Light     : return "light";
1937         case FXFont::Normal    : return "normal";
1938         case FXFont::Medium    : return "medium";
1939         case FXFont::DemiBold  : return "demibold";
1940         case FXFont::Bold      : return "bold";
1941         case FXFont::ExtraBold : return "extrabold";
1942         case FXFont::Black     : return "heavy";
1943         default: return ""; break;
1944     }
1945     return "";
1946 }
1947 
slantToString(FXuint slant)1948 static FXString slantToString(FXuint slant)
1949 {
1950     switch(slant)
1951     {
1952         case FXFont::Straight       : return "regular";
1953         case FXFont::Italic         : return "italic";
1954         case FXFont::Oblique        : return "oblique";
1955         case FXFont::ReverseItalic  : return "reverse italic";
1956         case FXFont::ReverseOblique : return "reverse oblique";
1957         default : return "";
1958     }
1959     return "";
1960 }
1961 
updateFont()1962 void ConfigDialog::updateFont()
1963 {
1964     FXString fontname = m_font->getActualName() +", " + FXStringVal(m_font->getSize()/10);
1965     if(m_font->getWeight()!=0 && m_font->getWeight()!=FXFont::Normal)
1966     {
1967         fontname += ", " + weightToString(m_font->getWeight());
1968     }
1969     if (m_font->getSlant()!=0 && m_font->getSlant()!=FXFont::Straight)
1970     {
1971         fontname += ", " + slantToString(m_font->getSlant());
1972     }
1973     m_fontButton->setText(fontname);
1974 
1975     m_labelSelected->setFont(m_font);
1976     m_labelNocurrent->setFont(m_font);
1977     m_labelTip->setFont(m_font);
1978     m_label->setFont(m_font);
1979     m_textTest->setFont(m_font);
1980     m_menuGroup->setFont(m_font);
1981     m_menuLabels[0]->setFont(m_font);
1982     m_menuLabels[1]->setFont(m_font);
1983     m_menuLabels[2]->setFont(m_font);
1984     m_tab->setFont(m_font);
1985     m_unread->setFont(m_font);
1986     m_highlight->setFont(m_font);
1987 }
1988 
updateIrcFont()1989 void ConfigDialog::updateIrcFont()
1990 {
1991     FXString fontname = m_ircFont->getActualName() +", " + FXStringVal(m_ircFont->getSize()/10);
1992     if(m_ircFont->getWeight()!=0 && m_ircFont->getWeight()!=FXFont::Normal)
1993     {
1994         fontname += ", " + weightToString(m_ircFont->getWeight());
1995     }
1996     if (m_ircFont->getSlant()!=0 && m_ircFont->getSlant()!=FXFont::Straight)
1997     {
1998         fontname += ", " + slantToString(m_ircFont->getSlant());
1999     }
2000     m_ircfontButton->setText(fontname);
2001 
2002     m_text->setFont(m_ircFont);
2003 }
2004 
onLogChanged(FXObject *,FXSelector,void *)2005 long ConfigDialog::onLogChanged(FXObject*, FXSelector, void*)
2006 {
2007     if(m_preferences.m_logging)
2008     {
2009         m_selectPath->enable();
2010         m_loadLogButton->enable();
2011     }
2012     else
2013     {
2014         m_selectPath->disable();
2015         m_preferences.m_loadLog = false;
2016         m_loadLogButton->disable();
2017         m_loadLineSpinner->disable();
2018     }
2019     return 1;
2020 }
2021 
onAutoloadChanged(FXObject *,FXSelector,void *)2022 long ConfigDialog::onAutoloadChanged(FXObject*, FXSelector, void*)
2023 {
2024     if(m_preferences.m_autoload) m_selectAutoloadPath->enable();
2025     else m_selectAutoloadPath->disable();
2026     return 1;
2027 }
2028 
onNickCharChanged(FXObject *,FXSelector,void *)2029 long ConfigDialog::onNickCharChanged(FXObject*, FXSelector, void*)
2030 {
2031     m_preferences.m_nickCompletionChar = m_nickCharField->getText().left(1);
2032     m_nickCharField->setText(m_preferences.m_nickCompletionChar);
2033     return 1;
2034 }
2035 
onTray(FXObject *,FXSelector,void *)2036 long ConfigDialog::onTray(FXObject*, FXSelector, void*)
2037 {
2038     if(m_preferences.m_useTray)
2039         m_closeToTrayButton->enable();
2040     else
2041     {
2042         m_preferences.m_closeToTray = FALSE;
2043         m_closeToTrayButton->disable();
2044     }
2045     return 1;
2046 }
2047 
onReconnect(FXObject *,FXSelector,void *)2048 long ConfigDialog::onReconnect(FXObject*, FXSelector, void*)
2049 {
2050     if(m_preferences.m_reconnect)
2051     {
2052         m_numberAttemptLabel->enable();
2053         m_numberAttemptSpinner->enable();
2054         m_delayAttemptLabel->enable();
2055         m_delayAttemptSpinner->enable();
2056     }
2057     else
2058     {
2059         m_numberAttemptLabel->disable();
2060         m_numberAttemptSpinner->disable();
2061         m_delayAttemptLabel->disable();
2062         m_delayAttemptSpinner->disable();
2063     }
2064     return 1;
2065 }
2066 
onPathSelect(FXObject *,FXSelector,void *)2067 long ConfigDialog::onPathSelect(FXObject*, FXSelector, void*)
2068 {
2069     dxEXDirDialog dirdialog(this,_("Select log directory"));
2070     dirdialog.setDirectory(m_preferences.m_logPath);
2071     if(dirdialog.execute(PLACEMENT_CURSOR))
2072     {
2073         m_preferences.m_logPath = dirdialog.getDirectory();
2074     }
2075     return 1;
2076 }
2077 
onAutoloadPathSelect(FXObject *,FXSelector,void *)2078 long ConfigDialog::onAutoloadPathSelect(FXObject*, FXSelector, void*)
2079 {
2080     dxEXDirDialog dirdialog(this,_("Select autoload directory"));
2081     dirdialog.setDirectory(m_preferences.m_autoloadPath);
2082     if(dirdialog.execute(PLACEMENT_CURSOR))
2083     {
2084         m_preferences.m_autoloadPath = dirdialog.getDirectory();
2085     }
2086     return 1;
2087 }
2088 
onDccPathSelect(FXObject *,FXSelector,void *)2089 long ConfigDialog::onDccPathSelect(FXObject*, FXSelector, void*)
2090 {
2091     dxEXDirDialog dirdialog(this,_("Select directory"));
2092     dirdialog.setDirectory(m_preferences.m_dccPath);
2093     if(dirdialog.execute(PLACEMENT_CURSOR))
2094     {
2095         m_preferences.m_dccPath = dirdialog.getDirectory();
2096     }
2097     return 1;
2098 }
2099 
onDccPortD(FXObject *,FXSelector,void *)2100 long ConfigDialog::onDccPortD(FXObject*, FXSelector, void*)
2101 {
2102     if(m_preferences.m_dccPortD<0 || m_preferences.m_dccPortD>65536) m_preferences.m_dccPortD = 0;
2103     if(m_preferences.m_dccPortH<m_preferences.m_dccPortD) m_preferences.m_dccPortH = m_preferences.m_dccPortD;
2104     return 1;
2105 }
2106 
onDccPortH(FXObject *,FXSelector,void *)2107 long ConfigDialog::onDccPortH(FXObject*, FXSelector, void*)
2108 {
2109     if(m_preferences.m_dccPortH<0 || m_preferences.m_dccPortH>65536) m_preferences.m_dccPortH = 0;
2110     if(m_preferences.m_dccPortD>m_preferences.m_dccPortH) m_preferences.m_dccPortD = m_preferences.m_dccPortH;
2111     return 1;
2112 }
2113 
onSounds(FXObject *,FXSelector,void *)2114 long ConfigDialog::onSounds(FXObject*, FXSelector, void*)
2115 {
2116     if(m_preferences.m_sounds)
2117     {
2118         m_checkConnect->enable();
2119         m_selectConnect->enable();
2120         if(FXStat::exists(m_preferences.m_pathConnect)) m_playConnect->enable();
2121         m_checkDisconnect->enable();
2122         m_selectDisconnect->enable();
2123         if(FXStat::exists(m_preferences.m_pathDisconnect)) m_playDisconnect->enable();
2124         m_checkMessage->enable();
2125         m_selectMessage->enable();
2126         if(FXStat::exists(m_preferences.m_pathMessage)) m_playMessage->enable();
2127     }
2128     else
2129     {
2130         m_checkConnect->disable();
2131         m_selectConnect->disable();
2132         m_playConnect->disable();
2133         m_checkDisconnect->disable();
2134         m_selectDisconnect->disable();
2135         m_playDisconnect->disable();
2136         m_checkMessage->disable();
2137         m_selectMessage->disable();
2138         m_playMessage->disable();
2139         m_addFriend->disable();
2140         m_modifyFriend->disable();
2141         m_deleteFriend->disable();
2142     }
2143     if(m_preferences.m_sounds || m_preferences.m_notify)
2144     {
2145         m_addFriend->enable();
2146         if(m_preferences.m_friendsList.no())
2147         {
2148             m_deleteFriend->enable();
2149             m_modifyFriend->enable();
2150         }
2151     }
2152     else
2153     {
2154         m_addFriend->disable();
2155         m_modifyFriend->disable();
2156         m_deleteFriend->disable();
2157     }
2158     return 1;
2159 }
2160 
onSoundConnect(FXObject *,FXSelector,void *)2161 long ConfigDialog::onSoundConnect(FXObject*, FXSelector, void*)
2162 {
2163     if(m_preferences.m_soundConnect)
2164     {
2165         m_selectConnect->enable();
2166         if(FXStat::exists(m_preferences.m_pathConnect)) m_playConnect->enable();
2167     }
2168     else
2169     {
2170         m_selectConnect->disable();
2171         m_playConnect->enable();
2172     }
2173     return 1;
2174 }
2175 
onSoundDisconnect(FXObject *,FXSelector,void *)2176 long ConfigDialog::onSoundDisconnect(FXObject*, FXSelector, void*)
2177 {
2178     if(m_preferences.m_soundDisconnect)
2179     {
2180         m_selectDisconnect->enable();
2181         if(FXStat::exists(m_preferences.m_pathDisconnect)) m_playDisconnect->enable();
2182     }
2183     else
2184     {
2185         m_selectDisconnect->disable();
2186         m_playDisconnect->enable();
2187     }
2188     return 1;
2189 }
2190 
onSoundMessage(FXObject *,FXSelector,void *)2191 long ConfigDialog::onSoundMessage(FXObject*, FXSelector, void*)
2192 {
2193     if(m_preferences.m_soundMessage)
2194     {
2195         m_selectMessage->enable();
2196         if(FXStat::exists(m_preferences.m_pathMessage)) m_playMessage->enable();
2197     }
2198     else
2199     {
2200         m_selectMessage->disable();
2201         m_playMessage->enable();
2202     }
2203     return 1;
2204 }
2205 
onPlay(FXObject *,FXSelector sel,void *)2206 long ConfigDialog::onPlay(FXObject*, FXSelector sel, void*)
2207 {
2208     switch(FXSELID(sel)) {
2209         case ConfigDialog_PLAYCONNECT:
2210             dxutils::playFile(m_preferences.m_pathConnect);
2211             return 1;
2212         case ConfigDialog_PLAYDISCONNECT:
2213             dxutils::playFile(m_preferences.m_pathDisconnect);
2214             return 1;
2215         case ConfigDialog_PLAYMESSAGE:
2216             dxutils::playFile(m_preferences.m_pathMessage);
2217             return 1;
2218     }
2219     return 1;
2220 }
2221 
onSelectPath(FXObject *,FXSelector sel,void *)2222 long ConfigDialog::onSelectPath(FXObject*, FXSelector sel, void*)
2223 {
2224     dxEXFileDialog file(this, _("Select file"));
2225     file.setPatternList(_("Sound file (*.wav)"));
2226     switch(FXSELID(sel)) {
2227         case ConfigDialog_SELECTCONNECT:
2228             if(file.execute(PLACEMENT_CURSOR))
2229             {
2230                 m_preferences.m_pathConnect = file.getFilename();
2231                 m_playConnect->enable();
2232             }
2233             return 1;
2234         case ConfigDialog_SELECTDISCONNECT:
2235             if(file.execute(PLACEMENT_CURSOR))
2236             {
2237                 m_preferences.m_pathDisconnect = file.getFilename();
2238                 m_playDisconnect->enable();
2239             }
2240             return 1;
2241         case ConfigDialog_SELECTMESSAGE:
2242             if(file.execute(PLACEMENT_CURSOR))
2243             {
2244                 m_preferences.m_pathMessage = file.getFilename();
2245                 m_playMessage->enable();
2246             }
2247             return 1;
2248     }
2249     return 1;
2250 }
2251 
onNotify(FXObject *,FXSelector,void *)2252 long ConfigDialog::onNotify(FXObject*, FXSelector, void*)
2253 {
2254     if(m_preferences.m_notify)
2255     {
2256         m_checkNotifyConnect->enable();
2257         m_checkNotifyDisconnect->enable();
2258         m_checkNotifyMessage->enable();
2259     }
2260     else
2261     {
2262         m_checkNotifyConnect->disable();
2263         m_checkNotifyDisconnect->disable();
2264         m_checkNotifyMessage->disable();
2265     }
2266     if(m_preferences.m_sounds || m_preferences.m_notify)
2267     {
2268         m_addFriend->enable();
2269         if(m_preferences.m_friendsList.no())
2270         {
2271             m_deleteFriend->enable();
2272             m_modifyFriend->enable();
2273         }
2274     }
2275     else
2276     {
2277         m_addFriend->disable();
2278         m_modifyFriend->disable();
2279         m_deleteFriend->disable();
2280     }
2281     return 1;
2282 }
2283 
onShowNotify(FXObject *,FXSelector,void *)2284 long ConfigDialog::onShowNotify(FXObject*, FXSelector, void*)
2285 {
2286     dxirc::instance()->showNotify(FXStringFormat(_("%s has joined to %s"), "dvx", "#dxirc"), m_preferences.m_notifyPosition);
2287     return 1;
2288 }
2289 
onUseSmileys(FXObject *,FXSelector,void *)2290 long ConfigDialog::onUseSmileys(FXObject*, FXSelector, void*)
2291 {
2292     if(m_preferences.m_useSmileys)
2293     {
2294         m_addSmiley->enable();
2295         m_importSmiley->enable();
2296         if((FXint)m_preferences.m_smileysMap.size())
2297         {
2298             m_modifySmiley->enable();
2299             m_deleteSmiley->enable();
2300             m_exportSmiley->enable();
2301         }
2302         else
2303         {
2304             m_modifySmiley->disable();
2305             m_deleteSmiley->disable();
2306             m_exportSmiley->disable();
2307         }
2308     }
2309     else
2310     {
2311         m_addSmiley->disable();
2312         m_modifySmiley->disable();
2313         m_deleteSmiley->disable();
2314         m_importSmiley->disable();
2315         m_exportSmiley->disable();
2316     }
2317     return 1;
2318 }
2319 
onAddSmiley(FXObject *,FXSelector,void *)2320 long ConfigDialog::onAddSmiley(FXObject*, FXSelector, void*)
2321 {
2322     if((FXint)m_preferences.m_smileysMap.size()>=256)
2323     {
2324         dxEXMessageBox::information(this, MBOX_OK, _("Information"), "%s", _("Maximum number of 256 smileys is reached"));
2325         return 1;
2326     }
2327     SmileyDialog dialog(this, _("Add smiley"), "", "");
2328     if(dialog.execute())
2329     {
2330         if(!dialog.iconExist())
2331         {
2332             dxEXMessageBox::information(this, MBOX_OK, _("Information"), _("Icon file '%s' doesn't exist or isn't image file"), dialog.getPath().text());
2333             return 1;
2334         }
2335         if(dialog.getSmiley().empty())
2336         {
2337             dxEXMessageBox::information(this, MBOX_OK, _("Information"), "%s", _("Smiley text is empty"));
2338             return 1;
2339         }
2340         if(smileyExist(dialog.getSmiley()))
2341         {
2342             dxEXMessageBox::information(this, MBOX_OK, _("Information"), _("Smiley '%s' already exist"), dialog.getSmiley().text());
2343             return 1;
2344         }
2345         m_preferences.m_smileysMap.insert(StringPair(dialog.getSmiley(), dialog.getPath()));
2346         m_smileys->appendItem(new FXListItem(dialog.getSmiley(), dialog.getIcon()));
2347         m_modifySmiley->enable();
2348         m_deleteSmiley->enable();
2349         m_exportSmiley->enable();
2350     }
2351     return 1;
2352 }
2353 
onModifySmiley(FXObject *,FXSelector,void *)2354 long ConfigDialog::onModifySmiley(FXObject*, FXSelector, void*)
2355 {
2356     FXint index = m_smileys->getCurrentItem();
2357     FXString oldkey = m_smileys->getItemText(index);
2358     SmileyDialog dialog(this, _("Modify smiley"), oldkey, m_preferences.m_smileysMap[oldkey]);
2359     if(dialog.execute())
2360     {
2361         if(!dialog.iconExist())
2362         {
2363             dxEXMessageBox::information(this, MBOX_OK, _("Information"), _("Icon file '%s' doesn't exist or isn't image file"), dialog.getPath().text());
2364             return 1;
2365         }
2366         if(dialog.getSmiley().empty())
2367         {
2368             dxEXMessageBox::information(this, MBOX_OK, _("Information"), "%s", _("Smiley text is empty"));
2369             return 1;
2370         }
2371         if(smileyExist(dialog.getSmiley()) && dialog.getSmiley()!=oldkey)
2372         {
2373             dxEXMessageBox::information(this, MBOX_OK, _("Information"), _("Smiley '%s' already exist"), dialog.getSmiley().text());
2374             return 1;
2375         }
2376         m_preferences.m_smileysMap.erase(oldkey);
2377         m_smileys->removeItem(index, TRUE);
2378         m_preferences.m_smileysMap.insert(StringPair(dialog.getSmiley(), dialog.getPath()));
2379         m_smileys->insertItem(index, new FXListItem(dialog.getSmiley(), dialog.getIcon()), TRUE);
2380         m_smileys->setCurrentItem(index, TRUE);
2381     }
2382     return 1;
2383 }
2384 
onDeleteSmiley(FXObject *,FXSelector,void *)2385 long ConfigDialog::onDeleteSmiley(FXObject*, FXSelector, void*)
2386 {
2387     m_preferences.m_smileysMap.erase(m_smileys->getItemText(m_smileys->getCurrentItem()));
2388     m_smileys->removeItem(m_smileys->getCurrentItem(), TRUE);
2389     if(!(FXint)m_preferences.m_smileysMap.size())
2390     {
2391         m_modifySmiley->disable();
2392         m_deleteSmiley->disable();
2393         m_exportSmiley->disable();
2394     }
2395     return 1;
2396 }
2397 
fillCommnads()2398 void ConfigDialog::fillCommnads()
2399 {
2400     if(!m_preferences.m_ignoreCommandsList.empty())
2401     {
2402         for(FXint i=0; i<m_preferences.m_ignoreCommandsList.contains(';'); i++)
2403         {
2404             m_commands->appendItem(m_preferences.m_ignoreCommandsList.before(';', i+1).rafter(';'));
2405         }
2406     }
2407 }
2408 
fillIcons()2409 void ConfigDialog::fillIcons()
2410 {
2411     if(!m_preferences.m_themesList.empty())
2412     {
2413         for(FXint i=0; i<m_preferences.m_themesList.contains(';'); i++)
2414         {
2415             m_icons->appendItem(m_preferences.m_themesList.before(';', i+1).rafter(';'));
2416         }
2417     }
2418 }
2419 
fillThemes()2420 void ConfigDialog::fillThemes()
2421 {
2422     FXint i, scheme=-1;
2423 
2424     for(i=0; i<numThemes; i++)
2425     {
2426         if((m_themeCurrent.back == ColorThemes[i].back) &&
2427                 (m_themeCurrent.base == ColorThemes[i].base) &&
2428                 (m_themeCurrent.border == ColorThemes[i].border) &&
2429                 (m_themeCurrent.fore == ColorThemes[i].fore) &&
2430                 (m_themeCurrent.menuback == ColorThemes[i].menuback) &&
2431                 (m_themeCurrent.menufore == ColorThemes[i].menufore) &&
2432                 (m_themeCurrent.selback == ColorThemes[i].selback) &&
2433                 (m_themeCurrent.selfore == ColorThemes[i].selfore) &&
2434                 (m_themeCurrent.tipback == ColorThemes[i].tipback) &&
2435                 (m_themeCurrent.tipfore == ColorThemes[i].tipfore) &&
2436                 (m_themeCurrent.notifyback == ColorThemes[i].notifyback) &&
2437                 (m_themeCurrent.notifyfore == ColorThemes[i].notifyfore))
2438         {
2439             scheme = i;
2440         }
2441         m_themes->appendItem(ColorThemes[i].name,NULL,(void*)&ColorThemes[i]);
2442     }
2443 
2444     if(scheme == -1)
2445         scheme = numThemes;
2446 
2447     m_themes->appendItem(_("User Defined"), NULL, &m_themeCurrent);
2448     m_themes->setCurrentItem(scheme);
2449 }
2450 
fillCommandsCombo()2451 FXString ConfigDialog::fillCommandsCombo()
2452 {
2453     FXString combo;
2454     FXString available[11] = { "away", "ban", "ctcp", "invite", "join", "me", "nick", "notice", "mode", "part", "quit"};
2455     for(FXint i=0; i<11; i++)
2456     {
2457         FXbool exist = FALSE;
2458         for(FXint j=0; j<m_commands->getNumItems(); j++)
2459         {
2460             if(m_commands->getItemText(j) == available[i])
2461             {
2462                 exist = TRUE;
2463                 break;
2464             }
2465         }
2466         if(!exist) combo.append(available[i]+'\n');
2467     }
2468     return combo;
2469 }
2470 
fillUsers()2471 void ConfigDialog::fillUsers()
2472 {
2473     if(m_preferences.m_ignoreUsersList.no())
2474     {
2475         for(FXint i=0; i<m_preferences.m_ignoreUsersList.no(); i++)
2476         {
2477             m_users->appendItem(m_preferences.m_ignoreUsersList[i].nick+"\t"+m_preferences.m_ignoreUsersList[i].channel+"\t"+m_preferences.m_ignoreUsersList[i].network);
2478         }
2479     }
2480 }
2481 
fillFriends()2482 void ConfigDialog::fillFriends()
2483 {
2484     if(m_preferences.m_friendsList.no())
2485     {
2486         for(FXint i=0; i<m_preferences.m_friendsList.no(); i++)
2487         {
2488             m_friends->appendItem(m_preferences.m_friendsList[i].nick+"\t"+m_preferences.m_friendsList[i].channel+"\t"+m_preferences.m_friendsList[i].network);
2489         }
2490     }
2491 }
2492 
fillSmileys()2493 void ConfigDialog::fillSmileys()
2494 {
2495     if((FXint)m_preferences.m_smileysMap.size())
2496     {
2497         StringIt it;
2498         for(it=m_preferences.m_smileysMap.begin(); it!=m_preferences.m_smileysMap.end(); it++)
2499         {
2500             m_smileys->appendItem(new FXListItem((*it).first, createIconFromName(getApp(), (*it).second)));
2501         }
2502     }
2503 }
2504 
updateCommands()2505 void ConfigDialog::updateCommands()
2506 {
2507     m_preferences.m_ignoreCommandsList.clear();
2508     for(FXint i=0; i<m_commands->getNumItems(); i++)
2509     {
2510         m_preferences.m_ignoreCommandsList.append(m_commands->getItemText(i)+';');
2511     }
2512     if(m_commands->getNumItems()) m_deleteCommand->enable();
2513 }
2514 
updateThemesList()2515 void ConfigDialog::updateThemesList()
2516 {
2517     m_preferences.m_themesList.clear();
2518     for(FXint i=0; i<m_icons->getNumItems(); i++)
2519     {
2520         m_preferences.m_themesList.append(m_icons->getItemText(i)+';');
2521     }
2522 }
2523 
updateNickIcons()2524 void ConfigDialog::updateNickIcons()
2525 {
2526     if(m_preferences.m_themePath=="internal")
2527     {
2528         m_icon1->setText("!");
2529         m_icon2->setText("*");
2530         m_icon3->setText("@");
2531         m_icon4->setText("%");
2532         m_icon5->setText("+");
2533         m_icon6->setText(" ");
2534         m_icon7->setText(" ");
2535         m_icon1->setIcon(NULL);
2536         m_icon2->setIcon(NULL);
2537         m_icon3->setIcon(NULL);
2538         m_icon4->setIcon(NULL);
2539         m_icon5->setIcon(NULL);
2540         m_icon6->setIcon(NULL);
2541         m_icon7->setIcon(NULL);
2542     }
2543     else
2544     {
2545         m_icon1->setText("");
2546         m_icon2->setText("");
2547         m_icon3->setText("");
2548         m_icon4->setText("");
2549         m_icon5->setText("");
2550         m_icon6->setText("");
2551         m_icon7->setText("");
2552         m_icon1->setIcon(makeIcon(getApp(), m_preferences.m_themePath, "irc_admin.png", TRUE));
2553         m_icon2->setIcon(makeIcon(getApp(), m_preferences.m_themePath, "irc_owner.png", TRUE));
2554         m_icon3->setIcon(makeIcon(getApp(), m_preferences.m_themePath, "irc_op.png", TRUE));
2555         m_icon4->setIcon(makeIcon(getApp(), m_preferences.m_themePath, "irc_halfop.png", TRUE));
2556         m_icon5->setIcon(makeIcon(getApp(), m_preferences.m_themePath, "irc_voice.png", TRUE));
2557         m_icon6->setIcon(makeIcon(getApp(), m_preferences.m_themePath, "irc_normal.png", TRUE));
2558         m_icon7->setIcon(makeAwayIcon(getApp(), m_preferences.m_themePath, "irc_normal.png"));
2559     }
2560 }
2561 
themeExist(const FXString & ckdTheme)2562 FXbool ConfigDialog::themeExist(const FXString &ckdTheme)
2563 {
2564     for(FXint i=0; i<m_icons->getNumItems(); i++)
2565     {
2566         if(m_icons->getItemText(i) == ckdTheme)
2567         {
2568             return TRUE;
2569         }
2570     }
2571     return FALSE;
2572 }
2573 
nickExist(const FXString & ckdNick,FXbool user)2574 FXbool ConfigDialog::nickExist(const FXString &ckdNick, FXbool user)
2575 {
2576     for(FXint i=0; i<(user ? m_users->getNumItems() : m_friends->getNumItems()); i++)
2577     {
2578         if((user ? m_users->getItemText(i) : m_friends->getItemText(i)) == ckdNick) return TRUE;
2579     }
2580     return FALSE;
2581 }
2582 
smileyExist(const FXString & ckdSmiley)2583 FXbool ConfigDialog::smileyExist(const FXString& ckdSmiley)
2584 {
2585     StringIt it;
2586     for(it=m_preferences.m_smileysMap.begin(); it!=m_preferences.m_smileysMap.end(); it++)
2587     {
2588         if(!compare((*it).first, ckdSmiley)) return TRUE;
2589     }
2590     return FALSE;
2591 }
2592 
updateTabPosition()2593 void ConfigDialog::updateTabPosition()
2594 {
2595     switch(m_preferences.m_tabPosition) {
2596         case 0: //bottom
2597             {
2598                 m_tabs->setTabStyle(TABBOOK_BOTTOMTABS);
2599                 for(FXint i = 0; i<m_tabs->numChildren(); i+=2)
2600                 {
2601                     static_cast<FXTabItem*>(m_tabs->childAtIndex(i))->setTabOrientation(TAB_BOTTOM);
2602                 }
2603                 FXuint packing = m_tabs->getPackingHints();
2604                 packing &= ~PACK_UNIFORM_WIDTH;
2605                 m_tabs->setPackingHints(packing);
2606             }break;
2607         case 1: //left
2608             {
2609                 m_tabs->setTabStyle(TABBOOK_LEFTTABS);
2610                 for(FXint i = 0; i<m_tabs->numChildren(); i+=2)
2611                 {
2612                     static_cast<FXTabItem*>(m_tabs->childAtIndex(i))->setTabOrientation(TAB_LEFT);
2613                 }
2614                 FXuint packing = m_tabs->getPackingHints();
2615                 packing |= PACK_UNIFORM_WIDTH;
2616                 m_tabs->setPackingHints(packing);
2617             }break;
2618         case 2: //top
2619             {
2620                 m_tabs->setTabStyle(TABBOOK_TOPTABS);
2621                 for(FXint i = 0; i<m_tabs->numChildren(); i+=2)
2622                 {
2623                     static_cast<FXTabItem*>(m_tabs->childAtIndex(i))->setTabOrientation(TAB_TOP);
2624                 }
2625                 FXuint packing = m_tabs->getPackingHints();
2626                 packing &= ~PACK_UNIFORM_WIDTH;
2627                 m_tabs->setPackingHints(packing);
2628             }break;
2629         case 3: //right
2630             {
2631                 m_tabs->setTabStyle(TABBOOK_RIGHTTABS);
2632                 for(FXint i = 0; i<m_tabs->numChildren(); i+=2)
2633                 {
2634                     static_cast<FXTabItem*>(m_tabs->childAtIndex(i))->setTabOrientation(TAB_RIGHT);
2635                 }
2636                 FXuint packing = m_tabs->getPackingHints();
2637                 packing |= PACK_UNIFORM_WIDTH;
2638                 m_tabs->setPackingHints(packing);
2639             }break;
2640         default:
2641             {
2642                 m_tabs->setTabStyle(TABBOOK_BOTTOMTABS);
2643                 for(FXint i = 0; i<m_tabs->numChildren(); i+=2)
2644                 {
2645                     static_cast<FXTabItem*>(m_tabs->childAtIndex(i))->setTabOrientation(TAB_BOTTOM);
2646                 }
2647                 FXuint packing = m_tabs->getPackingHints();
2648                 packing &= ~PACK_UNIFORM_WIDTH;
2649                 m_tabs->setPackingHints(packing);
2650             }
2651     }
2652 }
2653 
2654