Changeset 29069 in spip-zone for _core_/plugins/bandeau


Ignore:
Timestamp:
Jun 9, 2009, 1:53:39 PM (12 years ago)
Author:
cedric@…
Message:

un systeme de skin pour faire la peau aux resistances :

  • chaque skin est un sous repertoire de skins/
  • la skin par defaut s'appelle spip/ et contien(t|dra) un jeu complet d'icones utilisees par l'interface prive
  • un plugin peut etendre une skin. Par exemple, en ayant un repertoire skins/spip/ il etendra la skin par defaut nommee spip
  • d'autres skin peuvent etre definies (dans le core, dans un plugin, ...), il suffit de creer un repertoire skin/nomdemapeau/
  • si une skin est incomplete, les elements manquants sont pioches par la skin principale, qui par defaut est aussi 'spip'
  • la skin principale (qui sert de rechange aux skins supplementaires) peut etre redefinie par tout plugin avec define('_SPIP_SKIN','nomdemaskinimposee');
  • la skin par defaut des utilisateurs est la skin principale sauf si elle est definie par $GLOBALSskin_defaut? = 'maskinpardefaut';
  • les utilisateurs pourront choisir leur skin dans les preferences, mais plus tard...

Pour le moment, seules les icones de images/ sont piochees dans la skin.
A cette occasion, travail de renommage et rationnalisation des icones de spip, dans skins/spip :
les icones sont toutes en png, nommees
objet[-precision][-action]-taille.png

  • objet est au singulier
  • precision peut indiquer une sous categorie ou sous action (forum-interne, auteur-1comite,cache-empty,...)
  • action peut etre new, del, add

Les icones sont disponibles en 24px et 16px, a l'exception des icones du bandeau en 48px, et des 3 icones secteur,rubrique,article egalement disponible en 12px
Les variante d'action add, del, new devront etre disponibles directement, et non par superposition de deux icones dans le html comme actuellement

Pour produire toutes les icones derivee add, del, new, il est possible d'utiliser
ecrire/?exec=produce&skin=truc
qui utilisera add-xx.png, del-xx.png, new-xx.png pour produire les icones d'action derivees avec les filtres images.

Ce mecanisme va permettre a qui le veut de travailler sur des variantes de skin, qui pourront etre disponibles pour les utilisateurs, ou pour lew webmestres qui veulent les utiliser comme skin principale sur leurs sites.

Un debut de nouvelle skin est fournie a titre d'exemple, testable en mettant
$GLOBALSskin_defaut? = 'basic';
dans mes_options.php

