/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ /* */ /* PrefsDialog.cpp -- class for XFE preferences dialogs. Created: Linda Wei , 17-Sep-96. */ #define TRUE 1 #define FALSE 0 #include "felocale.h" #include "structs.h" #include "fonts.h" #include "xpassert.h" #include "xfe.h" #include "PrefsDialog.h" #ifdef MOZ_MAIL_NEWS #include "PrefsPageMessages.h" #include "PrefsPageNServer.h" #include "PrefsPageAddress.h" #endif #include "prefapi.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern int XFE_ERROR_SAVING_OPTIONS; extern int XFE_OUT_OF_MEMORY_URL; static const int NUM_OUTLINER_COLS = 2; static int OUTLINER_COLWIDTHS[] = {4, 20}; static const char *OUTLINER_COLUMN_TYPE = ""; static const char *OUTLINER_COLUMN_NAME = "Category"; static char *TAG_NORMAL = "NORMAL"; static char *TAG_BOLD = "BOLD"; #define CAT_LAST_CELL 0xFFFF #define CAT_FONTS "Fonts" #define CAT_COLORS "Colors" #define CAT_APPS "Applications" #define CAT_PRIVACY "Privacy" #define CAT_LANG "Languages" #define CAT_SMART "Smart Browsing" #define CAT_CACHE "Cache" #define CAT_PROXIES "Proxies" #define CAT_MAILNEWS_IDENTITY "Identity" #define CAT_MAILNEWS_MESSAGES "Messages" #define CAT_MAILNEWS_MAILSERVER "Mail Server" #define CAT_MAILNEWS_NSERVER "News Server" #define CAT_MAILNEWS_ADDRESS "Addressing" #define CAT_MAILNEWS_COPIES "Message Copies" #define CAT_MAILNEWS_HTML "HTML Formatting" #define CAT_MAILNEWS_RECEIPTS "Read Receipts" #define CAT_EDITOR_PUBLISH "Publish" #define CAT_DISKSPACE "Disk Space" #define CAT_EDITOR_APPEARANCE "Appearance" #ifdef MOZ_LI #define CAT_LI "Location Independence" #define CAT_LI_SERVER "Location Independence Server" #define CAT_LI_FILES "Location Independence Files" #endif /* MOZ_LI */ #ifdef PREFS_UNSUPPORTED #define CAT_HELPFILES "Help Files" #define CAT_OFFLINE_NEWS "News" #endif /* PREFS_UNSUPPORTED */ #define CAT_RESNAME_APPEARANCE "pref.appearance" #define CAT_RESNAME_FONTS "pref.fonts" #define CAT_RESNAME_COLORS "pref.colors" #define CAT_RESNAME_BROWSER "pref.browser" #define CAT_RESNAME_LANG "pref.lang" #define CAT_RESNAME_SMART "pref.smart" #define CAT_RESNAME_APPS "pref.applications" #define CAT_RESNAME_PRIVACY "pref.privacy" #define CAT_RESNAME_MAILNEWS "pref.mailNews" #define CAT_RESNAME_MAILNEWS_IDENTITY "pref.identity" #define CAT_RESNAME_MAILNEWS_MESSAGES "pref.messages" #define CAT_RESNAME_MAILNEWS_MAILSERVER "pref.mailServer" #define CAT_RESNAME_MAILNEWS_NSERVER "pref.newsServer" #define CAT_RESNAME_MAILNEWS_ADDRESS "pref.addressing" #define CAT_RESNAME_MAILNEWS_COPIES "pref.copies" #define CAT_RESNAME_MAILNEWS_HTML "pref.htmlmail" #define CAT_RESNAME_MAILNEWS_RECEIPTS "pref.readreceipts" #define CAT_RESNAME_EDITOR "pref.editor" #define CAT_RESNAME_EDITOR_PUBLISH "pref.editorPublish" #define CAT_RESNAME_ADVANCED "pref.advanced" #define CAT_RESNAME_CACHE "pref.cache" #define CAT_RESNAME_PROXIES "pref.proxies" #define CAT_RESNAME_DISKSPACE "pref.diskSpace" #define CAT_RESNAME_EDITOR_APPEARANCE "pref.editorAppearance" #ifdef MOZ_LI #define CAT_RESNAME_LI "pref.liGeneral" #define CAT_RESNAME_LI_SERVER "pref.liServer" #define CAT_RESNAME_LI_FILES "pref.liFiles" #endif /* MOZ_LI */ #ifdef PREFS_UNSUPPORTED #define CAT_RESNAME_HELPFILES "pref.helpFiles" #define CAT_RESNAME_OFFLINE "pref.offline" #define CAT_RESNAME_OFFLINE_NEWS "pref.offlineNews" #endif /* PREFS_UNSUPPORTED */ #define CAT_RESCLASS_APPEARANCE "Pref.Appearance" #define CAT_RESCLASS_FONTS "Pref.Fonts" #define CAT_RESCLASS_COLORS "Pref.Colors" #define CAT_RESCLASS_BROWSER "Pref.Browser" #define CAT_RESCLASS_LANG "Pref.Lang" #define CAT_RESCLASS_SMART "Pref.Smart" #define CAT_RESCLASS_APPS "Pref.Applications" #define CAT_RESCLASS_PRIVACY "Pref.Privacy" #define CAT_RESCLASS_MAILNEWS "Pref.MailNews" #define CAT_RESCLASS_MAILNEWS_IDENTITY "Pref.Identity" #define CAT_RESCLASS_MAILNEWS_MESSAGES "Pref.Messages" #define CAT_RESCLASS_MAILNEWS_MAILSERVER "Pref.MailServer" #define CAT_RESCLASS_MAILNEWS_NSERVER "Pref.NewsServer" #define CAT_RESCLASS_MAILNEWS_ADDRESS "Pref.Addressing" #define CAT_RESCLASS_MAILNEWS_COPIES "Pref.Copies" #define CAT_RESCLASS_MAILNEWS_HTML "Pref.HtmlMail" #define CAT_RESCLASS_MAILNEWS_RECEIPTS "Pref.ReadReceipts" #define CAT_RESCLASS_EDITOR "Pref.Editor" #define CAT_RESCLASS_EDITOR_PUBLISH "Pref.EditorPublish" #define CAT_RESCLASS_ADVANCED "Pref.Advanced" #define CAT_RESCLASS_CACHE "Pref.Cache" #define CAT_RESCLASS_PROXIES "Pref.Proxies" #define CAT_RESCLASS_DISKSPACE "Pref.DiskSpace" #define CAT_RESCLASS_EDITOR_APPEARANCE "Pref.EditorAppearance" #ifdef MOZ_LI #define CAT_RESCLASS_LI "Pref.liGeneral" #define CAT_RESCLASS_LI_SERVER "Pref.liServer" #define CAT_RESCLASS_LI_FILES "Pref.liFiles" #endif /* MOZ_LI */ #ifdef PREFS_UNSUPPORTED #define CAT_RESCLASS_HELPFILES "Pref.HelpFiles" #define CAT_RESCLASS_OFFLINE "Pref.Offline" #define CAT_RESCLASS_OFFLINE_NEWS "Pref.OfflineNews" #endif #define DESC_RESNAME_APPEARANCE "prefDesc.appearance" #define DESC_RESNAME_FONTS "prefDesc.fonts" #define DESC_RESNAME_COLORS "prefDesc.colors" #define DESC_RESNAME_BROWSER "prefDesc.browser" #define DESC_RESNAME_LANG "prefDesc.lang" #define DESC_RESNAME_SMART "prefDesc.smart" #define DESC_RESNAME_APPS "prefDesc.applications" #define DESC_RESNAME_PRIVACY "prefDesc.privacy" #define DESC_RESNAME_MAILNEWS "prefDesc.mailNews" #define DESC_RESNAME_MAILNEWS_IDENTITY "prefDesc.identity" #define DESC_RESNAME_MAILNEWS_MESSAGES "prefDesc.messages" #define DESC_RESNAME_MAILNEWS_MAILSERVER "prefDesc.mailServer" #define DESC_RESNAME_MAILNEWS_NSERVER "prefDesc.newsServer" #define DESC_RESNAME_MAILNEWS_ADDRESS "prefDesc.addressing" #define DESC_RESNAME_MAILNEWS_COPIES "prefDesc.copies" #define DESC_RESNAME_MAILNEWS_HTML "prefDesc.htmlMail" #define DESC_RESNAME_MAILNEWS_RECEIPTS "prefDesc.readReceipts" #define DESC_RESNAME_EDITOR "prefDesc.editor" #define DESC_RESNAME_EDITOR_PUBLISH "prefDesc.editorPublish" #define DESC_RESNAME_ADVANCED "prefDesc.advanced" #define DESC_RESNAME_CACHE "prefDesc.cache" #define DESC_RESNAME_PROXIES "prefDesc.proxies" #define DESC_RESNAME_DISKSPACE "prefDesc.diskSpace" #define DESC_RESNAME_EDITOR_APPEARANCE "prefDesc.editorAppearance" #ifdef MOZ_LI #define DESC_RESNAME_LI "prefDesc.liGeneral" #define DESC_RESNAME_LI_SERVER "prefDesc.liServer" #define DESC_RESNAME_LI_FILES "prefDesc.liFiles" #endif /* MOZ_LI */ #ifdef PREFS_UNSUPPORTED #define DESC_RESNAME_HELPFILES "prefDesc.helpFiles" #define DESC_RESNAME_OFFLINE "prefDesc.offline" #define DESC_RESNAME_OFFLINE_NEWS "prefDesc.offlineNews" #endif /* PREFS_UNSUPPORTED */ #define DESC_RESCLASS_APPEARANCE "PrefDesc.Appearance" #define DESC_RESCLASS_FONTS "PrefDesc.Fonts" #define DESC_RESCLASS_COLORS "PrefDesc.Colors" #define DESC_RESCLASS_BROWSER "PrefDesc.Browser" #define DESC_RESCLASS_LANG "PrefDesc.Lang" #define DESC_RESCLASS_SMART "PrefDesc.Smart" #define DESC_RESCLASS_APPS "PrefDesc.Applications" #define DESC_RESCLASS_PRIVACY "PrefDesc.Privacy" #define DESC_RESCLASS_MAILNEWS "PrefDesc.MailNews" #define DESC_RESCLASS_MAILNEWS_IDENTITY "PrefDesc.Identity" #define DESC_RESCLASS_MAILNEWS_MESSAGES "PrefDesc.Messages" #define DESC_RESCLASS_MAILNEWS_MAILSERVER "PrefDesc.MailServer" #define DESC_RESCLASS_MAILNEWS_NSERVER "PrefDesc.newsServer" #define DESC_RESCLASS_MAILNEWS_ADDRESS "PrefDesc.Addressing" #define DESC_RESCLASS_MAILNEWS_COPIES "PrefDesc.Copies" #define DESC_RESCLASS_MAILNEWS_HTML "PrefDesc.HTMLMail" #define DESC_RESCLASS_MAILNEWS_RECEIPTS "PrefDesc.readReceipts" #define DESC_RESCLASS_EDITOR "PrefDesc.Editor" #define DESC_RESCLASS_EDITOR_PUBLISH "PrefDesc.EditorPublish" #define DESC_RESCLASS_ADVANCED "PrefDesc.Advanced" #define DESC_RESCLASS_CACHE "PrefDesc.Cache" #define DESC_RESCLASS_PROXIES "PrefDesc.Proxies" #define DESC_RESCLASS_DISKSPACE "PrefDesc.DiskSpace" #define DESC_RESCLASS_EDITOR_APPEARANCE "PrefDesc.EditorAppearance" #ifdef MOZ_LI #define DESC_RESCLASS_LI "PrefDesc.liGeneral" #define DESC_RESCLASS_LI_SERVER "PrefDesc.liServer" #define DESC_RESCLASS_LI_FILES "PrefDesc.liFiles" #endif /* MOZ_LI */ #ifdef PREFS_UNSUPPORTED #define DESC_RESCLASS_HELPFILES "PrefDesc.HelpFiles" #define DESC_RESCLASS_OFFLINE "PrefDesc.Offline" #define DESC_RESCLASS_OFFLINE_NEWS "PrefDesc.OfflineNews" #endif /* PREFS_UNSUPPORTED */ typedef enum _prefsPageType { PAGE_TYPE_APPEARANCE, PAGE_TYPE_FONTS, PAGE_TYPE_COLORS, PAGE_TYPE_BROWSER, PAGE_TYPE_LANG, PAGE_TYPE_SMART, PAGE_TYPE_APPS, PAGE_TYPE_PRIVACY, PAGE_TYPE_MAILNEWS, PAGE_TYPE_MAILNEWS_IDENTITY, PAGE_TYPE_MAILNEWS_MESSAGES, PAGE_TYPE_MAILNEWS_MAILSERVER, PAGE_TYPE_MAILNEWS_NSERVER, PAGE_TYPE_MAILNEWS_ADDRESS, PAGE_TYPE_MAILNEWS_COPIES, PAGE_TYPE_MAILNEWS_HTML, PAGE_TYPE_MAILNEWS_RECEIPTS, PAGE_TYPE_EDITOR, PAGE_TYPE_EDITOR_APPEARANCE, PAGE_TYPE_EDITOR_PUBLISH, PAGE_TYPE_ADVANCED, PAGE_TYPE_CACHE, PAGE_TYPE_PROXIES, PAGE_TYPE_DISKSPACE #ifdef MOZ_LI , PAGE_TYPE_LI, PAGE_TYPE_LI_SERVER, PAGE_TYPE_LI_FILES #endif #ifdef PREFS_UNSUPPORTED PAGE_TYPE_HELPFILES PAGE_TYPE_OFFLINE, PAGE_TYPE_OFFLINE_NEWS, #endif /* PREFS_UNSUPPORTED */ } PrefsPageType; struct _prefsCategory { char *name; char *catResName; char *catResClass; char *descResName; char *descResClass; Boolean leaf; struct _prefsCategory *children; int numChildren; int type; }; struct _prefsCategory prefsAppearance[] = { { CAT_FONTS, CAT_RESNAME_FONTS, CAT_RESCLASS_FONTS, DESC_RESNAME_FONTS, DESC_RESCLASS_FONTS, TRUE, NULL, 0, PAGE_TYPE_FONTS, }, { CAT_COLORS, CAT_RESNAME_COLORS, CAT_RESCLASS_COLORS, DESC_RESNAME_COLORS, DESC_RESCLASS_COLORS, TRUE, NULL, 0, PAGE_TYPE_COLORS, }, }; struct _prefsCategory prefsMailNews[] = { { CAT_MAILNEWS_IDENTITY, CAT_RESNAME_MAILNEWS_IDENTITY, CAT_RESCLASS_MAILNEWS_IDENTITY, DESC_RESNAME_MAILNEWS_IDENTITY, DESC_RESCLASS_MAILNEWS_IDENTITY, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_IDENTITY, }, { CAT_MAILNEWS_MAILSERVER, CAT_RESNAME_MAILNEWS_MAILSERVER, CAT_RESCLASS_MAILNEWS_MAILSERVER, DESC_RESNAME_MAILNEWS_MAILSERVER, DESC_RESCLASS_MAILNEWS_MAILSERVER, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_MAILSERVER, }, { CAT_MAILNEWS_NSERVER, CAT_RESNAME_MAILNEWS_NSERVER, CAT_RESCLASS_MAILNEWS_NSERVER, DESC_RESNAME_MAILNEWS_NSERVER, DESC_RESCLASS_MAILNEWS_NSERVER, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_NSERVER, }, { CAT_MAILNEWS_ADDRESS, CAT_RESNAME_MAILNEWS_ADDRESS, CAT_RESCLASS_MAILNEWS_ADDRESS, DESC_RESNAME_MAILNEWS_ADDRESS, DESC_RESCLASS_MAILNEWS_ADDRESS, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_ADDRESS, }, { CAT_MAILNEWS_MESSAGES, CAT_RESNAME_MAILNEWS_MESSAGES, CAT_RESCLASS_MAILNEWS_MESSAGES, DESC_RESNAME_MAILNEWS_MESSAGES, DESC_RESCLASS_MAILNEWS_MESSAGES, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_MESSAGES, }, { CAT_MAILNEWS_COPIES, CAT_RESNAME_MAILNEWS_COPIES, CAT_RESCLASS_MAILNEWS_COPIES, DESC_RESNAME_MAILNEWS_COPIES, DESC_RESNAME_MAILNEWS_COPIES, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_COPIES, }, { CAT_MAILNEWS_HTML, CAT_RESNAME_MAILNEWS_HTML, CAT_RESCLASS_MAILNEWS_HTML, DESC_RESNAME_MAILNEWS_HTML, DESC_RESNAME_MAILNEWS_HTML, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_HTML, }, { CAT_MAILNEWS_RECEIPTS, CAT_RESNAME_MAILNEWS_RECEIPTS, CAT_RESCLASS_MAILNEWS_RECEIPTS, DESC_RESNAME_MAILNEWS_RECEIPTS, DESC_RESNAME_MAILNEWS_RECEIPTS, TRUE, NULL, 0, PAGE_TYPE_MAILNEWS_RECEIPTS, }, #ifdef MOZ_MAIL_NEWS { CAT_DISKSPACE, CAT_RESNAME_DISKSPACE, CAT_RESCLASS_DISKSPACE, DESC_RESNAME_DISKSPACE, DESC_RESCLASS_DISKSPACE, TRUE, NULL, 0, PAGE_TYPE_DISKSPACE, }, #endif // MOZ_MAIL_NEWS }; struct _prefsCategory prefsEditor[] = { { CAT_EDITOR_APPEARANCE, CAT_RESNAME_EDITOR_APPEARANCE, CAT_RESCLASS_EDITOR_APPEARANCE, DESC_RESNAME_EDITOR_APPEARANCE, DESC_RESCLASS_EDITOR_APPEARANCE, TRUE, NULL, 0, PAGE_TYPE_EDITOR_APPEARANCE, }, { CAT_EDITOR_PUBLISH, CAT_RESNAME_EDITOR_PUBLISH, CAT_RESCLASS_EDITOR_PUBLISH, DESC_RESNAME_EDITOR_PUBLISH, DESC_RESCLASS_EDITOR_PUBLISH, TRUE, NULL, 0, PAGE_TYPE_EDITOR_PUBLISH, }, }; #ifdef PREFS_UNSUPPORTED struct _prefsCategory prefsOffline[] = { { CAT_OFFLINE_NEWS, CAT_RESNAME_OFFLINE_NEWS, CAT_RESCLASS_OFFLINE_NEWS, DESC_RESNAME_OFFLINE_NEWS, DESC_RESCLASS_OFFLINE_NEWS, TRUE, NULL, 0, PAGE_TYPE_OFFLINE_NEWS, }, }; #endif /* PREFS_UNSUPPORTED */ struct _prefsCategory prefsBrowser[] = { { CAT_LANG, CAT_RESNAME_LANG, CAT_RESCLASS_LANG, DESC_RESNAME_LANG, DESC_RESCLASS_LANG, TRUE, NULL, 0, PAGE_TYPE_LANG, }, { CAT_APPS, CAT_RESNAME_APPS, CAT_RESCLASS_APPS, DESC_RESNAME_APPS, DESC_RESCLASS_APPS, TRUE, NULL, 0, PAGE_TYPE_APPS, }, { CAT_SMART, CAT_RESNAME_SMART, CAT_RESCLASS_SMART, DESC_RESNAME_SMART, DESC_RESCLASS_SMART, TRUE, NULL, 0, PAGE_TYPE_SMART, }, { CAT_PRIVACY, CAT_RESNAME_PRIVACY, CAT_RESCLASS_PRIVACY, DESC_RESNAME_PRIVACY, DESC_RESCLASS_PRIVACY, TRUE, NULL, 0, PAGE_TYPE_PRIVACY, } }; struct _prefsCategory prefsAdvanced[] = { { CAT_CACHE, CAT_RESNAME_CACHE, CAT_RESCLASS_CACHE, DESC_RESNAME_CACHE, DESC_RESCLASS_CACHE, TRUE, NULL, 0, PAGE_TYPE_CACHE, }, { CAT_PROXIES, CAT_RESNAME_PROXIES, CAT_RESCLASS_PROXIES, DESC_RESNAME_PROXIES, DESC_RESCLASS_PROXIES, TRUE, NULL, 0, PAGE_TYPE_PROXIES, }, #ifdef MOZ_MAIL_NEWS { CAT_DISKSPACE, CAT_RESNAME_DISKSPACE, CAT_RESCLASS_DISKSPACE, DESC_RESNAME_DISKSPACE, DESC_RESCLASS_DISKSPACE, TRUE, NULL, 0, PAGE_TYPE_DISKSPACE, }, #endif // MOZ_MAIL_NEWS #ifdef PREFS_UNSUPPORTED { CAT_HELPFILES, CAT_RESNAME_HELPFILES, CAT_RESCLASS_HELPFILES, DESC_RESNAME_HELPFILES, DESC_RESCLASS_HELPFILES, TRUE, NULL, 0, PAGE_TYPE_HELPFILES, }, #endif /* PREFS_UNSUPPORTED */ }; #ifdef MOZ_LI struct _prefsCategory prefsLI[] = { { CAT_LI_SERVER, CAT_RESNAME_LI_SERVER, CAT_RESCLASS_LI_SERVER, DESC_RESNAME_LI_SERVER, DESC_RESCLASS_LI_SERVER, TRUE, NULL, 0, PAGE_TYPE_LI_SERVER, }, { CAT_LI_FILES, CAT_RESNAME_LI_FILES, CAT_RESCLASS_LI_FILES, DESC_RESNAME_LI_FILES, DESC_RESCLASS_LI_FILES, TRUE, NULL, 0, PAGE_TYPE_LI_FILES, } }; #endif /* MOZ_LI */ struct _prefsCategory prefsCategories[] = { { CAT_APPEARANCE, CAT_RESNAME_APPEARANCE, CAT_RESCLASS_APPEARANCE, DESC_RESNAME_APPEARANCE, DESC_RESCLASS_APPEARANCE, FALSE, prefsAppearance, XtNumber(prefsAppearance), PAGE_TYPE_APPEARANCE, }, { CAT_BROWSER, CAT_RESNAME_BROWSER, CAT_RESCLASS_BROWSER, DESC_RESNAME_BROWSER, DESC_RESCLASS_BROWSER, FALSE, prefsBrowser, XtNumber(prefsBrowser), PAGE_TYPE_BROWSER, }, #ifndef MOZ_MAIL_NEWS { CAT_MAILNEWS_IDENTITY, CAT_RESNAME_MAILNEWS_IDENTITY, CAT_RESCLASS_MAILNEWS_IDENTITY, DESC_RESNAME_MAILNEWS_IDENTITY, DESC_RESCLASS_MAILNEWS_IDENTITY, FALSE, NULL, 0, PAGE_TYPE_MAILNEWS_IDENTITY, }, #endif // MOZ_MAIL_NEWS #ifdef MOZ_MAIL_NEWS { CAT_MAILNEWS, CAT_RESNAME_MAILNEWS, CAT_RESCLASS_MAILNEWS, DESC_RESNAME_MAILNEWS, DESC_RESCLASS_MAILNEWS, FALSE, prefsMailNews, XtNumber(prefsMailNews), PAGE_TYPE_MAILNEWS, }, #endif // MOZ_MAIL_NEWS #ifdef MOZ_LI { CAT_LI, CAT_RESNAME_LI, CAT_RESCLASS_LI, DESC_RESNAME_LI, DESC_RESCLASS_LI, FALSE, prefsLI, XtNumber(prefsLI), PAGE_TYPE_LI, }, #endif /* MOZ_LI */ #ifdef EDITOR { CAT_EDITOR, CAT_RESNAME_EDITOR, CAT_RESCLASS_EDITOR, DESC_RESNAME_EDITOR, DESC_RESCLASS_EDITOR, FALSE, prefsEditor, XtNumber(prefsEditor), PAGE_TYPE_EDITOR, }, #endif // EDITOR #ifdef PREFS_UNSUPPORTED { CAT_OFFLINE, CAT_RESNAME_OFFLINE, CAT_RESCLASS_OFFLINE, DESC_RESNAME_OFFLINE, DESC_RESCLASS_OFFLINE, FALSE, prefsOffline, XtNumber(prefsOffline), PAGE_TYPE_OFFLINE, }, #endif /* PREFS_UNSUPPORTED */ { CAT_ADVANCED, CAT_RESNAME_ADVANCED, CAT_RESCLASS_ADVANCED, DESC_RESNAME_ADVANCED, DESC_RESCLASS_ADVANCED, FALSE, prefsAdvanced, XtNumber(prefsAdvanced), PAGE_TYPE_ADVANCED, }, }; extern "C" { Widget fe_CreateFramedForm(Widget, char*, Arg*, Cardinal); char *XP_GetString(int i); } extern "C" void fe_showPreferences(XFE_Component *topLevel, MWContext *context) { XFE_PrefsDialog *theDialog = 0; Widget mainw = topLevel->getBaseWidget(); // Instantiate a preferences dialog if ((theDialog = new XFE_PrefsDialog(mainw, "prefs", context)) == 0) { fe_perror(context, XP_GetString(XFE_OUT_OF_MEMORY_URL)); return; } // Open some categories theDialog->openCategory(CAT_APPEARANCE); // Pop up the preferences dialog theDialog->show(); // Set the page to Appearance PrefsCategory *appearance = theDialog->getCategoryByName(CAT_APPEARANCE); theDialog->setCurrentCategory(appearance); } extern "C" void fe_showMailNewsPreferences(XFE_Component *topLevel, MWContext *context) { XFE_PrefsDialog *theDialog = 0; Widget mainw = topLevel->getBaseWidget(); // Instantiate a preferences dialog if ((theDialog = new XFE_PrefsDialog(mainw, "prefs", context)) == 0) { fe_perror(context, XP_GetString(XFE_OUT_OF_MEMORY_URL)); return; } // Open some categories theDialog->openCategory(CAT_APPEARANCE); theDialog->openCategory(CAT_MAILNEWS); // Pop up the preferences dialog theDialog->show(); // Set the page to Appearance PrefsCategory *appearance = theDialog->getCategoryByName(CAT_MAILNEWS); theDialog->setCurrentCategory(appearance); } extern "C" void fe_showMailServerPreferences(XFE_Component *topLevel, MWContext *context) { XFE_PrefsDialog *theDialog = 0; Widget mainw = topLevel->getBaseWidget(); // Instantiate a preferences dialog if ((theDialog = new XFE_PrefsDialog(mainw, "prefs", context)) == 0) { fe_perror(context, XP_GetString(XFE_OUT_OF_MEMORY_URL)); return; } // Open some categories theDialog->openCategory(CAT_MAILNEWS); // Pop up the preferences dialog theDialog->show(); // Set the page to Mail Servers PrefsCategory *mailserver_category = theDialog->getCategoryByName(CAT_MAILNEWS_MAILSERVER); theDialog->setCurrentCategory(mailserver_category); } extern "C" void fe_showMailIdentityPreferences(XFE_Component *topLevel, MWContext *context) { XFE_PrefsDialog *theDialog = 0; Widget mainw = topLevel->getBaseWidget(); // Instantiate a preferences dialog if ((theDialog = new XFE_PrefsDialog(mainw, "prefs", context)) == 0) { fe_perror(context, XP_GetString(XFE_OUT_OF_MEMORY_URL)); return; } // Open some categories theDialog->openCategory(CAT_MAILNEWS); // Pop up the preferences dialog theDialog->show(); // Set the page to Mail Identity PrefsCategory *identity_category = theDialog->getCategoryByName(CAT_MAILNEWS_IDENTITY); theDialog->setCurrentCategory(identity_category); } extern "C" void fe_showEditorPreferences(XFE_Component *topLevel, MWContext *context) { XFE_PrefsDialog *theDialog = 0; Widget mainw = topLevel->getBaseWidget(); // Instantiate a preferences dialog if ((theDialog = new XFE_PrefsDialog(mainw, "prefs", context)) == 0) { fe_perror(context, XP_GetString(XFE_OUT_OF_MEMORY_URL)); return; } // Open some categories theDialog->openCategory(CAT_APPEARANCE); theDialog->openCategory(CAT_EDITOR); // Pop up the preferences dialog theDialog->show(); // Set the page to Appearance PrefsCategory *appearance = theDialog->getCategoryByName(CAT_EDITOR); theDialog->setCurrentCategory(appearance); } // ==================== Prefs Page Member Functions ==================== // Member: XFE_PrefsPage // Description: Constructor // Inputs: // Side effects: Creates a preferences page XFE_PrefsPage::XFE_PrefsPage(XFE_PrefsDialog *prefsDialog) : // prefs dialog m_context(0), m_prefsDialog(prefsDialog), m_wPageForm(0), m_wPage(0), m_created(FALSE), m_initialized(FALSE), m_doInitInMap(FALSE), m_changed(FALSE) { m_wPageForm = m_prefsDialog->getPageForm(); m_context = m_prefsDialog->getContext(); } XFE_PrefsPage::XFE_PrefsPage(Widget w) : // prefs dialog m_context(0), m_prefsDialog(0), m_wPageForm(w), m_wPage(0), m_created(FALSE), m_initialized(FALSE), m_doInitInMap(FALSE), m_changed(FALSE) { m_wPageForm = w; } // Member: ~XFE_PrefsPage // Description: Destructor // Inputs: // Side effects: Destoy a preferences page XFE_PrefsPage::~XFE_PrefsPage() { } // Member: setCreated // Description: // Inputs: // Side effects: void XFE_PrefsPage::setCreated(Boolean flag) { m_created = flag; } // Member: setChanged // Description: // Inputs: // Side effects: void XFE_PrefsPage::setChanged(Boolean flag) { m_changed = flag; } // Member: setInitialized // Description: // Inputs: // Side effects: void XFE_PrefsPage::setInitialized(Boolean flag) { m_initialized = flag; } // Member: setDoInitInMap // Description: // Inputs: // Side effects: void XFE_PrefsPage::setDoInitInMap(Boolean flag) { m_doInitInMap = flag; } // Member: isCreated // Description: // Inputs: // Side effects: Boolean XFE_PrefsPage::isCreated() { return m_doInitInMap; } // Member: isInitialized // Description: // Inputs: // Side effects: Boolean XFE_PrefsPage::isInitialized() { return m_initialized; } // Member: doInitInMap // Description: // Inputs: // Side effects: Boolean XFE_PrefsPage::doInitInMap() { return m_doInitInMap; } // Member: isChanged // Description: // Inputs: // Side effects: Boolean XFE_PrefsPage::isChanged() { return m_changed; } // Member: getContext // Description: // Inputs: // Side effects: MWContext *XFE_PrefsPage::getContext() { return m_context; } // Member: getPrefsDialog // Description: // Inputs: // Side effects: XFE_PrefsDialog *XFE_PrefsPage::getPrefsDialog() { return m_prefsDialog; } // Member: getWidth // Description: // Inputs: // Side effects: Dimension XFE_PrefsPage::getWidth() { return XfeWidth(m_wPage); } // Member: getHeight // Description: // Inputs: // Side effects: Dimension XFE_PrefsPage::getHeight() { return XfeHeight(m_wPage); } // Member: map // Description: Displays page // Inputs: // Side effects: void XFE_PrefsPage::map() { // Create the page if not created already if (! isCreated()) create(); // Initialize the page if (doInitInMap()){ if (! isInitialized()) read(); setChanged(TRUE); } // Display the page XtManageChild(m_wPage); } // Member: unmap // Description: // Inputs: // Side effects: void XFE_PrefsPage::unmap() { XtUnmanageChild(m_wPage); } // Member: verify // Description: // Inputs: // Side effects: Boolean XFE_PrefsPage::verify() { return TRUE; } // ==================== Prefs Dialog Member Functions ==================== // Member: XFE_PrefsDialog // Description: Constructor // Inputs: // Side effects: Creates a preferences dialog XFE_PrefsDialog::XFE_PrefsDialog(Widget parent, // dialog parent char *name, // dialog name MWContext *context, // context Boolean modal) // modal dialog? : XFE_Dialog(parent, name, TRUE, // ok TRUE, // cancel TRUE, // help FALSE, // apply FALSE, // separator modal // modal ), m_wPageLabel(0), m_wPageTitle(0), m_wPageForm(0), m_wOutline(0), m_context(context), m_numPages(0), m_pages(0), m_columnWidths(0), m_outlineHeaders(0), m_numCategories(0), m_categories(0), m_visibleCategoryCount(0), m_currentCategory(0), m_initPageLabel(FALSE) { // Create areas for use later createRegions(); // Initialize categories initCategories(); // Add callbacks XtAddCallback (m_chrome, XmNokCallback, prefsMainCb_ok, this); XtAddCallback (m_chrome, XmNcancelCallback, prefsMainCb_cancel, this); XtAddCallback (m_chrome, XmNhelpCallback, prefsMainCb_help, this); XtAddCallback (m_chrome, XmNdestroyCallback, prefsMainCb_destroy, this); } // Member: prefsMainCb_ok // Description: // Inputs: // Side effects: void XFE_PrefsDialog::prefsMainCb_ok(Widget w, XtPointer closure, XtPointer callData) { XFE_PrefsDialog *theDialog = (XFE_PrefsDialog *)closure; // Verify the current page PrefsCategory *currentCategory = theDialog->getCurrentCategory(); if (currentCategory && currentCategory->page) { if (! currentCategory->page->verify()) return; } // hide ourself so any dialogs popped up will become children // of the parent frame. theDialog->hide(); // Save all the changes theDialog->saveChanges(); // Simulate a cancel on Ok theDialog->prefsMainCb_cancel(w, closure, callData); } // Member: prefsMainCb_cancel // Description: // Inputs: // Side effects: void XFE_PrefsDialog::prefsMainCb_cancel(Widget /* w */, XtPointer closure, XtPointer /* callData */) { XFE_PrefsDialog *theDialog = (XFE_PrefsDialog *)closure; // Remove all the callbacks XtRemoveCallback(theDialog->m_chrome, XmNokCallback, prefsMainCb_ok, theDialog); XtRemoveCallback(theDialog->m_chrome, XmNcancelCallback, prefsMainCb_cancel, theDialog); XtRemoveCallback(theDialog->m_chrome, XmNhelpCallback, prefsMainCb_help, theDialog); XtRemoveCallback(theDialog->m_chrome, XmNdestroyCallback, prefsMainCb_destroy, theDialog); // Delete the dialog delete theDialog; } // Member: prefsMainCb_help // Description: // Inputs: // Side effects: void XFE_PrefsDialog::prefsMainCb_help(Widget /* w */, XtPointer /* closure */, XtPointer /* callData */) { // XFE_PrefsDialog *theDialog = (XFE_PrefsDialog *)closure; } // Member: prefsMainCb_destroy // Description: // Inputs: // Side effects: void XFE_PrefsDialog::prefsMainCb_destroy(Widget w, XtPointer closure, XtPointer callData) { XFE_PrefsDialog *theDialog = (XFE_PrefsDialog *)closure; // Simulate a cancel on destroy theDialog->prefsMainCb_cancel(w, closure, callData); } // Member: ~XFE_PrefsDialog // Description: Destructor // Inputs: // Side effects: XFE_PrefsDialog::~XFE_PrefsDialog() { // Clean up for (int i = 0; i < m_numPages; i++) delete m_pages[i]; delete [] m_pages; delete m_columnWidths; if (m_outlineHeaders->header_strings) XP_FREE(m_outlineHeaders->header_strings); XP_FREE(m_outlineHeaders); } // Member: getContext // Description: Gets MWContext (for now) // Inputs: // Side effects: MWContext *XFE_PrefsDialog::getContext() { return m_context; } // Member: getVisibleCategoryCount // Description: Gets number of visible categories // Inputs: // Side effects: int XFE_PrefsDialog::getVisibleCategoryCount() { if (m_visibleCategoryCount == 0) { calcVisibleCategoryCount(); } return m_visibleCategoryCount; } // Member: show // Description: Pop up dialog // Inputs: // Side effects: void XFE_PrefsDialog::show() { int i; refreshCategories(); // Make sure we create all the pages first, so we can determine // the height and width of the preferences dialog. // Do not initialize the page to save time setDoInitInSetPage(FALSE); for (i = 0; i < m_numPages; i++) { m_pages[i]->map(); } setDoInitInSetPage(TRUE); // Manage the top level XFE_Dialog::show(); // Determine the height and width of the preferences dialog int page_width = calculateWidth(); int page_height = calculateHeight(); Dimension margin_width; Dimension margin_height; XtVaGetValues(m_wPageForm, XmNmarginWidth, &margin_width, XmNmarginHeight, &margin_height, NULL); XtVaSetValues(m_wPageForm, XmNwidth, page_width + 2 * margin_width, XmNheight, page_height + 2 * margin_height, XmNresizePolicy, XmRESIZE_NONE, NULL); // Reset the categories for (i = 0; i < m_numPages; i++) { m_pages[i]->unmap(); } setCurrentCategory(NULL); // Move focus to the OK button XmProcessTraversal(m_okButton, XmTRAVERSE_CURRENT); } // Member: setContext // Description: Sets MWContext (for now) // Inputs: // Side effects: void XFE_PrefsDialog::setContext(MWContext *context) { m_context = context; } // Member: calcVisibleCategoryCount // Description: Calculates number of visible categories // Inputs: // Side effects: void XFE_PrefsDialog::calcVisibleCategoryCount() { int i; int count = 0; for (i = 0; i < m_numCategories; i++) { count++; if (m_categories[i].open) { count += m_categories[i].numChildren; } } m_visibleCategoryCount = count; } // Member: setCurrentCategory // Description: Set currently selected category // Inputs: // Side effects: void XFE_PrefsDialog::setCurrentCategory(PrefsCategory *entry) { XmString labelString; // If the page label is not set reverse video, do it now. // Reverse video the label if we are setting a real page. if (entry != NULL) { if (m_initPageLabel == FALSE) { Pixel bg; Pixel fg; XtVaGetValues(m_wPageTitle, XmNbackground, &bg, XmNforeground, &fg, NULL); XtVaSetValues(m_wPageTitle, XmNforeground, bg, XmNbackground, fg, NULL); m_initPageLabel = TRUE; } } // Unset old page if (m_currentCategory) { if (m_currentCategory->page != 0) { if (! m_currentCategory->page->verify()) return; m_currentCategory->page->unmap(); } } m_currentCategory = entry; if (! entry) { // unset the page label and description labelString = XmStringCreateLtoR(" ", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG); XtVaSetValues(m_wPageLabel, XmNlabelString, labelString, NULL); XmStringFree(labelString); labelString = XmStringCreateLtoR(" ", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG); XtVaSetValues(m_wPageTitle, XmNlabelString, labelString, NULL); XmStringFree(labelString); return; } // Set the page label and description. // Page label is not displayed any more. labelString = XmStringCreateLtoR(" ", (XmStringCharSet)XmFONTLIST_DEFAULT_TAG); XtVaSetValues(m_wPageLabel, XmNlabelString, labelString, NULL); XmStringFree(labelString); XmString s1; XmString s2; XmString s3; XmString labelString2; s1 = XmStringCreate(entry->categoryName, TAG_BOLD); s2 = XmStringCreate(" ", TAG_NORMAL); if (entry->categoryDesc) s3 = XmStringCreate(entry->categoryDesc, TAG_NORMAL); else s3 = XmStringCreate(" ", TAG_NORMAL); labelString = XmStringConcat(s1, s2); labelString2 = XmStringConcat(labelString, s3); XtVaSetValues(m_wPageTitle, XmNlabelString, labelString2, NULL); XmStringFree(s1); XmStringFree(s2); XmStringFree(s3); XmStringFree(labelString); XmStringFree(labelString2); // Set the page if (entry->page != 0) { entry->page->map(); refreshCategories(); } } // Member: openCategory // Description: Open a category // Inputs: // Side effects: void XFE_PrefsDialog::openCategory(const char *catName) { PrefsCategory *entry = getCategoryByName(catName); if (entry) { entry->open = TRUE; } } // Member: closeCategory // Description: Close a category // Inputs: // Side effects: void XFE_PrefsDialog::closeCategory(const char *catName) { PrefsCategory *entry = getCategoryByName(catName); if (entry) { entry->open = FALSE; } } // Member: setDoInitInSetPage // Description: // Inputs: // Side effects: void XFE_PrefsDialog::setDoInitInSetPage(Boolean doInit) { for (int i = 0; i < m_numPages; i++) { m_pages[i]->setDoInitInMap(doInit); } } // Member: saveChanges // Description: // Inputs: // Side effects: void XFE_PrefsDialog::saveChanges() { int32 tempInt; // for news xaction pref below for (int i = 0; i < m_numPages; i++) { if (m_pages[i]->isChanged()) { m_pages[i]->write(); } } // Save the preferences at the end, so that if we've found some // setting that crashes, it won't get saved... if (! fe_CheckVersionAndSavePrefs((char *) fe_globalData.user_prefs_file, &fe_globalPrefs)) fe_perror(getContext(), XP_GetString( XFE_ERROR_SAVING_OPTIONS)); // ### mwelch 97 July // Since the default news server preference spans across three different // preferences, we need to always tweak the "news.server_change_xaction" // pref, in order to signal to the back end that the news server prefs // have settled into a steady state. PREF_GetIntPref("news.server_change_xaction", &tempInt); PREF_SetIntPref("news.server_change_xaction", ++tempInt); } // Member: calculateWidth // Description: // Inputs: // Side effects: Dimension XFE_PrefsDialog::calculateWidth() { Dimension widest = 0; Dimension width; if (!m_pages) return 0; for (int i = 0; i < m_numPages; i++) { if (m_pages[i]) { width = m_pages[i]->getWidth(); if (width > widest) widest = width; } } return widest; } // Member: calculateHeight // Description: // Inputs: // Side effects: Dimension XFE_PrefsDialog::calculateHeight() { Dimension tallest = 0; Dimension height; for (int i = 0; i < m_numPages; i++) { if (m_pages[i]) { height = m_pages[i]->getHeight(); if (height > tallest) tallest = height; } } return tallest; } // ==================== Prefs Dialog Protected Member Functions ==================== // ==================== Prefs Dialog Private Member Functions ==================== // Member: createRegions // Description: Creates regions for the preferences dialog // Inputs: // Side effects: void XFE_PrefsDialog::createRegions() { Arg args[50]; Cardinal n; // Top level form Widget form; form = XtVaCreateWidget("form", xmFormWidgetClass, m_chrome, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); // Category area Widget leftPane; leftPane = XtVaCreateWidget("leftPane", xmFormWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); // Page area Widget rightPane; rightPane = XtVaCreateWidget("rightPane", xmFormWidgetClass, form, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, leftPane, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, leftPane, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); // Category area - category label Widget categoryLabel; n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; categoryLabel = XmCreateLabelGadget(leftPane, "categoryLabel", args, n); XtManageChild(categoryLabel); // Category area - Categories #if 0 m_outlinable = new XFE_PrefsOutlinable; // TODO: pass attachments and name to outliner m_outliner = new XFE_Outliner(m_outlinable, /* outlinable */ this, /* toplevel */ leftPane, /* parent */ TRUE, /* constantSize */ NUM_OUTLINER_COLS, /* number of columns */ OUTLINER_COLWIDTHS); /* column widths */ #endif #if 0 n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, categoryLabel); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, categoryLabel); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++; n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++; #endif n = 0; m_wOutline = fe_GridCreate(m_context, /* context */ leftPane, /* parent */ "categoryList", /* name */ args, /* av */ n, /* ac */ 0, /* maxindentdepth */ NUM_OUTLINER_COLS,/* num columns */ OUTLINER_COLWIDTHS,/* column widths */ categoryDataFunc, /* data function */ categoryClickFunc,/* click function */ categoryIconFunc, /* icon function */ this, /* closure */ &m_columnWidths, /* posinfo */ TRUE, /* tag */ FALSE); /* grid */ // Category should grow horizontally to show all categories. XtVaSetValues(m_wOutline, XmNhorizontalSizePolicy, XmVARIABLE, NULL); m_outlineHeaders = XP_NEW_ZAP(fe_OutlineHeaderDesc); m_outlineHeaders->header_strings = (const char **)XP_CALLOC(NUM_OUTLINER_COLS, sizeof(char*)); m_outlineHeaders->type[0] = FE_OUTLINE_String; m_outlineHeaders->header_strings[0] = OUTLINER_COLUMN_TYPE; m_outlineHeaders->type[1] = FE_OUTLINE_String; m_outlineHeaders->header_strings[1] = OUTLINER_COLUMN_NAME; fe_OutlineSetHeaders(m_wOutline, m_outlineHeaders); XtVaSetValues(m_wOutline, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(m_wOutline); // Page area - page label n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; m_wPageLabel = XmCreateLabelGadget(rightPane, "pageLabel", args, n); XtManageChild(m_wPageLabel); // Page area - page title m_wPageTitle = XtVaCreateManagedWidget("pageTitle", xmLabelWidgetClass, rightPane, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, m_wPageLabel, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); // page area - Page Form m_wPageForm = XtVaCreateManagedWidget("pageForm", xmFormWidgetClass, rightPane, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, m_wPageTitle, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(leftPane); XtManageChild(rightPane); XtManageChild(form); } // Member: initCategories // Description: Initializes categories // Inputs: // Side effects: void XFE_PrefsDialog::initCategories() { XrmDatabase db = XtDatabase(XtDisplay(m_chrome)); char name[1024]; char clas[1024]; XrmValue value; char *type = NULL; int i; #ifdef MOZ_LI XP_Bool li_ui_enabled = FALSE; #endif if (m_categories) deleteCategories(); m_numCategories = XtNumber(prefsCategories); #ifdef MOZ_LI /* If li.ui.enabled is false, we hide the LI prefs */ PREF_GetBoolPref("li.ui.enabled", &li_ui_enabled); if ( li_ui_enabled == FALSE ) { int found_it = 0; for ( i = 0; i < m_numCategories; i++ ) { if ( prefsCategories[i].type == PAGE_TYPE_LI ) found_it = 1; if ( found_it ) prefsCategories[i] = prefsCategories[i+1]; } m_numCategories--; } #endif // Calculate the number of pages we have m_numPages = 0; for (i = 0; i < m_numCategories; i++) { m_numPages++; if (prefsCategories[i].numChildren > 0); m_numPages += prefsCategories[i].numChildren; } m_pages = new XFE_PrefsPage *[m_numPages]; int page_index = 0; // Well, this is kinda quick and dirty. I am assuming there are only // two levels in the hierarchy. m_categories = new PrefsCategory[m_numCategories]; for (i = 0; i < m_numCategories; i++) { newPage(m_pages[page_index], prefsCategories[i].type); m_categories[i].page = m_pages[page_index]; page_index++; m_categories[i].open = FALSE; m_categories[i].name = (char *)XtNewString(prefsCategories[i].name); // Get the resources for category name and description PR_snprintf(clas, sizeof (clas), "%s.%s", fe_progclass, prefsCategories[i].catResClass); PR_snprintf(name, sizeof (name), "%s.%s", fe_progclass, prefsCategories[i].catResName); if (XrmGetResource(db, name, clas, &type, &value)) m_categories[i].categoryName = (char *)XtNewString(value.addr); else m_categories[i].categoryName = (char *)XtNewString(prefsCategories[i].name); PR_snprintf(clas, sizeof (clas), "%s.%s", fe_progclass, prefsCategories[i].descResClass); PR_snprintf(name, sizeof (name), "%s.%s", fe_progclass, prefsCategories[i].descResName); if (XrmGetResource(db, name, clas, &type, &value)) m_categories[i].categoryDesc = (char *)XtNewString(value.addr); else m_categories[i].categoryDesc = (char *)XtNewString(prefsCategories[i].name); m_categories[i].parent = NULL; m_categories[i].leaf = prefsCategories[i].leaf; int numChildren = m_categories[i].numChildren = prefsCategories[i].numChildren; if (numChildren > 0) { m_categories[i].children = new PrefsCategory[numChildren]; struct _prefsCategory *prefs = prefsCategories[i].children; PrefsCategory *children = m_categories[i].children; for (int j = 0; j < numChildren; j++) { newPage(m_pages[page_index], prefs[j].type); children[j].page = m_pages[page_index]; page_index++; children[j].open = FALSE; children[j].name = (char *)XtNewString(prefs[j].name); // Get the resources for category name and description PR_snprintf(clas, sizeof (clas), "%s.%s", fe_progclass, prefs[j].catResClass); PR_snprintf(name, sizeof (name), "%s.%s", fe_progclass, prefs[j].catResName); if (XrmGetResource(db, name, clas, &type, &value)) children[j].categoryName = (char *)XtNewString(value.addr); else children[j].categoryName = (char *)XtNewString(prefs[j].name); PR_snprintf(clas, sizeof (clas), "%s.%s", fe_progclass, prefs[j].descResClass); PR_snprintf(name, sizeof (name), "%s.%s", fe_progclass, prefs[j].descResName); if (XrmGetResource(db, name, clas, &type, &value)) children[j].categoryDesc = (char *)XtNewString(value.addr); else children[j].categoryDesc = (char *)XtNewString(prefs[j].name); children[j].leaf = prefs[j].leaf; children[j].parent = &m_categories[i]; children[j].numChildren = 0; children[j].children = 0; } } else { m_categories[i].children = 0; } } } // Member: deleteCategories // Description: Deletes categories // Inputs: // Side effects: void XFE_PrefsDialog::deleteCategories() { // Delete for (int i = 0; i < m_numCategories; i++) { if (m_categories[i].children) { PrefsCategory *children = m_categories[i].children; int numChildren = m_categories[i].numChildren; for (int j = 0; j < numChildren; j++) { if (children[j].name) free (children[j].name); if (children[j].categoryName) free (children[j].categoryName); if (children[j].categoryDesc) free (children[j].categoryDesc); } delete (m_categories[i].children); } if (m_categories[i].name) free (m_categories[i].name); if (m_categories[i].categoryName) free (m_categories[i].categoryName); if (m_categories[i].categoryDesc) free (m_categories[i].categoryDesc); } delete m_categories; m_categories = 0; m_numCategories = 0; } // Member: newPage // Description: // Inputs: // Side effects: void XFE_PrefsDialog::newPage(XFE_PrefsPage *&page, int type) { switch (type) { case PAGE_TYPE_APPEARANCE: page = new XFE_PrefsPageGeneralAppearance(this); break; case PAGE_TYPE_FONTS: page = new XFE_PrefsPageGeneralFonts(this); break; case PAGE_TYPE_COLORS: page = new XFE_PrefsPageGeneralColors(this); break; case PAGE_TYPE_APPS: page = new XFE_PrefsPageGeneralAppl(this); break; case PAGE_TYPE_SMART: page = new XFE_PrefsPageBrowserSmart(this); break; case PAGE_TYPE_PRIVACY: page = new XFE_PrefsPageGeneralPrivacy(this); break; case PAGE_TYPE_CACHE: page = new XFE_PrefsPageGeneralCache(this); break; case PAGE_TYPE_PROXIES: page = new XFE_PrefsPageGeneralProxies(this); break; case PAGE_TYPE_BROWSER: page = new XFE_PrefsPageBrowser(this); break; case PAGE_TYPE_LANG: page = new XFE_PrefsPageBrowserLang(this); break; case PAGE_TYPE_MAILNEWS_IDENTITY: page = new XFE_PrefsPageMailNewsIdentity(this); break; #ifdef MOZ_MAIL_NEWS case PAGE_TYPE_MAILNEWS: page = new XFE_PrefsPageMailNews(this); break; case PAGE_TYPE_MAILNEWS_MESSAGES: page = new XFE_PrefsPageMessages(this); break; case PAGE_TYPE_MAILNEWS_MAILSERVER: page = new XFE_PrefsPageMailNewsMserver(this); break; case PAGE_TYPE_MAILNEWS_NSERVER: page = new XFE_PrefsPageNServer(this); break; case PAGE_TYPE_MAILNEWS_ADDRESS: page = new XFE_PrefsPageAddress(this); break; case PAGE_TYPE_MAILNEWS_COPIES: page = new XFE_PrefsPageMailNewsCopies(this); break; case PAGE_TYPE_MAILNEWS_HTML: page = new XFE_PrefsPageMailNewsHTML(this); break; case PAGE_TYPE_MAILNEWS_RECEIPTS: page = new XFE_PrefsPageMailNewsReceipts(this); break; #endif // MOZ_MAIL_NEWS #ifdef EDITOR case PAGE_TYPE_EDITOR: page = new XFE_PrefsPageEditor(this); break; case PAGE_TYPE_EDITOR_APPEARANCE: page = new XFE_PrefsPageEditorAppearance(this); break; case PAGE_TYPE_EDITOR_PUBLISH: page = new XFE_PrefsPageEditorPublish(this); break; case PAGE_TYPE_DISKSPACE: page = new XFE_PrefsPageDiskSpace(this); break; #endif // EDITOR case PAGE_TYPE_ADVANCED: page = new XFE_PrefsPageGeneralAdvanced(this); break; #ifdef PREFS_UNSUPPORTED case PAGE_TYPE_HELPFILES: page = new XFE_PrefsPageHelpFiles(this); break; case PAGE_TYPE_OFFLINE: page = new XFE_PrefsPageOffline(this); break; case PAGE_TYPE_OFFLINE_NEWS: page = new XFE_PrefsPageOfflineNews(this); break; #endif /* PREFS_UNSUPPORTED */ #ifdef MOZ_LI case PAGE_TYPE_LI: page = new XFE_PrefsPageLIGeneral(this); break; case PAGE_TYPE_LI_SERVER: page = new XFE_PrefsPageLIServer(this); break; case PAGE_TYPE_LI_FILES: page = new XFE_PrefsPageLIFiles(this); break; #endif } } // Member: getCategoryByIndex // Description: Returns category given an index // Inputs: // Side effects: PrefsCategory *XFE_PrefsDialog::getCategoryByIndex(int index) { PrefsCategory *item = 0; int count = 0; int i; int j; Boolean found = FALSE; for (i = 0; i < m_numCategories; i++) { count++; if ((index + 1) == count) { item = &m_categories[i]; found = TRUE; break; } if (! m_categories[i].open) continue; if ((index + 1 - count) <= m_categories[i].numChildren) { j = index - count; item = &(m_categories[i].children[j]); found = TRUE; break; } count += m_categories[i].numChildren; } return item; } // Member: getCategoryByName // Description: Returns category given a name // Inputs: // Side effects: PrefsCategory *XFE_PrefsDialog::getCategoryByName(const char *name) { PrefsCategory *item = 0; int i; int j; int numChildren; PrefsCategory *children; Boolean found = FALSE; for (i = 0; i < m_numCategories; i++) { if (strcmp(m_categories[i].name, name) == 0) { item = &m_categories[i]; found = TRUE; break; } if (m_categories[i].numChildren > 0) { numChildren = m_categories[i].numChildren; for (j = 0; j < numChildren; j++) { children = m_categories[i].children; if (strcmp(children[j].name, name) == 0) { item = &children[j]; found = TRUE; break; } } } } return item; } // Member: getCurrentCategory // Description: Returns currently selected category // Inputs: // Side effects: PrefsCategory *XFE_PrefsDialog::getCurrentCategory() { return m_currentCategory; } // Member: refreshCategories // Description: Refresh categories // Inputs: // Side effects: void XFE_PrefsDialog::refreshCategories() { fe_OutlineChange(m_wOutline, 1, CAT_LAST_CELL, getVisibleCategoryCount()); } // Member: isCurrentCategory // Description: Is category the one being displayed? // Inputs: // Side effects: Boolean XFE_PrefsDialog::isCurrentCategory(PrefsCategory *entry) { return (entry == m_currentCategory); } // Member: getOutline // Description: Returns the outline widget // Inputs: // Side effects: Widget XFE_PrefsDialog::getOutline() { return m_wOutline; } // Member: getPrefsParent // Description: Returns the widget from which a prefs dialog is popped up // Inputs: // Side effects: Widget XFE_PrefsDialog::getPrefsParent() { return m_wParent; } // Member: getPageForm // Description: Returns the page form // Inputs: // Side effects: Widget XFE_PrefsDialog::getPageForm() { return m_wPageForm; } // Member: getDialogChrome // Description: Returns the dialog chrome // Inputs: // Side effects: Widget XFE_PrefsDialog::getDialogChrome() { return m_chrome; } // ************************************************************************ // ************************* Outline ************************* // ************************************************************************ Boolean XFE_PrefsDialog::categoryDataFunc(Widget /* widget */, void *closure, int row, fe_OutlineDesc *data, int /* tag */) { int c; int dataColumn; XFE_PrefsDialog *prefsDialog = (XFE_PrefsDialog *)closure; if (row >= prefsDialog->getVisibleCategoryCount()) return False; PrefsCategory *entry = prefsDialog->getCategoryByIndex(row); if (entry == 0) return False; // Handle selections if (prefsDialog->isCurrentCategory(entry)) { fe_OutlineSelect(prefsDialog->getOutline(), row, True); } else { fe_OutlineUnselect(prefsDialog->getOutline(), row); } data->style = FE_OUTLINE_Default; if ((entry->leaf) || (entry->children == 0)) { data->flippy = FE_OUTLINE_Leaf; } else { data->flippy = entry->open ? FE_OUTLINE_Expanded : FE_OUTLINE_Folded; } data->depth = entry->leaf ? 1 : 0; for (c = 1, dataColumn = 0; c < NUM_OUTLINER_COLS ; c++, dataColumn++) { if (data->column_headers[c] == OUTLINER_COLUMN_NAME) { static char label[256]; data->type[dataColumn] = FE_OUTLINE_String; if (entry->leaf) PR_snprintf(label, sizeof(label)," %s", entry->categoryName); else strcpy(label, entry->categoryName); data->str[dataColumn] = label; // data->str[dataColumn] = entry->categoryName; } } return True; } void XFE_PrefsDialog::categoryClickFunc(Widget /* widget */, void *closure, int row, int /* column */, const char* /* header */, int /* button */, int /* clicks */, Boolean /* shift */, Boolean /* ctrl */, int /* tag */) { if (row == (-1)) { // The user is clicking on the header // Do nothing here. return; } XFE_PrefsDialog *prefsDialog = (XFE_PrefsDialog *)closure; PrefsCategory *entry = prefsDialog->getCategoryByIndex(row); prefsDialog->setCurrentCategory(entry); XmUpdateDisplay(prefsDialog->getBaseWidget()); } void XFE_PrefsDialog::categoryIconFunc(Widget /* widget */, void *closure, int row, int /*tag*/) { XFE_PrefsDialog *prefsDialog = (XFE_PrefsDialog *)closure; PrefsCategory *entry = prefsDialog->getCategoryByIndex(row); if (! entry) return; entry->open = (entry->open) ? FALSE : TRUE; prefsDialog->calcVisibleCategoryCount(); prefsDialog->refreshCategories(); // Make this the current selection prefsDialog->setCurrentCategory(entry); XmUpdateDisplay(prefsDialog->getBaseWidget()); }