/* -*- 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. */ /* PrefsDialogBrowser.cpp -- the Browser page in XFE preferences dialogs Created: Linda Wei , 17-Sep-96. */ #include "felocale.h" #include "structs.h" #include "fonts.h" #include "xpassert.h" #include "MozillaApp.h" #include "View.h" #include "xfe.h" #include "e_kit.h" #include "prefapi.h" #include "PrefsDialog.h" #include "PrefsLang.h" #include "prefapi.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { char *XP_GetString(int i); void fe_browse_file_of_text_in_url(MWContext *context, Widget text_field, Boolean dirp); void fe_installBrowser(); void fe_installBrowserLang(char *); } static char *array_to_acceptLang(char **array, int cnt); extern int fe_stringPrefToArray(const char *string, char ***array_p); extern char *fe_arrayToStringPref(char **array_p, int count); #define OUTLINER_GEOMETRY_PREF "preferences.lang.outliner_geometry" extern int XFE_LANG_COL_ORDER; extern int XFE_LANG_COL_LANG; extern int XFE_OUT_OF_MEMORY_URL; // ************************************************************************ // ************************* Browser ************************* // ************************************************************************ // Member: XFE_PrefsPageBrowser // Description: Constructor // Inputs: // Side effects: XFE_PrefsPageBrowser::XFE_PrefsPageBrowser(XFE_PrefsDialog *dialog) : XFE_PrefsPage(dialog), m_prefsDataBrowser(0), m_home_changed(FALSE) { } // Member: ~XFE_PrefsPageBrowser // Description: Destructor // Inputs: // Side effects: XFE_PrefsPageBrowser::~XFE_PrefsPageBrowser() { delete m_prefsDataBrowser; } // Member: create // Description: Creates page for Browser // Inputs: // Side effects: void XFE_PrefsPageBrowser::create() { Widget kids[100]; Arg av[50]; int ac; int i; PrefsDataBrowser *fep = NULL; fep = new PrefsDataBrowser; memset(fep, 0, sizeof(PrefsDataBrowser)); m_prefsDataBrowser = fep; fep->context = getContext(); fep->prompt_dialog = getPrefsDialog()->getDialogChrome(); Widget form; ac = 0; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; form = XmCreateForm (m_wPageForm, "browser", av, ac); XtManageChild (form); m_wPage = fep->page = form; // Browser starts with Widget frame1; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++; frame1 = XmCreateFrame (form, "browserFrame", av, ac); Widget form1; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; form1 = XmCreateForm (frame1, "browserBox", av, ac); Widget label1; ac = 0; XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++; label1 = XmCreateLabelGadget (frame1, "browserBoxLabel", av, ac); // Browser starts with ac = 0; i = 0; kids[i++] = fep->blank_page_toggle = XmCreateToggleButtonGadget(form1, "blankPage", av, ac); kids[i++] = fep->home_page_toggle = XmCreateToggleButtonGadget(form1, "homePage", av, ac); kids[i++] = fep->last_page_toggle = XmCreateToggleButtonGadget(form1, "lastPage", av, ac); XtVaSetValues(fep->blank_page_toggle, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(fep->home_page_toggle, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, fep->blank_page_toggle, XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, XmNleftWidget, fep->blank_page_toggle, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(fep->last_page_toggle, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, fep->home_page_toggle, XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, XmNleftWidget, fep->blank_page_toggle, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtManageChildren(kids, i); XtManageChild(label1); XtManageChild(form1); XtManageChild(frame1); // Home page location and History expiration Widget frame2; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg (av [ac], XmNtopWidget, frame1); ac++; XtSetArg (av [ac], XmNtopOffset, 8); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++; frame2 = XmCreateFrame (form, "homePageFrame", av, ac); Widget form2; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; form2 = XmCreateForm (frame2, "homePageBox", av, ac); Widget label2; ac = 0; XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++; label2 = XmCreateLabelGadget (frame2, "homePageBoxLabel", av, ac); Widget home_page_label; Widget loc_label; Widget home_page_text; Widget browse_button; Widget use_current_button; ac = 0; i = 0; kids[i++] = home_page_label = XmCreateLabelGadget(form2, "homePageLabel", av, ac); kids[i++] = loc_label = XmCreateLabelGadget(form2, "locLabel", av, ac); kids[i++] = home_page_text = fe_CreateTextField (form2, "homePageText", av, ac); kids[i++] = browse_button = XmCreatePushButtonGadget(form2, "browse", av, ac); kids[i++] = use_current_button = XmCreatePushButtonGadget(form2, "useCurrent", av, ac); fep->home_page_text = home_page_text; fep->browse_button = browse_button; fep->use_current_button = use_current_button; int labels_height; labels_height = XfeVaGetTallestWidget(loc_label, home_page_text, browse_button, NULL); XtVaSetValues(home_page_label, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(loc_label, XmNheight, labels_height, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, home_page_label, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(home_page_text, XmNheight, labels_height, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, loc_label, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, loc_label, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(browse_button, XmNheight, labels_height, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, loc_label, XmNleftAttachment, XmATTACH_NONE, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(use_current_button, XmNheight, labels_height, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, browse_button, XmNleftAttachment, XmATTACH_NONE, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, browse_button, XmNrightOffset, 8, XmNbottomAttachment, XmATTACH_NONE, NULL); XtManageChildren (kids, i); XtManageChild(label2); XtManageChild(form2); XtManageChild(frame2); // History Widget frame3; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg (av [ac], XmNtopWidget, frame2); ac++; XtSetArg (av [ac], XmNtopOffset, 8); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++; frame3 = XmCreateFrame (form, "historyFrame", av, ac); Widget form3; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; form3 = XmCreateForm (frame3, "historyBox", av, ac); Widget label3; ac = 0; XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++; label3 = XmCreateLabelGadget (frame3, "historyBoxLabel", av, ac); Widget expire_label; Widget expire_days_text; Widget days_label; Widget expire_now_button; ac = 0; i = 0; kids[i++] = expire_label = XmCreateLabelGadget(form3, "expireLabel", av, ac); kids[i++] = days_label = XmCreateLabelGadget(form3, "daysLabel", av, ac); kids[i++] = expire_days_text = fe_CreateTextField (form3, "expireDays", av, ac); kids[i++] = expire_now_button = XmCreatePushButtonGadget(form3, "expireNow", av, ac); fep->expire_days_text = expire_days_text; XtVaSetValues(expire_label, XmNheight, labels_height, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(expire_days_text, XmNcolumns, 3, XmNheight, labels_height, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, expire_label, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, expire_label, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(days_label, XmNheight, labels_height, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, expire_label, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, expire_days_text, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(expire_now_button, XmNheight, labels_height, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, expire_label, XmNleftAttachment, XmATTACH_NONE, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, NULL); XtManageChildren (kids, i); XtManageChild(label3); XtManageChild(form3); XtManageChild(frame3); XtAddCallback(fep->blank_page_toggle, XmNvalueChangedCallback, cb_setStartupPage, fep); XtAddCallback(fep->home_page_toggle, XmNvalueChangedCallback, cb_setStartupPage, fep); XtAddCallback(fep->last_page_toggle, XmNvalueChangedCallback, cb_setStartupPage, fep); XtAddCallback(browse_button, XmNactivateCallback, cb_browse, this); XtAddCallback(use_current_button, XmNactivateCallback, cb_useCurrent, this); XtAddCallback(expire_now_button, XmNactivateCallback, cb_expireNow, this); setCreated(TRUE); } // Member: init // Description: Initializes page for Browser // Inputs: // Side effects: void XFE_PrefsPageBrowser::init() { XP_ASSERT(m_prefsDataBrowser); PrefsDataBrowser *fep = m_prefsDataBrowser; XFE_GlobalPrefs *prefs = &fe_globalPrefs; Boolean sensitive; // Browser starts with sensitive = !PREF_PrefIsLocked("browser.startup.page"); XtVaSetValues(fep->blank_page_toggle, XmNset, (prefs->browser_startup_page == BROWSER_STARTUP_BLANK), XmNsensitive, sensitive, 0); XtVaSetValues(fep->home_page_toggle, XmNset, (prefs->browser_startup_page == BROWSER_STARTUP_HOME), XmNsensitive, sensitive, 0); XtVaSetValues(fep->last_page_toggle, XmNset, (prefs->browser_startup_page == BROWSER_STARTUP_LAST), XmNsensitive, sensitive, 0); sensitive = !PREF_PrefIsLocked("browser.startup.homepage"); XtVaSetValues(fep->home_page_text, XmNsensitive, sensitive, 0); fe_SetTextField(fep->home_page_text, prefs->home_document); XtSetSensitive(fep->use_current_button, sensitive); XtSetSensitive(fep->browse_button, sensitive); // History expires char buf [1024]; if (prefs->global_history_expiration >= 0) PR_snprintf(buf, sizeof(buf), "%d", prefs->global_history_expiration); else *buf = 0; sensitive = !PREF_PrefIsLocked("browser.link_expiration"); XtVaSetValues(fep->expire_days_text, XmNvalue, buf, XmNsensitive, sensitive, 0); setInitialized(TRUE); } // Member: install // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowser::install() { fe_installBrowser(); if (m_home_changed) { // Notify whoever is interested in updating home button/menu item XFE_MozillaApp::theApp()->notifyInterested(XFE_View::commandNeedsUpdating, (void*)xfeCmdHome); m_home_changed = FALSE; } } // Member: save // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowser::save() { PrefsDataBrowser *fep = m_prefsDataBrowser; XP_ASSERT(fep); char *old_home = fe_globalPrefs.home_document; Boolean b; XtVaGetValues(fep->blank_page_toggle, XmNset, &b, 0); if (b) fe_globalPrefs.browser_startup_page = BROWSER_STARTUP_BLANK; XtVaGetValues(fep->home_page_toggle, XmNset, &b, 0); if (b) fe_globalPrefs.browser_startup_page = BROWSER_STARTUP_HOME; XtVaGetValues(fep->last_page_toggle, XmNset, &b, 0); if (b) fe_globalPrefs.browser_startup_page = BROWSER_STARTUP_LAST; char *s = fe_GetTextField(fep->home_page_text); fe_globalPrefs.home_document = s ? s : XP_STRDUP(""); // Send out notification to change sensitivity of the home button/menu item if ((old_home == 0) || (*old_home == '\0')){ if (XP_STRLEN(fe_globalPrefs.home_document) > 0) { m_home_changed = TRUE; } } else { if (XP_STRLEN(fe_globalPrefs.home_document) == 0) { m_home_changed = TRUE; } } if (old_home) XP_FREE(old_home); // History expires int old_history_expiration = fe_globalPrefs.global_history_expiration; fe_globalPrefs.global_history_expiration = -1; char *text = 0; char dummy; XtVaGetValues(fep->expire_days_text, XmNvalue, &text, 0); sscanf(text, " %d %c", &fe_globalPrefs.global_history_expiration, &dummy); if (fe_globalPrefs.global_history_expiration < 0) fe_globalPrefs.global_history_expiration = -1; if (text) XtFree(text); if (old_history_expiration != fe_globalPrefs.global_history_expiration) { fe_RefreshAllAnchors(); } // Install preferences install(); } // Member: getData // Description: // Inputs: // Side effects: PrefsDataBrowser *XFE_PrefsPageBrowser::getData() { return m_prefsDataBrowser; } // Member: cb_setStartupPage // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowser::cb_setStartupPage(Widget w, XtPointer closure, XtPointer callData) { PrefsDataBrowser *fep = (PrefsDataBrowser *)closure; XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData; if (! cb->set) { XtVaSetValues(w, XmNset, True, 0); } else if (w == fep->blank_page_toggle){ XtVaSetValues(fep->home_page_toggle, XmNset, False, 0); XtVaSetValues(fep->last_page_toggle, XmNset, False, 0); } else if (w == fep->home_page_toggle){ XtVaSetValues(fep->blank_page_toggle, XmNset, False, 0); XtVaSetValues(fep->last_page_toggle, XmNset, False, 0); } else if (w == fep->last_page_toggle){ XtVaSetValues(fep->blank_page_toggle, XmNset, False, 0); XtVaSetValues(fep->home_page_toggle, XmNset, False, 0); } else abort(); } // Member: cb_browse // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowser::cb_browse(Widget /* w */, XtPointer closure, XtPointer /* callData */) { XFE_PrefsPageBrowser *thePage = (XFE_PrefsPageBrowser *)closure; XFE_PrefsDialog *theDialog = thePage->getPrefsDialog(); PrefsDataBrowser *fep = thePage->getData(); fe_browse_file_of_text_in_url(theDialog->getContext(), fep->home_page_text, False); } // Member: cb_useCurrent // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowser::cb_useCurrent(Widget /* w */, XtPointer closure, XtPointer /* callData */) { XFE_PrefsPageBrowser *thePage = (XFE_PrefsPageBrowser *)closure; XFE_PrefsDialog *theDialog = thePage->getPrefsDialog(); PrefsDataBrowser *fep = thePage->getData(); MWContext *context = theDialog->getContext(); History_entry *h = SHIST_GetCurrent (&context->hist); if (!h) return; if ((h->address) && (XP_STRLEN(h->address) > 0)) fe_SetTextField(fep->home_page_text, h->address); } // Member: cb_expireNow // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowser::cb_expireNow(Widget /* widget */, XtPointer closure, XtPointer /* call_data */) { XFE_PrefsPageBrowser *thePage = (XFE_PrefsPageBrowser *)closure; PrefsDataBrowser *fep = thePage->getData(); if (XFE_Confirm(fep->context, fe_globalData.expire_now_message)) { GH_ClearGlobalHistory(); fe_RefreshAllAnchors(); } } // ************************************************************************ // ************************* Browser/Languages ************************* // ************************************************************************ // Member: XFE_PrefsPageBrowserLang // Description: Constructor // Inputs: // Side effects: XFE_PrefsPageBrowserLang::XFE_PrefsPageBrowserLang(XFE_PrefsDialog *dialog) : XFE_PrefsPage(dialog), m_prefsDataBrowserLang(0), m_rowIndex(0) { } // Member: ~XFE_PrefsPageBrowserLang // Description: Destructor // Inputs: // Side effects: XFE_PrefsPageBrowserLang::~XFE_PrefsPageBrowserLang() { int i; PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; if (fep) { delete fep->lang_outliner; if (fep->pref_lang_regs) { for (i = 0; i < fep->pref_lang_count; i++) { XP_FREE(fep->pref_lang_regs[i]); } XP_FREE(m_prefsDataBrowserLang->pref_lang_regs); } } delete m_prefsDataBrowserLang; } const int XFE_PrefsPageBrowserLang::OUTLINER_COLUMN_ORDER = 0; const int XFE_PrefsPageBrowserLang::OUTLINER_COLUMN_LANG = 1; const int XFE_PrefsPageBrowserLang::OUTLINER_COLUMN_MAX_LENGTH = 256; const int XFE_PrefsPageBrowserLang::OUTLINER_INIT_POS = (-1); #define STRING_COL_ORDER "Order" #define STRING_COL_LANG "Language" // Member: create // Description: Creates page for BrowserLang // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::create() { Widget kids[100]; Arg av[50]; int ac; int i; PrefsDataBrowserLang *fep = NULL; fep = new PrefsDataBrowserLang; memset(fep, 0, sizeof(PrefsDataBrowserLang)); m_prefsDataBrowserLang = fep; fep->context = getContext(); fep->prompt_dialog = getPrefsDialog()->getDialogChrome(); Widget form; ac = 0; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; form = XmCreateForm (m_wPageForm, "lang", av, ac); XtManageChild (form); m_wPage = fep->page = form; Widget frame1; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++; frame1 = XmCreateFrame (form, "langFrame", av, ac); Widget form1; ac = 0; XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; form1 = XmCreateForm (frame1, "langBox", av, ac); Widget lang_label; Widget up_button; Widget down_button; Widget add_button; Widget delete_button; ac = 0; i = 0; kids[i++] = lang_label = XmCreateLabelGadget(form1, "langLabel", av, ac); kids[i++] = up_button = XmCreateArrowButtonGadget(form1, "upButton", av, ac); kids[i++] = down_button = XmCreateArrowButtonGadget(form1, "downButton", av, ac); kids[i++] = add_button = XmCreatePushButtonGadget(form1, "addButton", av, ac); kids[i++] = delete_button = XmCreatePushButtonGadget(form1, "deleteButton", av, ac); fep->add_button = add_button; fep->delete_button = delete_button; fep->up_button = up_button; fep->down_button = down_button; // Outliner int num_columns = 2; static int default_column_widths[] = {8, 40}; XFE_Outliner *outliner; Widget lang_list; outliner = new XFE_Outliner("langList", // name this, // outlinable getPrefsDialog(), // top level form1, // parent FALSE, // constant size TRUE, // has headings num_columns, // number of columns num_columns, // number of visible columns default_column_widths, // default column widths OUTLINER_GEOMETRY_PREF ); fep->lang_outliner = outliner; lang_list = fep->lang_list = outliner->getBaseWidget(); XtVaSetValues(outliner->getBaseWidget(), XtVaTypedArg, XmNblankBackground, XmRString, "white", 6, XmNvisibleRows, 10, NULL); XtVaSetValues(outliner->getBaseWidget(), XmNcellDefaults, True, XtVaTypedArg, XmNcellBackground, XmRString, "white", 6, NULL); outliner->setColumnResizable(OUTLINER_COLUMN_ORDER, False); outliner->setColumnResizable(OUTLINER_COLUMN_LANG, False); outliner->show(); XtVaSetValues(lang_label, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(fep->lang_list, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, lang_label, XmNtopOffset, 4, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); Dimension list_height; Dimension up_button_height; int down_button_top_offset; int up_button_top_offset; XtVaGetValues(down_button, XmNtopOffset, &down_button_top_offset, NULL); list_height = XfeHeight(lang_list); up_button_height = XfeHeight(up_button); up_button_top_offset = list_height/2 - up_button_height - down_button_top_offset/2; XtVaSetValues(up_button, XmNarrowDirection, XmARROW_UP, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, lang_list, XmNtopOffset, up_button_top_offset, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, lang_list, XmNleftOffset, 8, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(down_button, XmNarrowDirection, XmARROW_DOWN, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, up_button, XmNtopOffset, 4, XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, XmNleftWidget, up_button, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); int labels_width; labels_width = XfeVaGetWidestWidget(add_button, delete_button, NULL); XtVaSetValues(add_button, XmNwidth, labels_width, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, lang_list, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, up_button, XmNleftOffset, 24, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtVaSetValues(delete_button, XmNwidth, labels_width, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, add_button, XmNtopOffset, 4, XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, XmNleftWidget, add_button, XmNrightAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); XtAddCallback(add_button, XmNactivateCallback, cb_add, this); XtAddCallback(delete_button, XmNactivateCallback, cb_delete, this); XtAddCallback(up_button, XmNactivateCallback, cb_promote, this); XtAddCallback(down_button, XmNactivateCallback, cb_demote, this); XtManageChildren(kids, i); XtManageChild(form1); XtManageChild(frame1); setCreated(TRUE); } // Member: init // Description: Initializes page for BrowserLang // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::init() { XP_ASSERT(m_prefsDataBrowserLang); PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; XFE_GlobalPrefs *prefs = &fe_globalPrefs; // Retrieve the preferred lang/region list from preferences if (fep->pref_lang_regs) { for (int i = 0; i < fep->pref_lang_count; i++) { XP_FREE(fep->pref_lang_regs[i]); } XP_FREE(m_prefsDataBrowserLang->pref_lang_regs); fep->pref_lang_regs = 0; fep->pref_lang_count = 0; } fep->pref_lang_count = fe_stringPrefToArray(prefs->lang_regions, &fep->pref_lang_regs); fep->lang_outliner->change(0, fep->pref_lang_count, fep->pref_lang_count); setSelectionPos(OUTLINER_INIT_POS); setInitialized(TRUE); } // Member: install // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::install() { XP_ASSERT(m_prefsDataBrowserLang); PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; char *new_accept_lang; if (fep->pref_lang_count > 0) { new_accept_lang = array_to_acceptLang(fep->pref_lang_regs, fep->pref_lang_count); } else { new_accept_lang = NULL; } fe_installBrowserLang(new_accept_lang); } // Member: save // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::save() { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; XP_ASSERT(fep); char *new_regions = fe_arrayToStringPref(fep->pref_lang_regs, fep->pref_lang_count); XP_ASSERT(new_regions); XP_FREE(fe_globalPrefs.lang_regions); fe_globalPrefs.lang_regions = new_regions; // Install preferences install(); } // Member: insertLang // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::insertLang(char *lang) { // First figure out where to insert it PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; int pos = 0; int count = fep->pref_lang_count; if (count > 0) { // Check if there is any selection uint32 sel_count = 0; const int *indices = 0; fep->lang_outliner->getSelection(&indices, (int *) &sel_count); if (sel_count > 0 && indices) { pos = indices[0]; } } // Insert at pos insertLangAtPos(pos, lang); } // Member: insertLangAtPos // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::insertLangAtPos(int pos, char *lang) { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; int count = fep->pref_lang_count; int i; // Insert language at position if (count > 0) { for (i = 0; i < count; i++) { if (XP_STRCMP(lang, fep->pref_lang_regs[i]) == 0) return; } char **pref_lang_regs = 0; pref_lang_regs = (char **)XP_CALLOC(count+1, sizeof(char *)); for (i = 0; i < pos; i++) { pref_lang_regs[i] = fep->pref_lang_regs[i]; } for (i = pos; i < count; i++) { pref_lang_regs[i+1] = fep->pref_lang_regs[i]; } pref_lang_regs[pos] = XP_STRDUP(lang); XP_FREE(m_prefsDataBrowserLang->pref_lang_regs); fep->pref_lang_regs = pref_lang_regs; fep->pref_lang_count++; } else { fep->pref_lang_regs = (char **)XP_CALLOC(1, sizeof(char *)); fep->pref_lang_regs[0] = XP_STRDUP(lang); fep->pref_lang_count = 1; } // Repaint fep->lang_outliner->change(0, fep->pref_lang_count, fep->pref_lang_count); // Set selection setSelectionPos(pos); } // Member: deleteLangAtPos // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::deleteLangAtPos(int pos) { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; int count = fep->pref_lang_count; int i; if (pos >= count) return; // Remove the lang at pos if (count == 1) { fep->pref_lang_count = 0; XP_FREE(fep->pref_lang_regs[0]); XP_FREE(m_prefsDataBrowserLang->pref_lang_regs); m_prefsDataBrowserLang->pref_lang_regs = 0; } else { char **pref_lang_regs = 0; pref_lang_regs = (char **)XP_CALLOC(count-1, sizeof(char *)); for (i = 0; i < pos; i++) { pref_lang_regs[i] = fep->pref_lang_regs[i]; } for (i = pos; i < count - 1; i++) { pref_lang_regs[i] = fep->pref_lang_regs[i+1]; } XP_FREE(m_prefsDataBrowserLang->pref_lang_regs[pos]); XP_FREE(m_prefsDataBrowserLang->pref_lang_regs); m_prefsDataBrowserLang->pref_lang_regs = pref_lang_regs; fep->pref_lang_count--; } // Repaint fep->lang_outliner->change(0, fep->pref_lang_count, fep->pref_lang_count); // Set selection if there is more than one entry if (fep->pref_lang_count > 0) { if (pos >= fep->pref_lang_count) pos--; setSelectionPos(pos); } else { setSelectionPos(OUTLINER_INIT_POS); } } // Member: swapLangs // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::swapLangs(int pos1, int pos2, int sel_pos) { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; int count = fep->pref_lang_count; char *temp; if ((pos1 >= count) || (pos2 >= count) || (sel_pos >= count)) return; // Swap temp = m_prefsDataBrowserLang->pref_lang_regs[pos1]; m_prefsDataBrowserLang->pref_lang_regs[pos1] = m_prefsDataBrowserLang->pref_lang_regs[pos2]; m_prefsDataBrowserLang->pref_lang_regs[pos2] = temp; // Repaint fep->lang_outliner->change(0, fep->pref_lang_count, fep->pref_lang_count); // Set selection if there is more than one entry setSelectionPos(sel_pos); } // Member: setSelelctionPos // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::setSelectionPos(int pos) { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; int count = fep->pref_lang_count; if (pos >= count) return; if (pos == OUTLINER_INIT_POS) { XtVaSetValues(fep->delete_button, XmNsensitive, False, NULL); XtVaSetValues(fep->up_button, XmNsensitive, False, NULL); XtVaSetValues(fep->down_button, XmNsensitive, False, NULL); } else { fep->lang_outliner->selectItemExclusive(pos); XtVaSetValues(fep->delete_button, XmNsensitive, (count != 0), NULL); XtVaSetValues(fep->up_button, XmNsensitive, (pos != 0), NULL); XtVaSetValues(fep->down_button, XmNsensitive, (pos != (count-1)), NULL); } } // Member: deselelctionPos // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::deselectPos(int pos) { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; int count = fep->pref_lang_count; if (pos >= count) return; fep->lang_outliner->deselectItem(pos); } // Member: getData // Description: // Inputs: // Side effects: PrefsDataBrowserLang *XFE_PrefsPageBrowserLang::getData() { return m_prefsDataBrowserLang; } // Member: cb_add // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::cb_add(Widget /* widget */, XtPointer closure, XtPointer /* call_data */) { XFE_PrefsPageBrowserLang *thePage = (XFE_PrefsPageBrowserLang *)closure; XFE_PrefsDialog *theDialog = thePage->getPrefsDialog(); Widget mainw = theDialog->getBaseWidget(); // Instantiate a language dialog XFE_PrefsLangDialog *theLangDialog = 0; if ((theLangDialog = new XFE_PrefsLangDialog(theDialog, thePage, mainw, "prefsLang")) == 0) { fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL)); return; } // Initialize and pop up the lang dialog theLangDialog->initPage(); theLangDialog->show(); } // Member: cb_delete // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::cb_delete(Widget /* widget */, XtPointer closure, XtPointer /* call_data */) { XFE_PrefsPageBrowserLang *thePage = (XFE_PrefsPageBrowserLang *)closure; PrefsDataBrowserLang *fep = thePage->getData(); int count = fep->pref_lang_count; int pos = 0; uint32 sel_count = 0; const int *indices = 0; if (count == 0) return; fep->lang_outliner->getSelection(&indices, (int *) &sel_count); if (sel_count > 0 && indices) { pos = indices[0]; thePage->deleteLangAtPos(pos); } } // Member: cb_promote // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::cb_promote(Widget /* widget */, XtPointer closure, XtPointer /* call_data */) { XFE_PrefsPageBrowserLang *thePage = (XFE_PrefsPageBrowserLang *)closure; PrefsDataBrowserLang *fep = thePage->getData(); int count = fep->pref_lang_count; int pos = 0; uint32 sel_count = 0; const int *indices = 0; if (count == 0) return; fep->lang_outliner->getSelection(&indices, (int *) &sel_count); if (sel_count > 0 && indices) { pos = indices[0]; if (pos != 0) { thePage->deselectPos(pos); thePage->swapLangs(pos, pos-1, pos-1); } } } // Member: cb_demote // Description: // Inputs: // Side effects: void XFE_PrefsPageBrowserLang::cb_demote(Widget /* widget */, XtPointer closure, XtPointer /* call_data */) { XFE_PrefsPageBrowserLang *thePage = (XFE_PrefsPageBrowserLang *)closure; PrefsDataBrowserLang *fep = thePage->getData(); int count = fep->pref_lang_count; int pos = 0; uint32 sel_count = 0; const int *indices = 0; if (count == 0) return; fep->lang_outliner->getSelection(&indices, (int *) &sel_count); if (sel_count > 0 && indices) { pos = indices[0]; if (pos != (count-1)) { thePage->deselectPos(pos); thePage->swapLangs(pos, pos+1, pos+1); } } } /* Outlinable interface methods */ void *XFE_PrefsPageBrowserLang::ConvFromIndex(int /* index */) { return (void *)NULL; } int XFE_PrefsPageBrowserLang::ConvToIndex(void * /* item */) { return 0; } char*XFE_PrefsPageBrowserLang::getColumnName(int column) { switch (column){ case OUTLINER_COLUMN_ORDER: return STRING_COL_ORDER; case OUTLINER_COLUMN_LANG: return STRING_COL_LANG; default: XP_ASSERT(0); return 0; } } char *XFE_PrefsPageBrowserLang::getColumnHeaderText(int column) { switch (column) { case OUTLINER_COLUMN_ORDER: return XP_GetString(XFE_LANG_COL_ORDER); case OUTLINER_COLUMN_LANG: return XP_GetString(XFE_LANG_COL_LANG); default: XP_ASSERT(0); return 0; } } fe_icon *XFE_PrefsPageBrowserLang::getColumnHeaderIcon(int /* column */) { return 0; } EOutlinerTextStyle XFE_PrefsPageBrowserLang::getColumnHeaderStyle(int /* column */) { return OUTLINER_Default; } // This method acquires one line of data. void *XFE_PrefsPageBrowserLang::acquireLineData(int line) { m_rowIndex = line; return (void *)1; } void XFE_PrefsPageBrowserLang::getTreeInfo(Boolean * /* expandable */, Boolean * /* is_expanded */, int * /* depth */, OutlinerAncestorInfo ** /* ancestor */) { // No-op } EOutlinerTextStyle XFE_PrefsPageBrowserLang::getColumnStyle(int /*column*/) { return OUTLINER_Default; } char *XFE_PrefsPageBrowserLang::getColumnText(int column) { PrefsDataBrowserLang *fep = m_prefsDataBrowserLang; static char line[OUTLINER_COLUMN_MAX_LENGTH+1]; *line = 0; // if (m_rowIndex >= fep->pref_lang_count) return line; switch (column) { case OUTLINER_COLUMN_ORDER: sprintf(line, "%d", m_rowIndex+1); break; case OUTLINER_COLUMN_LANG: sprintf(line, "%s", fep->pref_lang_regs[m_rowIndex]); break; default: break; } return line; } fe_icon *XFE_PrefsPageBrowserLang::getColumnIcon(int /* column */) { return 0; } void XFE_PrefsPageBrowserLang::releaseLineData() { // No-op } void XFE_PrefsPageBrowserLang::Buttonfunc(const OutlineButtonFuncData *data) { int row = data->row; if (row < 0) { // header return; } setSelectionPos(data->row); } void XFE_PrefsPageBrowserLang::Flippyfunc(const OutlineFlippyFuncData * /* data */) { // No-op } XFE_Outliner *XFE_PrefsPageBrowserLang::getOutliner() { return m_prefsDataBrowserLang->lang_outliner; } // ************************************************************************ // ************************* Misc ************************* // ************************************************************************ /* * Get the tag part from a string * The tag is bracketed by '[' and ']' * and has no white space. * * Returns a pointer to the start of the tag. * also returns the tag length. * * Any error return NULL */ static char * fe_lang_reg_get_tag(char *tag, int *len_p) { char *q1, *q2; /* init the returned tag length */ *len_p = 0; /* bstell: need to fix this to use Istrchr */ /* use INTL_DefaultWinCharSetID to get the csid */ /* (really need to store the csid of the list in preferences) */ /* tag must start with '[' */ q1 = strchr(tag, '['); if (q1 == NULL) return NULL; q1 += 1; /* point past the '[' */ /* tag must end with ']' */ q2 = strchr(q1, ']'); if (q2 == NULL) return NULL; /* check length of tag (stop on any white-space) */ *len_p = strcspn(q1, "] \t\n"); if (*len_p < 1) /* need some text */ return NULL; if (*len_p != (q2-q1)) { *len_p = 0; return NULL; } return q1; } static const char *accept_lang_seperator = ", "; /* * Convert an array of strings * to HTTP Accept-Language string * * returns a string built up from the array * * The caller must free the array */ static char *array_to_acceptLang(char **array, int cnt) { char *al_string, *p, *q; int i, str_len, tag_len; /* * Handle an empty array */ if (cnt == 0) { return NULL; } /* * Get the maximum possible length of the result */ str_len = 0; for (i=0; i