Location:
_core_/plugins/bandeau
Files:
274 added
6 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/bandeau/exec/produce.php

    r26821 r29069  
    3131
    3232        include_spip('filtres/images_transforme');
     33        if (!$skin = _request('skin'))
     34                die('indiquez une &skin=xxx');
    3335
    3436        foreach(array(24,16) as $size){
     37                $masque = "";
     38                $postfix = "-$size.png";
     39                if (file_exists(_DIR_PLUGIN_BANDO.($f="skins/$skin/images/masque-$size.png"))){
     40                        $masque = $f;
     41                        $postfix = "-base".$postfix;
     42                }
    3543                // les icones 24px
    36                 $icones = preg_files(_DIR_PLUGIN_BANDO."images/base/","-$size.png$");
     44                $icones = preg_files(_DIR_PLUGIN_BANDO."skins/$skin/images/","$postfix$");
    3745                foreach($icones as $icone){
    38                         $base = image_masque($icone,"images/v1/masque-$size.png");
    39                         $base_new = image_masque($base,"images/v1/new-$size.png","mode=normal");
    40                         $base_add = image_masque($base,"images/v1/add-$size.png","mode=normal");
    41                         $base_del = image_masque($base,"images/v1/del-$size.png","mode=normal");
     46                        $objet = basename($icone,$postfix);
     47                        $base = $icone;
     48                        if ($masque)
     49                                $base = image_masque($base,$masque);
     50                        $base_new = image_masque($base,"skins/$skin/images/new-$size.png","mode=normal");
     51                        $base_add = image_masque($base,"skins/$skin/images/add-$size.png","mode=normal");
     52                        $base_del = image_masque($base,"skins/$skin/images/del-$size.png","mode=normal");
    4253                        echo $base
    4354                        . $base_new
     
    4556                        . $base_del
    4657                        . "<br />";
    47                         $icone = basename($icone,"-$size.png");
    48                         copy(extraire_attribut($base,'src'),_DIR_PLUGIN_BANDO."images/v1/$icone-$size.png");
    49                         copy(extraire_attribut($base_new,'src'),_DIR_PLUGIN_BANDO."images/v1/$icone-new-$size.png");
    50                         copy(extraire_attribut($base_add,'src'),_DIR_PLUGIN_BANDO."images/v1/$icone-add-$size.png");
    51                         copy(extraire_attribut($base_del,'src'),_DIR_PLUGIN_BANDO."images/v1/$icone-del-$size.png");
     58                        $icone = basename($icone,$postfix);
     59                        if ($masque)
     60                                copy(extraire_attribut($base,'src'),_DIR_PLUGIN_BANDO."skins/$skin/images/$objet-$size.png");
     61                        if (in_array($objet,array('article','auteur','annonce','breve','calendrier','cookie','document','forum','groupe-mot','image','message','mot','petition','rubrique','site','traduction'))){
     62                                copy(extraire_attribut($base_new,'src'),_DIR_PLUGIN_BANDO."skins/$skin/images/$objet-new-$size.png");
     63                                copy(extraire_attribut($base_add,'src'),_DIR_PLUGIN_BANDO."skins/$skin/images/$objet-add-$size.png");
     64                                copy(extraire_attribut($base_del,'src'),_DIR_PLUGIN_BANDO."skins/$skin/images/$objet-del-$size.png");
     65                        }
    5266                }
    5367        }
  • _core_/plugins/bandeau/inc/bandeau.php

    r28196 r29069  
    6060                                        $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu,0,$position)
    6161                                        + array($id=> new Bouton(
    62                                           ($icones AND $infos['icone'])?find_in_path($infos['icone']):'',  // icone
     62                                          ($icones AND $infos['icone'])?find_in_skin($infos['icone']):'',  // icone
    6363                                          $infos['titre'],      // titre
    6464                                          $infos['url']?$infos['url']:null,
     
    7575                                        $boutons_admin = array_slice($boutons_admin,0,$position)
    7676                                        +array($id=> new Bouton(
    77                                           ($icones AND $infos['icone'])?find_in_path($infos['icone']):'',  // icone
     77                                          ($icones AND $infos['icone'])?find_in_skin($infos['icone']):'',  // icone
    7878                                          $infos['titre'],      // titre
    7979                                          $infos['url']?$infos['url']:null,
     
    194194
    195195        $nom_site = typo($GLOBALS['meta']['nom_site']);
    196         $img_info = find_in_path('images/information.png');
     196        $img_info = find_in_skin('images/information-24.png');
    197197        $url_config_identite = generer_url_ecrire('config_identite');
    198198
     
    200200
    201201        $moi = typo($GLOBALS['visiteur_session']['nom']);
    202         $img_langue = find_in_path('images/langues.png');
     202        $img_langue = find_in_skin('images/langues.png');
    203203        $url_aide = generer_url_ecrire('aide_index',"var_lang=".$GLOBALS['spip_lang']);
    204204        $url_lang = generer_url_ecrire('config_langage');
     
    210210          ."'>"
    211211          . "<strong class='nom'>$moi</strong>"
    212           . "<img alt='"._T('icone_informations_personnelles')."' src='$img_info'/></a>"
     212          . " <img alt='"._T('icone_informations_personnelles')."' src='$img_info'/></a>"
    213213          . "| "
    214214          . "<a class='menu_lang' href='$url_lang' title='"._T('bando:titre_config_langage')."'><img alt='"._T('bando:titre_config_langage')."' src='$img_langue'/>".traduire_nom_langue($GLOBALS['spip_lang'])."</a>"
     
    244244
    245245
    246     // le navigateur de rubriques
    247         $img = find_in_path('images/v1/boussole-24.png');
    248     $url = generer_url_ecrire("articles_tous");
     246        // le navigateur de rubriques
     247        $img = find_in_skin('images/boussole-24.png');
     248        $url = generer_url_ecrire("articles_tous");
    249249        $res .= "<ul class='bandeau_rubriques deroulant'><li class='boussole'>";
    250     $res .= "<a href='$url' id='boutonbandeautoutsite'><img src='$img' width='24' height='24' alt='' /></a>";
     250        $res .= "<a href='$url' id='boutonbandeautoutsite'><img src='$img' width='24' height='24' alt='' /></a>";
    251251        include_spip('exec/menu_rubriques');
    252252        $res .= menu_rubriques(false);
    253253        $res .= "</li></ul>";
    254     //$res .= "<div id='gadget-rubriques'></div>";
    255 
    256     // la barre de raccourcis rapides
    257     if (isset($boutons['outils_rapides']))
    258         $res .= "<ul class='rapides creer'>"
    259           . bando_lister_sous_menu($boutons['outils_rapides']->sousmenu,$contexte,'bouton',true)
    260           . "</ul>";
    261 
    262     $res .= "<div id='rapides'>";
     254
     255        // la barre de raccourcis rapides
     256        if (isset($boutons['outils_rapides']))
     257                        $res .= "<ul class='rapides creer'>"
     258                                . bando_lister_sous_menu($boutons['outils_rapides']->sousmenu,$contexte,'bouton',true)
     259                                . "</ul>";
     260
     261        $res .= "<div id='rapides'>";
    263262
    264263        // la barre de raccourcis collaboratifs
    265     if (isset($boutons['outils_collaboratifs']))
    266         $res .= "<ul class='rapides collaborer'>"
    267           . bando_lister_sous_menu($boutons['outils_collaboratifs']->sousmenu,$contexte,'bouton',true)
    268           . "</ul>";
     264        if (isset($boutons['outils_collaboratifs']))
     265                        $res .= "<ul class='rapides collaborer'>"
     266                                . bando_lister_sous_menu($boutons['outils_collaboratifs']->sousmenu,$contexte,'bouton',true)
     267                                . "</ul>";
    269268
    270269        $res .= formulaire_recherche("recherche")."</div>";
  • _core_/plugins/bandeau/inc/icone_renommer.php

    r26821 r29069  
    1616
    1717function inc_icone_renommer_dist($fond,$fonction){
     18
    1819        $size = 24;
    1920        if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i",$fond,$match))
     
    3031                $type = $remplacement[$type];
    3132
    32         $dir = _DIR_PLUGIN_BANDO."images/v1/";
     33        $dir = "images/";
    3334        $f = "$type-$size.png";
    34         if (file_exists($dir.$f)){
    35                 $fond = $dir . $f;
     35        if ($icone = find_in_skin($dir.$f)){
     36                $dir = dirname($icone);
     37                $fond = $icone;
    3638                $action = "";
    3739                if ($fonction=="supprimer.gif"){
     
    4244                }
    4345                if ($action
    44                   AND $fa = "$type-$action-$size.png"
    45                   AND file_exists($dir.$fa)){
    46                         $fond = $dir . $fa;
     46                        AND $fa = "$type-$action-$size.png"
     47                        AND file_exists($dir.'/'.$fa)){
     48                        $fond = $dir .'/'. $fa;
    4749                        $fonction = "rien.gif";
    4850                }
     51                // c'est bon !
     52                return array($fond,$fonction);
    4953        }
     54
    5055        return array($fond,$fonction);
    5156}
  • _core_/plugins/bandeau/plugin.xml

    r28249 r29069  
    1111
    1212        <fonctions>public/slogan_balise.php</fonctions>
     13        <options>bando_options.php</options>
    1314        <pipeline>
    1415                <nom>autoriser</nom>
     
    1718       
    1819        <bouton id="bando_accueil">
    19                 <icone>images/spip/accueil-48.png</icone>
     20                <icone>images/accueil-48.png</icone>
    2021                <titre>bando:icone_accueil</titre>
    2122                <url>accueil</url>
     
    2324       
    2425        <bouton id="bando_edition">
    25                 <icone>images/spip/edition-48.png</icone>
     26                <icone>images/edition-48.png</icone>
    2627                <titre>bando:icone_edition</titre>
    2728                <url>navigation</url>
     
    2930        </bouton>
    3031        <bouton id='rubriques' parent="bando_edition">
    31                 <icone>images/v1/rubrique-16.png</icone>
     32                <icone>images/rubrique-16.png</icone>
    3233                <titre>info_rubriques</titre>           
    3334                <url>naviguer</url>
    3435        </bouton>
    3536        <bouton id='articles' parent="bando_edition">
    36                 <icone>images/v1/article-16.png</icone>
     37                <icone>images/article-16.png</icone>
    3738                <titre>icone_tous_articles</titre>             
    3839                <url>articles_page</url>
    3940        </bouton>
    4041        <bouton id='auteurs' parent="bando_edition">
    41                 <icone>images/v1/auteur-16.png</icone>
     42                <icone>images/auteur-16.png</icone>
    4243                <titre>icone_auteurs</titre>
    4344        </bouton>
    4445        <bouton id='breves' parent="bando_edition">
    45                 <icone>images/v1/breve-16.png</icone>
     46                <icone>images/breve-16.png</icone>
    4647                <titre>icone_breves</titre>
    4748        </bouton>
    4849        <bouton id='mots' parent="bando_edition">
    49                 <icone>images/v1/mot-16.png</icone>
     50                <icone>images/mot-16.png</icone>
    5051                <titre>icone_mots_cles</titre>
    5152                <url>mots_tous</url>
    5253        </bouton>
    5354        <bouton id='sites' parent="bando_edition">
    54                 <icone>images/v1/site-16.png</icone>
     55                <icone>images/site-16.png</icone>
    5556                <titre>icone_sites_references</titre>
    5657                <url>sites_tous</url>
     
    5859
    5960        <bouton id="bando_publication">
    60                 <icone>images/spip/publication-48.png</icone>
     61                <icone>images/publication-48.png</icone>
    6162                <titre>bando:icone_suivi_edito</titre>
    6263                <url>navigation</url>
     
    6465        </bouton>
    6566        <bouton id='suivi_edito' parent="bando_publication">
    66                 <icone>images/v1/suivi-16.png</icone>
     67                <icone>images/suivi-16.png</icone>
    6768                <titre>bando:icone_suivi_publication</titre>
    6869        </bouton>
    6970        <bouton id='suivi_revisions' parent="bando_publication">
    70                 <icone>images/v1/revisions-16.png</icone>
     71                <icone>images/revision-16.png</icone>
    7172                <titre>info_historique_titre</titre>
    7273        </bouton>
    7374        <bouton id='synchro' parent="bando_publication">
    74                 <icone>images/v1/rss-16.png</icone>
     75                <icone>images/rss-16.png</icone>
    7576                <titre>icone_suivi_activite</titre>
    7677        </bouton>
    7778       
    7879        <bouton id="bando_reactions">
    79                 <icone>images/spip/reactions-48.png</icone>
     80                <icone>images/reaction-48.png</icone>
    8081                <titre>bando:icone_reactions</titre>           
    8182                <url>navigation</url>
     
    8384        </bouton>
    8485        <bouton id="statistiques" parent="bando_reactions">
    85                 <icone>images/v1/statistiques-16.png</icone>
     86                <icone>images/statistique-16.png</icone>
    8687                <titre>icone_statistiques_visites</titre>               
    8788                <url>statistiques_visites</url>
    8889        </bouton>
    8990        <bouton id="referers" parent="bando_reactions">
    90                 <icone>images/v1/referer-16.png</icone>
     91                <icone>images/referer-16.png</icone>
    9192                <titre>titre_liens_entrants</titre>
    9293                <url>statistiques_referers</url>
    9394        </bouton>
    9495        <bouton id='forum_reactions' parent='bando_reactions'>
    95                 <icone>images/v1/forum-16.png</icone>
     96                <icone>images/forum-16.png</icone>
    9697                <titre>icone_suivi_forums</titre>
    9798                <url>controle_forum</url>
    9899        </bouton>
    99100        <bouton id='petitions_reactions' parent='bando_reactions'>
    100                 <icone>images/v1/petition-16.png</icone>
     101                <icone>images/petition-16.png</icone>
    101102                <titre>icone_suivi_pettions</titre>
    102103                <url>controle_petition</url>
    103104        </bouton>
    104105        <bouton id='visiteurs' parent="bando_reactions">
    105                 <icone>images/v1/auteur-16.png</icone>
     106                <icone>images/auteur-6forum-16.png</icone>
    106107                <titre>icone_afficher_visiteurs</titre>
    107108                <url>auteurs</url>
     
    111112       
    112113        <bouton id="bando_administration">
    113                 <icone>images/spip/administration-48.png</icone>
     114                <icone>images/administration-48.png</icone>
    114115                <titre>bando:icone_administration</titre>               
    115116                <url>navigation</url>
     
    117118        </bouton>
    118119        <bouton id='admin_vider' parent='bando_administration'>
    119                 <icone>images/v1/cache-empty-16.png</icone>
     120                <icone>images/cache-empty-16.png</icone>
    120121                <titre>onglet_vider_cache</titre>
    121122        </bouton>
    122123        <bouton id='admin_sauvegarder' parent='bando_administration'>
    123                 <icone>images/v1/backup-16.png</icone>
     124                <icone>images/base-backup-16.png</icone>
    124125                <titre>texte_sauvegarde_base</titre>
    125126                <url>admin_backup</url>
    126127        </bouton>
    127128        <bouton id='admin_restaurer' parent='bando_administration'>
    128                 <icone>images/v1/restore-16.png</icone>
     129                <icone>images/base-restore-16.png</icone>
    129130                <titre>bouton_restaurer_base</titre>
    130131                <url>admin_restore</url>
    131132        </bouton>
    132133        <bouton id='admin_maintenir' parent='bando_administration'>
    133                 <icone>images/v1/base-maintenance-16.png</icone>
     134                <icone>images/base-maintenance-16.png</icone>
    134135                <titre>titre_admin_tech</titre>
    135136                <url>admin_tech</url>
     
    139140       
    140141        <bouton id="bando_configuration">
    141                 <icone>images/spip/configuration-48.png</icone>
     142                <icone>images/configuration-48.png</icone>
    142143                <titre>bando:icone_configuration</titre>               
    143144                <url>navigation</url>
     
    145146        </bouton>
    146147        <bouton id='config_identite' parent="bando_configuration">
    147                 <icone>images/v1/identite-16.png</icone>
     148                <icone>images/identite-16.png</icone>
    148149                <titre>bando:titre_identite_site</titre>               
    149150                <url>config_identite</url>
    150151        </bouton>
    151152        <bouton id='config_lang' parent="bando_configuration">
    152                 <icone>images/v1/langues-16.png</icone>
     153                <icone>images/langues-16.png</icone>
    153154                <titre>icone_gestion_langues</titre>           
    154155        </bouton>
    155156        <bouton id='config_contenu' parent="bando_configuration">
    156                 <icone>images/v1/config-contenu-16.png</icone>
     157                <icone>images/config-contenu-16.png</icone>
    157158                <titre>onglet_contenu_site</titre>             
    158159                <url>configuration</url>
    159160        </bouton>
    160161        <bouton id='config_interactivite' parent="bando_configuration">
    161                 <icone>images/v1/config-interaction-16.png</icone>
     162                <icone>images/config-interaction-16.png</icone>
    162163                <titre>onglet_interactivite</titre>             
    163164                <url>config_contenu</url>
    164165        </bouton>
    165166        <bouton id='config_avancee' parent="bando_configuration">
    166                 <icone>images/v1/configuration-16.png</icone>
     167                <icone>images/configuration-16.png</icone>
    167168                <titre>onglet_fonctions_avances</titre>         
    168169                <url>config_fonctions</url>
     
    170171       
    171172        <bouton id='admin_plugin' parent="bando_configuration">
    172                 <icone>images/v1/plugin-16.png</icone>
     173                <icone>images/plugin-16.png</icone>
    173174                <titre>icone_admin_plugin</titre>               
    174175        </bouton>
     
    178179        </bouton>
    179180        <bouton id='calendrier' parent="outils_collaboratifs">
    180                 <icone>images/v1/calendrier-16.png</icone>
     181                <icone>images/calendrier-16.png</icone>
    181182                <titre>Agenda interne</titre>
    182183        </bouton>
    183184        <bouton id='messagerie' parent="outils_collaboratifs">
    184                 <icone>images/v1/message-16.png</icone>
     185                <icone>images/message-16.png</icone>
    185186                <titre>info_messagerie_interne</titre>
    186187        </bouton>
    187188        <bouton id="forum_interne_suivi" parent="outils_collaboratifs">
    188                 <icone>images/v1/forum-16.png</icone>
     189                <icone>images/forum-interne-16.png</icone>
    189190                <titre>titre_cadre_forum_interne</titre>
    190191                <url>forum</url>
     
    195196        </bouton>
    196197        <bouton id='rubrique_creer' parent="outils_rapides">
    197                 <icone>images/v1/rubrique-new-16.png</icone>
     198                <icone>images/rubrique-new-16.png</icone>
    198199                <titre>icone_creer_rubrique_2</titre>
    199200                <url>rubriques_edit</url>
     
    201202        </bouton>
    202203        <bouton id='article_creer' parent="outils_rapides">
    203                 <icone>images/v1/article-new-16.png</icone>
     204                <icone>images/article-new-16.png</icone>
    204205                <titre>icone_ecrire_article</titre>
    205206                <url>articles_edit</url>
     
    207208        </bouton>
    208209        <bouton id='auteur_creer' parent="outils_rapides">
    209                 <icone>images/v1/auteur-new-16.png</icone>
     210                <icone>images/auteur-new-16.png</icone>
    210211                <titre>icone_creer_nouvel_auteur</titre>
    211212                <url>auteur_infos</url>
     
    213214        </bouton>
    214215        <bouton id='mot_creer' parent="outils_rapides">
    215                 <icone>images/v1/mot-new-16.png</icone>
     216                <icone>images/mot-new-16.png</icone>
    216217                <titre>icone_creation_mots_cles</titre>
    217218                <url>mots_edit</url>
     
    219220        </bouton>
    220221        <bouton id='site_creer' parent="outils_rapides">
    221                 <icone>images/v1/site-new-16.png</icone>
     222                <icone>images/site-new-16.png</icone>
    222223                <titre>icone_referencer_nouveau_site</titre>
    223224                <url>sites_edit</url>
     
    225226        </bouton>
    226227        <bouton id='breve_creer' parent="outils_rapides">
    227                 <icone>images/v1/breve-new-16.png</icone>
     228                <icone>images/breve-new-16.png</icone>
    228229                <titre>icone_nouvelle_breve</titre>
    229230                <url>breves_edit</url>
  • _core_/plugins/bandeau/prive/style_prive_plugin_bando.html

    r27542 r29069  
    140140#bando_navigation ul.deroulant > li > a { color:#333;}
    141141
    142 /* pour les icones pochoir de diala */
    143 .navigation_avec_icones #bando_navigation ul.deroulant > li > a { background-color: #[(#GET{claire}|couleur_eclaircir)];}
     142.navigation_avec_icones #bando_navigation ul.deroulant > li > a { }
    144143.navigation_avec_icones #bando_navigation ul.deroulant > li > a:hover,
    145 .navigation_avec_icones #bando_navigation ul.deroulant > li > a:focus { background-color: #GET{claire}; }
     144.navigation_avec_icones #bando_navigation ul.deroulant > li > a:focus { background-color: #[(#GET{claire}|couleur_eclaircir)]; }
    146145
    147 .navigation_avec_icones #bando_navigation ul li a {background-position:center top;background-repeat:no-repeat;padding-top:60px;}
     146.navigation_avec_icones #bando_navigation ul li a {background-position:center 5px;background-repeat:no-repeat;padding-top:60px;}
    148147.navigation_avec_icones #bando_navigation ul li ul li a {margin-#GET{left}:7px;background-position:[(#GET{left})] center;margin-top:0;padding-#GET{left}:30px;padding-top:0.8em;}
    149148
     149#SET{style_prive_skin,#REM|bando_style_prive_skin}
     150/*#GET{style_prive_skin}*/
     151[(#GET{style_prive_skin}|oui)
     152[(#INCLURE{fond=#GET{style_prive_skin}}{env})]
     153]
    150154[(#REM|bando_images_background)]
    151155
  • _core_/plugins/bandeau/prive/style_prive_plugin_bando_fonctions.php

    r27001 r29069  
    3030        return $res;
    3131}
     32
     33function bando_style_prive_skin() {
     34        if ($f = find_in_skin('style_prive_skin.html'))
     35                return preg_replace(',[.]html$,Ui','',$f);
     36        return '';
     37}
Note: See TracChangeset for help on using the changeset viewer.