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