Implement ability to move to next message after moving the one you are viewing, per...
[squirrelmail.git] / include / options / display.php
index fb8daa90a5b3f92da4e1d9b6f0bae267448d72e9..33496d569ece8e6221097a3712f0c0b3036c5b24 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Displays all optinos about display preferences
  *
- * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @copyright 1999-2020 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
 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");
-            }
-        }
-    }
-}
+define('SMOPT_GRP_ABOOK', 3);
 
 global $use_iframe;
 if (! isset($use_iframe)) $use_iframe=false;
@@ -51,7 +36,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, $sTplDir;
+    $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();
@@ -69,15 +56,15 @@ function load_optpage_data_display() {
     $templateset_values = array();
 
     foreach ($aTemplateSet as $sKey => $aTemplateSetAttributes) {
-        $templateset_values[$aTemplateSetAttributes['NAME']] = $aTemplateSetAttributes['PATH'];
+        $templateset_values[$aTemplateSetAttributes['NAME']] = $aTemplateSetAttributes['ID'];
     }
     ksort($templateset_values);
     $templateset_values = array_flip($templateset_values);
     // display template options only when there is more than one template
     if (count($templateset_values)>1) {
         $optvals[SMOPT_GRP_GENERAL][] = array(
-            'name'    => 'sTplDir',
-            'caption' => _("Template"),
+            'name'    => 'sTemplateID',
+            'caption' => _("Skin"),
             'type'    => SMOPT_TYPE_STRLIST,
             'refresh' => SMOPT_REFRESH_ALL,
             'posvals' => $templateset_values,
@@ -87,45 +74,55 @@ function load_optpage_data_display() {
 
     /* Load the theme option. */
     $theme_values = array();
-    foreach ($theme as $theme_key => $theme_attributes) {
-        $theme_values[$theme_attributes['NAME']] = $theme_attributes['PATH'];
+    
+    // Always provide the template default first.
+    $theme_values['none'] = 'Template Default Theme';
+
+    // List alternate themes provided by templates first
+    $template_themes = $oTemplate->get_alternative_stylesheets(true);
+    asort($template_themes);
+    foreach ($template_themes as $sheet=>$name) {
+        $theme_values[$sheet] = 'Template Theme - '.sm_encode_html_special_chars($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);
+    // Next, list user-provided styles
+    asort($user_themes);
+    foreach ($user_themes as $style) {
+        if ($style['PATH'] == 'none')
+            continue;
+        $theme_values[$style['PATH']] = 'User Theme - '.sm_encode_html_special_chars($style['NAME']);
     }
 
-    /*
-    if ( count( $css_values ) > 1 ) {
-
+    if (count($user_themes) + count($template_themes) > 1) {
         $optvals[SMOPT_GRP_GENERAL][] = array(
-            'name'    => 'custom_css',
-            'caption' => _("Custom Stylesheet"),
+            'name'    => 'chosen_theme',
+            'caption' => _("Theme"),
             'type'    => SMOPT_TYPE_STRLIST,
             'refresh' => SMOPT_REFRESH_ALL,
-            'posvals' => $css_values
+            'posvals' => $theme_values,
+            'save'    => 'css_theme_save'
         );
+    }
 
+    /* Icon theme selection */
+    if ($use_icons) {
+        global $icon_themes, $icon_theme;
+
+        $temp = array();
+        $value = 0;
+        for ($count = 0; $count < sizeof($icon_themes); $count++) {
+            $temp[$icon_themes[$count]['PATH']] = $icon_themes[$count]['NAME'];
+        }
+        if (sizeof($icon_themes) > 0) {
+            $optvals[SMOPT_GRP_GENERAL][] = array(
+                'name'          => 'icon_theme',
+                'caption'       => _("Icon Theme"),
+                'type'          => SMOPT_TYPE_STRLIST,
+                'refresh'       => SMOPT_REFRESH_NONE,
+                'posvals'       => $temp,
+                'save'          => 'icon_theme_save'
+            );
+        }
     }
-    */
 
     $fontset_values = array();
     $fontset_list = array();
@@ -201,7 +198,7 @@ function load_optpage_data_display() {
                            SMPREF_JS_ON         => _("Always"),
                            SMPREF_JS_OFF        => _("Never")),
         'save'    => 'save_option_javascript_autodetect',
-        'script'  => 'onclick="document.forms[0].new_js_autodetect_results.value = \'' . SMPREF_JS_ON . '\';"'
+        'extra_attributes' => array('onclick' => 'document.option_form.new_js_autodetect_results.value = \'' . SMPREF_JS_ON . '\';'),
     );
 
     $optvals[SMOPT_GRP_GENERAL][] = array(
@@ -221,34 +218,6 @@ function load_optpage_data_display() {
                            SMPREF_TIME_24HR => _("24-hour clock"))
     );
 
-    /* Icon theme selection */
-    if ($use_icons) {
-        global $icon_themes, $icon_theme;
-
-        $temp = array();
-        $value = 0;
-        for ($count = 0; $count < sizeof($icon_themes); $count++) {
-            $temp[$count] = $icon_themes[$count]['NAME'];
-            if ($icon_theme == $icon_themes[$count]['PATH'] ||
-                (($icon_theme == $sTplDir.'images/') && ($icon_themes[$count]['PATH']=='template'))
-               ) {
-                $value = $count;
-            }
-        }
-        if (sizeof($icon_themes) > 0) {
-            $optvals[SMOPT_GRP_GENERAL][] = array(
-                'name'          => 'icon_theme',
-                'caption'       => _("Icon Theme"),
-                'type'          => SMOPT_TYPE_STRLIST,
-                'refresh'       => SMOPT_REFRESH_NONE,
-                'posvals'       => $temp,
-                'initial_value' => $value,
-                'save'          => 'icon_theme_save'
-            );
-        }
-    }
-
-
     /*** Load the General Options into the array ***/
     $optgrps[SMOPT_GRP_MAILBOX] = _("Mailbox Display Options");
     $optvals[SMOPT_GRP_MAILBOX] = array();
@@ -282,6 +251,13 @@ function load_optpage_data_display() {
         'refresh' => SMOPT_REFRESH_NONE
     );
 
+    $optvals[SMOPT_GRP_MAILBOX][] = array(
+        'name'    => 'show_copy_buttons',
+        'caption' => _("Enable Message Copy Buttons"),
+        'type'    => SMOPT_TYPE_BOOLEAN,
+        'refresh' => SMOPT_REFRESH_NONE
+    );
+
     $optvals[SMOPT_GRP_MAILBOX][] = array(
         'name'    => 'page_selector',
         'caption' => _("Enable Page Selector"),
@@ -304,6 +280,13 @@ function load_optpage_data_display() {
         'size'    => SMOPT_SIZE_TINY
     );
 
+    $optvals[SMOPT_GRP_MAILBOX][] = array(
+        'name'    => 'show_personal_names',
+        'caption' => _("Show Names Instead of Email Addresses"),
+        'type'    => SMOPT_TYPE_BOOLEAN,
+        'refresh' => SMOPT_REFRESH_NONE,
+    );
+
     $optvals[SMOPT_GRP_MAILBOX][] = array(
         'name'    => 'show_full_date',
         'caption' => _("Always Show Full Date"),
@@ -311,6 +294,16 @@ function load_optpage_data_display() {
         'refresh' => SMOPT_REFRESH_NONE
     );
 
+    $optvals[SMOPT_GRP_MAILBOX][] = array(
+        'name'          => 'custom_date_format',
+        'caption'       => _("Custom Date Format"),
+//FIXME: need better wording here.  users should be made aware that this is for advanced use.  It might be nice to provide a list of the more common date format characters.  It may be helpful to know that it overrides settings such as the one above show_full_date, and only if kept empty will the other date formats apply.  For non-English users, it also may be helpful to know that the format is still passed through our own date_intl() function which translates things like the day of the week, month names and abbreviations, etc.
+        'trailing_text' => ' ' . _("(Uses format of PHP date() function)"),
+        'type'          => SMOPT_TYPE_STRING,
+        'refresh'       => SMOPT_REFRESH_NONE,
+        'size'          => SMOPT_SIZE_TINY,
+    );
+
     $optvals[SMOPT_GRP_MAILBOX][] = array(
         'name'    => 'truncate_sender',
         'caption' => _("Length of From/To Field (0 for full)"),
@@ -327,6 +320,7 @@ function load_optpage_data_display() {
         'size'    => SMOPT_SIZE_TINY
     );
 /*
+FIXME!
   disabled because the template doesn't support it (yet?)
     $optvals[SMOPT_GRP_MAILBOX][] = array(
         'name'    => 'show_recipient_instead',
@@ -414,6 +408,51 @@ function load_optpage_data_display() {
         'refresh' => SMOPT_REFRESH_ALL
     );
 
+    $optvals[SMOPT_GRP_MESSAGE][] = array(
+        'name'    => 'return_to_message_list_after_move',
+        'caption' => _("Return To Message List After Move"),
+        'type'    => SMOPT_TYPE_BOOLEAN,
+        'refresh' => SMOPT_REFRESH_NONE
+    );
+
+
+
+    /*** Load the Address Book Options into the array ***/
+    $optgrps[SMOPT_GRP_ABOOK] = _("Address Book Display Options");
+    $optvals[SMOPT_GRP_ABOOK] = array();
+
+    $optvals[SMOPT_GRP_ABOOK][] = array(
+        'name'    => 'abook_show_num',
+        'caption' => _("Number of Addresses per Page"),
+        'type'    => SMOPT_TYPE_INTEGER,
+        'refresh' => SMOPT_REFRESH_NONE,
+        'size'    => SMOPT_SIZE_TINY
+    );
+
+    $optvals[SMOPT_GRP_ABOOK][] = array(
+        'name'    => 'abook_page_selector',
+        'caption' => _("Enable Page Selector"),
+        'type'    => SMOPT_TYPE_BOOLEAN,
+        'refresh' => SMOPT_REFRESH_NONE
+    );
+
+    $optvals[SMOPT_GRP_ABOOK][] = array(
+        'name'    => 'abook_compact_paginator',
+        'caption' => _("Use Compact Page Selector"),
+        'type'    => SMOPT_TYPE_BOOLEAN,
+        'refresh' => SMOPT_REFRESH_NONE
+    );
+
+    $optvals[SMOPT_GRP_ABOOK][] = array(
+        'name'    => 'abook_page_selector_max',
+        'caption' => _("Maximum Number of Pages to Show"),
+        'type'    => SMOPT_TYPE_INTEGER,
+        'refresh' => SMOPT_REFRESH_NONE,
+        'size'    => SMOPT_SIZE_TINY
+    );
+
+
+
     /* Assemble all this together and return it as our result. */
     $result = array(
         'grps' => $optgrps,
@@ -433,10 +472,10 @@ function load_optpage_data_display() {
 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]['PATH'] == $option->new_value) {
+        if ($aTemplateSet[$i]['ID'] == $option->new_value) {
             $templateset_in_array = true;
             break;
         }
@@ -444,31 +483,24 @@ function save_option_template($option) {
 
     if (!$templateset_in_array) {
         $option->new_value = '';
-    }
-    /* Save the option like normal. */
-    save_option($option);
-}
-
-/**
- * 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;
-        }
-    }
+    } 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($sTemplateID, TRUE);
 
-    if (!$theme_in_array) {
-        $option->new_value = '';
     }
 
+    /**
+     * TODO: If the template changes and we are using a template provided theme
+     * ($user_theme), do we want to reset $user_theme?
+     */
     /* Save the option like normal. */
     save_option($option);
 }
@@ -485,18 +517,47 @@ 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
-    //
-    if (isset($icon_themes[$option->new_value]['PATH']))
-        setPref($data_dir, $username, 'icon_theme', $icon_themes[$option->new_value]['PATH']);
-    else
-       setPref($data_dir, $username, 'icon_theme', 'none');
+    $found = false;
+    while (!$found && (list($index, $data) = each($icon_themes))) {
+        if ($data['PATH'] == $option->new_value)
+            $found = true;
+    }
+    
+    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 ($data['PATH'] == $option->new_value)
+            $found = true;
+    }
+    
+    if (!$found) {
+        $template_themes = $oTemplate->get_alternative_stylesheets(true);
+        while (!$found && (list($path, $name) = each($template_themes))) {
+            if ($path == $option->new_value)
+                $found = true;
+        }
+    }
+    
+    if (!$found)
+        $option->new_value = 'none';
+        
+    save_option($option);
 }
 
-?>
+