IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Coloration syntaxique sur champ Text


Sujet :

Eclipse Platform

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut Coloration syntaxique sur champ Text
    Bonjour à tous !

    Je voudrai rajouter de la coloration syntaxique dans un éditeur dans lequel j'affiche (en lecture seule) du XML

    Je me suis aidé de ce PDF pour mettre ça en place :
    http://www.serli.com/uploads/fichier...13814a7e5c.pdf

    A la fin de ce tuto, je vois que ce tout ce que je viens de faire ne s'applique pas à un Text, mais à un TextEditor...

    Le souci, c'est que moi j'ai un editor qui hérite de EditorPart, dans lequel j'ai deux onglets, un d'édition graphique de mon XML (Avec un Tree), un de visualisation du XML résultant (un Text sur lequel je voudrai rajouter ma coloration).

    Si j'utilise un TextEditor, je pourrai pas mettre dedans mon onglet avec mon arbre d'édition graphique...

    Bref je ne comprend pas ce que je dois faire... Peut être suis je parti sur une mauvaise piste?

    Pour le moment, j'ai le code suivant :
    Le scanner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    package generateurfue.gui.editors;
     
    import org.eclipse.jface.text.TextAttribute;
    import org.eclipse.jface.text.rules.IRule;
    import org.eclipse.jface.text.rules.RuleBasedScanner;
    import org.eclipse.jface.text.rules.SingleLineRule;
    import org.eclipse.jface.text.rules.Token;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Color;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.ui.PlatformUI;
     
    public class SourceScanner extends RuleBasedScanner {
    	private static final Color COLOR_BALISES;
    	private static final Color COLOR_VALEUR_ATTRIBUT;
    	private static final Color COLOR_AUTRE;
    	static {
    		Display d = PlatformUI.getWorkbench().getDisplay();
    			COLOR_BALISES = new Color(d, 0, 0, 128);
    			COLOR_VALEUR_ATTRIBUT = new Color(d, 128, 0, 0);
    			COLOR_AUTRE = new Color(d, 0, 0, 0);
    		}
     
    	public SourceScanner() {
    		super();
    		Token contenuBalises = new Token(new TextAttribute(COLOR_BALISES, null, SWT.BOLD));
    		Token valeurAttributs = new Token(new TextAttribute(COLOR_VALEUR_ATTRIBUT, null, SWT.ITALIC));
    		IRule[] rules = new IRule[2];
    		rules[0] = new SingleLineRule("<", ">", contenuBalises);
    		rules[1] = new SingleLineRule("\"", "\"", valeurAttributs);
    		setRules(rules);
    	}
    }
    Le configurator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package generateurfue.gui.editors;
     
    import org.eclipse.jface.text.IDocument;
    import org.eclipse.jface.text.presentation.IPresentationReconciler;
    import org.eclipse.jface.text.presentation.PresentationReconciler;
    import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
    import org.eclipse.jface.text.source.ISourceViewer;
    import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
     
    public class SourceConfigurator extends TextSourceViewerConfiguration{
     
    	@Override
    	public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
    		PresentationReconciler pr = new PresentationReconciler();
    		DefaultDamagerRepairer ddr = new DefaultDamagerRepairer(new SourceScanner());
    		pr.setDamager(ddr, IDocument.DEFAULT_CONTENT_TYPE);
    		pr.setRepairer(ddr, IDocument.DEFAULT_CONTENT_TYPE);
    		return pr;
    	}
     
    }
    Quelqu'un saurait me ré-aiguiller dans la bonne direction?

    Merci !

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Je ne sais pas si la coloration syntaxique que tu souhaites mettre en place est compliqué ou non (dans le sens où la "grammaire" est fournie ou pas...).
    Mais tu as cet exemple de coloration syntaxique pour SWT dont tu peux t'inspirer.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    C'est pour faire une coloration syntaxique de fichier XML, donc complexité moyenne !
    C'est très "bas niveau" par rapport à ce qui existe pour les TextEditors (où on définit juste les règles sans avoir à tout passer caractère par caractère !) mais vu que mon besoin est assez simple ça ira parfaitement !

    Je teste ça !

    Seule interrogation, mon fichier risque d'être gros (quelques dizaine de millier de lignes...) dans ces conditions, il vaut mieux (pour les perfs) que je recherche comme dans l'exemple caractère par caractère ou que je fasse une grosse expression régulière qui vérifie tout mon XML d'un coup?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Bon pour me faire un petit exemple facile j'ai ajouté le fait que dans la console les logs d'erreurs se mettent en rouge et ça marche à merveille !

    Merci !

  5. #5
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Euh t'es sur que c'est pas de base ça?
    Il me semble
    Essaie plutôt une autre couleur pour être sur
    Pas de questions technique par MP, les forums sont là pour ça.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Euh je me suis encore mal exprimé
    Pour mon plugin je me suis créé une nouvelle vue console, qui contient juste un champ texte et qui jusque là loggait en noir !
    Peut être j'aurai pu réutiliser la console déjà existante mais bon !

    Merci en tout cas !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Bon j'ai fini ma coloration syntaxique pour mon xml alors je vous la partage :

    Il y a beaucoup de limitations dans mon truc :
    - Mon XML est en lecture seule, donc pas de gestion de modification, la coloration est calculée une fois à l'affichage du XML
    - mon XML à un format "qui est toujours le même", j'ai donc fait des expressions régulières qui soient assez simples (dans un autre XML, il se peut que si un espace est placé avant une fin de balise ou quoi, qu'il y ait des soucis, j'ai juste testé avec mon format)
    - Si une double cotte est placée (avec un \ devant, dans une valeur d'attribut, ben c'est considéré comme étant la fin de l'attribut, donc pas top non plus)
    - J'ai fait un système qui permet, lors du calcul de la coloration, de colorer les 2000 premiers caractères avant de calculer le reste (j'ai pris en hypothèse que 2000 caractères serait suffisant pour colorer toute la partie affichée), mais j'ai pas constatée d'amélioration de perf (boaf, je l'avais fait, je l'ai laissé ^^) : Résultat, pour un fichier de quelques milliers de lignes, il faut compter une ou deux secondes avant que le texte se colore...
    - Sans doute beaucoup d'autres soucis auquels je n'ai pas pensé ^^

    Donc voilà un code qui est largement perfectible, mais qui peut faire un point de départ si quelqu'un à un jour besoin de faire quelque chose de similaire !

    Pour rappel textSource est un StyledText
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    private void appliquerColorationSyntaxique(final String xml) {
    	final int length = FUeEditor.this.textSource.getText().length();
    	Job job = new Job("Application de la coloration syntaxique") {
    		public static final int LIMITE = 2000;
     
    		@Override
    		protected IStatus run(IProgressMonitor monitor) {
    			final ArrayList<StyleRange> rangeList = new ArrayList<StyleRange>();
     
    	    	        boolean debutDejaAffiche = false;
    			int finAnalise = 0;
    			//Entete
    			Pattern patternDebutEntete = Pattern.compile("<\\?[\\p{ASCII}]+\\?>");
    			Matcher matcher = patternDebutEntete.matcher(xml);
    			if(matcher.find()){
    				finAnalise = matcher.end();
    				appliquerStyleEntete(matcher.start(), finAnalise, rangeList);
    			}
     
    			//recherche les balises suivantes
    			//Pattern patternBalise = Pattern.compile("<[\\p{ASCII}]+>");
    			Pattern patternBalise = Pattern.compile("<[^>]+>");
    			Pattern baliseVide = Pattern.compile("<[\\s]*[\\S&&[^>]]+[>]+");
    			Pattern debutBalise = Pattern.compile("<[\\s]*[\\S&&[^>]]+[\\s]+");
    			Pattern attributs = Pattern.compile("[\\s]*[\\S]+[=][\\s]*[\"][^\"]*[\"]");
    			matcher = patternBalise.matcher(xml.substring(finAnalise));
    			while(matcher.find()){
    				int indexDebutBalise = matcher.start() + finAnalise;
    				int indexFinBalise = matcher.end() + finAnalise;
    				//appliquerStyleBalise(indexDebutBalise, indexFinBalise, rangeList);
    				String balise = xml.substring(indexDebutBalise, indexFinBalise);
     
    				//Si assez de coloration a été calculée, affichage du début
    				if (indexDebutBalise > LIMITE && !debutDejaAffiche){
    					afficherColoration(rangeList, MODE_AFFICHER_DEBUT);
    					debutDejaAffiche = true;
    				}
     
    				Matcher matcherBalise = baliseVide.matcher(balise);
    				if(matcherBalise.find()){
    					//balise sans attributs
    					int indexFin = matcherBalise.end() + indexDebutBalise;
    					int indexDebut = matcherBalise.start() + indexDebutBalise;
    					appliquerStyleBalise(indexDebut, indexFin, rangeList);
    				}else {
    					//balise avec attributs
    					matcherBalise = debutBalise.matcher(balise);
    					if(matcherBalise.find()){
    						int indexFinPremierePartieBalise = matcherBalise.end() + indexDebutBalise;
    						int indexDebutPremierePartieBalise = matcherBalise.start() + indexDebutBalise;
    						appliquerStyleBalise(indexDebutPremierePartieBalise, indexFinPremierePartieBalise, rangeList);
    						//recherche les attributs
    						String attributsList = xml.substring(indexFinPremierePartieBalise, indexFinBalise);
    						//Pattern attributs = Pattern.compile("[\\s]*[\\s]+[=][\\s]*[\"][\\p{ASCII}]*[\"]");
    						Matcher matcherAttributs = attributs.matcher(attributsList);
    						int indexFinAttribut = indexFinPremierePartieBalise;
    						while (matcherAttributs.find()){
    							indexFinAttribut = matcherAttributs.end() + indexFinPremierePartieBalise;
    							int indexDebutAttribut = matcherAttributs.start() + indexFinPremierePartieBalise;
    							//appliquerStyleValeurAttribut(indexDebutAttribut, indexFinAttribut, rangeList);
    							String attribut = xml.substring(indexDebutAttribut, indexFinAttribut);
    							int indexDuEgal = attribut.indexOf('=');
    							int indexFinNomAttribut = indexDebutAttribut + indexDuEgal;
    							appliquerStyleEntete(indexDebutAttribut, indexFinNomAttribut +1, rangeList);
    							appliquerStyleValeurAttribut(indexFinNomAttribut + 1,indexFinAttribut , rangeList);
     
    						}
    						appliquerStyleBalise(indexFinAttribut,indexFinBalise , rangeList);
    					}
    				}
    			}
     
     
    			if (length < LIMITE){
    				//Rien n'a encore été affiché
    				afficherColoration(rangeList, MODE_AFFICHER_ENTIER);
    			} else {
    				//Le début a déjà été affiché
    				afficherColoration(rangeList, MODE_AFFICHER_FIN);
    			}
     
     
    			return Status.OK_STATUS;
    		}
     
    		public static final int MODE_AFFICHER_DEBUT = 1;
    		public static final int MODE_AFFICHER_FIN = 2;
    		public static final int MODE_AFFICHER_ENTIER = 3;
     
    		private void afficherColoration(final ArrayList<StyleRange> rangeList, final int mode) {
    			Display.getDefault().asyncExec(new Runnable() {
    				@Override
    				public void run() {
    					if (mode == MODE_AFFICHER_ENTIER){
    						//affiche tout d'un coup
    						FUeEditor.this.textSource.replaceStyleRanges(0, length, rangeList.toArray(new StyleRange[rangeList.size()]));
    					}else if (mode == MODE_AFFICHER_DEBUT) {
    						//affiche les premiers 2000 caractères 
    						FUeEditor.this.textSource.replaceStyleRanges(0, LIMITE, rangeList.toArray(new StyleRange[rangeList.size()]));
    						FUeEditor.this.textSource.update();
    					}else if (mode == MODE_AFFICHER_FIN){
    						FUeEditor.this.textSource.replaceStyleRanges(LIMITE, length - LIMITE, rangeList.toArray(new StyleRange[rangeList.size()]));
    					}
    				}
    			});
    		}
    	};
    	job.setSystem(true);
    	job.schedule();
    }
    A plus !

  8. #8
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Merci pour cette contribution
    Pas de questions technique par MP, les forums sont là pour ça.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    De rien !
    D'ailleurs je viens de voir que j'en avait oublié un bout au passage !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    protected void appliquerStyleBalise(int indexDebutBalise, int indexFinBalise, ArrayList<StyleRange> rangeList) {
    	appliquerStyle(indexDebutBalise, indexFinBalise, FUeEditor.BLUE_COLOR, rangeList);
    }
     
    protected void appliquerStyleEntete(int indexDebutBalise, int indexFinBalise, ArrayList<StyleRange> rangeList) {
    	appliquerStyle(indexDebutBalise, indexFinBalise, FUeEditor.GREEN_COLOR, rangeList);
    }
     
    private void appliquerStyle(int indexDebutBalise, int indexFinBalise, Color systemColor, ArrayList<StyleRange> rangeList) {
    	int length = indexFinBalise - indexDebutBalise;
     
    	StyleRange styleRange = new StyleRange(indexDebutBalise, length,systemColor, null);
    	rangeList.add(styleRange);
    }
     
    protected void appliquerStyleValeurAttribut(int indexDebutBalise, int indexFinBalise, ArrayList<StyleRange> rangeList) {
    	appliquerStyle(indexDebutBalise, indexFinBalise,  FUeEditor.RED_COLOR, rangeList);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Coloration syntaxique sur le forum
    Par Anomaly dans le forum Evolutions du club
    Réponses: 133
    Dernier message: 02/12/2014, 18h54
  2. Erreur sur champ text pour un index Full-Text
    Par Steph82 dans le forum Outils
    Réponses: 5
    Dernier message: 06/01/2011, 14h08
  3. Probleme de filtre avec fonction Dlookup sur champ texte
    Par Piloupilou999 dans le forum Access
    Réponses: 5
    Dernier message: 27/01/2007, 22h41
  4. DBMemo sur champ Text erreur insert
    Par htristra dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/11/2005, 15h17
  5. tri sur champ texte
    Par ridan dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/08/2004, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo