From 0cfb0a45bd508d2322c50f1a364d0c569e5a9173 Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Fri, 22 Oct 1999 02:09:18 +0000 Subject: [PATCH] make the PrefWindow work for html select dom elements, instead of just html input dom elements. right now, it only works for int prefs. fix #15230, heed and reflect the quoted style and quoted size prefs in the html select widget in pref-mailnews.xul. rewrite the html select elements in the pref xul, to work correctly. remove unused, commented out xul to avoid confusion. add new option for "yesterday" for the news offline download pref. use nsCOMPtr. use PR_snprintf() to avoid potential buffer overruns. use #defines to clean up the code. use PR_sscanf instead of sscanf. r=mscott git-svn-id: svn://10.0.0.236/trunk@51486 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/suite/common/pref/pref-download.xul | 13 +- mozilla/suite/common/pref/pref-fonts.xul | 8 +- mozilla/suite/common/pref/pref-navigator.xul | 39 --- .../chrome/common/pref/pref-download.dtd | 5 +- .../resources/content/pref-download.xul | 13 +- .../resources/content/pref-fonts.xul | 8 +- .../resources/content/pref-navigator.xul | 39 --- .../resources/locale/en-US/pref-download.dtd | 5 +- .../prefwindow/src/nsPrefWindow.cpp | 253 ++++++++++++++---- .../components/prefwindow/src/nsPrefWindow.h | 15 +- 10 files changed, 238 insertions(+), 160 deletions(-) diff --git a/mozilla/suite/common/pref/pref-download.xul b/mozilla/suite/common/pref/pref-download.xul index 4fa1759bd99..5af206d0604 100644 --- a/mozilla/suite/common/pref/pref-download.xul +++ b/mozilla/suite/common/pref/pref-download.xul @@ -61,12 +61,13 @@ &fromRadio.label; - - &one.select; - &two.select; - &oneM.select; - &sixM.select; - &oneY.select; + + &yesterday.select; + &oneW.select; + &twoW.select; + &oneM.select; + &sixM.select; + &oneY.select; diff --git a/mozilla/suite/common/pref/pref-fonts.xul b/mozilla/suite/common/pref/pref-fonts.xul index bafabde1a3e..4d02802c940 100644 --- a/mozilla/suite/common/pref/pref-fonts.xul +++ b/mozilla/suite/common/pref/pref-fonts.xul @@ -47,21 +47,21 @@ &varFont.select; - + &encod1.option; &size.select; - + &varFont.option; &fixedFont.Select; - + &encod1.option; &size.select; - + &varFont.option; diff --git a/mozilla/suite/common/pref/pref-navigator.xul b/mozilla/suite/common/pref/pref-navigator.xul index 7d6aa74f35c..b994e316c4c 100644 --- a/mozilla/suite/common/pref/pref-navigator.xul +++ b/mozilla/suite/common/pref/pref-navigator.xul @@ -102,45 +102,6 @@ - - - - diff --git a/mozilla/suite/locales/en-US/chrome/common/pref/pref-download.dtd b/mozilla/suite/locales/en-US/chrome/common/pref/pref-download.dtd index 2e796a082e7..dc42b48ca74 100644 --- a/mozilla/suite/locales/en-US/chrome/common/pref/pref-download.dtd +++ b/mozilla/suite/locales/en-US/chrome/common/pref/pref-download.dtd @@ -10,8 +10,9 @@ - - + + + diff --git a/mozilla/xpfe/components/prefwindow/resources/content/pref-download.xul b/mozilla/xpfe/components/prefwindow/resources/content/pref-download.xul index 4fa1759bd99..5af206d0604 100644 --- a/mozilla/xpfe/components/prefwindow/resources/content/pref-download.xul +++ b/mozilla/xpfe/components/prefwindow/resources/content/pref-download.xul @@ -61,12 +61,13 @@ &fromRadio.label; - - &one.select; - &two.select; - &oneM.select; - &sixM.select; - &oneY.select; + + &yesterday.select; + &oneW.select; + &twoW.select; + &oneM.select; + &sixM.select; + &oneY.select; diff --git a/mozilla/xpfe/components/prefwindow/resources/content/pref-fonts.xul b/mozilla/xpfe/components/prefwindow/resources/content/pref-fonts.xul index bafabde1a3e..4d02802c940 100644 --- a/mozilla/xpfe/components/prefwindow/resources/content/pref-fonts.xul +++ b/mozilla/xpfe/components/prefwindow/resources/content/pref-fonts.xul @@ -47,21 +47,21 @@ &varFont.select; - + &encod1.option; &size.select; - + &varFont.option; &fixedFont.Select; - + &encod1.option; &size.select; - + &varFont.option; diff --git a/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul b/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul index 7d6aa74f35c..b994e316c4c 100644 --- a/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul +++ b/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul @@ -102,45 +102,6 @@ - - - - diff --git a/mozilla/xpfe/components/prefwindow/resources/locale/en-US/pref-download.dtd b/mozilla/xpfe/components/prefwindow/resources/locale/en-US/pref-download.dtd index 2e796a082e7..dc42b48ca74 100644 --- a/mozilla/xpfe/components/prefwindow/resources/locale/en-US/pref-download.dtd +++ b/mozilla/xpfe/components/prefwindow/resources/locale/en-US/pref-download.dtd @@ -10,8 +10,9 @@ - - + + + diff --git a/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.cpp b/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.cpp index 8238f1acca1..961af853bd2 100644 --- a/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.cpp +++ b/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.cpp @@ -48,6 +48,8 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); #include "nsIDOMWindow.h" #include "nsIWebShellWindow.h" #include "nsIDOMHTMLInputElement.h" +#include "nsIDOMHTMLSelectElement.h" +#include "nsCOMPtr.h" #include "plstr.h" #include "prprf.h" @@ -69,6 +71,9 @@ static NS_DEFINE_IID(kIFileLocatorIID, NS_IFILELOCATOR_IID); static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID); static NS_DEFINE_CID(kFileLocatorCID, NS_FILELOCATOR_CID); +#define CHAR_VAL_BUF_LEN 32 +#define TEMP_PREF_NAME_MAX_LEN 256 + nsPrefWindow* nsPrefWindow::sPrefWindow = nsnull; static void DOMWindowToWebShellWindow(nsIDOMWindow *DOMWindow, nsCOMPtr *webWindow); @@ -83,9 +88,9 @@ nsPrefWindow::nsPrefWindow() { NS_INIT_REFCNT(); - printf("Created nsPrefWindow\n"); -#ifdef NS_DEBUG - NS_ASSERTION(!sPrefWindow, "There can be only one"); +#ifdef DEBUG_PREFWINDOW + printf("Created nsPrefWindow\n"); + NS_ASSERTION(!sPrefWindow, "There can be only one"); #endif // initialize substrings to null @@ -192,15 +197,13 @@ NS_IMETHODIMP nsPrefWindow::ShowWindow( NS_WITH_SERVICE(nsIIOService, service, kIOServiceCID, &rv); if (NS_FAILED(rv)) return rv; - nsIURI *uri = nsnull; - rv = service->NewURI(urlStr, nsnull, &uri); + nsCOMPtr uri; + rv = service->NewURI(urlStr, nsnull, getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; rv = uri->QueryInterface(nsIURI::GetIID(), (void**)&urlObj); - NS_RELEASE(uri); #endif // NECKO - if (NS_FAILED(rv)) - return rv; + if (NS_FAILED(rv)) return rv; NS_WITH_SERVICE(nsIAppShellService, appShell, kAppShellServiceCID, &rv); if (NS_FAILED(rv)) @@ -238,7 +241,7 @@ static PRBool CheckAndStrip( } //---------------------------------------------------------------------------------------- -static PRInt16 CheckOrdinalAndStrip(nsString& ioString, PRInt16& outOrdinal) +static PRBool CheckOrdinalAndStrip(nsString& ioString, PRInt16& outOrdinal) //---------------------------------------------------------------------------------------- { PRInt32 colonPos = ioString.FindChar(':'); @@ -252,10 +255,8 @@ static PRInt16 CheckOrdinalAndStrip(nsString& ioString, PRInt16& outOrdinal) return PR_TRUE; } ioString.Cut(0, colonPos + 1); - short result = 0; - sscanf(intString, "%hd", &result); + PR_sscanf(intString, "%hd", &outOrdinal); delete [] intString; - outOrdinal = result; return PR_TRUE; } @@ -297,7 +298,7 @@ static PRBool ParseElementIDString( } // ParseElementIDString //---------------------------------------------------------------------------------------- -nsresult nsPrefWindow::InitializeOneWidget( +nsresult nsPrefWindow::InitializeOneInputWidget( nsIDOMHTMLInputElement* inElement, const nsString& inWidgetType, const char* inPrefName, @@ -305,12 +306,11 @@ nsresult nsPrefWindow::InitializeOneWidget( PRInt16 inPrefOrdinal) //---------------------------------------------------------------------------------------- { - // See comments in FinalizeOneWidget for an explanation of the subtree technique. When + // See comments in FinalizeOneInputWidget for an explanation of the subtree technique. When // initializing a widget, we have to check the subtree first, to see if the user has // visited that panel previously and changed the value. - char tempPrefName[256]; - PL_strcpy(tempPrefName, "temp_tree."); - PL_strcat(tempPrefName, inPrefName); + char tempPrefName[TEMP_PREF_NAME_MAX_LEN]; + PR_snprintf(tempPrefName, TEMP_PREF_NAME_MAX_LEN, "temp_tree.%s", inPrefName); switch (inPrefType) { case eBool: @@ -362,8 +362,8 @@ nsresult nsPrefWindow::InitializeOneWidget( } else if (inWidgetType == "text") { - char charVal[32]; - sprintf(charVal, "%d", (int)intVal); + char charVal[CHAR_VAL_BUF_LEN]; + PR_snprintf(charVal, CHAR_VAL_BUF_LEN, "%d", (int)intVal); nsString newValue(charVal); inElement->SetValue(newValue); } @@ -390,25 +390,82 @@ nsresult nsPrefWindow::InitializeOneWidget( // Check the subtree first, then the real tree. // If the preference value is not set at all, let the HTML // determine the setting. - nsIFileSpec *specVal; - nsresult rv = mPrefs->GetFilePref(tempPrefName, &specVal); + nsCOMPtr specVal; + nsresult rv = mPrefs->GetFilePref(tempPrefName, getter_AddRefs(specVal)); if (NS_FAILED(rv)) - rv = mPrefs->GetFilePref(inPrefName, &specVal); + rv = mPrefs->GetFilePref(inPrefName, getter_AddRefs(specVal)); if (NS_FAILED(rv)) return rv; char* newValue; specVal->GetNativePath(&newValue); inElement->SetValue(newValue); - NS_RELEASE(specVal); break; } - case eNoType: - { - NS_ASSERTION(0, "eNoType not handled"); - } + case eNoType: + { + NS_ASSERTION(0, "eNoType not handled"); + break; + } } return NS_OK; -} // nsPrefWindow::InitializeOneWidget +} // nsPrefWindow::InitializeOneInputWidget + +//---------------------------------------------------------------------------------------- +nsresult nsPrefWindow::InitializeOneSelectWidget( + nsIDOMHTMLSelectElement* inElement, + const char* inPrefName, + TypeOfPref inPrefType, + PRInt16 inPrefOrdinal) +//---------------------------------------------------------------------------------------- +{ + // See comments in FinalizeOneSelectWidget for an explanation of the subtree technique. When + // initializing a widget, we have to check the subtree first, to see if the user has + // visited that panel previously and changed the value. + char tempPrefName[TEMP_PREF_NAME_MAX_LEN]; + PR_snprintf(tempPrefName, TEMP_PREF_NAME_MAX_LEN, "temp_tree.%s", inPrefName); + switch (inPrefType) + { + case eBool: + { + NS_ASSERTION(0,"not implemented yet!\n"); + break; + } + case eInt: + { + PRInt32 intVal; + // Check the subtree first, then the real tree. + // If the preference value is not set at all, let the HTML + // determine the setting. + if (NS_SUCCEEDED(mPrefs->GetIntPref(tempPrefName, &intVal)) + || NS_SUCCEEDED(mPrefs->GetIntPref(inPrefName, &intVal))) + { +#ifdef DEBUG_PREFWINDOW + printf("set select to %d\n",intVal); +#endif + nsAutoString strValue(""); + strValue.Append(intVal); + inElement->SetValue(strValue); + } + break; + } + case eString: + { + NS_ASSERTION(0,"not implemented yet!\n"); + break; + } + case ePath: + { + NS_ASSERTION(0,"not implemented yet!\n"); + break; + } + case eNoType: + { + NS_ASSERTION(0, "eNoType not handled"); + break; + } + } + return NS_OK; +} // nsPrefWindow::InitializeOneSelectWidget //---------------------------------------------------------------------------------------- nsresult nsPrefWindow::InitializeWidgetsRecursive(nsIDOMNode* inParentNode) @@ -437,22 +494,37 @@ nsresult nsPrefWindow::InitializeWidgetsRecursive(nsIDOMNode* inParentNode) nsresult rv = inParentNode->GetNodeType(&aNodeType); if (NS_SUCCEEDED(rv) && aNodeType == nsIDOMNode::ELEMENT_NODE) { - nsCOMPtr element = do_QueryInterface(inParentNode); - if (element) + nsCOMPtr inputElement = do_QueryInterface(inParentNode); + if (inputElement) { nsString prefName; TypeOfPref prefType; PRInt16 ordinal; - element->GetId( prefName); + inputElement->GetId( prefName); if (ParseElementIDString(prefName, prefType, ordinal)) { nsString widgetType; - element->GetType(widgetType); + inputElement->GetType(widgetType); char* prefNameString = GetSubstitution(prefName); - InitializeOneWidget(element, widgetType, prefNameString, + InitializeOneInputWidget(inputElement, widgetType, prefNameString, prefType, ordinal); PR_Free(prefNameString); } + return NS_OK; + } + nsCOMPtr selectElement = do_QueryInterface(inParentNode); + if (selectElement) { + nsString prefName; + TypeOfPref prefType; + PRInt16 ordinal; + selectElement->GetId( prefName); + if (ParseElementIDString(prefName, prefType, ordinal)) + { + char* prefNameString = GetSubstitution(prefName); + InitializeOneSelectWidget(selectElement, prefNameString, prefType, ordinal); + PR_Free(prefNameString); + } + return NS_OK; } } return NS_OK; @@ -488,7 +560,7 @@ nsresult nsPrefWindow::InitializePrefWidgets() } // nsPrefWindow::InitializePrefWidgets //---------------------------------------------------------------------------------------- -nsresult nsPrefWindow::FinalizeOneWidget( +nsresult nsPrefWindow::FinalizeOneInputWidget( nsIDOMHTMLInputElement* inElement, const nsString& inWidgetType, const char* inPrefName, @@ -502,9 +574,8 @@ nsresult nsPrefWindow::FinalizeOneWidget( // visits. If the user clicks "OK" at the end, then prefs in this subtree will be // copied back over to the real tree. This subtree will be deleted at the end // in either case (OK or Cancel). - char tempPrefName[256]; - PL_strcpy(tempPrefName, "temp_tree."); - PL_strcat(tempPrefName, inPrefName); + char tempPrefName[TEMP_PREF_NAME_MAX_LEN]; + PR_snprintf(tempPrefName, TEMP_PREF_NAME_MAX_LEN, "temp_tree.%s", inPrefName); switch (inPrefType) { case eBool: @@ -512,11 +583,11 @@ nsresult nsPrefWindow::FinalizeOneWidget( PRBool boolVal; nsresult rv = inElement->GetChecked(&boolVal); if (NS_FAILED(rv)) - return rv; + return rv; if (inWidgetType == "checkbox") { - boolVal = (PRBool)(boolVal ^ inPrefOrdinal); - mPrefs->SetBoolPref(tempPrefName, boolVal); + boolVal = (PRBool)(boolVal ^ inPrefOrdinal); + mPrefs->SetBoolPref(tempPrefName, boolVal); } else if (inWidgetType == "radio" && boolVal) { @@ -565,26 +636,80 @@ nsresult nsPrefWindow::FinalizeOneWidget( nsresult rv = inElement->GetValue(fieldValue); if (NS_FAILED(rv)) return rv; - nsIFileSpecWithUI* specValue = NS_CreateFileSpecWithUI(); + nsCOMPtr specValue; + specValue = NS_CreateFileSpecWithUI(); if (!specValue) return NS_ERROR_FAILURE; nsCAutoString str(fieldValue); specValue->SetNativePath((char*)(const char*)str); mPrefs->SetFilePref(tempPrefName, specValue, PR_TRUE); - NS_RELEASE(specValue); break; } - case eNoType: - { - NS_ASSERTION(0, "eNoType not handled"); - } + case eNoType: + { + NS_ASSERTION(0, "eNoType not handled"); + break; + } } -// if (inWidgetType == "checkbox" || inWidgetType = "radio") -// { -// inElement->SetAttribute(attributeToSet, newValue); -// } return NS_OK; -} // nsPrefWindow::FinalizeOneWidget +} // nsPrefWindow::FinalizeOneInputWidget + +//---------------------------------------------------------------------------------------- +nsresult nsPrefWindow::FinalizeOneSelectWidget( + nsIDOMHTMLSelectElement* inElement, + const char* inPrefName, + TypeOfPref inPrefType, + PRInt16 inPrefOrdinal) +//---------------------------------------------------------------------------------------- +{ + // As each panel is replaced, the values of its widgets are written out to a subtree + // of the prefs tree with root at "temp_tree". This subtree is rather sparse, since it + // only contains prefs (if any) that are represented by widgets in panels that the user + // visits. If the user clicks "OK" at the end, then prefs in this subtree will be + // copied back over to the real tree. This subtree will be deleted at the end + // in either case (OK or Cancel). + char tempPrefName[TEMP_PREF_NAME_MAX_LEN]; + PR_snprintf(tempPrefName, TEMP_PREF_NAME_MAX_LEN, "temp_tree.%s", inPrefName); + switch (inPrefType) + { + case eBool: + { + NS_ASSERTION(0,"not implemented yet!\n"); + break; + } + case eInt: + { + nsString fieldValue; + nsresult rv = inElement->GetValue(fieldValue); + if (NS_FAILED(rv)) + return rv; + char* s = fieldValue.ToNewCString(); +#ifdef DEBUG_PREFWINDOW + printf("set %s to %d\n",tempPrefName,atoi(s)); +#endif + mPrefs->SetIntPref(tempPrefName, atoi(s)); + delete [] s; + + break; + } + case eString: + { + NS_ASSERTION(0,"not implemented yet!\n"); + break; + } + case ePath: + { + NS_ASSERTION(0,"not implemented yet!\n"); + break; + } + case eNoType: + { + NS_ASSERTION(0, "eNoType not handled"); + break; + } + } + return NS_OK; +} // nsPrefWindow::FinalizeOneSelectWidget //---------------------------------------------------------------------------------------- nsresult nsPrefWindow::FinalizeWidgetsRecursive(nsIDOMNode* inParentNode) @@ -613,21 +738,37 @@ nsresult nsPrefWindow::FinalizeWidgetsRecursive(nsIDOMNode* inParentNode) nsresult rv = inParentNode->GetNodeType(&aNodeType); if (NS_SUCCEEDED(rv) && aNodeType == nsIDOMNode::ELEMENT_NODE) { - nsCOMPtr element = do_QueryInterface(inParentNode); - if (element) + nsCOMPtr inputElement = do_QueryInterface(inParentNode); + if (inputElement) { nsString prefName; TypeOfPref prefType; PRInt16 ordinal; - element->GetId( prefName); + inputElement->GetId( prefName); if (ParseElementIDString(prefName, prefType, ordinal)) { nsString widgetType; - element->GetType(widgetType); + inputElement->GetType(widgetType); char* prefNameString = GetSubstitution(prefName); - FinalizeOneWidget(element, widgetType, prefNameString, prefType, ordinal); + FinalizeOneInputWidget(inputElement, widgetType, prefNameString, prefType, ordinal); PR_Free(prefNameString); } + return NS_OK; + } + nsCOMPtr selectElement = do_QueryInterface(inParentNode); + if (selectElement) + { + nsString prefName; + TypeOfPref prefType; + PRInt16 ordinal; + selectElement->GetId( prefName); + if (ParseElementIDString(prefName, prefType, ordinal)) + { + char* prefNameString = GetSubstitution(prefName); + FinalizeOneSelectWidget(selectElement, prefNameString, prefType, ordinal); + PR_Free(prefNameString); + } + return NS_OK; } } return NS_OK; diff --git a/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.h b/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.h index 1fa246e46df..91090e8a387 100644 --- a/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.h +++ b/mozilla/xpfe/components/prefwindow/src/nsPrefWindow.h @@ -7,6 +7,7 @@ class nsIDOMNode; class nsIDOMHTMLInputElement; +class nsIDOMHTMLSelectElement; class nsIPref; class nsIWebShellWindow; @@ -45,20 +46,30 @@ class nsPrefWindow nsresult InitializePrefWidgets(); nsresult InitializeWidgetsRecursive(nsIDOMNode* inParentNode); - nsresult InitializeOneWidget( + nsresult InitializeOneInputWidget( nsIDOMHTMLInputElement* inElement, const nsString& inWidgetType, const char* inPrefName, TypeOfPref inPrefType, PRInt16 inPrefOrdinal); + nsresult InitializeOneSelectWidget( + nsIDOMHTMLSelectElement* inElement, + const char* inPrefName, + TypeOfPref inPrefType, + PRInt16 inPrefOrdinal); nsresult FinalizePrefWidgets(); nsresult FinalizeWidgetsRecursive(nsIDOMNode* inParentNode); - nsresult FinalizeOneWidget( + nsresult FinalizeOneInputWidget( nsIDOMHTMLInputElement* inElement, const nsString& inWidgetType, const char* inPrefName, TypeOfPref inPrefType, PRInt16 inPrefOrdinal); + nsresult FinalizeOneSelectWidget( + nsIDOMHTMLSelectElement* inElement, + const char* inPrefName, + TypeOfPref inPrefType, + PRInt16 inPrefOrdinal); char* GetSubstitution(nsString& formatstr); protected: