Let the user look-and-feel paramaters with prefs, bugs 24514 and 33417

This commit is contained in:
akkana%netscape.com 2000-03-30 22:32:18 +00:00
Родитель f8828e55bf
Коммит f2806908fc
2 изменённых файлов: 366 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,276 @@
/* -*- sode: 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.1 (the "License"); you say not use this file
* except in compliance with the License. You say obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is sozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsXPLookAndFeel.h"
#include "nsIServiceManager.h"
static NS_DEFINE_IID(kILookAndFeelIID, NS_ILOOKANDFEEL_IID);
static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID);
NS_IMPL_ISUPPORTS1(nsXPLookAndFeel, nsILookAndFeel)
nsLookAndFeelIntPref nsXPLookAndFeel::sIntPrefs[] =
{
{ "ui.windowTitleHeight", eMetric_WindowTitleHeight, PR_FALSE, PR_FALSE, 0 },
{ "ui.windowBorderWidth", eMetric_WindowBorderWidth, PR_FALSE, PR_FALSE, 0 },
{ "ui.windowBorderHeight", eMetric_WindowBorderHeight, PR_FALSE, PR_FALSE, 0 },
{ "ui.widget3DBorder", eMetric_Widget3DBorder, PR_FALSE, PR_FALSE, 0 },
{ "ui.textFieldBorder", eMetric_TextFieldBorder, PR_FALSE, PR_FALSE, 0 },
{ "ui.textFieldHeight", eMetric_TextFieldHeight, PR_FALSE, PR_FALSE, 0 },
{ "ui.buttonHorizontalInsidePaddingNavQuirks",
eMetric_ButtonHorizontalInsidePaddingNavQuirks, PR_FALSE, PR_FALSE, 0 },
{ "ui.buttonHorizontalInsidePaddingOffsetNavQuirks",
eMetric_ButtonHorizontalInsidePaddingOffsetNavQuirks, PR_FALSE, PR_FALSE, 0 },
{ "ui.checkboxSize", eMetric_CheckboxSize, PR_FALSE, PR_FALSE, 0 },
{ "ui.radioboxSize", eMetric_RadioboxSize, PR_FALSE, PR_FALSE, 0 },
{ "ui.textHorizontalInsideMinimumPadding",
eMetric_TextHorizontalInsideMinimumPadding, PR_FALSE, PR_FALSE, 0 },
{ "ui.textVerticalInsidePadding", eMetric_TextVerticalInsidePadding,
PR_FALSE, PR_FALSE, 0 },
{ "ui.textShouldUseVerticalInsidePadding",
eMetric_TextShouldUseVerticalInsidePadding, PR_FALSE, PR_FALSE, 0 },
{ "ui.textShouldUseHorizontalInsideMinimumPadding",
eMetric_TextShouldUseHorizontalInsideMinimumPadding, PR_FALSE, PR_FALSE, 0 },
{ "ui.listShouldUseHorizontalInsideMinimumPadding",
eMetric_ListShouldUseHorizontalInsideMinimumPadding, PR_FALSE, PR_FALSE, 0 },
{ "ui.listHorizontalInsideMinimumPadding",
eMetric_ListHorizontalInsideMinimumPadding, PR_FALSE, PR_FALSE, 0 },
{ "ui.listShouldUseVerticalInsidePadding",
eMetric_ListShouldUseVerticalInsidePadding, PR_FALSE, PR_FALSE, 0 },
{ "ui.listVerticalInsidePadding", eMetric_ListVerticalInsidePadding,
PR_FALSE, PR_FALSE, 0 },
{ "ui.caretBlinkTime", eMetric_CaretBlinkTime, PR_FALSE, PR_FALSE, 0 },
{ "ui.caretWidthTwips", eMetric_CaretWidthTwips, PR_FALSE, PR_FALSE, 0 },
{ "ui.submenuDelay", eMetric_SubmenuDelay, PR_FALSE, PR_FALSE, 0 },
{ "ui.menusCanOverlapOSBar", eMetric_MenusCanOverlapOSBar,
PR_FALSE, PR_FALSE, 0 },
};
nsLookAndFeelFloatPref nsXPLookAndFeel::sFloatPrefs[] =
{
{ "ui.textFieldVerticalInsidePadding",
eMetricFloat_TextFieldVerticalInsidePadding, PR_FALSE, PR_TRUE, 0 },
{ "ui.textFieldHorizontalInsidePadding",
eMetricFloat_TextFieldHorizontalInsidePadding, PR_FALSE, PR_TRUE, 0 },
{ "ui.textAreaVerticalInsidePadding", eMetricFloat_TextAreaVerticalInsidePadding,
PR_FALSE, PR_TRUE, 0 },
{ "ui.textAreaHorizontalInsidePadding",
eMetricFloat_TextAreaHorizontalInsidePadding, PR_FALSE, PR_TRUE, 0 },
{ "ui.listVerticalInsidePadding",
eMetricFloat_ListVerticalInsidePadding, PR_FALSE, PR_TRUE, 0 },
{ "ui.listHorizontalInsidePadding",
eMetricFloat_ListHorizontalInsidePadding, PR_FALSE, PR_TRUE, 0 },
{ "ui.buttonVerticalInsidePadding", eMetricFloat_ButtonVerticalInsidePadding,
PR_FALSE, PR_TRUE, 0 },
{ "ui.buttonHorizontalInsidePadding", eMetricFloat_ButtonHorizontalInsidePadding,
PR_FALSE, PR_TRUE, 0 },
};
PRBool nsXPLookAndFeel::sInitialized = PR_FALSE;
nsXPLookAndFeel::nsXPLookAndFeel() : nsILookAndFeel()
{
NS_INIT_REFCNT();
}
static int intPrefChanged (const char *newpref, void *data)
{
nsLookAndFeelIntPref* np = (nsLookAndFeelIntPref*)data;
if (np)
{
nsresult rv;
NS_WITH_SERVICE(nsIPref, prefService, kPrefServiceCID, &rv);
if (NS_SUCCEEDED(rv) && prefService)
{
PRInt32 intpref;
rv = prefService->GetIntPref(np->name, &intpref);
if (NS_SUCCEEDED(rv))
{
np->intVar = intpref;
np->isSet = PR_TRUE;
#ifdef DEBUG_akkana
printf("====== Changed int pref %s to %d\n", np->name, np->intVar);
#endif
}
}
}
return 0;
}
static int floatPrefChanged (const char *newpref, void *data)
{
nsLookAndFeelFloatPref* np = (nsLookAndFeelFloatPref*)data;
if (np)
{
nsresult rv;
NS_WITH_SERVICE(nsIPref, prefService, kPrefServiceCID, &rv);
if (NS_SUCCEEDED(rv) && prefService)
{
PRInt32 intpref;
rv = prefService->GetIntPref(np->name, &intpref);
if (NS_SUCCEEDED(rv))
{
np->floatVar = (float)intpref / 100.;
np->isSet = PR_TRUE;
#ifdef DEBUG_akkana
printf("====== Changed float pref %s to %f\n", np->name, np->floatVar);
#endif
}
}
}
return 0;
}
nsresult
nsXPLookAndFeel::InitFromPref(nsLookAndFeelIntPref* aPref)
{
PRInt32 intpref;
nsresult rv = mPrefService->GetIntPref(aPref->name, &intpref);
if (NS_SUCCEEDED(rv))
{
aPref->isSet = PR_TRUE;
aPref->intVar = intpref;
}
mPrefService->RegisterCallback(aPref->name, intPrefChanged, aPref);
return rv;
}
nsresult
nsXPLookAndFeel::InitFromPref(nsLookAndFeelFloatPref* aPref)
{
PRInt32 intpref;
nsresult rv = mPrefService->GetIntPref(aPref->name, &intpref);
if (NS_SUCCEEDED(rv))
{
aPref->isSet = PR_TRUE;
aPref->floatVar = (float)intpref / 100.;
}
mPrefService->RegisterCallback(aPref->name, floatPrefChanged, &aPref);
return rv;
}
//
// Read values from the user's preferences.
// This is done once at startup, but since the user's preferences
// haven't actually been read yet at that time, we also have to
// set a callback to inform us of changes to each pref.
//
void
nsXPLookAndFeel::Init()
{
// Say we're already initialized, and take the chance that it might fail;
// protects against some other process writing to our static variables.
sInitialized = PR_TRUE;
nsresult rv;
mPrefService = do_GetService(kPrefServiceCID, &rv);
if (NS_FAILED(rv) || !mPrefService)
return;
unsigned int i;
for (i = 0; i < ((sizeof (sIntPrefs) / sizeof (*sIntPrefs))); ++i)
InitFromPref(&sIntPrefs[i]);
for (i = 0; i < ((sizeof (sFloatPrefs) / sizeof (*sFloatPrefs))); ++i)
InitFromPref(&sFloatPrefs[i]);
// We won't need the prefs service any more:
mPrefService = 0;
}
nsXPLookAndFeel::~nsXPLookAndFeel()
{
}
//
// All these routines will return NS_OK if they have a value,
// in which case the nsLookAndFeel should use that value;
// otherwise we'll return NS_ERROR_NOT_AVAILABLE, in which case, the
// platform-specific nsLookAndFeel should use its own values instead.
//
NS_IMETHODIMP nsXPLookAndFeel::GetColor(const nsColorID aID, nscolor &aColor)
{
// We don't return any colors, currently;
// sostly because we need a string-pref-to-NS_RGB translation routine,
// but we also assume the user will pick a skin with colors they like.
return NS_ERROR_NOT_AVAILABLE;
}
NS_IMETHODIMP nsXPLookAndFeel::GetMetric(const nsMetricID aID, PRInt32& aMetric)
{
if (!sInitialized)
Init();
for (unsigned int i = 0; i < ((sizeof (sIntPrefs) / sizeof (*sIntPrefs))); ++i)
if (sIntPrefs[i].isSet && (sIntPrefs[i].id == aID))
{
aMetric = sIntPrefs[i].intVar;
return NS_OK;
}
return NS_ERROR_NOT_AVAILABLE;
}
NS_IMETHODIMP
nsXPLookAndFeel::GetMetric(const nsMetricFloatID aID, float& aMetric)
{
if (!sInitialized)
Init();
for (unsigned int i = 0; i < ((sizeof (sFloatPrefs) / sizeof (*sFloatPrefs))); ++i)
if (sFloatPrefs[i].isSet && sFloatPrefs[i].id == aID)
{
aMetric = sFloatPrefs[i].floatVar;
return NS_OK;
}
return NS_ERROR_NOT_AVAILABLE;
}
#ifdef NS_DEBUG
// This method returns the actual (or nearest estimate)
// of the Navigator size for a given form control for a given font
// and font size. This is used in NavQuirks mode to see how closely
// we match its size
NS_IMETHODIMP
nsXPLookAndFeel::GetNavSize(const nsMetricNavWidgetID aWidgetID,
const nsMetricNavFontID aFontID,
const PRInt32 aFontSize,
nsSize &aSize)
{
return NS_ERROR_NOT_AVAILABLE;
}
#endif
nsresult
NS_NewXPLookAndFeel(nsILookAndFeel** aXPLookAndFeel)
{
if (!aXPLookAndFeel)
return NS_ERROR_INVALID_ARG;
*aXPLookAndFeel = new nsXPLookAndFeel;
if (!*aXPLookAndFeel)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aXPLookAndFeel);
return NS_OK;
}

Просмотреть файл

@ -0,0 +1,90 @@
/* -*- 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.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef __nsXPLookAndFeel
#define __nsXPLookAndFeel
#include "nsILookAndFeel.h"
#include "nsCOMPtr.h"
#include "nsIPref.h"
struct nsLookAndFeelIntPref
{
char* name;
nsILookAndFeel::nsMetricID id;
PRPackedBool isSet;
PRPackedBool isFloat; // default (PR_FALSE) is PRInt32
PRInt32 intVar;
};
struct nsLookAndFeelFloatPref
{
char* name;
nsILookAndFeel::nsMetricFloatID id;
PRPackedBool isSet;
PRPackedBool isFloat; // default (PR_FALSE) is PRInt32
float floatVar;
};
class nsXPLookAndFeel: public nsILookAndFeel
{
public:
nsXPLookAndFeel();
virtual ~nsXPLookAndFeel();
NS_DECL_ISUPPORTS
void Init();
//
// All these routines will return NS_OK if they have a value,
// in which case the nsLookAndFeel should use that value;
// otherwise we'll return NS_ERROR_NOT_AVAILABLE, in which case, the
// platform-specific nsLookAndFeel should use its own values instead.
//
NS_IMETHOD GetColor(const nsColorID aID, nscolor &aColor);
NS_IMETHOD GetMetric(const nsMetricID aID, PRInt32 & aMetric);
NS_IMETHOD GetMetric(const nsMetricFloatID aID, float & aMetric);
#ifdef NS_DEBUG
NS_IMETHOD GetNavSize(const nsMetricNavWidgetID aWidgetID,
const nsMetricNavFontID aFontID,
const PRInt32 aFontSize,
nsSize &aSize);
#endif
protected:
nsresult InitFromPref(nsLookAndFeelIntPref* aPref);
nsresult InitFromPref(nsLookAndFeelFloatPref* aPref);
nsCOMPtr<nsIPref> mPrefService;
static PRBool sInitialized;
static nsLookAndFeelIntPref sIntPrefs[22];
static nsLookAndFeelFloatPref sFloatPrefs[8];
};
extern nsresult NS_NewXPLookAndFeel(nsILookAndFeel**);
#endif