rkrishna_1975
11-30-2007, 10:57 AM
I just developed a new ThemeChanger Extension. it extends Ext.form.ComboBox. I was useful to me. I am sharing this if it is of any use to others.
Here is a sample code to use this There are other hidden features that can be explored:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="scripts/ext/ext-base.js"></script>
<script type="text/javascript" src="scripts/ext/ext-all.js"></script>
<script type="text/javascript" src="scripts/extux/Portal.js"></script>
<script type="text/javascript" src="scripts/extux/ThemeChanger.js"></script>
<script type="text/javascript">
var myThemeChanger = new Ext.ux.ThemeChanger({
renderTo:'theme-selector', // or use as a component in your layout
preThemes: 'css/ext/ext-all.css',
postThemes: ['css/app/corp.css','css/extux/Portal.css'],
extThemes: [
['Aero', 'css/ext/xtheme-none.css'], // some non existent or blank file.
['Black', 'css/ext/xtheme-black.css'],
['Gray', 'css/ext/xtheme-gray.css'],
['Slate', 'css/ext/xtheme-slate.css']
],
defaultTheme: 3,
cssId: 'myThemeId'
});
// All other page layout setup scripts here.
</script>
</head>
<body>
<div id="theme-selector" style="width:100%;height:100%;"></div>
</body>
</html>Here is the code for the ThemeChanger component itself.
/**
* @author ramki_r
*/
Ext.ux.ThemeChanger = Ext.extend(Ext.form.ComboBox, {
extThemes: [
['Aero', 'xtheme-none.css'],
],
defaultTheme: 0,
typeAhead: true,
triggerAction: 'all',
mode: 'local',
editable: false,
cssId: Ext.id(),
loadCssFile: function(filename, theCssId){
if (theCssId)
var elem = document.getElementById(theCssId);
if (elem && elem!=null){
elem.setAttribute("href", filename);
} else {
elem=document.createElement("link");
elem.setAttribute("rel", "stylesheet");
elem.setAttribute("type", "text/css");
elem.setAttribute("href", filename);
if (theCssId)
elem.setAttribute("id", theCssId);
document.getElementsByTagName("head")[0].appendChild(elem);
}
},
changeTheme: function ( obj, rec, themeChoice){
this.defaultTheme = themeChoice;
this.loadCssFile(rec.get(this.valueField),this.cssId);
},
loadPreThemes: function() {
if (this.preThemes) {
if (this.preThemes instanceof Array) {
for(var i = 0, len = this.preThemes.length; i < len; i++){
this.loadCssFile(this.preThemes[i]);
}
} else {
this.loadCssFile(this.preThemes);
}
}
},
loadPostThemes: function() {
if (this.postThemes) {
if (this.postThemes instanceof Array) {
for(var i = 0, len = this.postThemes.length; i < len; i++){
this.loadCssFile(this.postThemes[i]);
}
} else {
this.loadCssFile(this.postThemes);
}
}
},
initComponent: function() {
Ext.ux.ThemeChanger.superclass.initComponent.call(this);
if (!this.store) {
this.store = new Ext.data.SimpleStore({
fields: ['displayname', 'cssFile'],
data: this.extThemes
});
}
if (!this.displayField)
this.displayField = 'displayname';
if (!this.valueField)
this.valueField = 'cssFile';
if (!this.value)
this.value = this.store.getAt(this.defaultTheme).get(this.valueField);
this.on('select',this.changeTheme);
this.loadPreThemes();
this.changeTheme(this, this.store.getAt(this.defaultTheme),this.defaultTheme);
this.loadPostThemes();
}
});Try it out and enjoy.
I have uploaded some screenshots for context.
Here is a sample code to use this There are other hidden features that can be explored:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="scripts/ext/ext-base.js"></script>
<script type="text/javascript" src="scripts/ext/ext-all.js"></script>
<script type="text/javascript" src="scripts/extux/Portal.js"></script>
<script type="text/javascript" src="scripts/extux/ThemeChanger.js"></script>
<script type="text/javascript">
var myThemeChanger = new Ext.ux.ThemeChanger({
renderTo:'theme-selector', // or use as a component in your layout
preThemes: 'css/ext/ext-all.css',
postThemes: ['css/app/corp.css','css/extux/Portal.css'],
extThemes: [
['Aero', 'css/ext/xtheme-none.css'], // some non existent or blank file.
['Black', 'css/ext/xtheme-black.css'],
['Gray', 'css/ext/xtheme-gray.css'],
['Slate', 'css/ext/xtheme-slate.css']
],
defaultTheme: 3,
cssId: 'myThemeId'
});
// All other page layout setup scripts here.
</script>
</head>
<body>
<div id="theme-selector" style="width:100%;height:100%;"></div>
</body>
</html>Here is the code for the ThemeChanger component itself.
/**
* @author ramki_r
*/
Ext.ux.ThemeChanger = Ext.extend(Ext.form.ComboBox, {
extThemes: [
['Aero', 'xtheme-none.css'],
],
defaultTheme: 0,
typeAhead: true,
triggerAction: 'all',
mode: 'local',
editable: false,
cssId: Ext.id(),
loadCssFile: function(filename, theCssId){
if (theCssId)
var elem = document.getElementById(theCssId);
if (elem && elem!=null){
elem.setAttribute("href", filename);
} else {
elem=document.createElement("link");
elem.setAttribute("rel", "stylesheet");
elem.setAttribute("type", "text/css");
elem.setAttribute("href", filename);
if (theCssId)
elem.setAttribute("id", theCssId);
document.getElementsByTagName("head")[0].appendChild(elem);
}
},
changeTheme: function ( obj, rec, themeChoice){
this.defaultTheme = themeChoice;
this.loadCssFile(rec.get(this.valueField),this.cssId);
},
loadPreThemes: function() {
if (this.preThemes) {
if (this.preThemes instanceof Array) {
for(var i = 0, len = this.preThemes.length; i < len; i++){
this.loadCssFile(this.preThemes[i]);
}
} else {
this.loadCssFile(this.preThemes);
}
}
},
loadPostThemes: function() {
if (this.postThemes) {
if (this.postThemes instanceof Array) {
for(var i = 0, len = this.postThemes.length; i < len; i++){
this.loadCssFile(this.postThemes[i]);
}
} else {
this.loadCssFile(this.postThemes);
}
}
},
initComponent: function() {
Ext.ux.ThemeChanger.superclass.initComponent.call(this);
if (!this.store) {
this.store = new Ext.data.SimpleStore({
fields: ['displayname', 'cssFile'],
data: this.extThemes
});
}
if (!this.displayField)
this.displayField = 'displayname';
if (!this.valueField)
this.valueField = 'cssFile';
if (!this.value)
this.value = this.store.getAt(this.defaultTheme).get(this.valueField);
this.on('select',this.changeTheme);
this.loadPreThemes();
this.changeTheme(this, this.store.getAt(this.defaultTheme),this.defaultTheme);
this.loadPostThemes();
}
});Try it out and enjoy.
I have uploaded some screenshots for context.