# postscript-mode.tcl - mode for editing postscript code
# 
# modif :
# 04/05/95 (Maurice DIAMANTINI diam@ensta.fr)
# 13/01/97 (diam) refonte
# 
###########################################################################
global stead

## mode_postscript_init --
# 
proc mode_postscript_init {} {

    global stead
    global EDITPREFS 
    global TE_MODE_SEARCH_STRING TE_MODE_NAVIG_SHOW_TEXT
    
    # Quelques préférences globales :
    set EDITPREFS(autobreak)     0
    set EDITPREFS(autoindent)    1          ;# Force l'auto indent
    
    # define the prefix for c mode
    set EDITPREFS(prefix) "% "
    
   
    # chaine de recherche (utilisé pour le générer le menu de navigation) :
    set TE_MODE_SEARCH_STRING {(?n)^%%([Pp]age)\y.*}
    
    set TE_MODE_NAVIG_SHOW_TEXT "page" ;# nom de menu de navigation
    
} ;# endproc mode_postscript_init


########################################################################
# procédure de définition des couleurs des couleurs
########################################################################
proc mode_postscript_defineStyles {} {
    global stead
    upvar #0 stead(text) w
    
    
    # Style specialkeyword  : quelques mots clés connu de postscript
    # 
    xtext_style $w define postscript specialkeyword {
        -type wordList
        -config {-foreground DarkViolet}
        -prePat {\m}
        -postPat {\M}
        -values {
            def userdict begin end statusdict mark
            add sub div mul roll exch
            if ifelse  repeat loop 
            pop
            dup Pyth false true neg
            copy 
            newpath closepath 
            gsave grestore stroke fill scale
            setgray setlinecap setcolor setrgbcolor
            moveto lineto curveto
        }
    }
    
    # Style specialchars  : quelques mots clés connu de postscript
    # 
    xtext_style $w define postscript specialchars {
        -type regexpLight
        -config {-foreground DarkViolet}
        -pat {(\<\<|\>\>|\(|\)|\{|\})}
    }
    
    # Style keyword  : commande  postscript "/rmargin"
    # 
    xtext_style $w define postscript keyword {
        -type regexpLight
        -config {-foreground blue}
        -pat {/[\w@]+\M}
    }
    
    # style "metacoment"  commence par %% en début de ligne
    #   
    xtext_style $w define postscript directive {
        -type regexpLine
        -config {-foreground #800}
        -pat {^(%%.*)}
    }
    
    # style "directive"  métacomment du style %%BoundingBox: (atend)
    #   
    xtext_style $w define postscript metacoment {
        -type regexpLine
        -config {-foreground red}
        -pat {^([-\(\)\$\.%/ \w\d]+)\s*:(?!=)}
        -pat {^(%%\w+\s*:)}
    }
    

    # Style comment  : commentaire type shell #xxx
    xtext_style $w define postscript comment {
        -type regexpLine
        -config {-foreground #060}
        -pat {(^%([^%]|$).*)}
    }
 
 
    xtext_style $w enable postscript
}

## mode_postscript_getHelp - aide sur le mode postscript
# 
# 
proc mode_postscript_getHelp {} {
    set help {
        aide du mode postscript :
        
        Aucun aide pour l'instant
    } 
    return $help
} 

## mode_postscript_defineSabbrev -- alias statique du mode postscript
# 
# 
proc mode_postscript_defineSabbrev {} {

    global stead 
    
    # pour simplifier l'ecriture des electric-alias en déclarant :
    #    M : Marque temporaire
    #    B : début de postcommande 
    #    E : fin de postcommande
    #    V : Inclusion d'une variable TCL
    electricAlias-use8bitsCars
    
    
    # electricAlias-def ${M}$stead(mode) do  \
    #      "do $V{bb}\n${B}i${E}$M\n$V{eb} while ($M);$M"
   
    # electricAlias-def ${M}$stead(mode) clean  "clean:\n\t/bin/rm *.o"
 
}

## mode_postscript_defineMenu_postscript -
# 
# 
proc mode_postscript_defineMenu_postscript {} {
    global stead
    
    set menubutton  .menu.$stead(mode)
    set m           .menu.$stead(mode).m
    
    if {[winfo exists $menubutton]} {
        destroy $menubutton
    }
    # Création d'un bouton de menu (ce qu'on voit)
    menubutton $menubutton \
            -text [string totitle $stead(mode)] \
            -menu .menu.$stead(mode).m
            
    # On positionne ce bouton
    pack append .menu $menubutton left
  
    # Création d'un menu (ce qui ce déroule quand on clique sur le menubutton)
    set m [menu $m]
    
    $m add command \
            -label {Prévisualiser ce fichier avec ghostview} \
            -command {mode_postscript_viewps $::stead(file)}
                          
    $m add separator
    $m add command \
            -label "Aide du mode postscript"  \
            -command [list stead -readonly 1 -text [mode_postscript_getHelp] ]
    
    
}    
    
## mode_postscript_defineMenu_templates - Création et remplissage de menu template
# 
# 
proc mode_postscript_defineMenu_templates {} {
    global stead
    
    set menubutton  .menu.template
    set m           .menu.template.m
    
    if {[winfo exists $menubutton]} {
        destroy $menubutton
    }
    # Création d'un bouton de menu (ce qu'on voit)
    menubutton $menubutton \
            -text Templates \
            -menu $m
            
    # On positionne ce bouton
    pack append .menu $menubutton left
  
    # Création d'un menu (ce qui ce déroule quand on clique sur le menubutton)
    set m [menu $m]

    $m add command \
            -label "Insérer un separateur \"%%%...\"" \
            -command {separator 1}
    
    $m add separator
                                    
    
    $m add cascade -label Alias -menu $m.alias
    menu $m.alias
    foreach alias [electricAlias-softNames] {
        # on peut ne retenir QUE les alias finissant par "_"
        if {[string match *_ $alias]} {
            $m.alias add command \
                 -label $alias \
                 -command "electricAlias-insert $stead(text)  $alias"
        }
    }     
}  
## mode_postscript_viewps - prévisualiser une fichier par ghostview 
# 
# A déplacer vers fichier system.tcl car dépend de la plateforme
# 
proc mode_postscript_viewps {file} {
    return [eval [list exec gv $file &]]
}

## separator {{NbLines 1}}
# 
# Insère "Nblines" lignes (défaut : 1) correspondant au separateur 
# souhaité ;
# Cette procédure est automatiquement liée à <Meta-1>
#
proc separator {{NbLines 1} } {
    insert_fill_lines "%" $NbLines 
} 

## tri des procedures pour la navigation par ordre alphabetique
#
proc te:mode:navig_sort_hook {list} {

    # Exemple : tri par ordre alphabetique
    # return [lsort -command te:mode:sort_command $list]
    
    # Exemple : aucun tri (pour conserver l'ordre d'apparition)
    return  $list
}


## stead:modeStart_tcl - lancement du mode tcl
# 
# 
proc stead:modeStart_postscript {} {
    mode_postscript_init
    mode_postscript_defineSabbrev
    mode_postscript_defineMenu_postscript
    mode_postscript_defineMenu_templates
    mode_postscript_defineStyles
}
## stead:modeCleanup -
# 
proc stead:modeCleanup {} {
    global stead
    upvar 0 stead(text) w
    te:mode:destroy_menu $stead(mode)
    te:mode:destroy_menu templates
    xtext_style $w delete $stead(mode)
} 
stead:modeStart_postscript
#./
