Add support for tempalte-provided themes.
[squirrelmail.git] / include / options / display.php
index d4dc021a340ca193e6d01fe22301464500202906..a519de42f35a1a06b6b17e021a0a8ef05efe4944 100644 (file)
@@ -16,22 +16,6 @@ define('SMOPT_GRP_GENERAL', 0);
 define('SMOPT_GRP_MAILBOX', 1);
 define('SMOPT_GRP_MESSAGE', 2);
 
-// load icon themes if in use
-global $use_icons;
-if ($use_icons) {
-    global $icon_themes;
-    $dirName = SM_PATH . 'images/themes';
-    if (is_readable($dirName) && is_dir($dirName)) {
-        $d = dir($dirName);
-        while($dir = $d->read()) {
-            if ($dir != "." && $dir != "..") {
-                if (is_dir($dirName."/".$dir) && file_exists("$dirName/$dir/theme.php"))
-                    include("$dirName/$dir/theme.php");
-            }
-        }
-    }
-}
-
 global $use_iframe;
 if (! isset($use_iframe)) $use_iframe=false;
 
@@ -51,7 +35,9 @@ if (! isset($use_iframe)) $use_iframe=false;
 function load_optpage_data_display() {
     global $theme, $fontsets, $language, $languages,$aTemplateSet,
     $default_use_mdn, $squirrelmail_language, $allow_thread_sort,
-    $show_alternative_names, $use_icons, $use_iframe, $sTemplateID;
+    $show_alternative_names, $use_iframe, $use_icons, 
+    $sTemplateID, $oTemplate,
+    $user_themes, $chosen_theme;
 
     /* Build a simple array into which we will build options. */
     $optgrps = array();
@@ -86,34 +72,47 @@ function load_optpage_data_display() {
     }
 
     /* Load the theme option. */
+
+    /**
+     * User themes start with a 'u_', template themes start with a 't_' to
+     * differentiate which is which.  This seems kind of hackish, but we can
+     * come up with a better solution later.
+PL: No need for the prefixes.  Just use full paths, no?
+
+SB: Don't think so.  If the user chooses a template theme than changes the 
+    path to the template, it would error out, right?  Or should we worry about
+    that?
+     * 
+     * TODO: Clean me.
+     **/
     $theme_values = array();
+    
+    // Always provide the template default first.
+    $theme_values['none'] = 'Template Default Theme';
+
     // List alternate themes provided by templates first
-#    var_dump(Template::get_template_file_directory());
-    #list_files
-    foreach ($theme as $theme_key => $theme_attributes) {
-        $theme_values[$theme_attributes['NAME']] = $theme_attributes['PATH'];
+    $template_themes = $oTemplate->get_alternative_stylesheets();
+    asort($template_themes);
+    foreach ($template_themes as $sheet=>$name) {
+        $theme_values['t_'.$sheet] = 'Template Theme - '.htmlspecialchars($name);
+    }
+    // Next, list user-provided styles
+    asort($user_themes);
+    foreach ($user_themes as $style) {
+        if ($style['PATH'] == 'none')
+            continue;
+        $theme_values['u_'.$style['PATH']] = 'User Theme - '.htmlspecialchars($style['NAME']);
     }
-    ksort($theme_values);
-    $theme_values = array_flip($theme_values);
-    $optvals[SMOPT_GRP_GENERAL][] = array(
-        'name'    => 'chosen_theme',
-        'caption' => _("Theme"),
-        'type'    => SMOPT_TYPE_STRLIST,
-        'refresh' => SMOPT_REFRESH_ALL,
-        'posvals' => $theme_values,
-        'save'    => 'save_option_theme'
-    );
 
-    $css_values = array( 'none' => _("Default" ) );
-    $css_dir = SM_PATH . 'themes/css';
-    if (is_readable($css_dir) && is_dir($css_dir)) {
-        $handle=opendir($css_dir);
-        while ($file = readdir($handle) ) {
-            if ( substr( $file, -4 ) == '.css' ) {
-                $css_values[$file] = substr( $file, 0, strlen( $file ) - 4 );
-            }
-        }
-        closedir($handle);
+    if (count($user_themes) + count($template_themes) > 1) {
+        $optvals[SMOPT_GRP_GENERAL][] = array(
+            'name'    => 'chosen_theme',
+            'caption' => _("Theme"),
+            'type'    => SMOPT_TYPE_STRLIST,
+            'refresh' => SMOPT_REFRESH_ALL,
+            'posvals' => $theme_values,
+            'save'    => 'css_theme_save'
+        );
     }
 
     /* Icon theme selection */
@@ -423,7 +422,7 @@ FIXME!
 function save_option_template($option) {
     global $aTemplateSet;
 
-    /* Do checking to make sure $new_theme is in the array. */
+    /* Do checking to make sure new template is in the available templates array. */
     $templateset_in_array = false;
     for ($i = 0; $i < count($aTemplateSet); ++$i) {
         if ($aTemplateSet[$i]['ID'] == $option->new_value) {
@@ -434,29 +433,18 @@ function save_option_template($option) {
 
     if (!$templateset_in_array) {
         $option->new_value = '';
-    }
-    /* Save the option like normal. */
-    save_option($option);
-}
+    } else {
+
+        // clear template cache when changing template sets
+        // (in order to do so, we have to change the global
+        // template set ID now... should not be a problem --
+        // in fact, if we don't do it now, very anomalous
+        // problems occur)
+        //
+        global $sTemplateID;
+        $sTemplateID = $option->new_value;
+        Template::cache_template_file_hierarchy(TRUE);
 
-/**
- * This function saves a new theme setting.
- * It updates the theme array.
- */
-function save_option_theme($option) {
-    global $theme;
-
-    /* Do checking to make sure $new_theme is in the array. */
-    $theme_in_array = false;
-    for ($i = 0; $i < count($theme); ++$i) {
-        if ($theme[$i]['PATH'] == $option->new_value) {
-            $theme_in_array = true;
-            break;
-        }
-    }
-
-    if (!$theme_in_array) {
-        $option->new_value = '';
     }
 
     /* Save the option like normal. */
@@ -475,20 +463,45 @@ function save_option_javascript_autodetect($option) {
  * This function saves the user's icon theme setting
  */
 function icon_theme_save($option) {
-    global $icon_themes, $data_dir, $username;
+    global $icon_themes;
 
 
     // Don't assume the new value is there, double check
     // and only save if found
-    //
     $found = false;
     while (!$found && (list($index, $data) = each($icon_themes))) {
         if ($data['PATH'] == $option->new_value)
             $found = true;
     }
-    if ($found)
-        setPref($data_dir, $username, 'icon_theme', $option->new_value);
-    else
-       setPref($data_dir, $username, 'icon_theme', 'none');
+    
+    if (!$found)
+        $option->new_value = 'none';
+        
+    save_option($option);
+}
 
+function css_theme_save ($option) {
+    global $user_themes, $oTemplate;
+
+    // Don't assume the new value is there, double check
+    // and only save if found
+    $found = false;
+    reset($user_themes);
+    while (!$found && (list($index, $data) = each($user_themes))) {
+        if ('u_'.$data['PATH'] == $option->new_value)
+            $found = true;
+    }
+    
+    $template_themes = $oTemplate->get_alternative_stylesheets();
+    foreach ($template_themes as $path=>$name) {
+        if ('t_'.$path == $option->new_value)
+            $found = true;
+    }
+    
+    if (!$found)
+        $option->new_value = 'none';
+        
+    save_option($option);
 }
+
+