Meditor: Unterschied zwischen den Versionen

Aus Physik
Zur Navigation springen Zur Suche springen
Zeile 56: Zeile 56:
 
**Idee: Eine Klasse für RegEx schreiben, die <tt>IRule</tt> oder <tt>IPredicateRule</tt> implementiert.
 
**Idee: Eine Klasse für RegEx schreiben, die <tt>IRule</tt> oder <tt>IPredicateRule</tt> implementiert.
   
  +
Diese Klasse gibt es schon fertig implementiert:
::Eine Möglichkeit wäre es auch die vorgegebenen Rules für dieses Unterfangen zu verwenden, z.B.
 
  +
[http://dev.radrails.org/trac/browser/trunk/org.radrails.rails.ui/src/org/radrails/rails/internal/ui/editors/rhtml/RegExRule.java?rev=476 RegExRule] <br>
:: WordRule wordRule = new WordRule(new MatlabWordDetector(), def);
 
  +
Eine Möglichkeit wäre es vielleicht teilweise auch, die vorgegebenen Rules für dieses Unterfangen zu verwenden, z.B.
::wobei MatlabWordDetector wie folgt implementiert wird:
 
  +
WordRule wordRule = new WordRule(new MatlabWordDetector(), def);
:: import java.util.regex.Pattern;
 
  +
wobei MatlabWordDetector wie folgt implementiert wird:
:: import org.eclipse.jface.text.rules.IWordDetector;
 
  +
import java.util.regex.Pattern;
  +
import org.eclipse.jface.text.rules.IWordDetector;
  +
public class MatlabWordDetector implements IWordDetector {
  +
public boolean isWordStart(char c) {
  +
return Pattern.matches("Regular Expression für WordStart", String.valueOf(c));
  +
}
  +
public boolean isWordPart(char c) {
  +
return Pattern.matches("Regular Expression für WordPart", String.valueOf(c));
  +
}
  +
   
 
==Diverses==
 
==Diverses==

Version vom 14. November 2005, 09:09 Uhr

Ziel

Ein professioneller Editor für Matlab

Features:

  • Syntax-Highlighting
  • Automatische Einrückung
  • Matching Brackets
  • Templates?


Vorhandene Strukturen

In grün Geschriebenes sind die selbst entwickelten Klassen.

Editor

...
  |- org.eclipse.ui.texteditor.AbstractTextEditor
       |- org.eclipse.ui.texteditor.StatusTextEditor
            |- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor
                 |- org.eclipse.ui.editors.text.TextEditor
                      |- at.tugraz.itp.mltutor.meditor.editors.MatlabEditProjection
                           |- at.tugraz.itp.mltutor.meditor.editors.MatlabEditor


Partitionierung des Dokuments

PartitionScanner ist MatlabPartitionScanner.

java.lang.Object
  |- org.eclipse.jface.text.rules.RuleBasedScanner
       |- org.eclipse.jface.text.rules.BufferedRuleBasedScanner
            |- org.eclipse.jface.text.rules.RuleBasedPartitionScanner
                 |- at.tugraz.itp.mltutor.meditor.editors.MatlabPartitionScanner

Der Partitioner ist FastPartitioner (war vorher der deprecated DefaultPartitioner)


Weiters gibt es MatlabScanner, welche allerdings nur für die Erstellung eines DefaultDamageRepairer in der Funktion MatlabConfiguration.getPresentationReconciler(...) verwendet wird.

java.lang.Object
  |- org.eclipse.jface.text.rules.RuleBasedScanner
       |- at.tugraz.itp.mltutor.meditor.editors.MatlabScanner

Warum zwei Scanner:
FastPartitioner wird von MatlabDocumentProvider.createDocument(...) verwendet, und braucht ein IPartitionTokenScanner. Dieses wird von RuleBasedPartitionScanner implementiert, jedoch nicht von RuleBasedScanner. RuleBasedPartitionScanner ist jedoch für IPredicateRules, was von WordRule nicht implementiert ist, gedacht. Letzteres wird für das Scannen nach den Keywords benutzt, weshalb für diesen Zweck letztendlich eine weitere Klasse von RuleBasedScanner abgeleitet wurde.
ABER: es gibt auch die Funktion RuleBasedPartitionScanner.setRules(IRule[] rules), es müsste nur ausprobiert werden, ob die WordRules damit wirklich funktionieren (bin ein wenig durch die Hilfe verwirrt --Osiris).

Weitere Schritte

Partitionierung

  • Schön wäre es, wenn auch Regular Expressions für die Partitionierung verwendet werden könnten. Damit könnten z.B. Variablen erkannt werden, weiters ist es besonders praktisch, dass die RegEx bereits entwickelt sind.
    • Leider gibt es als Futter für den RuleBasedScanner nur die Klassen:
      1. NumberRule
      2. PatternRule, davon abgeleitet:
        • MultiLineRule
        • SingleLineRule
      3. WhitespaceRule
      4. WordRule
    • Idee: Eine Klasse für RegEx schreiben, die IRule oder IPredicateRule implementiert.

Diese Klasse gibt es schon fertig implementiert: RegExRule
Eine Möglichkeit wäre es vielleicht teilweise auch, die vorgegebenen Rules für dieses Unterfangen zu verwenden, z.B.

WordRule wordRule = new WordRule(new MatlabWordDetector(), def); 

wobei MatlabWordDetector wie folgt implementiert wird:

import java.util.regex.Pattern;
import org.eclipse.jface.text.rules.IWordDetector;
public class MatlabWordDetector implements IWordDetector {
public boolean isWordStart(char c) {

return Pattern.matches("Regular Expression für WordStart", String.valueOf(c)); }

public boolean isWordPart(char c) {

return Pattern.matches("Regular Expression für WordPart", String.valueOf(c)); }


Diverses

Anmerkungen zur Entwicklung

Folgende Plugins werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)

  • org.eclipse.ui
  • org.eclipse.core.runtime
  • org.eclipse.ui.workbench.texteditor
  • org.eclipse.jface.text
  • org.eclipse.ui.editors
  • org.eclipse.core.resources
  • org.eclipse.ui.ide
  • org.eclipse.ui.views
  • org.eclipse.jdt.ui

Erstellen eines eigenen Editors (nur Anmerkungen)

  1. Klasse von AbstractTextEditor ableiten
  2. Klasse von SourceViewerConfiguration ableiten
    Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten
  3. Einen DocumentProvider erweitern um ein IDocument Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations.
  4. Actions werden in der Funktion createActions() (Memberfunktion des erzeugten Editors) hinzugefügt.


Fragen

  • Wie wichtig ist eine korrekte Partitionierung des Dokuments? => evt. sollten die beiden Scanner zusammengelegt werden.