https://itp.tugraz.at/wiki/api.php?action=feedcontributions&user=Osiris&feedformat=atomPhysik - Benutzerbeiträge [de-at]2024-03-28T09:35:57ZBenutzerbeiträgeMediaWiki 1.34.2https://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5748Meditor2008-02-01T12:12:59Z<p>Osiris: /* Weitere Schritte */ Erledigtes rausgegeben</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Hilfe für Toolbox-Funktionen<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
TOOLBOX_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei derzeit zwischen Matlab-Funktionen, Toolbox-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Lookaheads und Lookbacks automatisch aus der Regex extrahieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Benutzer:Osiris&diff=5747Benutzer:Osiris2008-02-01T09:56:30Z<p>Osiris: /* Seiten in Arbeit */</p>
<hr />
<div>'''Name: ''' Georg Huhs<br />
<br />
'''Studium: ''' F810 Technische Physik<br />
<br />
'''Email: ''' [mailto:osiris@sbox.tugraz.at osiris@sbox.tugraz.at]<br />
<br />
<br />
== Seiten in Arbeit ==<br />
<br />
[[Meditor]]<br />
: [[Meditor_Benutzerseite]]<br />
: [[Filetools]]<br />
: [[Meditor_XML-Export]]<br />
<br />
[[Buchempfehlungen]]<br />
<br />
[[Tschernobyl]]<br />
<br />
[[User-Login_Absicherung]]<br />
<br />
[[Numerische_Methoden]]<br />
: [[Verwendung_von_gnuplot_i]]<br />
<br />
'''Weitere Ideen für [[Numerische_Methoden]]:'''<br />
* Variablenübergabe bei Funktionsaufrufen<br />
* mehrdimensionale Arrays<br />
* Angabe der Ressourcen die von Prof. Sormann zur Verfügung gestellt werden<br />
<br />
<br />
auf folgende bitte nicht verweisen - Danke<br />
<br />
[[Osiris-Testseite]]</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5745Meditor2008-01-29T17:35:29Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Hilfe für Toolbox-Funktionen<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
TOOLBOX_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei derzeit zwischen Matlab-Funktionen, Toolbox-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Matlab_Referenz_mit_Details&diff=5342Matlab Referenz mit Details2008-01-19T14:12:29Z<p>Osiris: /* Special Pages */</p>
<hr />
<div>= Special Pages = <br />
[http://itp.tugraz.at/matlab/techdoc/ref/index.html Matlab Function Reference] <br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/arithmeticoperators.html Arithmetic Operators + - * / \ ^ ']<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/relationaloperators.html Relational Operators < > <= >= == ~=]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorselementwise.html Logical Operators: Elementwise & | ~]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorsshortcircuit.html Logical Operators: Short-circuit && ||]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/specialcharacters.html <nowiki>Special Characters [ ] ( ) {} = ' . ... , ; : % ! @</nowiki>]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/colon.html colon (:)]<br />
<br />
= a =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="accumarray">[http://itp.tugraz.at/matlab/techdoc/ref/accumarray.html accumarray]</span><br />
| Construct an array with accumulation<br />
|-<br />
| style="width:30%" | <span id="abs">[http://itp.tugraz.at/matlab/techdoc/ref/abs.html abs]</span><br />
| Absolute value and complex magnitude<br />
|-<br />
| style="width:30%" | <span id="acos">[http://itp.tugraz.at/matlab/techdoc/ref/acos.html acos]</span><br />
| Inverse cosine, result in radians<br />
|-<br />
| style="width:30%" | <span id="actxcontrol">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrol.html actxcontrol]</span><br />
| Create ActiveX control in figure window <br />
|-<br />
| style="width:30%" | <span id="acosd">[http://itp.tugraz.at/matlab/techdoc/ref/acosd.html acosd]</span><br />
| Inverse cosine, result in degrees<br />
|-<br />
| style="width:30%" | <span id="acosh">[http://itp.tugraz.at/matlab/techdoc/ref/acosh.html acosh]</span><br />
| Inverse hyperbolic cosine<br />
|-<br />
| style="width:30%" | <span id="acot">[http://itp.tugraz.at/matlab/techdoc/ref/acot.html acot]</span><br />
| Inverse cotangent, result in radians<br />
|-<br />
| style="width:30%" | <span id="acotd">[http://itp.tugraz.at/matlab/techdoc/ref/acotd.html acotd]</span><br />
| Inverse cotangent, result in degrees<br />
|-<br />
| style="width:30%" | <span id="acoth">[http://itp.tugraz.at/matlab/techdoc/ref/acoth.html acoth]</span><br />
| Inverse hyperbolic cotangent<br />
|-<br />
| style="width:30%" | <span id="acsc">[http://itp.tugraz.at/matlab/techdoc/ref/acsc.html acsc]</span><br />
| Inverse cosecant, result in radians<br />
|-<br />
| style="width:30%" | <span id="acscd">[http://itp.tugraz.at/matlab/techdoc/ref/acscd.html acscd]</span><br />
| Inverse cosecant, result in degrees<br />
|-<br />
| style="width:30%" | <span id="acsch">[http://itp.tugraz.at/matlab/techdoc/ref/acsch.html acsch]</span><br />
| Inverse cosecant and inverse hyperbolic cosecant<br />
|-<br />
| style="width:30%" | <span id="actxcontrolselect">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrolselect.html actxcontrolselect]</span><br />
| Display graphical interface for creating an ActiveX control<br />
|-<br />
| style="width:30%" | <span id="actxcontrollist">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrollist.html actxcontrollist]</span><br />
| List all currently installed ActiveX controls<br />
|-<br />
| style="width:30%" | <span id="arithmeticoperators">[http://itp.tugraz.at/matlab/techdoc/ref/arithmeticoperators.html arithmeticoperators]</span><br />
| Matrix and array arithmetic<br />
|-<br />
| style="width:30%" | <span id="actxserver">[http://itp.tugraz.at/matlab/techdoc/ref/actxserver.html actxserver]</span><br />
| Create COM Automation server <br />
|-<br />
| style="width:30%" | <span id="addframe">[http://itp.tugraz.at/matlab/techdoc/ref/addframe.html addframe]</span><br />
| Add frame to Audio/Video Interleaved (AVI) file <br />
|-<br />
| style="width:30%" | <span id="addpath">[http://itp.tugraz.at/matlab/techdoc/ref/addpath.html addpath]</span><br />
| Add directories to MATLAB search path<br />
|-<br />
| style="width:30%" | <span id="addpref">[http://itp.tugraz.at/matlab/techdoc/ref/addpref.html addpref]</span><br />
| Add preference<br />
|-<br />
| style="width:30%" | <span id="addproperty">[http://itp.tugraz.at/matlab/techdoc/ref/addproperty.html addproperty]</span><br />
| Add custom property to object <br />
|-<br />
| style="width:30%" | <span id="addtodate">[http://itp.tugraz.at/matlab/techdoc/ref/addtodate.html addtodate]</span><br />
| Modify date number by field<br />
|-<br />
| style="width:30%" | <span id="airy">[http://itp.tugraz.at/matlab/techdoc/ref/airy.html airy]</span><br />
| Airy functions<br />
|-<br />
| style="width:30%" | <span id="alim">[http://itp.tugraz.at/matlab/techdoc/ref/alim.html alim]</span><br />
| Set or query the axes alpha limits <br />
|-<br />
| style="width:30%" | <span id="all">[http://itp.tugraz.at/matlab/techdoc/ref/all.html all]</span><br />
| Determine if all array elements are nonzero<br />
|-<br />
| style="width:30%" | <span id="allchild">[http://itp.tugraz.at/matlab/techdoc/ref/allchild.html allchild]</span><br />
| Find all children of specified objects<br />
|-<br />
| style="width:30%" | <span id="alpha">[http://itp.tugraz.at/matlab/techdoc/ref/alpha.html alpha]</span><br />
| Set transparency properties for objects in current axes<br />
|-<br />
| style="width:30%" | <span id="alphamap">[http://itp.tugraz.at/matlab/techdoc/ref/alphamap.html alphamap]</span><br />
| Specify the figure alphamap (transparency)<br />
|-<br />
| style="width:30%" | <span id="ancestor">[http://itp.tugraz.at/matlab/techdoc/ref/ancestor.html ancestor]</span><br />
| Get ancestor of graphics object<br />
|-<br />
| style="width:30%" | <span id="and">[http://itp.tugraz.at/matlab/techdoc/ref/and.html and]</span><br />
| Find logical AND of array or scalar inputs<br />
|-<br />
| style="width:30%" | <span id="angle">[http://itp.tugraz.at/matlab/techdoc/ref/angle.html angle]</span><br />
| Phase angle<br />
|-<br />
| style="width:30%" | <span id="annotation">[http://itp.tugraz.at/matlab/techdoc/ref/annotation.html annotation]</span><br />
| Create annotation objects<br />
|-<br />
| style="width:30%" | <span id="annotationdoublearrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationdoublearrowproperties.html annotationdoublearrowproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="annotationarrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationarrowproperties.html annotationarrowproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="annotationrectangleproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationrectangleproperties.html annotationrectangleproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="annotationellipseproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationellipseproperties.html annotationellipseproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="annotationlineproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationlineproperties.html annotationlineproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="ans">[http://itp.tugraz.at/matlab/techdoc/ref/ans.html ans]</span><br />
| The most recent answer<br />
|-<br />
| style="width:30%" | <span id="any">[http://itp.tugraz.at/matlab/techdoc/ref/any.html any]</span><br />
| Determine if any array elements are nonzero<br />
|-<br />
| style="width:30%" | <span id="annotationtextarrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationtextarrowproperties.html annotationtextarrowproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="annotationtextboxproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationtextboxproperties.html annotationtextboxproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="area">[http://itp.tugraz.at/matlab/techdoc/ref/area.html area]</span><br />
| Filled area 2-D plot<br />
|-<br />
| style="width:30%" | <span id="asec">[http://itp.tugraz.at/matlab/techdoc/ref/asec.html asec]</span><br />
| Inverse secant, result in radians<br />
|-<br />
| style="width:30%" | <span id="areaseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/areaseriesproperties.html areaseriesproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="arrayfun">[http://itp.tugraz.at/matlab/techdoc/ref/arrayfun.html arrayfun]</span><br />
| Apply function to each element of array<br />
|-<br />
| style="width:30%" | <span id="ascii">[http://itp.tugraz.at/matlab/techdoc/ref/ascii.html ascii]</span><br />
| Set FTP transfer type to ASCII<br />
|-<br />
| style="width:30%" | <span id="assignin">[http://itp.tugraz.at/matlab/techdoc/ref/assignin.html assignin]</span><br />
| Assign value to variable in specified workspace<br />
|-<br />
| style="width:30%" | <span id="asecd">[http://itp.tugraz.at/matlab/techdoc/ref/asecd.html asecd]</span><br />
| Inverse secant, result in degrees<br />
|-<br />
| style="width:30%" | <span id="asech">[http://itp.tugraz.at/matlab/techdoc/ref/asech.html asech]</span><br />
| Inverse hyperbolic secant<br />
|-<br />
| style="width:30%" | <span id="asin">[http://itp.tugraz.at/matlab/techdoc/ref/asin.html asin]</span><br />
| Inverse sine, result in radians<br />
|-<br />
| style="width:30%" | <span id="asind">[http://itp.tugraz.at/matlab/techdoc/ref/asind.html asind]</span><br />
| Inverse sine, result in degrees<br />
|-<br />
| style="width:30%" | <span id="asinh">[http://itp.tugraz.at/matlab/techdoc/ref/asinh.html asinh]</span><br />
| Inverse hyperbolic sine<br />
|-<br />
| style="width:30%" | <span id="atan">[http://itp.tugraz.at/matlab/techdoc/ref/atan.html atan]</span><br />
| Inverse tangent, result in radians<br />
|-<br />
| style="width:30%" | <span id="audioplayer">[http://itp.tugraz.at/matlab/techdoc/ref/audioplayer.html audioplayer]</span><br />
| Create audio player object<br />
|-<br />
| style="width:30%" | <span id="atan2">[http://itp.tugraz.at/matlab/techdoc/ref/atan2.html atan2]</span><br />
| Four-quadrant inverse tangent<br />
|-<br />
| style="width:30%" | <span id="atand">[http://itp.tugraz.at/matlab/techdoc/ref/atand.html atand]</span><br />
| Inverse tangent, result in degrees<br />
|-<br />
| style="width:30%" | <span id="atanh">[http://itp.tugraz.at/matlab/techdoc/ref/atanh.html atanh]</span><br />
| Inverse hyperbolic tangent<br />
|-<br />
| style="width:30%" | <span id="audiorecorder">[http://itp.tugraz.at/matlab/techdoc/ref/audiorecorder.html audiorecorder]</span><br />
| Create audio recorder object<br />
|-<br />
| style="width:30%" | <span id="aufinfo">[http://itp.tugraz.at/matlab/techdoc/ref/aufinfo.html aufinfo]</span><br />
| Return information about NeXT/SUN (<code>.au</code>) sound file<br />
|-<br />
| style="width:30%" | <span id="auread">[http://itp.tugraz.at/matlab/techdoc/ref/auread.html auread]</span><br />
| Read NeXT/SUN (<code>.au</code>) sound file<br />
|-<br />
| style="width:30%" | <span id="auwrite">[http://itp.tugraz.at/matlab/techdoc/ref/auwrite.html auwrite]</span><br />
| Write NeXT/SUN (<code>.au</code>) sound file<br />
|-<br />
| style="width:30%" | <span id="avifile">[http://itp.tugraz.at/matlab/techdoc/ref/avifile.html avifile]</span><br />
| Create new Audio/Video Interleaved (AVI) file<br />
|-<br />
| style="width:30%" | <span id="aviinfo">[http://itp.tugraz.at/matlab/techdoc/ref/aviinfo.html aviinfo]</span><br />
| Return information about Audio/Video Interleaved (AVI) file <br />
|-<br />
| style="width:30%" | <span id="aviread">[http://itp.tugraz.at/matlab/techdoc/ref/aviread.html aviread]</span><br />
| Read Audio/Video Interleaved (AVI) file <br />
|-<br />
| style="width:30%" | <span id="axes">[http://itp.tugraz.at/matlab/techdoc/ref/axes.html axes]</span><br />
| Create axes graphics object<br />
|-<br />
| style="width:30%" | <span id="axes_props">[http://itp.tugraz.at/matlab/techdoc/ref/axes_props.html axes_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="axis">[http://itp.tugraz.at/matlab/techdoc/ref/axis.html axis]</span><br />
| Axis scaling and appearance <br />
|-<br />
|}<br />
<br />
= b =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="barseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/barseriesproperties.html barseriesproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="balance">[http://itp.tugraz.at/matlab/techdoc/ref/balance.html balance]</span><br />
| Diagonal scaling to improve eigenvalue accuracy<br />
|-<br />
| style="width:30%" | <span id="bar">[http://itp.tugraz.at/matlab/techdoc/ref/bar.html bar]</span><br />
| Plot bar graph (vertical and horizontal)<br />
|-<br />
| style="width:30%" | <span id="bar3">[http://itp.tugraz.at/matlab/techdoc/ref/bar3.html bar3]</span><br />
| Plot three-dimensional bar chart<br />
|-<br />
| style="width:30%" | <span id="bar3h">[http://itp.tugraz.at/matlab/techdoc/ref/bar3h.html bar3h]</span><br />
| Plot three-dimensional bar chart<br />
|-<br />
| style="width:30%" | <span id="barh">[http://itp.tugraz.at/matlab/techdoc/ref/barh.html barh]</span><br />
| Plot bar graph (vertical and horizontal)<br />
|-<br />
| style="width:30%" | <span id="base2dec">[http://itp.tugraz.at/matlab/techdoc/ref/base2dec.html base2dec]</span><br />
| Convert base N number string to decimal number <br />
|-<br />
| style="width:30%" | <span id="beep">[http://itp.tugraz.at/matlab/techdoc/ref/beep.html beep]</span><br />
| Produce beep sound<br />
|-<br />
| style="width:30%" | <span id="besselh">[http://itp.tugraz.at/matlab/techdoc/ref/besselh.html besselh]</span><br />
| Bessel function of the third kind (Hankel function) <br />
|-<br />
| style="width:30%" | <span id="besseli">[http://itp.tugraz.at/matlab/techdoc/ref/besseli.html besseli]</span><br />
| Modified Bessel function of the first kind <br />
|-<br />
| style="width:30%" | <span id="besselj">[http://itp.tugraz.at/matlab/techdoc/ref/besselj.html besselj]</span><br />
| Bessel function of the first kind<br />
|-<br />
| style="width:30%" | <span id="besselk">[http://itp.tugraz.at/matlab/techdoc/ref/besselk.html besselk]</span><br />
| Modified Bessel function of the second kind <br />
|-<br />
| style="width:30%" | <span id="bessely">[http://itp.tugraz.at/matlab/techdoc/ref/bessely.html bessely]</span><br />
| Bessel functions of the second kind<br />
|-<br />
| style="width:30%" | <span id="beta">[http://itp.tugraz.at/matlab/techdoc/ref/beta.html beta]</span><br />
| Beta function<br />
|-<br />
| style="width:30%" | <span id="betainc">[http://itp.tugraz.at/matlab/techdoc/ref/betainc.html betainc]</span><br />
| Incomplete beta function<br />
|-<br />
| style="width:30%" | <span id="betaln">[http://itp.tugraz.at/matlab/techdoc/ref/betaln.html betaln]</span><br />
| Logarithm of beta function<br />
|-<br />
| style="width:30%" | <span id="bicg">[http://itp.tugraz.at/matlab/techdoc/ref/bicg.html bicg]</span><br />
| Biconjugate gradients method<br />
|-<br />
| style="width:30%" | <span id="bicgstab">[http://itp.tugraz.at/matlab/techdoc/ref/bicgstab.html bicgstab]</span><br />
| Biconjugate gradients stabilized method<br />
|-<br />
| style="width:30%" | <span id="bin2dec">[http://itp.tugraz.at/matlab/techdoc/ref/bin2dec.html bin2dec]</span><br />
| Convert binary number string to decimal number<br />
|-<br />
| style="width:30%" | <span id="binary">[http://itp.tugraz.at/matlab/techdoc/ref/binary.html binary]</span><br />
| Set FTP transfer type to binary<br />
|-<br />
| style="width:30%" | <span id="bitand">[http://itp.tugraz.at/matlab/techdoc/ref/bitand.html bitand]</span><br />
| Return bitwise AND<br />
|-<br />
| style="width:30%" | <span id="bitcmp">[http://itp.tugraz.at/matlab/techdoc/ref/bitcmp.html bitcmp]</span><br />
| Return bitwise complement<br />
|-<br />
| style="width:30%" | <span id="bitget">[http://itp.tugraz.at/matlab/techdoc/ref/bitget.html bitget]</span><br />
| Get bit at specified position<br />
|-<br />
| style="width:30%" | <span id="bitmax">[http://itp.tugraz.at/matlab/techdoc/ref/bitmax.html bitmax]</span><br />
| Return maximum double-precision floating-point integer<br />
|-<br />
| style="width:30%" | <span id="bitor">[http://itp.tugraz.at/matlab/techdoc/ref/bitor.html bitor]</span><br />
| Return bitwise OR<br />
|-<br />
| style="width:30%" | <span id="bitset">[http://itp.tugraz.at/matlab/techdoc/ref/bitset.html bitset]</span><br />
| Set bit at specified position<br />
|-<br />
| style="width:30%" | <span id="bitshift">[http://itp.tugraz.at/matlab/techdoc/ref/bitshift.html bitshift]</span><br />
| Shift bits specified number of places<br />
|-<br />
| style="width:30%" | <span id="bitxor">[http://itp.tugraz.at/matlab/techdoc/ref/bitxor.html bitxor]</span><br />
| Return bitwise XOR<br />
|-<br />
| style="width:30%" | <span id="blanks">[http://itp.tugraz.at/matlab/techdoc/ref/blanks.html blanks]</span><br />
| Create string of blank characters<br />
|-<br />
| style="width:30%" | <span id="blkdiag">[http://itp.tugraz.at/matlab/techdoc/ref/blkdiag.html blkdiag]</span><br />
| Construct a block diagonal matrix from input arguments<br />
|-<br />
| style="width:30%" | <span id="box">[http://itp.tugraz.at/matlab/techdoc/ref/box.html box]</span><br />
| Display axes border<br />
|-<br />
| style="width:30%" | <span id="break">[http://itp.tugraz.at/matlab/techdoc/ref/break.html break]</span><br />
| Terminate execution of <code>for</code> or <code>while</code> loop<br />
|-<br />
| style="width:30%" | <span id="brighten">[http://itp.tugraz.at/matlab/techdoc/ref/brighten.html brighten]</span><br />
| Brighten or darken colormap<br />
|-<br />
| style="width:30%" | <span id="builtin">[http://itp.tugraz.at/matlab/techdoc/ref/builtin.html builtin]</span><br />
| Execute built-in function from overloaded method<br />
|-<br />
| style="width:30%" | <span id="bvp4c">[http://itp.tugraz.at/matlab/techdoc/ref/bvp4c.html bvp4c]</span><br />
| Solve boundary value problems (BVPs) for ordinary differential equations<br />
|-<br />
| style="width:30%" | <span id="bvpget">[http://itp.tugraz.at/matlab/techdoc/ref/bvpget.html bvpget]</span><br />
| Extract properties from the options structure created with [http://itp.tugraz.at/matlab/techdoc/ref/bvpset.html bvpset]<br />
|-<br />
| style="width:30%" | <span id="bvpinit">[http://itp.tugraz.at/matlab/techdoc/ref/bvpinit.html bvpinit]</span><br />
| Form the initial guess for <code>bvp4c</code><br />
|-<br />
| style="width:30%" | <span id="bvpset">[http://itp.tugraz.at/matlab/techdoc/ref/bvpset.html bvpset]</span><br />
| Create or alter boundary value problem (BVP) options structure<br />
|-<br />
| style="width:30%" | <span id="bvpval">[http://itp.tugraz.at/matlab/techdoc/ref/bvpval.html bvpval]</span><br />
| Evaluate the numerical solution of a boundary value problem (BVP) using the output of [http://itp.tugraz.at/matlab/techdoc/ref/bvp4c.html bvp4c]<br />
|-<br />
|}<br />
<br />
= c =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="callsoapservice">[http://itp.tugraz.at/matlab/techdoc/ref/callsoapservice.html callsoapservice]</span><br />
| Send SOAP message off to endpoint<br />
|-<br />
| style="width:30%" | <span id="calendar">[http://itp.tugraz.at/matlab/techdoc/ref/calendar.html calendar]</span><br />
| Display calendar for specified month<br />
|-<br />
| style="width:30%" | <span id="calllib">[http://itp.tugraz.at/matlab/techdoc/ref/calllib.html calllib]</span><br />
| Call function in external library<br />
|-<br />
| style="width:30%" | <span id="cameratoolbar">[http://itp.tugraz.at/matlab/techdoc/ref/cameratoolbar.html cameratoolbar]</span><br />
| Control camera toolbar programmatically<br />
|-<br />
| style="width:30%" | <span id="camdolly">[http://itp.tugraz.at/matlab/techdoc/ref/camdolly.html camdolly]</span><br />
| Move the camera position and target<br />
|-<br />
| style="width:30%" | <span id="closeavifile">[http://itp.tugraz.at/matlab/techdoc/ref/closeavifile.html closeavifile]</span><br />
| Close Audio/Video Interleaved (AVI) file<br />
|-<br />
| style="width:30%" | <span id="camlight">[http://itp.tugraz.at/matlab/techdoc/ref/camlight.html camlight]</span><br />
| Create or move a light [http://itp.tugraz.at/matlab/techdoc/ref/light.html object] in camera coordinates<br />
|-<br />
| style="width:30%" | <span id="camlookat">[http://itp.tugraz.at/matlab/techdoc/ref/camlookat.html camlookat]</span><br />
| Position the camera to view an object or group of objects<br />
|-<br />
| style="width:30%" | <span id="camorbit">[http://itp.tugraz.at/matlab/techdoc/ref/camorbit.html camorbit]</span><br />
| Rotate the camera position around the camera target<br />
|-<br />
| style="width:30%" | <span id="campan">[http://itp.tugraz.at/matlab/techdoc/ref/campan.html campan]</span><br />
| Rotate the camera target around the camera position<br />
|-<br />
| style="width:30%" | <span id="campos">[http://itp.tugraz.at/matlab/techdoc/ref/campos.html campos]</span><br />
| Set or query the camera position<br />
|-<br />
| style="width:30%" | <span id="camproj">[http://itp.tugraz.at/matlab/techdoc/ref/camproj.html camproj]</span><br />
| Set or query the projection type<br />
|-<br />
| style="width:30%" | <span id="camroll">[http://itp.tugraz.at/matlab/techdoc/ref/camroll.html camroll]</span><br />
| Rotate the camera about the view axis<br />
|-<br />
| style="width:30%" | <span id="camtarget">[http://itp.tugraz.at/matlab/techdoc/ref/camtarget.html camtarget]</span><br />
| Set or query the location of the camera target<br />
|-<br />
| style="width:30%" | <span id="camup">[http://itp.tugraz.at/matlab/techdoc/ref/camup.html camup]</span><br />
| Set or query the camera up vector<br />
|-<br />
| style="width:30%" | <span id="camva">[http://itp.tugraz.at/matlab/techdoc/ref/camva.html camva]</span><br />
| Set or query the camera view angle<br />
|-<br />
| style="width:30%" | <span id="camzoom">[http://itp.tugraz.at/matlab/techdoc/ref/camzoom.html camzoom]</span><br />
| Zoom in and out on a scene<br />
|-<br />
| style="width:30%" | <span id="cart2pol">[http://itp.tugraz.at/matlab/techdoc/ref/cart2pol.html cart2pol]</span><br />
| Transform Cartesian coordinates to polar or cylindrical<br />
|-<br />
| style="width:30%" | <span id="cart2sph">[http://itp.tugraz.at/matlab/techdoc/ref/cart2sph.html cart2sph]</span><br />
| Transform Cartesian coordinates to spherical<br />
|-<br />
| style="width:30%" | <span id="case">[http://itp.tugraz.at/matlab/techdoc/ref/case.html case]</span><br />
| Execute block of code if condition is <code>true</code><br />
|-<br />
| style="width:30%" | <span id="cast">[http://itp.tugraz.at/matlab/techdoc/ref/cast.html cast]</span><br />
| Cast variable to different data type<br />
|-<br />
| style="width:30%" | <span id="cat">[http://itp.tugraz.at/matlab/techdoc/ref/cat.html cat]</span><br />
| Concatenate arrays along specified dimension<br />
|-<br />
| style="width:30%" | <span id="catch">[http://itp.tugraz.at/matlab/techdoc/ref/catch.html catch]</span><br />
| Specify how to respond to error in <code>try</code> statement<br />
|-<br />
| style="width:30%" | <span id="cd">[http://itp.tugraz.at/matlab/techdoc/ref/cd.html cd]</span><br />
| Change working directory<br />
|-<br />
| style="width:30%" | <span id="caxis">[http://itp.tugraz.at/matlab/techdoc/ref/caxis.html caxis]</span><br />
| Color axis scaling<br />
|-<br />
| style="width:30%" | <span id="cgs">[http://itp.tugraz.at/matlab/techdoc/ref/cgs.html cgs]</span><br />
| Conjugate gradients squared method<br />
|-<br />
| style="width:30%" | <span id="cdf2rdf">[http://itp.tugraz.at/matlab/techdoc/ref/cdf2rdf.html cdf2rdf]</span><br />
| Convert complex diagonal form to real block diagonal form<br />
|-<br />
| style="width:30%" | <span id="cdfepoch">[http://itp.tugraz.at/matlab/techdoc/ref/cdfepoch.html cdfepoch]</span><br />
| Construct <code>cdfepoch</code> object for Common Data Format (CDF) export<br />
|-<br />
| style="width:30%" | <span id="cdfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/cdfinfo.html cdfinfo]</span><br />
| Return information about CDF file<br />
|-<br />
| style="width:30%" | <span id="cdfread">[http://itp.tugraz.at/matlab/techdoc/ref/cdfread.html cdfread]</span><br />
| Read data from CDF file<br />
|-<br />
| style="width:30%" | <span id="cdftp">[http://itp.tugraz.at/matlab/techdoc/ref/cdftp.html cdftp]</span><br />
| Change current directory on FTP server<br />
|-<br />
| style="width:30%" | <span id="cdfwrite">[http://itp.tugraz.at/matlab/techdoc/ref/cdfwrite.html cdfwrite]</span><br />
| Write data to CDF file<br />
|-<br />
| style="width:30%" | <span id="ceil">[http://itp.tugraz.at/matlab/techdoc/ref/ceil.html ceil]</span><br />
| Round toward infinity<br />
|-<br />
| style="width:30%" | <span id="cell">[http://itp.tugraz.at/matlab/techdoc/ref/cell.html cell]</span><br />
| Construct cell array<br />
|-<br />
| style="width:30%" | <span id="cell2mat">[http://itp.tugraz.at/matlab/techdoc/ref/cell2mat.html cell2mat]</span><br />
| Convert cell array of matrices to single matrix<br />
|-<br />
| style="width:30%" | <span id="cell2struct">[http://itp.tugraz.at/matlab/techdoc/ref/cell2struct.html cell2struct]</span><br />
| Convert cell array to structure array<br />
|-<br />
| style="width:30%" | <span id="celldisp">[http://itp.tugraz.at/matlab/techdoc/ref/celldisp.html celldisp]</span><br />
| Display cell array contents.<br />
|-<br />
| style="width:30%" | <span id="cellfun">[http://itp.tugraz.at/matlab/techdoc/ref/cellfun.html cellfun]</span><br />
| Apply function to each cell in cell array<br />
|-<br />
| style="width:30%" | <span id="cellplot">[http://itp.tugraz.at/matlab/techdoc/ref/cellplot.html cellplot]</span><br />
| Graphically display structure of cell arrays<br />
|-<br />
| style="width:30%" | <span id="cellstr">[http://itp.tugraz.at/matlab/techdoc/ref/cellstr.html cellstr]</span><br />
| Create cell array of strings from character array<br />
|-<br />
| style="width:30%" | <span id="char">[http://itp.tugraz.at/matlab/techdoc/ref/char.html char]</span><br />
| Convert to character array (string)<br />
|-<br />
| style="width:30%" | <span id="checkin">[http://itp.tugraz.at/matlab/techdoc/ref/checkin.html checkin]</span><br />
| Check files into source control system (UNIX only)<br />
|-<br />
| style="width:30%" | <span id="checkout">[http://itp.tugraz.at/matlab/techdoc/ref/checkout.html checkout]</span><br />
| Check files out of source control system (UNIX only)<br />
|-<br />
| style="width:30%" | <span id="chol">[http://itp.tugraz.at/matlab/techdoc/ref/chol.html chol]</span><br />
| Cholesky factorization<br />
|-<br />
| style="width:30%" | <span id="cholinc">[http://itp.tugraz.at/matlab/techdoc/ref/cholinc.html cholinc]</span><br />
| Sparse incomplete Cholesky and Cholesky-Infinity factorizations<br />
|-<br />
| style="width:30%" | <span id="cholupdate">[http://itp.tugraz.at/matlab/techdoc/ref/cholupdate.html cholupdate]</span><br />
| Rank 1 update to Cholesky factorization<br />
|-<br />
| style="width:30%" | <span id="circshift">[http://itp.tugraz.at/matlab/techdoc/ref/circshift.html circshift]</span><br />
| Shift array circularly<br />
|-<br />
| style="width:30%" | <span id="cla">[http://itp.tugraz.at/matlab/techdoc/ref/cla.html cla]</span><br />
| Clear current axes<br />
|-<br />
| style="width:30%" | <span id="clabel">[http://itp.tugraz.at/matlab/techdoc/ref/clabel.html clabel]</span><br />
| Contour plot elevation labels<br />
|-<br />
| style="width:30%" | <span id="class">[http://itp.tugraz.at/matlab/techdoc/ref/class.html class]</span><br />
| Create object or return class of object<br />
|-<br />
| style="width:30%" | <span id="clc">[http://itp.tugraz.at/matlab/techdoc/ref/clc.html clc]</span><br />
| Clear Command Window<br />
|-<br />
| style="width:30%" | <span id="clear">[http://itp.tugraz.at/matlab/techdoc/ref/clear.html clear]</span><br />
| Remove items from workspace, freeing up system memory<br />
|-<br />
| style="width:30%" | <span id="clearserial">[http://itp.tugraz.at/matlab/techdoc/ref/clearserial.html clearserial]</span><br />
| Remove a serial port object from the MATLAB workspace<br />
|-<br />
| style="width:30%" | <span id="clf">[http://itp.tugraz.at/matlab/techdoc/ref/clf.html clf]</span><br />
| Clear current figure window<br />
|-<br />
| style="width:30%" | <span id="clipboard">[http://itp.tugraz.at/matlab/techdoc/ref/clipboard.html clipboard]</span><br />
| Copy and paste strings to and from system clipboard<br />
|-<br />
| style="width:30%" | <span id="clock">[http://itp.tugraz.at/matlab/techdoc/ref/clock.html clock]</span><br />
| Return current time as date vector<br />
|-<br />
| style="width:30%" | <span id="close">[http://itp.tugraz.at/matlab/techdoc/ref/close.html close]</span><br />
| Delete specified figure<br />
|-<br />
| style="width:30%" | <span id="closeftp">[http://itp.tugraz.at/matlab/techdoc/ref/closeftp.html closeftp]</span><br />
| Close connection to FTP server<br />
|-<br />
| style="width:30%" | <span id="colormapeditor">[http://itp.tugraz.at/matlab/techdoc/ref/colormapeditor.html colormapeditor]</span><br />
| Start colormap editor<br />
|-<br />
| style="width:30%" | <span id="closereq">[http://itp.tugraz.at/matlab/techdoc/ref/closereq.html closereq]</span><br />
| Default figure close request function<br />
|-<br />
| style="width:30%" | <span id="cmopts">[http://itp.tugraz.at/matlab/techdoc/ref/cmopts.html cmopts]</span><br />
| Get name of source control system<br />
|-<br />
| style="width:30%" | <span id="colamd">[http://itp.tugraz.at/matlab/techdoc/ref/colamd.html colamd]</span><br />
| Column approximate minimum degree permutation<br />
|-<br />
| style="width:30%" | <span id="colmmd">[http://itp.tugraz.at/matlab/techdoc/ref/colmmd.html colmmd]</span><br />
| Sparse column minimum degree permutation<br />
|-<br />
| style="width:30%" | <span id="colon">[http://itp.tugraz.at/matlab/techdoc/ref/colon.html colon]</span><br />
| Create vectors, array subscripting, and <code>for</code> loop iterations<br />
|-<br />
| style="width:30%" | <span id="colorbar">[http://itp.tugraz.at/matlab/techdoc/ref/colorbar.html colorbar]</span><br />
| Display colorbar showing the color scale<br />
|-<br />
| style="width:30%" | <span id="colordef">[http://itp.tugraz.at/matlab/techdoc/ref/colordef.html colordef]</span><br />
| Set default property values to display different color schemes<br />
|-<br />
| style="width:30%" | <span id="colormap">[http://itp.tugraz.at/matlab/techdoc/ref/colormap.html colormap]</span><br />
| Set and get the current colormap<br />
|-<br />
| style="width:30%" | <span id="commandhistory">[http://itp.tugraz.at/matlab/techdoc/ref/commandhistory.html commandhistory]</span><br />
| Open Command History window, or select it if already open<br />
|-<br />
| style="width:30%" | <span id="colorspec">[http://itp.tugraz.at/matlab/techdoc/ref/colorspec.html colorspec]</span><br />
| Color specification<br />
|-<br />
| style="width:30%" | <span id="colperm">[http://itp.tugraz.at/matlab/techdoc/ref/colperm.html colperm]</span><br />
| Sparse column permutation based on nonzero count <br />
|-<br />
| style="width:30%" | <span id="comet">[http://itp.tugraz.at/matlab/techdoc/ref/comet.html comet]</span><br />
| Two-dimensional comet plot<br />
|-<br />
| style="width:30%" | <span id="comet3">[http://itp.tugraz.at/matlab/techdoc/ref/comet3.html comet3]</span><br />
| Three-dimensional comet plot<br />
|-<br />
| style="width:30%" | <span id="contourgroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/contourgroupproperties.html contourgroupproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="commandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/commandwindow.html commandwindow]</span><br />
| Open Command Window, or select it if already open<br />
|-<br />
| style="width:30%" | <span id="compan">[http://itp.tugraz.at/matlab/techdoc/ref/compan.html compan]</span><br />
| Companion matrix<br />
|-<br />
| style="width:30%" | <span id="compass">[http://itp.tugraz.at/matlab/techdoc/ref/compass.html compass]</span><br />
| Plot arrows emanating from the origin<br />
|-<br />
| style="width:30%" | <span id="complex">[http://itp.tugraz.at/matlab/techdoc/ref/complex.html complex]</span><br />
| Construct complex data from real and imaginary components<br />
|-<br />
| style="width:30%" | <span id="computer">[http://itp.tugraz.at/matlab/techdoc/ref/computer.html computer]</span><br />
| Return information about computer on which MATLAB is running<br />
|-<br />
| style="width:30%" | <span id="cond">[http://itp.tugraz.at/matlab/techdoc/ref/cond.html cond]</span><br />
| Condition number with respect to inversion<br />
|-<br />
| style="width:30%" | <span id="condeig">[http://itp.tugraz.at/matlab/techdoc/ref/condeig.html condeig]</span><br />
| Condition number with respect to eigenvalues<br />
|-<br />
| style="width:30%" | <span id="condest">[http://itp.tugraz.at/matlab/techdoc/ref/condest.html condest]</span><br />
| 1-norm condition number estimate<br />
|-<br />
| style="width:30%" | <span id="coneplot">[http://itp.tugraz.at/matlab/techdoc/ref/coneplot.html coneplot]</span><br />
| Plot velocity vectors as cones in a 3-D vector field<br />
|-<br />
| style="width:30%" | <span id="conj">[http://itp.tugraz.at/matlab/techdoc/ref/conj.html conj]</span><br />
| Complex conjugate<br />
|-<br />
| style="width:30%" | <span id="continue">[http://itp.tugraz.at/matlab/techdoc/ref/continue.html continue]</span><br />
| Pass control to next iteration of <code>for</code> or <code>while</code> loop<br />
|-<br />
| style="width:30%" | <span id="contour">[http://itp.tugraz.at/matlab/techdoc/ref/contour.html contour]</span><br />
| Contour graph of a matrix<br />
|-<br />
| style="width:30%" | <span id="contour3">[http://itp.tugraz.at/matlab/techdoc/ref/contour3.html contour3]</span><br />
| Three-dimensional contour plot<br />
|-<br />
| style="width:30%" | <span id="contourc">[http://itp.tugraz.at/matlab/techdoc/ref/contourc.html contourc]</span><br />
| Low-level contour plot computation<br />
|-<br />
| style="width:30%" | <span id="contourf">[http://itp.tugraz.at/matlab/techdoc/ref/contourf.html contourf]</span><br />
| Filled two-dimensional contour plot<br />
|-<br />
| style="width:30%" | <span id="createclassfromwsdl">[http://itp.tugraz.at/matlab/techdoc/ref/createclassfromwsdl.html createclassfromwsdl]</span><br />
| Create MATLAB object based on WSDL file<br />
|-<br />
| style="width:30%" | <span id="contourslice">[http://itp.tugraz.at/matlab/techdoc/ref/contourslice.html contourslice]</span><br />
| Draw contours in volume slice planes<br />
|-<br />
| style="width:30%" | <span id="contrast">[http://itp.tugraz.at/matlab/techdoc/ref/contrast.html contrast]</span><br />
| Grayscale colormap for contrast enhancement<br />
|-<br />
| style="width:30%" | <span id="conv">[http://itp.tugraz.at/matlab/techdoc/ref/conv.html conv]</span><br />
| Convolution and polynomial multiplication<br />
|-<br />
| style="width:30%" | <span id="conv2">[http://itp.tugraz.at/matlab/techdoc/ref/conv2.html conv2]</span><br />
| Two-dimensional convolution<br />
|-<br />
| style="width:30%" | <span id="convhull">[http://itp.tugraz.at/matlab/techdoc/ref/convhull.html convhull]</span><br />
| Convex hull<br />
|-<br />
| style="width:30%" | <span id="convhulln">[http://itp.tugraz.at/matlab/techdoc/ref/convhulln.html convhulln]</span><br />
| N-dimensional convex hull<br />
|-<br />
| style="width:30%" | <span id="convn">[http://itp.tugraz.at/matlab/techdoc/ref/convn.html convn]</span><br />
| N-dimensional convolution<br />
|-<br />
| style="width:30%" | <span id="copyfile">[http://itp.tugraz.at/matlab/techdoc/ref/copyfile.html copyfile]</span><br />
| Copy file or directory<br />
|-<br />
| style="width:30%" | <span id="copyobj">[http://itp.tugraz.at/matlab/techdoc/ref/copyobj.html copyobj]</span><br />
| Copy graphics objects and their descendants<br />
|-<br />
| style="width:30%" | <span id="corrcoef">[http://itp.tugraz.at/matlab/techdoc/ref/corrcoef.html corrcoef]</span><br />
| Correlation coefficients<br />
|-<br />
| style="width:30%" | <span id="cos">[http://itp.tugraz.at/matlab/techdoc/ref/cos.html cos]</span><br />
| Cosine of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="cosd">[http://itp.tugraz.at/matlab/techdoc/ref/cosd.html cosd]</span><br />
| Cosine of an argument in degrees<br />
|-<br />
| style="width:30%" | <span id="cosh">[http://itp.tugraz.at/matlab/techdoc/ref/cosh.html cosh]</span><br />
| Hyperbolic cosine<br />
|-<br />
| style="width:30%" | <span id="cot">[http://itp.tugraz.at/matlab/techdoc/ref/cot.html cot]</span><br />
| Cotangent of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="cotd">[http://itp.tugraz.at/matlab/techdoc/ref/cotd.html cotd]</span><br />
| Cotangent of an argument in degrees<br />
|-<br />
| style="width:30%" | <span id="coth">[http://itp.tugraz.at/matlab/techdoc/ref/coth.html coth]</span><br />
| Hyperbolic cotangent<br />
|-<br />
| style="width:30%" | <span id="cov">[http://itp.tugraz.at/matlab/techdoc/ref/cov.html cov]</span><br />
| Covariance matrix<br />
|-<br />
| style="width:30%" | <span id="cplxpair">[http://itp.tugraz.at/matlab/techdoc/ref/cplxpair.html cplxpair]</span><br />
| Sort complex numbers into complex conjugate pairs<br />
|-<br />
| style="width:30%" | <span id="cputime">[http://itp.tugraz.at/matlab/techdoc/ref/cputime.html cputime]</span><br />
| Return elapsed CPU time<br />
|-<br />
| style="width:30%" | <span id="cscd">[http://itp.tugraz.at/matlab/techdoc/ref/cscd.html cscd]</span><br />
| Cosecant of an argument in degrees<br />
|-<br />
| style="width:30%" | <span id="createsoapmessage">[http://itp.tugraz.at/matlab/techdoc/ref/createsoapmessage.html createsoapmessage]</span><br />
| Create SOAP message to send to server<br />
|-<br />
| style="width:30%" | <span id="cross">[http://itp.tugraz.at/matlab/techdoc/ref/cross.html cross]</span><br />
| Vector cross product<br />
|-<br />
| style="width:30%" | <span id="csc">[http://itp.tugraz.at/matlab/techdoc/ref/csc.html csc]</span><br />
| Cosecant of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="csch">[http://itp.tugraz.at/matlab/techdoc/ref/csch.html csch]</span><br />
| Hyperbolic cosecant<br />
|-<br />
| style="width:30%" | <span id="csvwrite">[http://itp.tugraz.at/matlab/techdoc/ref/csvwrite.html csvwrite]</span><br />
| Write comma-separated value file<br />
|-<br />
| style="width:30%" | <span id="csvread">[http://itp.tugraz.at/matlab/techdoc/ref/csvread.html csvread]</span><br />
| Read comma-separated value file<br />
|-<br />
| style="width:30%" | <span id="cumtrapz">[http://itp.tugraz.at/matlab/techdoc/ref/cumtrapz.html cumtrapz]</span><br />
| Cumulative trapezoidal numerical integration<br />
|-<br />
| style="width:30%" | <span id="cumprod">[http://itp.tugraz.at/matlab/techdoc/ref/cumprod.html cumprod]</span><br />
| Cumulative product<br />
|-<br />
| style="width:30%" | <span id="cumsum">[http://itp.tugraz.at/matlab/techdoc/ref/cumsum.html cumsum]</span><br />
| Cumulative sum<br />
|-<br />
| style="width:30%" | <span id="customverctrl">[http://itp.tugraz.at/matlab/techdoc/ref/customverctrl.html customverctrl]</span><br />
| Allow custom source control system (UNIX only)<br />
|-<br />
| style="width:30%" | <span id="curl">[http://itp.tugraz.at/matlab/techdoc/ref/curl.html curl]</span><br />
| Computes the curl and angular velocity of a vector field<br />
|-<br />
| style="width:30%" | <span id="cylinder">[http://itp.tugraz.at/matlab/techdoc/ref/cylinder.html cylinder]</span><br />
| Generate cylinder<br />
|-<br />
|}<br />
<br />
= d =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="datacursormode">[http://itp.tugraz.at/matlab/techdoc/ref/datacursormode.html datacursormode]</span><br />
| Enable/disable interactive data cursor mode<br />
|-<br />
| style="width:30%" | <span id="daspect">[http://itp.tugraz.at/matlab/techdoc/ref/daspect.html daspect]</span><br />
| Set or query the axes data aspect ratio<br />
|-<br />
| style="width:30%" | <span id="deleteproperty">[http://itp.tugraz.at/matlab/techdoc/ref/deleteproperty.html deleteproperty]</span><br />
| Remove custom property from object<br />
|-<br />
| style="width:30%" | <span id="datatipinfo">[http://itp.tugraz.at/matlab/techdoc/ref/datatipinfo.html datatipinfo]</span><br />
| Produce short description of input variable<br />
|-<br />
| style="width:30%" | <span id="date">[http://itp.tugraz.at/matlab/techdoc/ref/date.html date]</span><br />
| Return current date string<br />
|-<br />
| style="width:30%" | <span id="datenum">[http://itp.tugraz.at/matlab/techdoc/ref/datenum.html datenum]</span><br />
| Convert date and time to serial date number<br />
|-<br />
| style="width:30%" | <span id="datestr">[http://itp.tugraz.at/matlab/techdoc/ref/datestr.html datestr]</span><br />
| Convert date and time to string format<br />
|-<br />
| style="width:30%" | <span id="datetick">[http://itp.tugraz.at/matlab/techdoc/ref/datetick.html datetick]</span><br />
| Label tick lines using dates<br />
|-<br />
| style="width:30%" | <span id="datevec">[http://itp.tugraz.at/matlab/techdoc/ref/datevec.html datevec]</span><br />
| Convert date and time to vector of components<br />
|-<br />
| style="width:30%" | <span id="dbclear">[http://itp.tugraz.at/matlab/techdoc/ref/dbclear.html dbclear]</span><br />
| Clear breakpoints<br />
|-<br />
| style="width:30%" | <span id="dbcont">[http://itp.tugraz.at/matlab/techdoc/ref/dbcont.html dbcont]</span><br />
| Resume execution<br />
|-<br />
| style="width:30%" | <span id="dbdown">[http://itp.tugraz.at/matlab/techdoc/ref/dbdown.html dbdown]</span><br />
| Change local workspace context when in debug mode<br />
|-<br />
| style="width:30%" | <span id="dblquad">[http://itp.tugraz.at/matlab/techdoc/ref/dblquad.html dblquad]</span><br />
| Numerically evaluate double integral<br />
|-<br />
| style="width:30%" | <span id="dbmex">[http://itp.tugraz.at/matlab/techdoc/ref/dbmex.html dbmex]</span><br />
| Enable MEX-file debugging<br />
|-<br />
| style="width:30%" | <span id="dbquit">[http://itp.tugraz.at/matlab/techdoc/ref/dbquit.html dbquit]</span><br />
| Quit debug mode<br />
|-<br />
| style="width:30%" | <span id="dbstack">[http://itp.tugraz.at/matlab/techdoc/ref/dbstack.html dbstack]</span><br />
| Display function call stack<br />
|-<br />
| style="width:30%" | <span id="dbstatus">[http://itp.tugraz.at/matlab/techdoc/ref/dbstatus.html dbstatus]</span><br />
| List all breakpoints<br />
|-<br />
| style="width:30%" | <span id="dbstep">[http://itp.tugraz.at/matlab/techdoc/ref/dbstep.html dbstep]</span><br />
| Execute one or more lines from current breakpoint<br />
|-<br />
| style="width:30%" | <span id="dbstop">[http://itp.tugraz.at/matlab/techdoc/ref/dbstop.html dbstop]</span><br />
| Set breakpoints<br />
|-<br />
| style="width:30%" | <span id="dbtype">[http://itp.tugraz.at/matlab/techdoc/ref/dbtype.html dbtype]</span><br />
| List M-file with line numbers<br />
|-<br />
| style="width:30%" | <span id="dbup">[http://itp.tugraz.at/matlab/techdoc/ref/dbup.html dbup]</span><br />
| Change local workspace context<br />
|-<br />
| style="width:30%" | <span id="dde23">[http://itp.tugraz.at/matlab/techdoc/ref/dde23.html dde23]</span><br />
| Solve delay differential equations (DDEs) with constant delays<br />
|-<br />
| style="width:30%" | <span id="ddeadv">[http://itp.tugraz.at/matlab/techdoc/ref/ddeadv.html ddeadv]</span><br />
| Set up advisory link<br />
|-<br />
| style="width:30%" | <span id="ddeexec">[http://itp.tugraz.at/matlab/techdoc/ref/ddeexec.html ddeexec]</span><br />
| Send string for execution<br />
|-<br />
| style="width:30%" | <span id="ddeget">[http://itp.tugraz.at/matlab/techdoc/ref/ddeget.html ddeget]</span><br />
| Extract properties from options structure created with [http://itp.tugraz.at/matlab/techdoc/ref/ddeset.html ddeset]<br />
|-<br />
| style="width:30%" | <span id="ddeinit">[http://itp.tugraz.at/matlab/techdoc/ref/ddeinit.html ddeinit]</span><br />
| Initiate DDE conversation<br />
|-<br />
| style="width:30%" | <span id="ddepoke">[http://itp.tugraz.at/matlab/techdoc/ref/ddepoke.html ddepoke]</span><br />
| Send data to application<br />
|-<br />
| style="width:30%" | <span id="ddereq">[http://itp.tugraz.at/matlab/techdoc/ref/ddereq.html ddereq]</span><br />
| Request data from application<br />
|-<br />
| style="width:30%" | <span id="ddeset">[http://itp.tugraz.at/matlab/techdoc/ref/ddeset.html ddeset]</span><br />
| Create or alter delay differential equations (DDE) options structure<br />
|-<br />
| style="width:30%" | <span id="ddeterm">[http://itp.tugraz.at/matlab/techdoc/ref/ddeterm.html ddeterm]</span><br />
| Terminate DDE conversation<br />
|-<br />
| style="width:30%" | <span id="ddeunadv">[http://itp.tugraz.at/matlab/techdoc/ref/ddeunadv.html ddeunadv]</span><br />
| Release advisory link<br />
|-<br />
| style="width:30%" | <span id="deal">[http://itp.tugraz.at/matlab/techdoc/ref/deal.html deal]</span><br />
| Distribute inputs to outputs<br />
|-<br />
| style="width:30%" | <span id="deblank">[http://itp.tugraz.at/matlab/techdoc/ref/deblank.html deblank]</span><br />
| Strip trailing blanks from end of string<br />
|-<br />
| style="width:30%" | <span id="debug">[http://itp.tugraz.at/matlab/techdoc/ref/debug.html debug]</span><br />
| List M-file debugging functions<br />
|-<br />
| style="width:30%" | <span id="dec2base">[http://itp.tugraz.at/matlab/techdoc/ref/dec2base.html dec2base]</span><br />
| Convert decimal to base N number in string<br />
|-<br />
| style="width:30%" | <span id="dec2bin">[http://itp.tugraz.at/matlab/techdoc/ref/dec2bin.html dec2bin]</span><br />
| Convert decimal to binary number in string<br />
|-<br />
| style="width:30%" | <span id="dec2hex">[http://itp.tugraz.at/matlab/techdoc/ref/dec2hex.html dec2hex]</span><br />
| Convert decimal to hexadecimal number in string<br />
|-<br />
| style="width:30%" | <span id="decic">[http://itp.tugraz.at/matlab/techdoc/ref/decic.html decic]</span><br />
| Compute consistent initial conditions for <code>ode15i</code><br />
|-<br />
| style="width:30%" | <span id="deconv">[http://itp.tugraz.at/matlab/techdoc/ref/deconv.html deconv]</span><br />
| Deconvolution and polynomial division<br />
|-<br />
| style="width:30%" | <span id="del2">[http://itp.tugraz.at/matlab/techdoc/ref/del2.html del2]</span><br />
| Discrete Laplacian<br />
|-<br />
| style="width:30%" | <span id="delaunay">[http://itp.tugraz.at/matlab/techdoc/ref/delaunay.html delaunay]</span><br />
| Delaunay triangulation<br />
|-<br />
| style="width:30%" | <span id="delaunay3">[http://itp.tugraz.at/matlab/techdoc/ref/delaunay3.html delaunay3]</span><br />
| 3-dimensional Delaunay tessellation<br />
|-<br />
| style="width:30%" | <span id="delaunayn">[http://itp.tugraz.at/matlab/techdoc/ref/delaunayn.html delaunayn]</span><br />
| N-dimensional Delaunay tessellation<br />
|-<br />
| style="width:30%" | <span id="delete">[http://itp.tugraz.at/matlab/techdoc/ref/delete.html delete]</span><br />
| Delete files or graphics objects<br />
|-<br />
| style="width:30%" | <span id="deletecom">[http://itp.tugraz.at/matlab/techdoc/ref/deletecom.html deletecom]</span><br />
| Delete COM control or server<br />
|-<br />
| style="width:30%" | <span id="deleteftp">[http://itp.tugraz.at/matlab/techdoc/ref/deleteftp.html deleteftp]</span><br />
| Delete file on FTP server<br />
|-<br />
| style="width:30%" | <span id="deleteserial">[http://itp.tugraz.at/matlab/techdoc/ref/deleteserial.html deleteserial]</span><br />
| Remove a serial port object from memory<br />
|-<br />
| style="width:30%" | <span id="deletetimer">[http://itp.tugraz.at/matlab/techdoc/ref/deletetimer.html deletetimer]</span><br />
| Remove a timer object from memory<br />
|-<br />
| style="width:30%" | <span id="demo">[http://itp.tugraz.at/matlab/techdoc/ref/demo.html demo]</span><br />
| Access product <font face=sansserif>demos</font> via Help browser<br />
|-<br />
| style="width:30%" | <span id="depdir">[http://itp.tugraz.at/matlab/techdoc/ref/depdir.html depdir]</span><br />
| List dependent directories of M-file or P-file<br />
|-<br />
| style="width:30%" | <span id="depfun">[http://itp.tugraz.at/matlab/techdoc/ref/depfun.html depfun]</span><br />
| List dependencies of M-file or P-file<br />
|-<br />
| style="width:30%" | <span id="det">[http://itp.tugraz.at/matlab/techdoc/ref/det.html det]</span><br />
| Matrix determinant<br />
|-<br />
| style="width:30%" | <span id="detrend">[http://itp.tugraz.at/matlab/techdoc/ref/detrend.html detrend]</span><br />
| Remove linear trends.<br />
|-<br />
| style="width:30%" | <span id="deval">[http://itp.tugraz.at/matlab/techdoc/ref/deval.html deval]</span><br />
| Evaluate the solution of a differential equation<br />
|-<br />
| style="width:30%" | <span id="diag">[http://itp.tugraz.at/matlab/techdoc/ref/diag.html diag]</span><br />
| Diagonal matrices and diagonals of a matrix<br />
|-<br />
| style="width:30%" | <span id="dialog">[http://itp.tugraz.at/matlab/techdoc/ref/dialog.html dialog]</span><br />
| Create and display dialog box<br />
|-<br />
| style="width:30%" | <span id="diary">[http://itp.tugraz.at/matlab/techdoc/ref/diary.html diary]</span><br />
| Save session to file<br />
|-<br />
| style="width:30%" | <span id="diff">[http://itp.tugraz.at/matlab/techdoc/ref/diff.html diff]</span><br />
| Differences and approximate derivatives<br />
|-<br />
| style="width:30%" | <span id="dir">[http://itp.tugraz.at/matlab/techdoc/ref/dir.html dir]</span><br />
| Display directory listing<br />
|-<br />
| style="width:30%" | <span id="dirftp">[http://itp.tugraz.at/matlab/techdoc/ref/dirftp.html dirftp]</span><br />
| List contents of directory on FTP server<br />
|-<br />
| style="width:30%" | <span id="disp">[http://itp.tugraz.at/matlab/techdoc/ref/disp.html disp]</span><br />
| Display text or array<br />
|-<br />
| style="width:30%" | <span id="display">[http://itp.tugraz.at/matlab/techdoc/ref/display.html display]</span><br />
| Overloaded method to display text or array<br />
|-<br />
| style="width:30%" | <span id="dispmemmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/dispmemmapfile.html dispmemmapfile]</span><br />
| Display information about memory map object<br />
|-<br />
| style="width:30%" | <span id="dispserial">[http://itp.tugraz.at/matlab/techdoc/ref/dispserial.html dispserial]</span><br />
| Display serial port object summary information<br />
|-<br />
| style="width:30%" | <span id="disptimer">[http://itp.tugraz.at/matlab/techdoc/ref/disptimer.html disptimer]</span><br />
| Display information about timer object<br />
|-<br />
| style="width:30%" | <span id="divergence">[http://itp.tugraz.at/matlab/techdoc/ref/divergence.html divergence]</span><br />
| Computes the divergence of a vector field<br />
|-<br />
| style="width:30%" | <span id="dlmread">[http://itp.tugraz.at/matlab/techdoc/ref/dlmread.html dlmread]</span><br />
| Read ASCII-delimited file of numeric data into matrix<br />
|-<br />
| style="width:30%" | <span id="dlmwrite">[http://itp.tugraz.at/matlab/techdoc/ref/dlmwrite.html dlmwrite]</span><br />
| Write matrix to ASCII-delimited file<br />
|-<br />
| style="width:30%" | <span id="dmperm">[http://itp.tugraz.at/matlab/techdoc/ref/dmperm.html dmperm]</span><br />
| Dulmage-Mendelsohn decomposition<br />
|-<br />
| style="width:30%" | <span id="doc">[http://itp.tugraz.at/matlab/techdoc/ref/doc.html doc]</span><br />
| Display online documentation in Help browser<br />
|-<br />
| style="width:30%" | <span id="docopt">[http://itp.tugraz.at/matlab/techdoc/ref/docopt.html docopt]</span><br />
| Web browser for UNIX platforms<br />
|-<br />
| style="width:30%" | <span id="docsearch">[http://itp.tugraz.at/matlab/techdoc/ref/docsearch.html docsearch]</span><br />
| Open Help browser <strong>Search</strong> pane and search for specified term<br />
|-<br />
| style="width:30%" | <span id="dos">[http://itp.tugraz.at/matlab/techdoc/ref/dos.html dos]</span><br />
| Execute DOS command and return result<br />
|-<br />
| style="width:30%" | <span id="dot">[http://itp.tugraz.at/matlab/techdoc/ref/dot.html dot]</span><br />
| Vector dot product<br />
|-<br />
| style="width:30%" | <span id="double">[http://itp.tugraz.at/matlab/techdoc/ref/double.html double]</span><br />
| Convert to double -precision<br />
|-<br />
| style="width:30%" | <span id="dragrect">[http://itp.tugraz.at/matlab/techdoc/ref/dragrect.html dragrect]</span><br />
| Drag rectangles with mouse<br />
|-<br />
| style="width:30%" | <span id="drawnow">[http://itp.tugraz.at/matlab/techdoc/ref/drawnow.html drawnow]</span><br />
| Complete pending drawing events <br />
|-<br />
| style="width:30%" | <span id="dsearch">[http://itp.tugraz.at/matlab/techdoc/ref/dsearch.html dsearch]</span><br />
| Search for nearest point<br />
|-<br />
| style="width:30%" | <span id="dsearchn">[http://itp.tugraz.at/matlab/techdoc/ref/dsearchn.html dsearchn]</span><br />
| N-dimensional nearest point search<br />
|-<br />
|}<br />
<br />
= e =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="echo">[http://itp.tugraz.at/matlab/techdoc/ref/echo.html echo]</span><br />
| Echo M-files during execution<br />
|-<br />
| style="width:30%" | <span id="echodemo">[http://itp.tugraz.at/matlab/techdoc/ref/echodemo.html echodemo]</span><br />
| Run M-file demo step-by-step in Command Window<br />
|-<br />
| style="width:30%" | <span id="edit">[http://itp.tugraz.at/matlab/techdoc/ref/edit.html edit]</span><br />
| Edit or create M-file<br />
|-<br />
| style="width:30%" | <span id="eig">[http://itp.tugraz.at/matlab/techdoc/ref/eig.html eig]</span><br />
| Find eigenvalues and eigenvectors<br />
|-<br />
| style="width:30%" | <span id="eigs">[http://itp.tugraz.at/matlab/techdoc/ref/eigs.html eigs]</span><br />
| Find largest eigenvalues and eigenvectors of a sparse matrix<br />
|-<br />
| style="width:30%" | <span id="ellipj">[http://itp.tugraz.at/matlab/techdoc/ref/ellipj.html ellipj]</span><br />
| Jacobi elliptic functions<br />
|-<br />
| style="width:30%" | <span id="ellipke">[http://itp.tugraz.at/matlab/techdoc/ref/ellipke.html ellipke]</span><br />
| Complete elliptic integrals of the first and second kind<br />
|-<br />
| style="width:30%" | <span id="ellipsoid">[http://itp.tugraz.at/matlab/techdoc/ref/ellipsoid.html ellipsoid]</span><br />
| Generate ellipsoid<br />
|-<br />
| style="width:30%" | <span id="else">[http://itp.tugraz.at/matlab/techdoc/ref/else.html else]</span><br />
| Conditionally execute statements<br />
|-<br />
| style="width:30%" | <span id="elseif">[http://itp.tugraz.at/matlab/techdoc/ref/elseif.html elseif]</span><br />
| Conditionally execute statements<br />
|-<br />
| style="width:30%" | <span id="enableservice">[http://itp.tugraz.at/matlab/techdoc/ref/enableservice.html enableservice]</span><br />
| Enable DDE or Automation server <br />
|-<br />
| style="width:30%" | <span id="end">[http://itp.tugraz.at/matlab/techdoc/ref/end.html end]</span><br />
| Terminate block of code, or indicate last index of array<br />
|-<br />
| style="width:30%" | <span id="eomday">[http://itp.tugraz.at/matlab/techdoc/ref/eomday.html eomday]</span><br />
| Return last day of month<br />
|-<br />
| style="width:30%" | <span id="eps">[http://itp.tugraz.at/matlab/techdoc/ref/eps.html eps]</span><br />
| Floating-point relative accuracy<br />
|-<br />
| style="width:30%" | <span id="eq">[http://itp.tugraz.at/matlab/techdoc/ref/eq.html eq]</span><br />
| Test for equality<br />
|-<br />
| style="width:30%" | <span id="erf">[http://itp.tugraz.at/matlab/techdoc/ref/erf.html erf]</span><br />
| Error functions<br />
|-<br />
| style="width:30%" | <span id="erfc">[http://itp.tugraz.at/matlab/techdoc/ref/erfc.html erfc]</span><br />
| Error functions<br />
|-<br />
| style="width:30%" | <span id="erfcinv">[http://itp.tugraz.at/matlab/techdoc/ref/erfcinv.html erfcinv]</span><br />
| Error functions<br />
|-<br />
| style="width:30%" | <span id="erfcx">[http://itp.tugraz.at/matlab/techdoc/ref/erfcx.html erfcx]</span><br />
| Error functions<br />
|-<br />
| style="width:30%" | <span id="erfinv">[http://itp.tugraz.at/matlab/techdoc/ref/erfinv.html erfinv]</span><br />
| Error functions<br />
|-<br />
| style="width:30%" | <span id="error">[http://itp.tugraz.at/matlab/techdoc/ref/error.html error]</span><br />
| Display error message<br />
|-<br />
| style="width:30%" | <span id="errorbar">[http://itp.tugraz.at/matlab/techdoc/ref/errorbar.html errorbar]</span><br />
| Plot error bars along a curve<br />
|-<br />
| style="width:30%" | <span id="errordlg">[http://itp.tugraz.at/matlab/techdoc/ref/errordlg.html errordlg]</span><br />
| Create and display an error dialog box<br />
|-<br />
| style="width:30%" | <span id="errorbarseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/errorbarseriesproperties.html errorbarseriesproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="etime">[http://itp.tugraz.at/matlab/techdoc/ref/etime.html etime]</span><br />
| Return time elapsed between date vectors<br />
|-<br />
| style="width:30%" | <span id="etree">[http://itp.tugraz.at/matlab/techdoc/ref/etree.html etree]</span><br />
| Elimination tree<br />
|-<br />
| style="width:30%" | <span id="etreeplot">[http://itp.tugraz.at/matlab/techdoc/ref/etreeplot.html etreeplot]</span><br />
| Plot elimination tree<br />
|-<br />
| style="width:30%" | <span id="eval">[http://itp.tugraz.at/matlab/techdoc/ref/eval.html eval]</span><br />
| Execute string containing MATLAB expression<br />
|-<br />
| style="width:30%" | <span id="evalc">[http://itp.tugraz.at/matlab/techdoc/ref/evalc.html evalc]</span><br />
| Evaluate MATLAB expression with capture<br />
|-<br />
| style="width:30%" | <span id="evalin">[http://itp.tugraz.at/matlab/techdoc/ref/evalin.html evalin]</span><br />
| Execute MATLAB expression in specified workspace<br />
|-<br />
| style="width:30%" | <span id="eventlisteners">[http://itp.tugraz.at/matlab/techdoc/ref/eventlisteners.html eventlisteners]</span><br />
| Return list of events attached to listeners<br />
|-<br />
| style="width:30%" | <span id="events">[http://itp.tugraz.at/matlab/techdoc/ref/events.html events]</span><br />
| Return list of events control can trigger<br />
|-<br />
| style="width:30%" | <span id="execute">[http://itp.tugraz.at/matlab/techdoc/ref/execute.html execute]</span><br />
| Execute MATLAB command in server<br />
|-<br />
| style="width:30%" | <span id="exifread">[http://itp.tugraz.at/matlab/techdoc/ref/exifread.html exifread]</span><br />
| Read EXIF information from JPEG and TIFF image files<br />
|-<br />
| style="width:30%" | <span id="exist">[http://itp.tugraz.at/matlab/techdoc/ref/exist.html exist]</span><br />
| Check if variables or functions are defined<br />
|-<br />
| style="width:30%" | <span id="exit">[http://itp.tugraz.at/matlab/techdoc/ref/exit.html exit]</span><br />
| Terminate MATLAB (same as <code>quit</code>)<br />
|-<br />
| style="width:30%" | <span id="exp">[http://itp.tugraz.at/matlab/techdoc/ref/exp.html exp]</span><br />
| Exponential<br />
|-<br />
| style="width:30%" | <span id="expint">[http://itp.tugraz.at/matlab/techdoc/ref/expint.html expint]</span><br />
| Exponential integral<br />
|-<br />
| style="width:30%" | <span id="expm">[http://itp.tugraz.at/matlab/techdoc/ref/expm.html expm]</span><br />
| Matrix exponential<br />
|-<br />
| style="width:30%" | <span id="expm1">[http://itp.tugraz.at/matlab/techdoc/ref/expm1.html expm1]</span><br />
| Compute <code>exp(x)-1</code> accurately for small values of <code>x</code><br />
|-<br />
| style="width:30%" | <span id="eye">[http://itp.tugraz.at/matlab/techdoc/ref/eye.html eye]</span><br />
| Identity matrix<br />
|-<br />
| style="width:30%" | <span id="ezcontour">[http://itp.tugraz.at/matlab/techdoc/ref/ezcontour.html ezcontour]</span><br />
| Easy to use contour plotter<br />
|-<br />
| style="width:30%" | <span id="ezcontourf">[http://itp.tugraz.at/matlab/techdoc/ref/ezcontourf.html ezcontourf]</span><br />
| Easy to use filled contour plotter<br />
|-<br />
| style="width:30%" | <span id="ezmesh">[http://itp.tugraz.at/matlab/techdoc/ref/ezmesh.html ezmesh]</span><br />
| Easy to use 3-D mesh plotter<br />
|-<br />
| style="width:30%" | <span id="ezmeshc">[http://itp.tugraz.at/matlab/techdoc/ref/ezmeshc.html ezmeshc]</span><br />
| Easy to use combination mesh/contour plotter<br />
|-<br />
| style="width:30%" | <span id="ezplot">[http://itp.tugraz.at/matlab/techdoc/ref/ezplot.html ezplot]</span><br />
| Easy to use function plotter<br />
|-<br />
| style="width:30%" | <span id="ezplot3">[http://itp.tugraz.at/matlab/techdoc/ref/ezplot3.html ezplot3]</span><br />
| Easy to use 3-D parametric curve plotter<br />
|-<br />
| style="width:30%" | <span id="ezpolar">[http://itp.tugraz.at/matlab/techdoc/ref/ezpolar.html ezpolar]</span><br />
| Easy to use polar coordinate plotter<br />
|-<br />
| style="width:30%" | <span id="ezsurf">[http://itp.tugraz.at/matlab/techdoc/ref/ezsurf.html ezsurf]</span><br />
| Easy to use 3-D colored surface plotter<br />
|-<br />
| style="width:30%" | <span id="ezsurfc">[http://itp.tugraz.at/matlab/techdoc/ref/ezsurfc.html ezsurfc]</span><br />
| Easy to use combination surface/contour plotter<br />
|-<br />
|}<br />
<br />
= f =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="factor">[http://itp.tugraz.at/matlab/techdoc/ref/factor.html factor]</span><br />
| Prime factors<br />
|-<br />
| style="width:30%" | <span id="factorial">[http://itp.tugraz.at/matlab/techdoc/ref/factorial.html factorial]</span><br />
| Factorial function<br />
|-<br />
| style="width:30%" | <span id="false">[http://itp.tugraz.at/matlab/techdoc/ref/false.html false]</span><br />
| Return logical 0 (false)<br />
|-<br />
| style="width:30%" | <span id="fclose">[http://itp.tugraz.at/matlab/techdoc/ref/fclose.html fclose]</span><br />
| Close one or more open files <br />
|-<br />
| style="width:30%" | <span id="fcloseserial">[http://itp.tugraz.at/matlab/techdoc/ref/fcloseserial.html fcloseserial]</span><br />
| Disconnect a serial port object from the device<br />
|-<br />
| style="width:30%" | <span id="feather">[http://itp.tugraz.at/matlab/techdoc/ref/feather.html feather]</span><br />
| Plot velocity vectors<br />
|-<br />
| style="width:30%" | <span id="feof">[http://itp.tugraz.at/matlab/techdoc/ref/feof.html feof]</span><br />
| Test for end-of-file<br />
|-<br />
| style="width:30%" | <span id="ferror">[http://itp.tugraz.at/matlab/techdoc/ref/ferror.html ferror]</span><br />
| Query MATLAB about errors in file input or output<br />
|-<br />
| style="width:30%" | <span id="feval">[http://itp.tugraz.at/matlab/techdoc/ref/feval.html feval]</span><br />
| Evaluate function<br />
|-<br />
| style="width:30%" | <span id="fevalcom">[http://itp.tugraz.at/matlab/techdoc/ref/fevalcom.html fevalcom]</span><br />
| Evaluate MATLAB function in server<br />
|-<br />
| style="width:30%" | <span id="fft">[http://itp.tugraz.at/matlab/techdoc/ref/fft.html fft]</span><br />
| Discrete Fourier transform<br />
|-<br />
| style="width:30%" | <span id="fft2">[http://itp.tugraz.at/matlab/techdoc/ref/fft2.html fft2]</span><br />
| Two-dimensional discrete Fourier transform<br />
|-<br />
| style="width:30%" | <span id="fftn">[http://itp.tugraz.at/matlab/techdoc/ref/fftn.html fftn]</span><br />
| Multidimensional discrete Fourier transform<br />
|-<br />
| style="width:30%" | <span id="fftshift">[http://itp.tugraz.at/matlab/techdoc/ref/fftshift.html fftshift]</span><br />
| Shift zero-frequency component of discrete Fourier transform to center of spectrum<br />
|-<br />
| style="width:30%" | <span id="fftw">[http://itp.tugraz.at/matlab/techdoc/ref/fftw.html fftw]</span><br />
| Interface to the FFTW library run-time algorithm for tuning fast Fourier transform (FFT) computations<br />
|-<br />
| style="width:30%" | <span id="fgetl">[http://itp.tugraz.at/matlab/techdoc/ref/fgetl.html fgetl]</span><br />
| Read line from file, discarding newline character<br />
|-<br />
| style="width:30%" | <span id="fgetlserial">[http://itp.tugraz.at/matlab/techdoc/ref/fgetlserial.html fgetlserial]</span><br />
| Read one line of text from the device and discard the terminator<br />
|-<br />
| style="width:30%" | <span id="fgets">[http://itp.tugraz.at/matlab/techdoc/ref/fgets.html fgets]</span><br />
| Read line from file, keeping newline character<br />
|-<br />
| style="width:30%" | <span id="fgetsserial">[http://itp.tugraz.at/matlab/techdoc/ref/fgetsserial.html fgetsserial]</span><br />
| Read one line of text from the device and include the terminator<br />
|-<br />
| style="width:30%" | <span id="fieldnames">[http://itp.tugraz.at/matlab/techdoc/ref/fieldnames.html fieldnames]</span><br />
| Return field names of structure, or public fields of object<br />
|-<br />
| style="width:30%" | <span id="figure">[http://itp.tugraz.at/matlab/techdoc/ref/figure.html figure]</span><br />
| Create a figure graphics object<br />
|-<br />
| style="width:30%" | <span id="figure_props">[http://itp.tugraz.at/matlab/techdoc/ref/figure_props.html figure_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="figurepalette">[http://itp.tugraz.at/matlab/techdoc/ref/figurepalette.html figurepalette]</span><br />
| Show or hide figure palette<br />
|-<br />
| style="width:30%" | <span id="fileattrib">[http://itp.tugraz.at/matlab/techdoc/ref/fileattrib.html fileattrib]</span><br />
| Set or get attributes of file or directory<br />
|-<br />
| style="width:30%" | <span id="filebrowser">[http://itp.tugraz.at/matlab/techdoc/ref/filebrowser.html filebrowser]</span><br />
| Display Current Directory browser, a tool for viewing files in current directory<br />
|-<br />
| style="width:30%" | <span id="fileformats">[http://itp.tugraz.at/matlab/techdoc/ref/fileformats.html fileformats]</span><br />
| Readable file formats<br />
|-<br />
| style="width:30%" | <span id="fileparts">[http://itp.tugraz.at/matlab/techdoc/ref/fileparts.html fileparts]</span><br />
| Return filename parts<br />
|-<br />
| style="width:30%" | <span id="filesep">[http://itp.tugraz.at/matlab/techdoc/ref/filesep.html filesep]</span><br />
| Return directory separator for current platform<br />
|-<br />
| style="width:30%" | <span id="fill">[http://itp.tugraz.at/matlab/techdoc/ref/fill.html fill]</span><br />
| Filled two-dimensional polygons<br />
|-<br />
| style="width:30%" | <span id="fill3">[http://itp.tugraz.at/matlab/techdoc/ref/fill3.html fill3]</span><br />
| Filled three-dimensional polygons<br />
|-<br />
| style="width:30%" | <span id="filter">[http://itp.tugraz.at/matlab/techdoc/ref/filter.html filter]</span><br />
| Filter data with an infinite impulse response (IIR) or finite impulse response (FIR) filter<br />
|-<br />
| style="width:30%" | <span id="filter2">[http://itp.tugraz.at/matlab/techdoc/ref/filter2.html filter2]</span><br />
| Two-dimensional digital filtering<br />
|-<br />
| style="width:30%" | <span id="find">[http://itp.tugraz.at/matlab/techdoc/ref/find.html find]</span><br />
| Find indices and values of nonzero elements<br />
|-<br />
| style="width:30%" | <span id="findall">[http://itp.tugraz.at/matlab/techdoc/ref/findall.html findall]</span><br />
| Find all graphics objects<br />
|-<br />
| style="width:30%" | <span id="findfigs">[http://itp.tugraz.at/matlab/techdoc/ref/findfigs.html findfigs]</span><br />
| Find visible off-screen figures<br />
|-<br />
| style="width:30%" | <span id="findobj">[http://itp.tugraz.at/matlab/techdoc/ref/findobj.html findobj]</span><br />
| Locate graphics objects with specific properties<br />
|-<br />
| style="width:30%" | <span id="findstr">[http://itp.tugraz.at/matlab/techdoc/ref/findstr.html findstr]</span><br />
| Find string within another, longer string<br />
|-<br />
| style="width:30%" | <span id="finish">[http://itp.tugraz.at/matlab/techdoc/ref/finish.html finish]</span><br />
| MATLAB termination M-file<br />
|-<br />
| style="width:30%" | <span id="fitsinfo">[http://itp.tugraz.at/matlab/techdoc/ref/fitsinfo.html fitsinfo]</span><br />
| Return information about FITS file<br />
|-<br />
| style="width:30%" | <span id="fitsread">[http://itp.tugraz.at/matlab/techdoc/ref/fitsread.html fitsread]</span><br />
| Extract data from FITS file<br />
|-<br />
| style="width:30%" | <span id="fix">[http://itp.tugraz.at/matlab/techdoc/ref/fix.html fix]</span><br />
| Round towards zero<br />
|-<br />
| style="width:30%" | <span id="flipdim">[http://itp.tugraz.at/matlab/techdoc/ref/flipdim.html flipdim]</span><br />
| Flip array along a specified dimension<br />
|-<br />
| style="width:30%" | <span id="fliplr">[http://itp.tugraz.at/matlab/techdoc/ref/fliplr.html fliplr]</span><br />
| Flip matrices left-right<br />
|-<br />
| style="width:30%" | <span id="flipud">[http://itp.tugraz.at/matlab/techdoc/ref/flipud.html flipud]</span><br />
| Flip matrices up-down<br />
|-<br />
| style="width:30%" | <span id="floor">[http://itp.tugraz.at/matlab/techdoc/ref/floor.html floor]</span><br />
| Round towards minus infinity<br />
|-<br />
| style="width:30%" | <span id="flops">[http://itp.tugraz.at/matlab/techdoc/ref/flops.html flops]</span><br />
| Count floating-point operations<br />
|-<br />
| style="width:30%" | <span id="flow">[http://itp.tugraz.at/matlab/techdoc/ref/flow.html flow]</span><br />
| A simple function of three variables <br />
|-<br />
| style="width:30%" | <span id="fminbnd">[http://itp.tugraz.at/matlab/techdoc/ref/fminbnd.html fminbnd]</span><br />
| Minimize a function of one variable on a fixed interval<br />
|-<br />
| style="width:30%" | <span id="fminsearch">[http://itp.tugraz.at/matlab/techdoc/ref/fminsearch.html fminsearch]</span><br />
| Minimize a function of several variables<br />
|-<br />
| style="width:30%" | <span id="fopen">[http://itp.tugraz.at/matlab/techdoc/ref/fopen.html fopen]</span><br />
| Open file, or obtain information about open files<br />
|-<br />
| style="width:30%" | <span id="fopenserial">[http://itp.tugraz.at/matlab/techdoc/ref/fopenserial.html fopenserial]</span><br />
| Connect a serial port object to the device<br />
|-<br />
| style="width:30%" | <span id="for">[http://itp.tugraz.at/matlab/techdoc/ref/for.html for]</span><br />
| Execute block of code specified number of times<br />
|-<br />
| style="width:30%" | <span id="format">[http://itp.tugraz.at/matlab/techdoc/ref/format.html format]</span><br />
| Set display format for output<br />
|-<br />
| style="width:30%" | <span id="fplot">[http://itp.tugraz.at/matlab/techdoc/ref/fplot.html fplot]</span><br />
| Plot a function between specified limits<br />
|-<br />
| style="width:30%" | <span id="fprintf">[http://itp.tugraz.at/matlab/techdoc/ref/fprintf.html fprintf]</span><br />
| Write formatted data to file<br />
|-<br />
| style="width:30%" | <span id="fprintfserial">[http://itp.tugraz.at/matlab/techdoc/ref/fprintfserial.html fprintfserial]</span><br />
| Write text to the device<br />
|-<br />
| style="width:30%" | <span id="frame2im">[http://itp.tugraz.at/matlab/techdoc/ref/frame2im.html frame2im]</span><br />
| Convert movie frame to indexed image<br />
|-<br />
| style="width:30%" | <span id="frameedit">[http://itp.tugraz.at/matlab/techdoc/ref/frameedit.html frameedit]</span><br />
| Create and edit print frames for Simulink and Stateflow block diagrams<br />
|-<br />
| style="width:30%" | <span id="fread">[http://itp.tugraz.at/matlab/techdoc/ref/fread.html fread]</span><br />
| Read binary data from file<br />
|-<br />
| style="width:30%" | <span id="freadserial">[http://itp.tugraz.at/matlab/techdoc/ref/freadserial.html freadserial]</span><br />
| Read binary data from the device<br />
|-<br />
| style="width:30%" | <span id="freqspace">[http://itp.tugraz.at/matlab/techdoc/ref/freqspace.html freqspace]</span><br />
| Determine frequency spacing for frequency response<br />
|-<br />
| style="width:30%" | <span id="frewind">[http://itp.tugraz.at/matlab/techdoc/ref/frewind.html frewind]</span><br />
| Move file position indicator to beginning of open file<br />
|-<br />
| style="width:30%" | <span id="fscanf">[http://itp.tugraz.at/matlab/techdoc/ref/fscanf.html fscanf]</span><br />
| Read formatted data from file<br />
|-<br />
| style="width:30%" | <span id="fscanfserial">[http://itp.tugraz.at/matlab/techdoc/ref/fscanfserial.html fscanfserial]</span><br />
| Read data from the device, and format as text<br />
|-<br />
| style="width:30%" | <span id="fseek">[http://itp.tugraz.at/matlab/techdoc/ref/fseek.html fseek]</span><br />
| Set file position indicator<br />
|-<br />
| style="width:30%" | <span id="ftell">[http://itp.tugraz.at/matlab/techdoc/ref/ftell.html ftell]</span><br />
| Get file position indicator<br />
|-<br />
| style="width:30%" | <span id="ftp">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.html ftp]</span><br />
| Connect to FTP server, creating FTP object<br />
|-<br />
| style="width:30%" | <span id="full">[http://itp.tugraz.at/matlab/techdoc/ref/full.html full]</span><br />
| Convert sparse matrix to full matrix<br />
|-<br />
| style="width:30%" | <span id="fullfile">[http://itp.tugraz.at/matlab/techdoc/ref/fullfile.html fullfile]</span><br />
| Build full filename from parts<br />
|-<br />
| style="width:30%" | <span id="funm">[http://itp.tugraz.at/matlab/techdoc/ref/funm.html funm]</span><br />
| Evaluate general matrix function<br />
|-<br />
| style="width:30%" | <span id="fwrite">[http://itp.tugraz.at/matlab/techdoc/ref/fwrite.html fwrite]</span><br />
| Write binary data to file<br />
|-<br />
| style="width:30%" | <span id="fwriteserial">[http://itp.tugraz.at/matlab/techdoc/ref/fwriteserial.html fwriteserial]</span><br />
| Write binary data to the device<br />
|-<br />
| style="width:30%" | <span id="fzero">[http://itp.tugraz.at/matlab/techdoc/ref/fzero.html fzero]</span><br />
| Find zero of a function of one variable<br />
|-<br />
|}<br />
<br />
= g =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="getworkspacedata">[http://itp.tugraz.at/matlab/techdoc/ref/getworkspacedata.html getworkspacedata]</span><br />
| Get data from server workspace<br />
|-<br />
| style="width:30%" | <span id="gallery">[http://itp.tugraz.at/matlab/techdoc/ref/gallery.html gallery]</span><br />
| Test matrices<br />
|-<br />
| style="width:30%" | <span id="gamma">[http://itp.tugraz.at/matlab/techdoc/ref/gamma.html gamma]</span><br />
| Gamma functions<br />
|-<br />
| style="width:30%" | <span id="gammainc">[http://itp.tugraz.at/matlab/techdoc/ref/gammainc.html gammainc]</span><br />
| Gamma functions<br />
|-<br />
| style="width:30%" | <span id="gammaln">[http://itp.tugraz.at/matlab/techdoc/ref/gammaln.html gammaln]</span><br />
| Gamma functions<br />
|-<br />
| style="width:30%" | <span id="gca">[http://itp.tugraz.at/matlab/techdoc/ref/gca.html gca]</span><br />
| Get current axes handle<br />
|-<br />
| style="width:30%" | <span id="gcbf">[http://itp.tugraz.at/matlab/techdoc/ref/gcbf.html gcbf]</span><br />
| Return handle of figure containing object whose callback is executing<br />
|-<br />
| style="width:30%" | <span id="gcbo">[http://itp.tugraz.at/matlab/techdoc/ref/gcbo.html gcbo]</span><br />
| Return handle of object whose callback is executing<br />
|-<br />
| style="width:30%" | <span id="gcd">[http://itp.tugraz.at/matlab/techdoc/ref/gcd.html gcd]</span><br />
| Greatest common divisor<br />
|-<br />
| style="width:30%" | <span id="gcf">[http://itp.tugraz.at/matlab/techdoc/ref/gcf.html gcf]</span><br />
| Get current figure handle<br />
|-<br />
| style="width:30%" | <span id="gco">[http://itp.tugraz.at/matlab/techdoc/ref/gco.html gco]</span><br />
| Return handle of current object<br />
|-<br />
| style="width:30%" | <span id="ge">[http://itp.tugraz.at/matlab/techdoc/ref/ge.html ge]</span><br />
| Test for greater than or equal to<br />
|-<br />
| style="width:30%" | <span id="genpath">[http://itp.tugraz.at/matlab/techdoc/ref/genpath.html genpath]</span><br />
| Generate path string<br />
|-<br />
| style="width:30%" | <span id="genvarname">[http://itp.tugraz.at/matlab/techdoc/ref/genvarname.html genvarname]</span><br />
| Construct valid variable name from string<br />
|-<br />
| style="width:30%" | <span id="get">[http://itp.tugraz.at/matlab/techdoc/ref/get.html get]</span><br />
| Get object properties<br />
|-<br />
| style="width:30%" | <span id="getappdata">[http://itp.tugraz.at/matlab/techdoc/ref/getappdata.html getappdata]</span><br />
| Get value of application-defined data<br />
|-<br />
| style="width:30%" | <span id="getchararray">[http://itp.tugraz.at/matlab/techdoc/ref/getchararray.html getchararray]</span><br />
| Get character array from server<br />
|-<br />
| style="width:30%" | <span id="getcom">[http://itp.tugraz.at/matlab/techdoc/ref/getcom.html getcom]</span><br />
| Get property value from interface, or display properties<br />
|-<br />
| style="width:30%" | <span id="getenv">[http://itp.tugraz.at/matlab/techdoc/ref/getenv.html getenv]</span><br />
| Get environment variable<br />
|-<br />
| style="width:30%" | <span id="getfield">[http://itp.tugraz.at/matlab/techdoc/ref/getfield.html getfield]</span><br />
| Get field of structure array<br />
|-<br />
| style="width:30%" | <span id="getframe">[http://itp.tugraz.at/matlab/techdoc/ref/getframe.html getframe]</span><br />
| Get movie frame<br />
|-<br />
| style="width:30%" | <span id="getfullmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/getfullmatrix.html getfullmatrix]</span><br />
| Get matrix from server<br />
|-<br />
| style="width:30%" | <span id="getmemmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/getmemmapfile.html getmemmapfile]</span><br />
| Return <code>memmapfile</code> object properties<br />
|-<br />
| style="width:30%" | <span id="getplottool">[http://itp.tugraz.at/matlab/techdoc/ref/getplottool.html getplottool]</span><br />
| Utility function for creating and obtaining the figure components used for plot editing.<br />
|-<br />
| style="width:30%" | <span id="getpref">[http://itp.tugraz.at/matlab/techdoc/ref/getpref.html getpref]</span><br />
| Get preference<br />
|-<br />
| style="width:30%" | <span id="getserial">[http://itp.tugraz.at/matlab/techdoc/ref/getserial.html getserial]</span><br />
| Return serial port object properties<br />
|-<br />
| style="width:30%" | <span id="gettimer">[http://itp.tugraz.at/matlab/techdoc/ref/gettimer.html gettimer]</span><br />
| Display or get timer object properties<br />
|-<br />
| style="width:30%" | <span id="getvariable">[http://itp.tugraz.at/matlab/techdoc/ref/getvariable.html getvariable]</span><br />
| Returns data from variable in server workspace<br />
|-<br />
| style="width:30%" | <span id="grabcode">[http://itp.tugraz.at/matlab/techdoc/ref/grabcode.html grabcode]</span><br />
| Get MATLAB code from M-files published to HTML<br />
|-<br />
| style="width:30%" | <span id="ginput">[http://itp.tugraz.at/matlab/techdoc/ref/ginput.html ginput]</span><br />
| Graphical input from a mouse or cursor<br />
|-<br />
| style="width:30%" | <span id="global">[http://itp.tugraz.at/matlab/techdoc/ref/global.html global]</span><br />
| Declare global variables<br />
|-<br />
| style="width:30%" | <span id="gmres">[http://itp.tugraz.at/matlab/techdoc/ref/gmres.html gmres]</span><br />
| Generalized Minimum Residual method (with restarts)<br />
|-<br />
| style="width:30%" | <span id="gplot">[http://itp.tugraz.at/matlab/techdoc/ref/gplot.html gplot]</span><br />
| Plot set of nodes using an adjacency matrix<br />
|-<br />
| style="width:30%" | <span id="gradient">[http://itp.tugraz.at/matlab/techdoc/ref/gradient.html gradient]</span><br />
| Numerical gradient<br />
|-<br />
| style="width:30%" | <span id="griddata">[http://itp.tugraz.at/matlab/techdoc/ref/griddata.html griddata]</span><br />
| Data gridding<br />
|-<br />
| style="width:30%" | <span id="gt">[http://itp.tugraz.at/matlab/techdoc/ref/gt.html gt]</span><br />
| Test for greater than<br />
|-<br />
| style="width:30%" | <span id="graymon">[http://itp.tugraz.at/matlab/techdoc/ref/graymon.html graymon]</span><br />
| Set default figure properties for grayscale monitors<br />
|-<br />
| style="width:30%" | <span id="grid">[http://itp.tugraz.at/matlab/techdoc/ref/grid.html grid]</span><br />
| Grid lines for two- and three-dimensional plots<br />
|-<br />
| style="width:30%" | <span id="griddata3">[http://itp.tugraz.at/matlab/techdoc/ref/griddata3.html griddata3]</span><br />
| Data gridding and hypersurface fitting for 3-D data<br />
|-<br />
| style="width:30%" | <span id="griddatan">[http://itp.tugraz.at/matlab/techdoc/ref/griddatan.html griddatan]</span><br />
| Data gridding and hypersurface fitting (dimension &gt;= 2)<br />
|-<br />
| style="width:30%" | <span id="gsvd">[http://itp.tugraz.at/matlab/techdoc/ref/gsvd.html gsvd]</span><br />
| Generalized singular value decomposition<br />
|-<br />
| style="width:30%" | <span id="gtext">[http://itp.tugraz.at/matlab/techdoc/ref/gtext.html gtext]</span><br />
| Mouse placement of text in two-dimensional view<br />
|-<br />
| style="width:30%" | <span id="guidata">[http://itp.tugraz.at/matlab/techdoc/ref/guidata.html guidata]</span><br />
| Store or retrieve GUI data<br />
|-<br />
| style="width:30%" | <span id="guide">[http://itp.tugraz.at/matlab/techdoc/ref/guide.html guide]</span><br />
| Start the GUI Layout Editor<br />
|-<br />
| style="width:30%" | <span id="guihandles">[http://itp.tugraz.at/matlab/techdoc/ref/guihandles.html guihandles]</span><br />
| Create a structure of handles<br />
|-<br />
| style="width:30%" | <span id="gunzip">[http://itp.tugraz.at/matlab/techdoc/ref/gunzip.html gunzip]</span><br />
| Uncompress files in gzip format<br />
|-<br />
| style="width:30%" | <span id="gzip">[http://itp.tugraz.at/matlab/techdoc/ref/gzip.html gzip]</span><br />
| Compress files into gzip format<br />
|-<br />
|}<br />
<br />
= h =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="hggroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/hggroupproperties.html hggroupproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="hadamard">[http://itp.tugraz.at/matlab/techdoc/ref/hadamard.html hadamard]</span><br />
| Hadamard matrix<br />
|-<br />
| style="width:30%" | <span id="hankel">[http://itp.tugraz.at/matlab/techdoc/ref/hankel.html hankel]</span><br />
| Hankel matrix<br />
|-<br />
| style="width:30%" | <span id="hdf">[http://itp.tugraz.at/matlab/techdoc/ref/hdf.html hdf]</span><br />
| HDF interface<br />
|-<br />
| style="width:30%" | <span id="hdf5">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5.html hdf5]</span><br />
| HDF5 data type classes<br />
|-<br />
| style="width:30%" | <span id="hdf5info">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5info.html hdf5info]</span><br />
| Return information about an HDF5 file<br />
|-<br />
| style="width:30%" | <span id="hdf5read">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5read.html hdf5read]</span><br />
| Read data from an HDF5 file<br />
|-<br />
| style="width:30%" | <span id="hdf5write">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5write.html hdf5write]</span><br />
| Write a Hierarchical Data Format (HDF) Version 5 file<br />
|-<br />
| style="width:30%" | <span id="hdfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/hdfinfo.html hdfinfo]</span><br />
| Return information about an HDF or HDF-EOS file<br />
|-<br />
| style="width:30%" | <span id="hdfread">[http://itp.tugraz.at/matlab/techdoc/ref/hdfread.html hdfread]</span><br />
| Extract data from an HDF or HDF-EOS file<br />
|-<br />
| style="width:30%" | <span id="hdftool">[http://itp.tugraz.at/matlab/techdoc/ref/hdftool.html hdftool]</span><br />
| Browse and import data from HDF or HDF-EOS files<br />
|-<br />
| style="width:30%" | <span id="help">[http://itp.tugraz.at/matlab/techdoc/ref/help.html help]</span><br />
| Display help for MATLAB functions in Command Window<br />
|-<br />
| style="width:30%" | <span id="helpbrowser">[http://itp.tugraz.at/matlab/techdoc/ref/helpbrowser.html helpbrowser]</span><br />
| Display Help browser for access to full online documentation and demos<br />
|-<br />
| style="width:30%" | <span id="helpdesk">[http://itp.tugraz.at/matlab/techdoc/ref/helpdesk.html helpdesk]</span><br />
| Display Help browser<br />
|-<br />
| style="width:30%" | <span id="helpdlg">[http://itp.tugraz.at/matlab/techdoc/ref/helpdlg.html helpdlg]</span><br />
| Create and display help dialog box<br />
|-<br />
| style="width:30%" | <span id="helpwin">[http://itp.tugraz.at/matlab/techdoc/ref/helpwin.html helpwin]</span><br />
| Provide access to and display M-file help for all functions<br />
|-<br />
| style="width:30%" | <span id="hess">[http://itp.tugraz.at/matlab/techdoc/ref/hess.html hess]</span><br />
| Hessenberg form of a matrix<br />
|-<br />
| style="width:30%" | <span id="hex2dec">[http://itp.tugraz.at/matlab/techdoc/ref/hex2dec.html hex2dec]</span><br />
| Convert hexadecimal number string to decimal number<br />
|-<br />
| style="width:30%" | <span id="hex2num">[http://itp.tugraz.at/matlab/techdoc/ref/hex2num.html hex2num]</span><br />
| Convert hexadecimal number string to double-precision number<br />
|-<br />
| style="width:30%" | <span id="hgexport">[http://itp.tugraz.at/matlab/techdoc/ref/hgexport.html hgexport]</span><br />
| Export figure<br />
|-<br />
| style="width:30%" | <span id="hggroup">[http://itp.tugraz.at/matlab/techdoc/ref/hggroup.html hggroup]</span><br />
| Create hggroup object<br />
|-<br />
| style="width:30%" | <span id="hgtransform">[http://itp.tugraz.at/matlab/techdoc/ref/hgtransform.html hgtransform]</span><br />
| Create an hgtransform graphics object<br />
|-<br />
| style="width:30%" | <span id="hgload">[http://itp.tugraz.at/matlab/techdoc/ref/hgload.html hgload]</span><br />
| Load Handle Graphics object hierarchy from a file<br />
|-<br />
| style="width:30%" | <span id="hgsave">[http://itp.tugraz.at/matlab/techdoc/ref/hgsave.html hgsave]</span><br />
| Saves a Handle Graphics object hierarchy to a file<br />
|-<br />
| style="width:30%" | <span id="hgtransformproperties">[http://itp.tugraz.at/matlab/techdoc/ref/hgtransformproperties.html hgtransformproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="hidden">[http://itp.tugraz.at/matlab/techdoc/ref/hidden.html hidden]</span><br />
| Remove hidden lines from a mesh plot<br />
|-<br />
| style="width:30%" | <span id="hilb">[http://itp.tugraz.at/matlab/techdoc/ref/hilb.html hilb]</span><br />
| Hilbert matrix<br />
|-<br />
| style="width:30%" | <span id="hist">[http://itp.tugraz.at/matlab/techdoc/ref/hist.html hist]</span><br />
| Histogram plot<br />
|-<br />
| style="width:30%" | <span id="histc">[http://itp.tugraz.at/matlab/techdoc/ref/histc.html histc]</span><br />
| Histogram count<br />
|-<br />
| style="width:30%" | <span id="hold">[http://itp.tugraz.at/matlab/techdoc/ref/hold.html hold]</span><br />
| Hold current graph in the figure<br />
|-<br />
| style="width:30%" | <span id="home">[http://itp.tugraz.at/matlab/techdoc/ref/home.html home]</span><br />
| Move cursor to upper left corner of Command Window<br />
|-<br />
| style="width:30%" | <span id="horzcat">[http://itp.tugraz.at/matlab/techdoc/ref/horzcat.html horzcat]</span><br />
| Concatenate arrays horizontally<br />
|-<br />
| style="width:30%" | <span id="hostid">[http://itp.tugraz.at/matlab/techdoc/ref/hostid.html hostid]</span><br />
| Return MATLAB server host identification number<br />
|-<br />
| style="width:30%" | <span id="hsv2rgb">[http://itp.tugraz.at/matlab/techdoc/ref/hsv2rgb.html hsv2rgb]</span><br />
| Convert HSV colormap to RGB colormap<br />
|-<br />
| style="width:30%" | <span id="hypot">[http://itp.tugraz.at/matlab/techdoc/ref/hypot.html hypot]</span><br />
| Square root of sum of squares<br />
|-<br />
|}<br />
<br />
= i =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="ifft">[http://itp.tugraz.at/matlab/techdoc/ref/ifft.html ifft]</span><br />
| Inverse discrete Fourier transform<br />
|-<br />
| style="width:30%" | <span id="i">[http://itp.tugraz.at/matlab/techdoc/ref/i.html i]</span><br />
| Imaginary unit<br />
|-<br />
| style="width:30%" | <span id="if">[http://itp.tugraz.at/matlab/techdoc/ref/if.html if]</span><br />
| Conditionally execute statements<br />
|-<br />
| style="width:30%" | <span id="ifftshift">[http://itp.tugraz.at/matlab/techdoc/ref/ifftshift.html ifftshift]</span><br />
| Inverse FFT shift<br />
|-<br />
| style="width:30%" | <span id="ifft2">[http://itp.tugraz.at/matlab/techdoc/ref/ifft2.html ifft2]</span><br />
| Two-dimensional inverse discrete Fourier transform<br />
|-<br />
| style="width:30%" | <span id="ifftn">[http://itp.tugraz.at/matlab/techdoc/ref/ifftn.html ifftn]</span><br />
| Multidimensional inverse discrete Fourier transform<br />
|-<br />
| style="width:30%" | <span id="im2frame">[http://itp.tugraz.at/matlab/techdoc/ref/im2frame.html im2frame]</span><br />
| Convert indexed image into movie format<br />
|-<br />
| style="width:30%" | <span id="image_props">[http://itp.tugraz.at/matlab/techdoc/ref/image_props.html image_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="im2java">[http://itp.tugraz.at/matlab/techdoc/ref/im2java.html im2java]</span><br />
| Convert image to Java image<br />
|-<br />
| style="width:30%" | <span id="imag">[http://itp.tugraz.at/matlab/techdoc/ref/imag.html imag]</span><br />
| Imaginary part of a complex number<br />
|-<br />
| style="width:30%" | <span id="image">[http://itp.tugraz.at/matlab/techdoc/ref/image.html image]</span><br />
| Display image object<br />
|-<br />
| style="width:30%" | <span id="imformats">[http://itp.tugraz.at/matlab/techdoc/ref/imformats.html imformats]</span><br />
| Manage file format registry <br />
|-<br />
| style="width:30%" | <span id="imagesc">[http://itp.tugraz.at/matlab/techdoc/ref/imagesc.html imagesc]</span><br />
| Scale data and display an image object<br />
|-<br />
| style="width:30%" | <span id="imfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/imfinfo.html imfinfo]</span><br />
| Information about graphics file<br />
|-<br />
| style="width:30%" | <span id="importdata">[http://itp.tugraz.at/matlab/techdoc/ref/importdata.html importdata]</span><br />
| Load data from disk file<br />
|-<br />
| style="width:30%" | <span id="import">[http://itp.tugraz.at/matlab/techdoc/ref/import.html import]</span><br />
| Add package or class to current Java import list<br />
|-<br />
| style="width:30%" | <span id="inferiorto">[http://itp.tugraz.at/matlab/techdoc/ref/inferiorto.html inferiorto]</span><br />
| Establish inferior class relationship<br />
|-<br />
| style="width:30%" | <span id="imread">[http://itp.tugraz.at/matlab/techdoc/ref/imread.html imread]</span><br />
| Read image from graphics file<br />
|-<br />
| style="width:30%" | <span id="imwrite">[http://itp.tugraz.at/matlab/techdoc/ref/imwrite.html imwrite]</span><br />
| Write image to graphics file<br />
|-<br />
| style="width:30%" | <span id="ind2rgb">[http://itp.tugraz.at/matlab/techdoc/ref/ind2rgb.html ind2rgb]</span><br />
| Convert an indexed image to an RGB image<br />
|-<br />
| style="width:30%" | <span id="ind2sub">[http://itp.tugraz.at/matlab/techdoc/ref/ind2sub.html ind2sub]</span><br />
| Subscripts from linear index<br />
|-<br />
| style="width:30%" | <span id="inf">[http://itp.tugraz.at/matlab/techdoc/ref/inf.html inf]</span><br />
| Infinity<br />
|-<br />
| style="width:30%" | <span id="inpolygon">[http://itp.tugraz.at/matlab/techdoc/ref/inpolygon.html inpolygon]</span><br />
| Detect points inside a polygonal region<br />
|-<br />
| style="width:30%" | <span id="info">[http://itp.tugraz.at/matlab/techdoc/ref/info.html info]</span><br />
| Display information about contacting The MathWorks<br />
|-<br />
| style="width:30%" | <span id="inline">[http://itp.tugraz.at/matlab/techdoc/ref/inline.html inline]</span><br />
| Construct an inline object<br />
|-<br />
| style="width:30%" | <span id="inmem">[http://itp.tugraz.at/matlab/techdoc/ref/inmem.html inmem]</span><br />
| Return names of M-files, MEX-files, Java classes in memory<br />
|-<br />
| style="width:30%" | <span id="inputdlg">[http://itp.tugraz.at/matlab/techdoc/ref/inputdlg.html inputdlg]</span><br />
| <font face=sansserif>Create and display input dialog box</font><br />
|-<br />
| style="width:30%" | <span id="input">[http://itp.tugraz.at/matlab/techdoc/ref/input.html input]</span><br />
| Request user input<br />
|-<br />
| style="width:30%" | <span id="instrcallback">[http://itp.tugraz.at/matlab/techdoc/ref/instrcallback.html instrcallback]</span><br />
| Display event information when an event occurs<br />
|-<br />
| style="width:30%" | <span id="inputname">[http://itp.tugraz.at/matlab/techdoc/ref/inputname.html inputname]</span><br />
| Return variable name of function input<br />
|-<br />
| style="width:30%" | <span id="inspect">[http://itp.tugraz.at/matlab/techdoc/ref/inspect.html inspect]</span><br />
| Display Property Inspector<br />
|-<br />
| style="width:30%" | <span id="interpstreamspeed">[http://itp.tugraz.at/matlab/techdoc/ref/interpstreamspeed.html interpstreamspeed]</span><br />
| Interpolate stream line vertices from flow speed<br />
|-<br />
| style="width:30%" | <span id="instrfind">[http://itp.tugraz.at/matlab/techdoc/ref/instrfind.html instrfind]</span><br />
| Return serial port objects from memory to the MATLAB workspace<br />
|-<br />
| style="width:30%" | <span id="int16">[http://itp.tugraz.at/matlab/techdoc/ref/int16.html int16]</span><br />
| Convert to signed integer<br />
|-<br />
| style="width:30%" | <span id="int2str">[http://itp.tugraz.at/matlab/techdoc/ref/int2str.html int2str]</span><br />
| Convert integer to string<br />
|-<br />
| style="width:30%" | <span id="int32">[http://itp.tugraz.at/matlab/techdoc/ref/int32.html int32]</span><br />
| Convert to signed integer<br />
|-<br />
| style="width:30%" | <span id="int64">[http://itp.tugraz.at/matlab/techdoc/ref/int64.html int64]</span><br />
| Convert to signed integer<br />
|-<br />
| style="width:30%" | <span id="int8">[http://itp.tugraz.at/matlab/techdoc/ref/int8.html int8]</span><br />
| Convert to signed integer<br />
|-<br />
| style="width:30%" | <span id="interfaces">[http://itp.tugraz.at/matlab/techdoc/ref/interfaces.html interfaces]</span><br />
| List custom interfaces to COM server<br />
|-<br />
| style="width:30%" | <span id="interp1">[http://itp.tugraz.at/matlab/techdoc/ref/interp1.html interp1]</span><br />
| One-dimensional data interpolation (table lookup)<br />
|-<br />
| style="width:30%" | <span id="interp2">[http://itp.tugraz.at/matlab/techdoc/ref/interp2.html interp2]</span><br />
| Two-dimensional data interpolation (table lookup)<br />
|-<br />
| style="width:30%" | <span id="inv">[http://itp.tugraz.at/matlab/techdoc/ref/inv.html inv]</span><br />
| Matrix inverse<br />
|-<br />
| style="width:30%" | <span id="interp3">[http://itp.tugraz.at/matlab/techdoc/ref/interp3.html interp3]</span><br />
| Three-dimensional data interpolation (table lookup)<br />
|-<br />
| style="width:30%" | <span id="interpft">[http://itp.tugraz.at/matlab/techdoc/ref/interpft.html interpft]</span><br />
| One-dimensional interpolation using the FFT method<br />
|-<br />
| style="width:30%" | <span id="interpn">[http://itp.tugraz.at/matlab/techdoc/ref/interpn.html interpn]</span><br />
| Multidimensional data interpolation (table lookup)<br />
|-<br />
| style="width:30%" | <span id="isvalidtimer">[http://itp.tugraz.at/matlab/techdoc/ref/isvalidtimer.html isvalidtimer]</span><br />
| Determine if timer object is valid<br />
|-<br />
| style="width:30%" | <span id="intersect">[http://itp.tugraz.at/matlab/techdoc/ref/intersect.html intersect]</span><br />
| Find set intersection of two vectors<br />
|-<br />
| style="width:30%" | <span id="intmax">[http://itp.tugraz.at/matlab/techdoc/ref/intmax.html intmax]</span><br />
| Largest possible value of specified integer type<br />
|-<br />
| style="width:30%" | <span id="intmin">[http://itp.tugraz.at/matlab/techdoc/ref/intmin.html intmin]</span><br />
| Smallest possible value of specified integer type<br />
|-<br />
| style="width:30%" | <span id="intwarning">[http://itp.tugraz.at/matlab/techdoc/ref/intwarning.html intwarning]</span><br />
| Control state of integer warnings<br />
|-<br />
| style="width:30%" | <span id="invhilb">[http://itp.tugraz.at/matlab/techdoc/ref/invhilb.html invhilb]</span><br />
| Inverse of the Hilbert matrix<br />
|-<br />
| style="width:30%" | <span id="invoke">[http://itp.tugraz.at/matlab/techdoc/ref/invoke.html invoke]</span><br />
| Invoke method on object or interface, or display methods<br />
|-<br />
| style="width:30%" | <span id="ipermute">[http://itp.tugraz.at/matlab/techdoc/ref/ipermute.html ipermute]</span><br />
| Inverse permute the dimensions of a multidimensional array<br />
|-<br />
| style="width:30%" | <span id="is">[http://itp.tugraz.at/matlab/techdoc/ref/is.html is]</span><br />
| Detect state<br />
|-<br />
| style="width:30%" | <span id="isa">[http://itp.tugraz.at/matlab/techdoc/ref/isa.html isa]</span><br />
| Determine if input is object of given class<br />
|-<br />
| style="width:30%" | <span id="isappdata">[http://itp.tugraz.at/matlab/techdoc/ref/isappdata.html isappdata]</span><br />
| True if application-defined data exists<br />
|-<br />
| style="width:30%" | <span id="iscell">[http://itp.tugraz.at/matlab/techdoc/ref/iscell.html iscell]</span><br />
| Determine if input is cell array<br />
|-<br />
| style="width:30%" | <span id="iscellstr">[http://itp.tugraz.at/matlab/techdoc/ref/iscellstr.html iscellstr]</span><br />
| Determine if input is cell array of strings<br />
|-<br />
| style="width:30%" | <span id="ischar">[http://itp.tugraz.at/matlab/techdoc/ref/ischar.html ischar]</span><br />
| Determine if item is character array<br />
|-<br />
| style="width:30%" | <span id="iscom">[http://itp.tugraz.at/matlab/techdoc/ref/iscom.html iscom]</span><br />
| Determine if input is COM object<br />
|-<br />
| style="width:30%" | <span id="isdir">[http://itp.tugraz.at/matlab/techdoc/ref/isdir.html isdir]</span><br />
| Determine if input is a directory<br />
|-<br />
| style="width:30%" | <span id="isempty">[http://itp.tugraz.at/matlab/techdoc/ref/isempty.html isempty]</span><br />
| Determine if array is empty<br />
|-<br />
| style="width:30%" | <span id="isequal">[http://itp.tugraz.at/matlab/techdoc/ref/isequal.html isequal]</span><br />
| Test arrays for equality<br />
|-<br />
| style="width:30%" | <span id="isevent">[http://itp.tugraz.at/matlab/techdoc/ref/isevent.html isevent]</span><br />
| Determine if input is event<br />
|-<br />
| style="width:30%" | <span id="isfield">[http://itp.tugraz.at/matlab/techdoc/ref/isfield.html isfield]</span><br />
| Determine if input is MATLAB structure array field<br />
|-<br />
| style="width:30%" | <span id="isequalwithequalnans">[http://itp.tugraz.at/matlab/techdoc/ref/isequalwithequalnans.html isequalwithequalnans]</span><br />
| Test arrays for equality, treating <code>NaN</code>s as equal<br />
|-<br />
| style="width:30%" | <span id="isfinite">[http://itp.tugraz.at/matlab/techdoc/ref/isfinite.html isfinite]</span><br />
| Detect finite elements of array<br />
|-<br />
| style="width:30%" | <span id="isfloat">[http://itp.tugraz.at/matlab/techdoc/ref/isfloat.html isfloat]</span><br />
| Determine if input is floating-point array<br />
|-<br />
| style="width:30%" | <span id="isglobal">[http://itp.tugraz.at/matlab/techdoc/ref/isglobal.html isglobal]</span><br />
| Determine if input is global variable<br />
|-<br />
| style="width:30%" | <span id="ishandle">[http://itp.tugraz.at/matlab/techdoc/ref/ishandle.html ishandle]</span><br />
| Returns true for graphics handles<br />
|-<br />
| style="width:30%" | <span id="ishold">[http://itp.tugraz.at/matlab/techdoc/ref/ishold.html ishold]</span><br />
| Returns current hold state<br />
|-<br />
| style="width:30%" | <span id="isinf">[http://itp.tugraz.at/matlab/techdoc/ref/isinf.html isinf]</span><br />
| Detect infinite elements of array<br />
|-<br />
| style="width:30%" | <span id="isinteger">[http://itp.tugraz.at/matlab/techdoc/ref/isinteger.html isinteger]</span><br />
| Determine if input is integer array<br />
|-<br />
| style="width:30%" | <span id="isinterface">[http://itp.tugraz.at/matlab/techdoc/ref/isinterface.html isinterface]</span><br />
| Determine if input is COM interface<br />
|-<br />
| style="width:30%" | <span id="isjava">[http://itp.tugraz.at/matlab/techdoc/ref/isjava.html isjava]</span><br />
| Determine if input is Java object<br />
|-<br />
| style="width:30%" | <span id="iskeyword">[http://itp.tugraz.at/matlab/techdoc/ref/iskeyword.html iskeyword]</span><br />
| Determine if input is MATLAB keyword<br />
|-<br />
| style="width:30%" | <span id="isletter">[http://itp.tugraz.at/matlab/techdoc/ref/isletter.html isletter]</span><br />
| Detect array elements that are letters of alphabet<br />
|-<br />
| style="width:30%" | <span id="islogical">[http://itp.tugraz.at/matlab/techdoc/ref/islogical.html islogical]</span><br />
| Determine if input is logical array<br />
|-<br />
| style="width:30%" | <span id="ismember">[http://itp.tugraz.at/matlab/techdoc/ref/ismember.html ismember]</span><br />
| Detect members of set<br />
|-<br />
| style="width:30%" | <span id="ismethod">[http://itp.tugraz.at/matlab/techdoc/ref/ismethod.html ismethod]</span><br />
| Determine if input is object method<br />
|-<br />
| style="width:30%" | <span id="isnan">[http://itp.tugraz.at/matlab/techdoc/ref/isnan.html isnan]</span><br />
| Detect <code>NaN</code> elements of array<br />
|-<br />
| style="width:30%" | <span id="isnumeric">[http://itp.tugraz.at/matlab/techdoc/ref/isnumeric.html isnumeric]</span><br />
| Determine if input is numeric array<br />
|-<br />
| style="width:30%" | <span id="isobject">[http://itp.tugraz.at/matlab/techdoc/ref/isobject.html isobject]</span><br />
| Determine if input is MATLAB OOPs object<br />
|-<br />
| style="width:30%" | <span id="isocaps">[http://itp.tugraz.at/matlab/techdoc/ref/isocaps.html isocaps]</span><br />
| Compute isosurface end cap geometry<br />
|-<br />
| style="width:30%" | <span id="isocolors">[http://itp.tugraz.at/matlab/techdoc/ref/isocolors.html isocolors]</span><br />
| Calculates isosurface and patch colors<br />
|-<br />
| style="width:30%" | <span id="isonormals">[http://itp.tugraz.at/matlab/techdoc/ref/isonormals.html isonormals]</span><br />
| Compute normals of isosurface vertices<br />
|-<br />
| style="width:30%" | <span id="isosurface">[http://itp.tugraz.at/matlab/techdoc/ref/isosurface.html isosurface]</span><br />
| Extract isosurface data from volume data<br />
|-<br />
| style="width:30%" | <span id="ispc">[http://itp.tugraz.at/matlab/techdoc/ref/ispc.html ispc]</span><br />
| Determine if PC (Windows) version of MATLAB<br />
|-<br />
| style="width:30%" | <span id="ispref">[http://itp.tugraz.at/matlab/techdoc/ref/ispref.html ispref]</span><br />
| Test for existence of preference<br />
|-<br />
| style="width:30%" | <span id="isprime">[http://itp.tugraz.at/matlab/techdoc/ref/isprime.html isprime]</span><br />
| Detect prime elements of array<br />
|-<br />
| style="width:30%" | <span id="isprop">[http://itp.tugraz.at/matlab/techdoc/ref/isprop.html isprop]</span><br />
| Determine if input is object property<br />
|-<br />
| style="width:30%" | <span id="isreal">[http://itp.tugraz.at/matlab/techdoc/ref/isreal.html isreal]</span><br />
| Determine if all array elements are real numbers<br />
|-<br />
| style="width:30%" | <span id="isscalar">[http://itp.tugraz.at/matlab/techdoc/ref/isscalar.html isscalar]</span><br />
| Determine if input is scalar<br />
|-<br />
| style="width:30%" | <span id="issorted">[http://itp.tugraz.at/matlab/techdoc/ref/issorted.html issorted]</span><br />
| Determine if set elements are in sorted order<br />
|-<br />
| style="width:30%" | <span id="isspace">[http://itp.tugraz.at/matlab/techdoc/ref/isspace.html isspace]</span><br />
| Detect space characters in array<br />
|-<br />
| style="width:30%" | <span id="issparse">[http://itp.tugraz.at/matlab/techdoc/ref/issparse.html issparse]</span><br />
| Determine if input is sparse<br />
|-<br />
| style="width:30%" | <span id="isstr">[http://itp.tugraz.at/matlab/techdoc/ref/isstr.html isstr]</span><br />
| Determine if input is character array<br />
|-<br />
| style="width:30%" | <span id="isstrprop">[http://itp.tugraz.at/matlab/techdoc/ref/isstrprop.html isstrprop]</span><br />
| Determine if string is of specified category<br />
|-<br />
| style="width:30%" | <span id="isstruct">[http://itp.tugraz.at/matlab/techdoc/ref/isstruct.html isstruct]</span><br />
| Determine if input is MATLAB structure array<br />
|-<br />
| style="width:30%" | <span id="isstudent">[http://itp.tugraz.at/matlab/techdoc/ref/isstudent.html isstudent]</span><br />
| Determine if Student Version of MATLAB<br />
|-<br />
| style="width:30%" | <span id="isunix">[http://itp.tugraz.at/matlab/techdoc/ref/isunix.html isunix]</span><br />
| Determine if UNIX version of MATLAB<br />
|-<br />
| style="width:30%" | <span id="isvalid">[http://itp.tugraz.at/matlab/techdoc/ref/isvalid.html isvalid]</span><br />
| Determine if serial port objects are valid<br />
|-<br />
| style="width:30%" | <span id="isvarname">[http://itp.tugraz.at/matlab/techdoc/ref/isvarname.html isvarname]</span><br />
| Determine if input is valid variable name<br />
|-<br />
| style="width:30%" | <span id="isvector">[http://itp.tugraz.at/matlab/techdoc/ref/isvector.html isvector]</span><br />
| Determine if input is vector<br />
|-<br />
|}<br />
<br />
= j =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="javaclasspath">[http://itp.tugraz.at/matlab/techdoc/ref/javaclasspath.html javaclasspath]</span><br />
| Set and get dynamic Java class path<br />
|-<br />
| style="width:30%" | <span id="j">[http://itp.tugraz.at/matlab/techdoc/ref/j.html j]</span><br />
| Imaginary unit<br />
|-<br />
| style="width:30%" | <span id="javaaddpath">[http://itp.tugraz.at/matlab/techdoc/ref/javaaddpath.html javaaddpath]</span><br />
| Add Java classes to MATLAB using dynamic Java class path<br />
|-<br />
| style="width:30%" | <span id="javaarray">[http://itp.tugraz.at/matlab/techdoc/ref/javaarray.html javaarray]</span><br />
| Construct Java array<br />
|-<br />
| style="width:30%" | <span id="javachk">[http://itp.tugraz.at/matlab/techdoc/ref/javachk.html javachk]</span><br />
| Generate error message based on Java feature support<br />
|-<br />
| style="width:30%" | <span id="javamethod">[http://itp.tugraz.at/matlab/techdoc/ref/javamethod.html javamethod]</span><br />
| Invoke Java method<br />
|-<br />
| style="width:30%" | <span id="javaobject">[http://itp.tugraz.at/matlab/techdoc/ref/javaobject.html javaobject]</span><br />
| Construct Java object<br />
|-<br />
| style="width:30%" | <span id="javarmpath">[http://itp.tugraz.at/matlab/techdoc/ref/javarmpath.html javarmpath]</span><br />
| Remove entries from dynamic Java class path<br />
|-<br />
|}<br />
<br />
= k =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="keyboard">[http://itp.tugraz.at/matlab/techdoc/ref/keyboard.html keyboard]</span><br />
| Get input from keyboard<br />
|-<br />
| style="width:30%" | <span id="kron">[http://itp.tugraz.at/matlab/techdoc/ref/kron.html kron]</span><br />
| Kronecker tensor product<br />
|-<br />
|}<br />
<br />
= l =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="lengthserial">[http://itp.tugraz.at/matlab/techdoc/ref/lengthserial.html lengthserial]</span><br />
| Length of serial port object array<br />
|-<br />
| style="width:30%" | <span id="lasterr">[http://itp.tugraz.at/matlab/techdoc/ref/lasterr.html lasterr]</span><br />
| Return last error message<br />
|-<br />
| style="width:30%" | <span id="lasterror">[http://itp.tugraz.at/matlab/techdoc/ref/lasterror.html lasterror]</span><br />
| Return last error message and related information<br />
|-<br />
| style="width:30%" | <span id="lastwarn">[http://itp.tugraz.at/matlab/techdoc/ref/lastwarn.html lastwarn]</span><br />
| Return last warning message<br />
|-<br />
| style="width:30%" | <span id="lcm">[http://itp.tugraz.at/matlab/techdoc/ref/lcm.html lcm]</span><br />
| Least common multiple<br />
|-<br />
| style="width:30%" | <span id="ldivide">[http://itp.tugraz.at/matlab/techdoc/ref/ldivide.html ldivide]</span><br />
| Left or right array division <br />
|-<br />
| style="width:30%" | <span id="le">[http://itp.tugraz.at/matlab/techdoc/ref/le.html le]</span><br />
| Test for less than or equal to<br />
|-<br />
| style="width:30%" | <span id="legend">[http://itp.tugraz.at/matlab/techdoc/ref/legend.html legend]</span><br />
| Display a legend on graphs<br />
|-<br />
| style="width:30%" | <span id="legendre">[http://itp.tugraz.at/matlab/techdoc/ref/legendre.html legendre]</span><br />
| Associated Legendre functions<br />
|-<br />
| style="width:30%" | <span id="length">[http://itp.tugraz.at/matlab/techdoc/ref/length.html length]</span><br />
| Length of vector<br />
|-<br />
| style="width:30%" | <span id="libfunctionsview">[http://itp.tugraz.at/matlab/techdoc/ref/libfunctionsview.html libfunctionsview]</span><br />
| Create window displaying information on functions in external library<br />
|-<br />
| style="width:30%" | <span id="libfunctions">[http://itp.tugraz.at/matlab/techdoc/ref/libfunctions.html libfunctions]</span><br />
| Return information on functions in external library<br />
|-<br />
| style="width:30%" | <span id="libisloaded">[http://itp.tugraz.at/matlab/techdoc/ref/libisloaded.html libisloaded]</span><br />
| Determine if external library is loaded<br />
|-<br />
| style="width:30%" | <span id="libpointer">[http://itp.tugraz.at/matlab/techdoc/ref/libpointer.html libpointer]</span><br />
| Create pointer object for use with external libraries<br />
|-<br />
| style="width:30%" | <span id="libstruct">[http://itp.tugraz.at/matlab/techdoc/ref/libstruct.html libstruct]</span><br />
| Construct structure as defined in external library<br />
|-<br />
| style="width:30%" | <span id="license">[http://itp.tugraz.at/matlab/techdoc/ref/license.html license]</span><br />
| Return license number or perform licensing task<br />
|-<br />
| style="width:30%" | <span id="light">[http://itp.tugraz.at/matlab/techdoc/ref/light.html light]</span><br />
| Create a light object<br />
|-<br />
| style="width:30%" | <span id="light_props">[http://itp.tugraz.at/matlab/techdoc/ref/light_props.html light_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="lightangle">[http://itp.tugraz.at/matlab/techdoc/ref/lightangle.html lightangle]</span><br />
| Create or position a [http://itp.tugraz.at/matlab/techdoc/ref/light.html light] object in spherical coordinates<br />
|-<br />
| style="width:30%" | <span id="lighting">[http://itp.tugraz.at/matlab/techdoc/ref/lighting.html lighting]</span><br />
| Select the lighting algorithm<br />
|-<br />
| style="width:30%" | <span id="lin2mu">[http://itp.tugraz.at/matlab/techdoc/ref/lin2mu.html lin2mu]</span><br />
| Convert linear audio signal to mu-law<br />
|-<br />
| style="width:30%" | <span id="line">[http://itp.tugraz.at/matlab/techdoc/ref/line.html line]</span><br />
| Create line object<br />
|-<br />
| style="width:30%" | <span id="line_props">[http://itp.tugraz.at/matlab/techdoc/ref/line_props.html line_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="linespec">[http://itp.tugraz.at/matlab/techdoc/ref/linespec.html linespec]</span><br />
| Line specification syntax<br />
|-<br />
| style="width:30%" | <span id="listdlg">[http://itp.tugraz.at/matlab/techdoc/ref/listdlg.html listdlg]</span><br />
| Create and display list selection dialog box<br />
|-<br />
| style="width:30%" | <span id="lineseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/lineseriesproperties.html lineseriesproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="linkaxes">[http://itp.tugraz.at/matlab/techdoc/ref/linkaxes.html linkaxes]</span><br />
| Synchronize limits of specified 2-D axes <br />
|-<br />
| style="width:30%" | <span id="linkprop">[http://itp.tugraz.at/matlab/techdoc/ref/linkprop.html linkprop]</span><br />
| Keep same value for corresponding properties<br />
|-<br />
| style="width:30%" | <span id="linsolve">[http://itp.tugraz.at/matlab/techdoc/ref/linsolve.html linsolve]</span><br />
| Solve a linear system of equations<br />
|-<br />
| style="width:30%" | <span id="linspace">[http://itp.tugraz.at/matlab/techdoc/ref/linspace.html linspace]</span><br />
| Generate linearly spaced vectors<br />
|-<br />
| style="width:30%" | <span id="load">[http://itp.tugraz.at/matlab/techdoc/ref/load.html load]</span><br />
| Load workspace variables from disk<br />
|-<br />
| style="width:30%" | <span id="loadcom">[http://itp.tugraz.at/matlab/techdoc/ref/loadcom.html loadcom]</span><br />
| Initialize control object from file<br />
|-<br />
| style="width:30%" | <span id="loadlibrary">[http://itp.tugraz.at/matlab/techdoc/ref/loadlibrary.html loadlibrary]</span><br />
| Load external library into MATLAB<br />
|-<br />
| style="width:30%" | <span id="loadobj">[http://itp.tugraz.at/matlab/techdoc/ref/loadobj.html loadobj]</span><br />
| User-defined extension of <code>load</code> function for user objects<br />
|-<br />
| style="width:30%" | <span id="loadserial">[http://itp.tugraz.at/matlab/techdoc/ref/loadserial.html loadserial]</span><br />
| Load serial port objects and variables into the MATLAB workspace<br />
|-<br />
| style="width:30%" | <span id="log">[http://itp.tugraz.at/matlab/techdoc/ref/log.html log]</span><br />
| Natural logarithm<br />
|-<br />
| style="width:30%" | <span id="log10">[http://itp.tugraz.at/matlab/techdoc/ref/log10.html log10]</span><br />
| Common (base 10) logarithm<br />
|-<br />
| style="width:30%" | <span id="log1p">[http://itp.tugraz.at/matlab/techdoc/ref/log1p.html log1p]</span><br />
| Compute <code>log(1+x)</code> accurately for small values of <code>x</code><br />
|-<br />
| style="width:30%" | <span id="log2">[http://itp.tugraz.at/matlab/techdoc/ref/log2.html log2]</span><br />
| Base 2 logarithm and dissect floating-point numbers into exponent and mantissa<br />
|-<br />
| style="width:30%" | <span id="logical">[http://itp.tugraz.at/matlab/techdoc/ref/logical.html logical]</span><br />
| Convert numeric values to logical<br />
|-<br />
| style="width:30%" | <span id="logicaloperatorsshortcircuit">[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorsshortcircuit.html logicaloperatorsshortcircuit]</span><br />
| Logical operations, with short-circuiting capability<br />
|-<br />
| style="width:30%" | <span id="logicaloperatorselementwise">[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorselementwise.html logicaloperatorselementwise]</span><br />
| Elementwise logical operations on arrays<br />
|-<br />
| style="width:30%" | <span id="loglog">[http://itp.tugraz.at/matlab/techdoc/ref/loglog.html loglog]</span><br />
| Log-log scale plot<br />
|-<br />
| style="width:30%" | <span id="logm">[http://itp.tugraz.at/matlab/techdoc/ref/logm.html logm]</span><br />
| Matrix logarithm<br />
|-<br />
| style="width:30%" | <span id="logspace">[http://itp.tugraz.at/matlab/techdoc/ref/logspace.html logspace]</span><br />
| Generate logarithmically spaced vectors<br />
|-<br />
| style="width:30%" | <span id="lookfor">[http://itp.tugraz.at/matlab/techdoc/ref/lookfor.html lookfor]</span><br />
| Search for keyword in all help entries<br />
|-<br />
| style="width:30%" | <span id="lower">[http://itp.tugraz.at/matlab/techdoc/ref/lower.html lower]</span><br />
| Convert string to lowercase<br />
|-<br />
| style="width:30%" | <span id="ls">[http://itp.tugraz.at/matlab/techdoc/ref/ls.html ls]</span><br />
| Display directory contents on UNIX system<br />
|-<br />
| style="width:30%" | <span id="lscov">[http://itp.tugraz.at/matlab/techdoc/ref/lscov.html lscov]</span><br />
| Least squares solution in the presence of known covariance<br />
|-<br />
| style="width:30%" | <span id="lsqnonneg">[http://itp.tugraz.at/matlab/techdoc/ref/lsqnonneg.html lsqnonneg]</span><br />
| Linear least squares with nonnegativity constraints<br />
|-<br />
| style="width:30%" | <span id="lsqr">[http://itp.tugraz.at/matlab/techdoc/ref/lsqr.html lsqr]</span><br />
| LSQR method<br />
|-<br />
| style="width:30%" | <span id="lt">[http://itp.tugraz.at/matlab/techdoc/ref/lt.html lt]</span><br />
| Test for less than<br />
|-<br />
| style="width:30%" | <span id="lu">[http://itp.tugraz.at/matlab/techdoc/ref/lu.html lu]</span><br />
| LU matrix factorization<br />
|-<br />
| style="width:30%" | <span id="luinc">[http://itp.tugraz.at/matlab/techdoc/ref/luinc.html luinc]</span><br />
| Incomplete LU matrix factorizations<br />
|-<br />
|}<br />
<br />
= m =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="matlabwindows">[http://itp.tugraz.at/matlab/techdoc/ref/matlabwindows.html matlabwindows]</span><br />
| Start MATLAB (Windows systems)<br />
|-<br />
| style="width:30%" | <span id="magic">[http://itp.tugraz.at/matlab/techdoc/ref/magic.html magic]</span><br />
| Magic square<br />
|-<br />
| style="width:30%" | <span id="makehgtform">[http://itp.tugraz.at/matlab/techdoc/ref/makehgtform.html makehgtform]</span><br />
| Create 4-by-4 transform matrix<br />
|-<br />
| style="width:30%" | <span id="mat2cell">[http://itp.tugraz.at/matlab/techdoc/ref/mat2cell.html mat2cell]</span><br />
| Divide matrix into cell array of matrices<br />
|-<br />
| style="width:30%" | <span id="mat2str">[http://itp.tugraz.at/matlab/techdoc/ref/mat2str.html mat2str]</span><br />
| Convert matrix to string<br />
|-<br />
| style="width:30%" | <span id="material">[http://itp.tugraz.at/matlab/techdoc/ref/material.html material]</span><br />
| Controls the reflectance properties of surfaces and patches<br />
|-<br />
| style="width:30%" | <span id="max">[http://itp.tugraz.at/matlab/techdoc/ref/max.html max]</span><br />
| Maximum elements of an array<br />
|-<br />
| style="width:30%" | <span id="mex">[http://itp.tugraz.at/matlab/techdoc/ref/mex.html mex]</span><br />
| Compile MEX-function from C or Fortran source code<br />
|-<br />
| style="width:30%" | <span id="min">[http://itp.tugraz.at/matlab/techdoc/ref/min.html min]</span><br />
| Minimum elements of an array<br />
|-<br />
| style="width:30%" | <span id="matlabcolon">[http://itp.tugraz.at/matlab/techdoc/ref/matlabcolon.html matlabcolon]</span><br />
| Run specified function via hyperlink<br />
|-<br />
| style="width:30%" | <span id="matlabrc">[http://itp.tugraz.at/matlab/techdoc/ref/matlabrc.html matlabrc]</span><br />
| MATLAB startup M-file for single-user systems or system administrators<br />
|-<br />
| style="width:30%" | <span id="matlabroot">[http://itp.tugraz.at/matlab/techdoc/ref/matlabroot.html matlabroot]</span><br />
| Return root directory of MATLAB installation<br />
|-<br />
| style="width:30%" | <span id="matlabunix">[http://itp.tugraz.at/matlab/techdoc/ref/matlabunix.html matlabunix]</span><br />
| Start MATLAB (UNIX systems)<br />
|-<br />
| style="width:30%" | <span id="mode">[http://itp.tugraz.at/matlab/techdoc/ref/mode.html mode]</span><br />
| Find most frequent values in sample<br />
|-<br />
| style="width:30%" | <span id="mod">[http://itp.tugraz.at/matlab/techdoc/ref/mod.html mod]</span><br />
| Modulus after division<br />
|-<br />
| style="width:30%" | <span id="maximizecommandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/maximizecommandwindow.html maximizecommandwindow]</span><br />
| Display server window on Windows desktop<br />
|-<br />
| style="width:30%" | <span id="mean">[http://itp.tugraz.at/matlab/techdoc/ref/mean.html mean]</span><br />
| Average or mean value of arrays<br />
|-<br />
| style="width:30%" | <span id="median">[http://itp.tugraz.at/matlab/techdoc/ref/median.html median]</span><br />
| Median value of arrays<br />
|-<br />
| style="width:30%" | <span id="memmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/memmapfile.html memmapfile]</span><br />
| Construct memory map object<br />
|-<br />
| style="width:30%" | <span id="memory">[http://itp.tugraz.at/matlab/techdoc/ref/memory.html memory]</span><br />
| Help for memory limitations<br />
|-<br />
| style="width:30%" | <span id="menu">[http://itp.tugraz.at/matlab/techdoc/ref/menu.html menu]</span><br />
| Generate menu of choices for user input<br />
|-<br />
| style="width:30%" | <span id="mesh">[http://itp.tugraz.at/matlab/techdoc/ref/mesh.html mesh]</span><br />
| Mesh plots<br />
|-<br />
| style="width:30%" | <span id="meshc">[http://itp.tugraz.at/matlab/techdoc/ref/meshc.html meshc]</span><br />
| Mesh plots<br />
|-<br />
| style="width:30%" | <span id="meshgrid">[http://itp.tugraz.at/matlab/techdoc/ref/meshgrid.html meshgrid]</span><br />
| Generate <code>X</code> and <code>Y</code> matrices for three-dimensional plots<br />
|-<br />
| style="width:30%" | <span id="meshz">[http://itp.tugraz.at/matlab/techdoc/ref/meshz.html meshz]</span><br />
| Mesh plots<br />
|-<br />
| style="width:30%" | <span id="methods">[http://itp.tugraz.at/matlab/techdoc/ref/methods.html methods]</span><br />
| Display information on class methods<br />
|-<br />
| style="width:30%" | <span id="methodsview">[http://itp.tugraz.at/matlab/techdoc/ref/methodsview.html methodsview]</span><br />
| Display information on class methods in separate window<br />
|-<br />
| style="width:30%" | <span id="mexext">[http://itp.tugraz.at/matlab/techdoc/ref/mexext.html mexext]</span><br />
| Return MEX-filename extension<br />
|-<br />
| style="width:30%" | <span id="mfilename">[http://itp.tugraz.at/matlab/techdoc/ref/mfilename.html mfilename]</span><br />
| Return name of currently running M-file<br />
|-<br />
| style="width:30%" | <span id="mget">[http://itp.tugraz.at/matlab/techdoc/ref/mget.html mget]</span><br />
| Download file from FTP server<br />
|-<br />
| style="width:30%" | <span id="minimizecommandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/minimizecommandwindow.html minimizecommandwindow]</span><br />
| Minimize size of server window<br />
|-<br />
| style="width:30%" | <span id="minres">[http://itp.tugraz.at/matlab/techdoc/ref/minres.html minres]</span><br />
| Minimum residual method<br />
|-<br />
| style="width:30%" | <span id="mislocked">[http://itp.tugraz.at/matlab/techdoc/ref/mislocked.html mislocked]</span><br />
| Determine if M-file or MEX-file cannot be cleared from memory<br />
|-<br />
| style="width:30%" | <span id="mkdir">[http://itp.tugraz.at/matlab/techdoc/ref/mkdir.html mkdir]</span><br />
| Make new directory<br />
|-<br />
| style="width:30%" | <span id="mkdirftp">[http://itp.tugraz.at/matlab/techdoc/ref/mkdirftp.html mkdirftp]</span><br />
| Create new directory on FTP server<br />
|-<br />
| style="width:30%" | <span id="mkpp">[http://itp.tugraz.at/matlab/techdoc/ref/mkpp.html mkpp]</span><br />
| Make a piecewise polynomial<br />
|-<br />
| style="width:30%" | <span id="mldivide">[http://itp.tugraz.at/matlab/techdoc/ref/mldivide.html mldivide]</span><br />
| right matrix division<br />
|-<br />
| style="width:30%" | <span id="mlint">[http://itp.tugraz.at/matlab/techdoc/ref/mlint.html mlint]</span><br />
| Check M-files for possible problems, and report results<br />
|-<br />
| style="width:30%" | <span id="mlintrpt">[http://itp.tugraz.at/matlab/techdoc/ref/mlintrpt.html mlintrpt]</span><br />
| Run [http://itp.tugraz.at/matlab/techdoc/ref/mlint.html mlint] for file or directory, reporting results in Web browser<br />
|-<br />
| style="width:30%" | <span id="mlock">[http://itp.tugraz.at/matlab/techdoc/ref/mlock.html mlock]</span><br />
| Prevent clearing M-file or MEX-file from memory<br />
|-<br />
| style="width:30%" | <span id="mmfileinfo">[http://itp.tugraz.at/matlab/techdoc/ref/mmfileinfo.html mmfileinfo]</span><br />
| Return information about multimedia file<br />
|-<br />
| style="width:30%" | <span id="movefile">[http://itp.tugraz.at/matlab/techdoc/ref/movefile.html movefile]</span><br />
| Move file or directory<br />
|-<br />
| style="width:30%" | <span id="more">[http://itp.tugraz.at/matlab/techdoc/ref/more.html more]</span><br />
| Control paged output for Command Window<br />
|-<br />
| style="width:30%" | <span id="move">[http://itp.tugraz.at/matlab/techdoc/ref/move.html move]</span><br />
| Move or resize control in parent window<br />
|-<br />
| style="width:30%" | <span id="movie2avi">[http://itp.tugraz.at/matlab/techdoc/ref/movie2avi.html movie2avi]</span><br />
| Create Audio/Video Interleaved (AVI) movie from MATLAB movie<br />
|-<br />
| style="width:30%" | <span id="movegui">[http://itp.tugraz.at/matlab/techdoc/ref/movegui.html movegui]</span><br />
| Move GUI figure to specified location on screen<br />
|-<br />
| style="width:30%" | <span id="movie">[http://itp.tugraz.at/matlab/techdoc/ref/movie.html movie]</span><br />
| Play recorded movie frames<br />
|-<br />
| style="width:30%" | <span id="mrdivide">[http://itp.tugraz.at/matlab/techdoc/ref/mrdivide.html mrdivide]</span><br />
| right matrix division<br />
|-<br />
| style="width:30%" | <span id="mput">[http://itp.tugraz.at/matlab/techdoc/ref/mput.html mput]</span><br />
| Upload file or directory to FTP server<br />
|-<br />
| style="width:30%" | <span id="multibandread">[http://itp.tugraz.at/matlab/techdoc/ref/multibandread.html multibandread]</span><br />
| Read band interleaved data from binary file<br />
|-<br />
| style="width:30%" | <span id="msgbox">[http://itp.tugraz.at/matlab/techdoc/ref/msgbox.html msgbox]</span><br />
| Create and display message box<br />
|-<br />
| style="width:30%" | <span id="mtimes">[http://itp.tugraz.at/matlab/techdoc/ref/mtimes.html mtimes]</span><br />
| Matrix multiplication<br />
|-<br />
| style="width:30%" | <span id="mu2lin">[http://itp.tugraz.at/matlab/techdoc/ref/mu2lin.html mu2lin]</span><br />
| Convert mu-law audio signal to linear<br />
|-<br />
| style="width:30%" | <span id="multibandwrite">[http://itp.tugraz.at/matlab/techdoc/ref/multibandwrite.html multibandwrite]</span><br />
| Write multiband data to file<br />
|-<br />
| style="width:30%" | <span id="munlock">[http://itp.tugraz.at/matlab/techdoc/ref/munlock.html munlock]</span><br />
| Allow clearing M-file or MEX-file from memory<br />
|-<br />
|}<br />
<br />
= n =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="namelengthmax">[http://itp.tugraz.at/matlab/techdoc/ref/namelengthmax.html namelengthmax]</span><br />
| Return maximum identifier length<br />
|-<br />
| style="width:30%" | <span id="nan">[http://itp.tugraz.at/matlab/techdoc/ref/nan.html nan]</span><br />
| Not-a-Number<br />
|-<br />
| style="width:30%" | <span id="nargchk">[http://itp.tugraz.at/matlab/techdoc/ref/nargchk.html nargchk]</span><br />
| Validate number of input arguments<br />
|-<br />
| style="width:30%" | <span id="nargin">[http://itp.tugraz.at/matlab/techdoc/ref/nargin.html nargin]</span><br />
| Return number of function arguments<br />
|-<br />
| style="width:30%" | <span id="nargout">[http://itp.tugraz.at/matlab/techdoc/ref/nargout.html nargout]</span><br />
| Return number of function arguments<br />
|-<br />
| style="width:30%" | <span id="nargoutchk">[http://itp.tugraz.at/matlab/techdoc/ref/nargoutchk.html nargoutchk]</span><br />
| Validate number of output arguments<br />
|-<br />
| style="width:30%" | <span id="native2unicode">[http://itp.tugraz.at/matlab/techdoc/ref/native2unicode.html native2unicode]</span><br />
| Convert numeric bytes to Unicode characters<br />
|-<br />
| style="width:30%" | <span id="nchoosek">[http://itp.tugraz.at/matlab/techdoc/ref/nchoosek.html nchoosek]</span><br />
| Binomial coefficient or all combinations <br />
|-<br />
| style="width:30%" | <span id="ndgrid">[http://itp.tugraz.at/matlab/techdoc/ref/ndgrid.html ndgrid]</span><br />
| Generate arrays for multidimensional functions and interpolation<br />
|-<br />
| style="width:30%" | <span id="ndims">[http://itp.tugraz.at/matlab/techdoc/ref/ndims.html ndims]</span><br />
| Number of array dimensions<br />
|-<br />
| style="width:30%" | <span id="ne">[http://itp.tugraz.at/matlab/techdoc/ref/ne.html ne]</span><br />
| Test for inequality<br />
|-<br />
| style="width:30%" | <span id="newplot">[http://itp.tugraz.at/matlab/techdoc/ref/newplot.html newplot]</span><br />
| Determine where to draw graphics objects<br />
|-<br />
| style="width:30%" | <span id="nextpow2">[http://itp.tugraz.at/matlab/techdoc/ref/nextpow2.html nextpow2]</span><br />
| Next power of two<br />
|-<br />
| style="width:30%" | <span id="nnz">[http://itp.tugraz.at/matlab/techdoc/ref/nnz.html nnz]</span><br />
| Number of nonzero matrix elements<br />
|-<br />
| style="width:30%" | <span id="noanimate">[http://itp.tugraz.at/matlab/techdoc/ref/noanimate.html noanimate]</span><br />
| Change <code>EraseMode</code> of all objects to <code>normal</code><br />
|-<br />
| style="width:30%" | <span id="nonzeros">[http://itp.tugraz.at/matlab/techdoc/ref/nonzeros.html nonzeros]</span><br />
| Nonzero matrix elements<br />
|-<br />
| style="width:30%" | <span id="norm">[http://itp.tugraz.at/matlab/techdoc/ref/norm.html norm]</span><br />
| Vector and matrix norms<br />
|-<br />
| style="width:30%" | <span id="normest">[http://itp.tugraz.at/matlab/techdoc/ref/normest.html normest]</span><br />
| 2-norm estimate<br />
|-<br />
| style="width:30%" | <span id="not">[http://itp.tugraz.at/matlab/techdoc/ref/not.html not]</span><br />
| Find logical NOT of array or scalar input<br />
|-<br />
| style="width:30%" | <span id="notebook">[http://itp.tugraz.at/matlab/techdoc/ref/notebook.html notebook]</span><br />
| Open M-book in Microsoft Word (Windows only)<br />
|-<br />
| style="width:30%" | <span id="now">[http://itp.tugraz.at/matlab/techdoc/ref/now.html now]</span><br />
| Return current date and time<br />
|-<br />
| style="width:30%" | <span id="nthroot">[http://itp.tugraz.at/matlab/techdoc/ref/nthroot.html nthroot]</span><br />
| Real <code>n</code>th root of real numbers<br />
|-<br />
| style="width:30%" | <span id="null">[http://itp.tugraz.at/matlab/techdoc/ref/null.html null]</span><br />
| Null space of a matrix<br />
|-<br />
| style="width:30%" | <span id="num2cell">[http://itp.tugraz.at/matlab/techdoc/ref/num2cell.html num2cell]</span><br />
| Convert numeric array to cell array<br />
|-<br />
| style="width:30%" | <span id="num2hex">[http://itp.tugraz.at/matlab/techdoc/ref/num2hex.html num2hex]</span><br />
| Convert singles and doubles to IEEE hexadecimal strings.<br />
|-<br />
| style="width:30%" | <span id="num2str">[http://itp.tugraz.at/matlab/techdoc/ref/num2str.html num2str]</span><br />
| Convert number to string<br />
|-<br />
| style="width:30%" | <span id="numel">[http://itp.tugraz.at/matlab/techdoc/ref/numel.html numel]</span><br />
| Number of elements in array or subscripted array expression<br />
|-<br />
| style="width:30%" | <span id="nzmax">[http://itp.tugraz.at/matlab/techdoc/ref/nzmax.html nzmax]</span><br />
| Amount of storage allocated for nonzero matrix elements<br />
|-<br />
|}<br />
<br />
= o =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="ode113">[http://itp.tugraz.at/matlab/techdoc/ref/ode113.html ode113]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="ode15i">[http://itp.tugraz.at/matlab/techdoc/ref/ode15i.html ode15i]</span><br />
| Solve fully implicit differential equations, variable order method<br />
|-<br />
| style="width:30%" | <span id="ode15s">[http://itp.tugraz.at/matlab/techdoc/ref/ode15s.html ode15s]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="ode23">[http://itp.tugraz.at/matlab/techdoc/ref/ode23.html ode23]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="ode23s">[http://itp.tugraz.at/matlab/techdoc/ref/ode23s.html ode23s]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="ode23t">[http://itp.tugraz.at/matlab/techdoc/ref/ode23t.html ode23t]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="ode23tb">[http://itp.tugraz.at/matlab/techdoc/ref/ode23tb.html ode23tb]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="ode45">[http://itp.tugraz.at/matlab/techdoc/ref/ode45.html ode45]</span><br />
| Solve initial value problems for ordinary differential equations (ODEs)<br />
|-<br />
| style="width:30%" | <span id="odefile">[http://itp.tugraz.at/matlab/techdoc/ref/odefile.html odefile]</span><br />
| Define a differential equation problem for ordinary differential equation (ODE) solvers<br />
|-<br />
| style="width:30%" | <span id="odeget">[http://itp.tugraz.at/matlab/techdoc/ref/odeget.html odeget]</span><br />
| Extract properties from options structure created with [http://itp.tugraz.at/matlab/techdoc/ref/odeset.html odeset]<br />
|-<br />
| style="width:30%" | <span id="odeset">[http://itp.tugraz.at/matlab/techdoc/ref/odeset.html odeset]</span><br />
| Create or alter options structure for input to ordinary differential equation (ODE) solvers<br />
|-<br />
| style="width:30%" | <span id="odextend">[http://itp.tugraz.at/matlab/techdoc/ref/odextend.html odextend]</span><br />
| Extend the solution of an initial value problem for an ordinary differential equation (ODE)<br />
|-<br />
| style="width:30%" | <span id="ones">[http://itp.tugraz.at/matlab/techdoc/ref/ones.html ones]</span><br />
| Create an array of all ones<br />
|-<br />
| style="width:30%" | <span id="open">[http://itp.tugraz.at/matlab/techdoc/ref/open.html open]</span><br />
| Open files based on extension<br />
|-<br />
| style="width:30%" | <span id="openfig">[http://itp.tugraz.at/matlab/techdoc/ref/openfig.html openfig]</span><br />
| Open new copy or raise existing copy of saved figure<br />
|-<br />
| style="width:30%" | <span id="opengl">[http://itp.tugraz.at/matlab/techdoc/ref/opengl.html opengl]</span><br />
| Control OpenGL rendering<br />
|-<br />
| style="width:30%" | <span id="openvar">[http://itp.tugraz.at/matlab/techdoc/ref/openvar.html openvar]</span><br />
| Open workspace variable in Array Editor or other tool for graphical editing<br />
|-<br />
| style="width:30%" | <span id="optimget">[http://itp.tugraz.at/matlab/techdoc/ref/optimget.html optimget]</span><br />
| Get optimization options structure parameter values<br />
|-<br />
| style="width:30%" | <span id="optimset">[http://itp.tugraz.at/matlab/techdoc/ref/optimset.html optimset]</span><br />
| Create or edit an optimization <code>options</code> structure<br />
|-<br />
| style="width:30%" | <span id="or">[http://itp.tugraz.at/matlab/techdoc/ref/or.html or]</span><br />
| Find logical OR of array or scalar inputs<br />
|-<br />
| style="width:30%" | <span id="ordeig">[http://itp.tugraz.at/matlab/techdoc/ref/ordeig.html ordeig]</span><br />
| Eigenvalues of quasitriangular matrices<br />
|-<br />
| style="width:30%" | <span id="orderfields">[http://itp.tugraz.at/matlab/techdoc/ref/orderfields.html orderfields]</span><br />
| Order fields of structure array<br />
|-<br />
| style="width:30%" | <span id="ordqz">[http://itp.tugraz.at/matlab/techdoc/ref/ordqz.html ordqz]</span><br />
| Reorder eigenvalues in QZ factorization<br />
|-<br />
| style="width:30%" | <span id="ordschur">[http://itp.tugraz.at/matlab/techdoc/ref/ordschur.html ordschur]</span><br />
| Reorder eigenvalues in Schur factorization<br />
|-<br />
| style="width:30%" | <span id="orient">[http://itp.tugraz.at/matlab/techdoc/ref/orient.html orient]</span><br />
| Set paper orientation for printed output<br />
|-<br />
| style="width:30%" | <span id="orth">[http://itp.tugraz.at/matlab/techdoc/ref/orth.html orth]</span><br />
| Range space of a matrix<br />
|-<br />
| style="width:30%" | <span id="otherwise">[http://itp.tugraz.at/matlab/techdoc/ref/otherwise.html otherwise]</span><br />
| Default part of switch statement<br />
|-<br />
|}<br />
<br />
= p =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="parsesoapresponse">[http://itp.tugraz.at/matlab/techdoc/ref/parsesoapresponse.html parsesoapresponse]</span><br />
| Convert response string from SOAP server into MATLAB data types<br />
|-<br />
| style="width:30%" | <span id="pack">[http://itp.tugraz.at/matlab/techdoc/ref/pack.html pack]</span><br />
| Consolidate workspace memory<br />
|-<br />
| style="width:30%" | <span id="pagesetupdlg">[http://itp.tugraz.at/matlab/techdoc/ref/pagesetupdlg.html pagesetupdlg]</span><br />
| Display page setup dialog box<br />
|-<br />
| style="width:30%" | <span id="pan">[http://itp.tugraz.at/matlab/techdoc/ref/pan.html pan]</span><br />
| Pan the view of a graph interactively<br />
|-<br />
| style="width:30%" | <span id="pareto">[http://itp.tugraz.at/matlab/techdoc/ref/pareto.html pareto]</span><br />
| Pareto chart<br />
|-<br />
| style="width:30%" | <span id="printpreview">[http://itp.tugraz.at/matlab/techdoc/ref/printpreview.html printpreview]</span><br />
| Preview figure to be printed<br />
|-<br />
| style="width:30%" | <span id="partialpath">[http://itp.tugraz.at/matlab/techdoc/ref/partialpath.html partialpath]</span><br />
| Partial pathname description<br />
|-<br />
| style="width:30%" | <span id="pascal">[http://itp.tugraz.at/matlab/techdoc/ref/pascal.html pascal]</span><br />
| Pascal matrix<br />
|-<br />
| style="width:30%" | <span id="patch">[http://itp.tugraz.at/matlab/techdoc/ref/patch.html patch]</span><br />
| Create patch graphics object<br />
|-<br />
| style="width:30%" | <span id="patch_props">[http://itp.tugraz.at/matlab/techdoc/ref/patch_props.html patch_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="path">[http://itp.tugraz.at/matlab/techdoc/ref/path.html path]</span><br />
| View or change MATLAB directory search path<br />
|-<br />
| style="width:30%" | <span id="path2rc">[http://itp.tugraz.at/matlab/techdoc/ref/path2rc.html path2rc]</span><br />
| Save current MATLAB search path to <code>pathdef.m</code> file<br />
|-<br />
| style="width:30%" | <span id="pathdef">[http://itp.tugraz.at/matlab/techdoc/ref/pathdef.html pathdef]</span><br />
| List of directories in MATLAB search path<br />
|-<br />
| style="width:30%" | <span id="pathsep">[http://itp.tugraz.at/matlab/techdoc/ref/pathsep.html pathsep]</span><br />
| Return path separator for current platform<br />
|-<br />
| style="width:30%" | <span id="pathtool">[http://itp.tugraz.at/matlab/techdoc/ref/pathtool.html pathtool]</span><br />
| Open <strong>Set Path</strong> dialog box to view and change MATLAB path<br />
|-<br />
| style="width:30%" | <span id="pause">[http://itp.tugraz.at/matlab/techdoc/ref/pause.html pause]</span><br />
| Halt execution temporarily<br />
|-<br />
| style="width:30%" | <span id="pbaspect">[http://itp.tugraz.at/matlab/techdoc/ref/pbaspect.html pbaspect]</span><br />
| Set or query the plot box aspect ratio<br />
|-<br />
| style="width:30%" | <span id="pcg">[http://itp.tugraz.at/matlab/techdoc/ref/pcg.html pcg]</span><br />
| Preconditioned conjugate gradients method<br />
|-<br />
| style="width:30%" | <span id="pchip">[http://itp.tugraz.at/matlab/techdoc/ref/pchip.html pchip]</span><br />
| Piecewise Cubic Hermite Interpolating Polynomial (PCHIP)<br />
|-<br />
| style="width:30%" | <span id="pcode">[http://itp.tugraz.at/matlab/techdoc/ref/pcode.html pcode]</span><br />
| Create preparsed pseudocode file (P-file)<br />
|-<br />
| style="width:30%" | <span id="pcolor">[http://itp.tugraz.at/matlab/techdoc/ref/pcolor.html pcolor]</span><br />
| Pseudocolor plot<br />
|-<br />
| style="width:30%" | <span id="pdepe">[http://itp.tugraz.at/matlab/techdoc/ref/pdepe.html pdepe]</span><br />
| Solve initial-boundary value problems for systems of parabolic and elliptic partial differential equations (PDEs) in one space variable and time<br />
|-<br />
| style="width:30%" | <span id="pdeval">[http://itp.tugraz.at/matlab/techdoc/ref/pdeval.html pdeval]</span><br />
| Evaluate the numerical solution of a PDE using the output of [http://itp.tugraz.at/matlab/techdoc/ref/pdepe.html pdepe]<br />
|-<br />
| style="width:30%" | <span id="peaks">[http://itp.tugraz.at/matlab/techdoc/ref/peaks.html peaks]</span><br />
| A sample function of two variables.<br />
|-<br />
| style="width:30%" | <span id="perl">[http://itp.tugraz.at/matlab/techdoc/ref/perl.html perl]</span><br />
| Call Perl script using appropriate operating system executable<br />
|-<br />
| style="width:30%" | <span id="perms">[http://itp.tugraz.at/matlab/techdoc/ref/perms.html perms]</span><br />
| All possible permutations<br />
|-<br />
| style="width:30%" | <span id="permute">[http://itp.tugraz.at/matlab/techdoc/ref/permute.html permute]</span><br />
| Rearrange the dimensions of a multidimensional array<br />
|-<br />
| style="width:30%" | <span id="persistent">[http://itp.tugraz.at/matlab/techdoc/ref/persistent.html persistent]</span><br />
| Define persistent variable<br />
|-<br />
| style="width:30%" | <span id="pi">[http://itp.tugraz.at/matlab/techdoc/ref/pi.html pi]</span><br />
| Ratio of a circle's circumference to its diameter, http://itp.tugraz.at/matlab/techdoc/ref/math_p47.gif <br />
|-<br />
| style="width:30%" | <span id="pie">[http://itp.tugraz.at/matlab/techdoc/ref/pie.html pie]</span><br />
| Pie chart<br />
|-<br />
| style="width:30%" | <span id="pie3">[http://itp.tugraz.at/matlab/techdoc/ref/pie3.html pie3]</span><br />
| Three-dimensional pie chart<br />
|-<br />
| style="width:30%" | <span id="pinv">[http://itp.tugraz.at/matlab/techdoc/ref/pinv.html pinv]</span><br />
| Moore-Penrose pseudoinverse of a matrix<br />
|-<br />
| style="width:30%" | <span id="planerot">[http://itp.tugraz.at/matlab/techdoc/ref/planerot.html planerot]</span><br />
| Givens plane rotation<br />
|-<br />
| style="width:30%" | <span id="playshow">[http://itp.tugraz.at/matlab/techdoc/ref/playshow.html playshow]</span><br />
| Run M-file demo (deprecated; use [http://itp.tugraz.at/matlab/techdoc/ref/echodemo.html echodemo] instead)<br />
|-<br />
| style="width:30%" | <span id="plot">[http://itp.tugraz.at/matlab/techdoc/ref/plot.html plot]</span><br />
| Linear 2-D plot<br />
|-<br />
| style="width:30%" | <span id="plot3">[http://itp.tugraz.at/matlab/techdoc/ref/plot3.html plot3]</span><br />
| 3-D line plot<br />
|-<br />
| style="width:30%" | <span id="plotbrowser">[http://itp.tugraz.at/matlab/techdoc/ref/plotbrowser.html plotbrowser]</span><br />
| Show or hide figure plotbrowser<br />
|-<br />
| style="width:30%" | <span id="plotedit">[http://itp.tugraz.at/matlab/techdoc/ref/plotedit.html plotedit]</span><br />
| Start plot edit mode to allow editing and annotation of plots<br />
|-<br />
| style="width:30%" | <span id="plotmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/plotmatrix.html plotmatrix]</span><br />
| Draw scatter plots<br />
|-<br />
| style="width:30%" | <span id="plottools">[http://itp.tugraz.at/matlab/techdoc/ref/plottools.html plottools]</span><br />
| Show or hide the plot tools <br />
|-<br />
| style="width:30%" | <span id="plotyy">[http://itp.tugraz.at/matlab/techdoc/ref/plotyy.html plotyy]</span><br />
| Create graphs with <em>y</em>-axes on both left and right side<br />
|-<br />
| style="width:30%" | <span id="pol2cart">[http://itp.tugraz.at/matlab/techdoc/ref/pol2cart.html pol2cart]</span><br />
| Transform polar or cylindrical coordinates to Cartesian<br />
|-<br />
| style="width:30%" | <span id="polar">[http://itp.tugraz.at/matlab/techdoc/ref/polar.html polar]</span><br />
| Plot polar coordinates<br />
|-<br />
| style="width:30%" | <span id="poly">[http://itp.tugraz.at/matlab/techdoc/ref/poly.html poly]</span><br />
| Polynomial with specified roots<br />
|-<br />
| style="width:30%" | <span id="polyarea">[http://itp.tugraz.at/matlab/techdoc/ref/polyarea.html polyarea]</span><br />
| Area of polygon<br />
|-<br />
| style="width:30%" | <span id="polyder">[http://itp.tugraz.at/matlab/techdoc/ref/polyder.html polyder]</span><br />
| Polynomial derivative<br />
|-<br />
| style="width:30%" | <span id="polyeig">[http://itp.tugraz.at/matlab/techdoc/ref/polyeig.html polyeig]</span><br />
| Polynomial eigenvalue problem<br />
|-<br />
| style="width:30%" | <span id="polyfit">[http://itp.tugraz.at/matlab/techdoc/ref/polyfit.html polyfit]</span><br />
| Polynomial curve fitting<br />
|-<br />
| style="width:30%" | <span id="polyint">[http://itp.tugraz.at/matlab/techdoc/ref/polyint.html polyint]</span><br />
| Integrate polynomial analytically<br />
|-<br />
| style="width:30%" | <span id="polyval">[http://itp.tugraz.at/matlab/techdoc/ref/polyval.html polyval]</span><br />
| Polynomial evaluation<br />
|-<br />
| style="width:30%" | <span id="polyvalm">[http://itp.tugraz.at/matlab/techdoc/ref/polyvalm.html polyvalm]</span><br />
| Matrix polynomial evaluation<br />
|-<br />
| style="width:30%" | <span id="pow2">[http://itp.tugraz.at/matlab/techdoc/ref/pow2.html pow2]</span><br />
| Base 2 power and scale floating-point numbers<br />
|-<br />
| style="width:30%" | <span id="power">[http://itp.tugraz.at/matlab/techdoc/ref/power.html power]</span><br />
| Array power<br />
|-<br />
| style="width:30%" | <span id="ppval">[http://itp.tugraz.at/matlab/techdoc/ref/ppval.html ppval]</span><br />
| Evaluate piecewise polynomial<br />
|-<br />
| style="width:30%" | <span id="prefdir">[http://itp.tugraz.at/matlab/techdoc/ref/prefdir.html prefdir]</span><br />
| Return directory containing preferences, history, and layout files<br />
|-<br />
| style="width:30%" | <span id="preferences">[http://itp.tugraz.at/matlab/techdoc/ref/preferences.html preferences]</span><br />
| Display <strong>Preferences</strong> dialog box for MATLAB and related products<br />
|-<br />
| style="width:30%" | <span id="primes">[http://itp.tugraz.at/matlab/techdoc/ref/primes.html primes]</span><br />
| Generate list of prime numbers<br />
|-<br />
| style="width:30%" | <span id="print">[http://itp.tugraz.at/matlab/techdoc/ref/print.html print]</span><br />
| Create hardcopy output<br />
|-<br />
| style="width:30%" | <span id="printdlg">[http://itp.tugraz.at/matlab/techdoc/ref/printdlg.html printdlg]</span><br />
| Display print dialog box<br />
|-<br />
| style="width:30%" | <span id="printopt">[http://itp.tugraz.at/matlab/techdoc/ref/printopt.html printopt]</span><br />
| Create hardcopy output<br />
|-<br />
| style="width:30%" | <span id="publish">[http://itp.tugraz.at/matlab/techdoc/ref/publish.html publish]</span><br />
| Run M-file script containing cells, and save results to file of specified type<br />
|-<br />
| style="width:30%" | <span id="prod">[http://itp.tugraz.at/matlab/techdoc/ref/prod.html prod]</span><br />
| Product of array elements<br />
|-<br />
| style="width:30%" | <span id="profile">[http://itp.tugraz.at/matlab/techdoc/ref/profile.html profile]</span><br />
| Profile execution time for function<br />
|-<br />
| style="width:30%" | <span id="profsave">[http://itp.tugraz.at/matlab/techdoc/ref/profsave.html profsave]</span><br />
| Save profile report in HTML format<br />
|-<br />
| style="width:30%" | <span id="propedit">[http://itp.tugraz.at/matlab/techdoc/ref/propedit.html propedit]</span><br />
| Starts the Property Editor<br />
|-<br />
| style="width:30%" | <span id="propeditcom">[http://itp.tugraz.at/matlab/techdoc/ref/propeditcom.html propeditcom]</span><br />
| Display built-in property page for control<br />
|-<br />
| style="width:30%" | <span id="propertyeditor">[http://itp.tugraz.at/matlab/techdoc/ref/propertyeditor.html propertyeditor]</span><br />
| Show or hide property editor<br />
|-<br />
| style="width:30%" | <span id="psi">[http://itp.tugraz.at/matlab/techdoc/ref/psi.html psi]</span><br />
| Psi (polygamma) function<br />
|-<br />
| style="width:30%" | <span id="putworkspacedata">[http://itp.tugraz.at/matlab/techdoc/ref/putworkspacedata.html putworkspacedata]</span><br />
| Store data in server workspace<br />
|-<br />
| style="width:30%" | <span id="putchararray">[http://itp.tugraz.at/matlab/techdoc/ref/putchararray.html putchararray]</span><br />
| Store character array in server<br />
|-<br />
| style="width:30%" | <span id="putfullmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/putfullmatrix.html putfullmatrix]</span><br />
| Store matrix in server<br />
|-<br />
| style="width:30%" | <span id="pwd">[http://itp.tugraz.at/matlab/techdoc/ref/pwd.html pwd]</span><br />
| Identify current directory<br />
|-<br />
|}<br />
<br />
= q =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="qrdelete">[http://itp.tugraz.at/matlab/techdoc/ref/qrdelete.html qrdelete]</span><br />
| Delete column or row from QR factorization<br />
|-<br />
| style="width:30%" | <span id="qmr">[http://itp.tugraz.at/matlab/techdoc/ref/qmr.html qmr]</span><br />
| Quasi-minimal residual method<br />
|-<br />
| style="width:30%" | <span id="qr">[http://itp.tugraz.at/matlab/techdoc/ref/qr.html qr]</span><br />
| Orthogonal-triangular decomposition<br />
|-<br />
| style="width:30%" | <span id="qrinsert">[http://itp.tugraz.at/matlab/techdoc/ref/qrinsert.html qrinsert]</span><br />
| Insert column or row into QR factorization<br />
|-<br />
| style="width:30%" | <span id="qrupdate">[http://itp.tugraz.at/matlab/techdoc/ref/qrupdate.html qrupdate]</span><br />
| <br />
|-<br />
| style="width:30%" | <span id="quad">[http://itp.tugraz.at/matlab/techdoc/ref/quad.html quad]</span><br />
| Numerically evaluate integral, adaptive Simpson quadrature<br />
|-<br />
| style="width:30%" | <span id="quad8">[http://itp.tugraz.at/matlab/techdoc/ref/quad8.html quad8]</span><br />
| Numerically evaluate integral, adaptive Simpson quadrature<br />
|-<br />
| style="width:30%" | <span id="quadl">[http://itp.tugraz.at/matlab/techdoc/ref/quadl.html quadl]</span><br />
| Numerically evaluate integral, adaptive Lobatto quadrature<br />
|-<br />
| style="width:30%" | <span id="quadv">[http://itp.tugraz.at/matlab/techdoc/ref/quadv.html quadv]</span><br />
| Vectorized quadrature<br />
|-<br />
| style="width:30%" | <span id="questdlg">[http://itp.tugraz.at/matlab/techdoc/ref/questdlg.html questdlg]</span><br />
| Create and display question dialog box<br />
|-<br />
| style="width:30%" | <span id="quit">[http://itp.tugraz.at/matlab/techdoc/ref/quit.html quit]</span><br />
| Terminate MATLAB<br />
|-<br />
| style="width:30%" | <span id="quitcom">[http://itp.tugraz.at/matlab/techdoc/ref/quitcom.html quitcom]</span><br />
| Terminate MATLAB server<br />
|-<br />
| style="width:30%" | <span id="quiver">[http://itp.tugraz.at/matlab/techdoc/ref/quiver.html quiver]</span><br />
| Quiver or velocity plot<br />
|-<br />
| style="width:30%" | <span id="quiver3">[http://itp.tugraz.at/matlab/techdoc/ref/quiver3.html quiver3]</span><br />
| Three-dimensional velocity plot<br />
|-<br />
| style="width:30%" | <span id="qz">[http://itp.tugraz.at/matlab/techdoc/ref/qz.html qz]</span><br />
| QZ factorization for generalized eigenvalues<br />
|-<br />
| style="width:30%" | <span id="quivergroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/quivergroupproperties.html quivergroupproperties]</span><br />
| Modifying Properties<br />
|-<br />
|}<br />
<br />
= r =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="rectangle_props">[http://itp.tugraz.at/matlab/techdoc/ref/rectangle_props.html rectangle_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="rand">[http://itp.tugraz.at/matlab/techdoc/ref/rand.html rand]</span><br />
| Uniformly distributed pseudorandom numbers<br />
|-<br />
| style="width:30%" | <span id="randn">[http://itp.tugraz.at/matlab/techdoc/ref/randn.html randn]</span><br />
| Normally distributed random numbers and arrays<br />
|-<br />
| style="width:30%" | <span id="randperm">[http://itp.tugraz.at/matlab/techdoc/ref/randperm.html randperm]</span><br />
| Random permutation <br />
|-<br />
| style="width:30%" | <span id="rank">[http://itp.tugraz.at/matlab/techdoc/ref/rank.html rank]</span><br />
| Rank of a matrix<br />
|-<br />
| style="width:30%" | <span id="rat">[http://itp.tugraz.at/matlab/techdoc/ref/rat.html rat]</span><br />
| Rational fraction approximation<br />
|-<br />
| style="width:30%" | <span id="rats">[http://itp.tugraz.at/matlab/techdoc/ref/rats.html rats]</span><br />
| Rational fraction approximation<br />
|-<br />
| style="width:30%" | <span id="rbbox">[http://itp.tugraz.at/matlab/techdoc/ref/rbbox.html rbbox]</span><br />
| Create rubberband box for area selection<br />
|-<br />
| style="width:30%" | <span id="rcond">[http://itp.tugraz.at/matlab/techdoc/ref/rcond.html rcond]</span><br />
| Matrix reciprocal condition number estimate<br />
|-<br />
| style="width:30%" | <span id="rdivide">[http://itp.tugraz.at/matlab/techdoc/ref/rdivide.html rdivide]</span><br />
| Left or right array division <br />
|-<br />
| style="width:30%" | <span id="readasync">[http://itp.tugraz.at/matlab/techdoc/ref/readasync.html readasync]</span><br />
| Read data asynchronously from the device<br />
|-<br />
| style="width:30%" | <span id="real">[http://itp.tugraz.at/matlab/techdoc/ref/real.html real]</span><br />
| Real part of complex number<br />
|-<br />
| style="width:30%" | <span id="reallog">[http://itp.tugraz.at/matlab/techdoc/ref/reallog.html reallog]</span><br />
| Natural logarithm for nonnegative real arrays<br />
|-<br />
| style="width:30%" | <span id="realmax">[http://itp.tugraz.at/matlab/techdoc/ref/realmax.html realmax]</span><br />
| Largest positive floating-point number<br />
|-<br />
| style="width:30%" | <span id="realmin">[http://itp.tugraz.at/matlab/techdoc/ref/realmin.html realmin]</span><br />
| Smallest positive floating-point number<br />
|-<br />
| style="width:30%" | <span id="realpow">[http://itp.tugraz.at/matlab/techdoc/ref/realpow.html realpow]</span><br />
| Array power for real-only output<br />
|-<br />
| style="width:30%" | <span id="realsqrt">[http://itp.tugraz.at/matlab/techdoc/ref/realsqrt.html realsqrt]</span><br />
| Square root for nonnegative real arrays<br />
|-<br />
| style="width:30%" | <span id="record">[http://itp.tugraz.at/matlab/techdoc/ref/record.html record]</span><br />
| Record data and event information to a file<br />
|-<br />
| style="width:30%" | <span id="rectangle">[http://itp.tugraz.at/matlab/techdoc/ref/rectangle.html rectangle]</span><br />
| Create a 2-D rectangle object<br />
|-<br />
| style="width:30%" | <span id="reducepatch">[http://itp.tugraz.at/matlab/techdoc/ref/reducepatch.html reducepatch]</span><br />
| Reduce the number of patch faces<br />
|-<br />
| style="width:30%" | <span id="rectint">[http://itp.tugraz.at/matlab/techdoc/ref/rectint.html rectint]</span><br />
| Rectangle intersection area.<br />
|-<br />
| style="width:30%" | <span id="recycle">[http://itp.tugraz.at/matlab/techdoc/ref/recycle.html recycle]</span><br />
| Set option to move deleted files to recycle folder<br />
|-<br />
| style="width:30%" | <span id="reducevolume">[http://itp.tugraz.at/matlab/techdoc/ref/reducevolume.html reducevolume]</span><br />
| Reduce the number of elements in a volume data set<br />
|-<br />
| style="width:30%" | <span id="relationaloperators">[http://itp.tugraz.at/matlab/techdoc/ref/relationaloperators.html relationaloperators]</span><br />
| Relational operations<br />
|-<br />
| style="width:30%" | <span id="refresh">[http://itp.tugraz.at/matlab/techdoc/ref/refresh.html refresh]</span><br />
| Redraw current figure<br />
|-<br />
| style="width:30%" | <span id="refreshdata">[http://itp.tugraz.at/matlab/techdoc/ref/refreshdata.html refreshdata]</span><br />
| Refresh data in graph when data source is specified<br />
|-<br />
| style="width:30%" | <span id="regexp">[http://itp.tugraz.at/matlab/techdoc/ref/regexp.html regexp]</span><br />
| Match regular expression<br />
|-<br />
| style="width:30%" | <span id="regexpi">[http://itp.tugraz.at/matlab/techdoc/ref/regexpi.html regexpi]</span><br />
| Match regular expression<br />
|-<br />
| style="width:30%" | <span id="regexprep">[http://itp.tugraz.at/matlab/techdoc/ref/regexprep.html regexprep]</span><br />
| Replace string using regular expression<br />
|-<br />
| style="width:30%" | <span id="registerevent">[http://itp.tugraz.at/matlab/techdoc/ref/registerevent.html registerevent]</span><br />
| Register event handler with control's event<br />
|-<br />
| style="width:30%" | <span id="rehash">[http://itp.tugraz.at/matlab/techdoc/ref/rehash.html rehash]</span><br />
| Refresh function and file system path caches<br />
|-<br />
| style="width:30%" | <span id="rmappdata">[http://itp.tugraz.at/matlab/techdoc/ref/rmappdata.html rmappdata]</span><br />
| Remove application-defined data<br />
|-<br />
| style="width:30%" | <span id="release">[http://itp.tugraz.at/matlab/techdoc/ref/release.html release]</span><br />
| Release interface<br />
|-<br />
| style="width:30%" | <span id="rem">[http://itp.tugraz.at/matlab/techdoc/ref/rem.html rem]</span><br />
| Remainder after division<br />
|-<br />
| style="width:30%" | <span id="rename">[http://itp.tugraz.at/matlab/techdoc/ref/rename.html rename]</span><br />
| Rename file on FTP server<br />
|-<br />
| style="width:30%" | <span id="repmat">[http://itp.tugraz.at/matlab/techdoc/ref/repmat.html repmat]</span><br />
| Replicate and tile an array<br />
|-<br />
| style="width:30%" | <span id="reset">[http://itp.tugraz.at/matlab/techdoc/ref/reset.html reset]</span><br />
| Reset graphics object [http://itp.tugraz.at/matlab/techdoc/ref/../infotool/hgprop/doc_frame.html properties] to their defaults<br />
|-<br />
| style="width:30%" | <span id="reshape">[http://itp.tugraz.at/matlab/techdoc/ref/reshape.html reshape]</span><br />
| Reshape array<br />
|-<br />
| style="width:30%" | <span id="residue">[http://itp.tugraz.at/matlab/techdoc/ref/residue.html residue]</span><br />
| Convert between partial fraction expansion and polynomial coefficients<br />
|-<br />
| style="width:30%" | <span id="rethrow">[http://itp.tugraz.at/matlab/techdoc/ref/rethrow.html rethrow]</span><br />
| Reissue error<br />
|-<br />
| style="width:30%" | <span id="return">[http://itp.tugraz.at/matlab/techdoc/ref/return.html return]</span><br />
| Return to invoking function<br />
|-<br />
| style="width:30%" | <span id="restoredefaultpath">[http://itp.tugraz.at/matlab/techdoc/ref/restoredefaultpath.html restoredefaultpath]</span><br />
| Restore default MATLAB search path<br />
|-<br />
| style="width:30%" | <span id="rgb2hsv">[http://itp.tugraz.at/matlab/techdoc/ref/rgb2hsv.html rgb2hsv]</span><br />
| Convert RGB colormap to HSV colormap<br />
|-<br />
| style="width:30%" | <span id="rgbplot">[http://itp.tugraz.at/matlab/techdoc/ref/rgbplot.html rgbplot]</span><br />
| Plot colormap<br />
|-<br />
| style="width:30%" | <span id="ribbon">[http://itp.tugraz.at/matlab/techdoc/ref/ribbon.html ribbon]</span><br />
| Ribbon plot<br />
|-<br />
| style="width:30%" | <span id="rmdirftp">[http://itp.tugraz.at/matlab/techdoc/ref/rmdirftp.html rmdirftp]</span><br />
| Remove directory on FTP server<br />
|-<br />
| style="width:30%" | <span id="rmdir">[http://itp.tugraz.at/matlab/techdoc/ref/rmdir.html rmdir]</span><br />
| Remove directory<br />
|-<br />
| style="width:30%" | <span id="rootobject">[http://itp.tugraz.at/matlab/techdoc/ref/rootobject.html rootobject]</span><br />
| Root object properties<br />
|-<br />
| style="width:30%" | <span id="rmfield">[http://itp.tugraz.at/matlab/techdoc/ref/rmfield.html rmfield]</span><br />
| Remove fields from structure<br />
|-<br />
| style="width:30%" | <span id="rmpath">[http://itp.tugraz.at/matlab/techdoc/ref/rmpath.html rmpath]</span><br />
| Remove directories from MATLAB search path<br />
|-<br />
| style="width:30%" | <span id="rmpref">[http://itp.tugraz.at/matlab/techdoc/ref/rmpref.html rmpref]</span><br />
| Remove preference<br />
|-<br />
| style="width:30%" | <span id="run">[http://itp.tugraz.at/matlab/techdoc/ref/run.html run]</span><br />
| Run script that is not on current path<br />
|-<br />
| style="width:30%" | <span id="rootobject_props">[http://itp.tugraz.at/matlab/techdoc/ref/rootobject_props.html rootobject_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="roots">[http://itp.tugraz.at/matlab/techdoc/ref/roots.html roots]</span><br />
| Polynomial roots<br />
|-<br />
| style="width:30%" | <span id="rose">[http://itp.tugraz.at/matlab/techdoc/ref/rose.html rose]</span><br />
| Angle histogram<br />
|-<br />
| style="width:30%" | <span id="rosser">[http://itp.tugraz.at/matlab/techdoc/ref/rosser.html rosser]</span><br />
| Classic symmetric eigenvalue test problem<br />
|-<br />
| style="width:30%" | <span id="rot90">[http://itp.tugraz.at/matlab/techdoc/ref/rot90.html rot90]</span><br />
| Rotate matrix 90&#176;<br />
|-<br />
| style="width:30%" | <span id="rotate">[http://itp.tugraz.at/matlab/techdoc/ref/rotate.html rotate]</span><br />
| Rotate object about a specified direction<br />
|-<br />
| style="width:30%" | <span id="rotate3d">[http://itp.tugraz.at/matlab/techdoc/ref/rotate3d.html rotate3d]</span><br />
| Rotate 3-D view using mouse <br />
|-<br />
| style="width:30%" | <span id="round">[http://itp.tugraz.at/matlab/techdoc/ref/round.html round]</span><br />
| Round to nearest integer<br />
|-<br />
| style="width:30%" | <span id="rref">[http://itp.tugraz.at/matlab/techdoc/ref/rref.html rref]</span><br />
| Reduced row echelon form<br />
|-<br />
| style="width:30%" | <span id="rsf2csf">[http://itp.tugraz.at/matlab/techdoc/ref/rsf2csf.html rsf2csf]</span><br />
| Convert real Schur form to complex Schur form<br />
|-<br />
|}<br />
<br />
= s =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="save">[http://itp.tugraz.at/matlab/techdoc/ref/save.html save]</span><br />
| Save workspace variables on disk<br />
|-<br />
| style="width:30%" | <span id="savepath">[http://itp.tugraz.at/matlab/techdoc/ref/savepath.html savepath]</span><br />
| Save current MATLAB search path to <code>pathdef.m</code> file<br />
|-<br />
| style="width:30%" | <span id="saveas">[http://itp.tugraz.at/matlab/techdoc/ref/saveas.html saveas]</span><br />
| <font face=sansserif>Save figure or model using specified format</font><br />
|-<br />
| style="width:30%" | <span id="savecom">[http://itp.tugraz.at/matlab/techdoc/ref/savecom.html savecom]</span><br />
| Serialize control object to file<br />
|-<br />
| style="width:30%" | <span id="saveobj">[http://itp.tugraz.at/matlab/techdoc/ref/saveobj.html saveobj]</span><br />
| User-defined extension of <code>save</code> function for user objects<br />
|-<br />
| style="width:30%" | <span id="selectmoveresize">[http://itp.tugraz.at/matlab/techdoc/ref/selectmoveresize.html selectmoveresize]</span><br />
| Select, move, resize, or copy axes and uicontrol graphics objects<br />
|-<br />
| style="width:30%" | <span id="saveserial">[http://itp.tugraz.at/matlab/techdoc/ref/saveserial.html saveserial]</span><br />
| Save serial port objects and variables to a MAT-file<br />
|-<br />
| style="width:30%" | <span id="scatter">[http://itp.tugraz.at/matlab/techdoc/ref/scatter.html scatter]</span><br />
| Plot a scatter (bubble) graph<br />
|-<br />
| style="width:30%" | <span id="scatter3">[http://itp.tugraz.at/matlab/techdoc/ref/scatter3.html scatter3]</span><br />
| 3-D scatter plot<br />
|-<br />
| style="width:30%" | <span id="schur">[http://itp.tugraz.at/matlab/techdoc/ref/schur.html schur]</span><br />
| Schur decomposition<br />
|-<br />
| style="width:30%" | <span id="script">[http://itp.tugraz.at/matlab/techdoc/ref/script.html script]</span><br />
| Script M-file description<br />
|-<br />
| style="width:30%" | <span id="scattergroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/scattergroupproperties.html scattergroupproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="sec">[http://itp.tugraz.at/matlab/techdoc/ref/sec.html sec]</span><br />
| Secant of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="secd">[http://itp.tugraz.at/matlab/techdoc/ref/secd.html secd]</span><br />
| Secant of an argument in degrees<br />
|-<br />
| style="width:30%" | <span id="sech">[http://itp.tugraz.at/matlab/techdoc/ref/sech.html sech]</span><br />
| Hyperbolic secant<br />
|-<br />
| style="width:30%" | <span id="showplottool">[http://itp.tugraz.at/matlab/techdoc/ref/showplottool.html showplottool]</span><br />
| Show or hide one of the figure plot tools<br />
|-<br />
| style="width:30%" | <span id="semilogx">[http://itp.tugraz.at/matlab/techdoc/ref/semilogx.html semilogx]</span><br />
| Semilogarithmic plots<br />
|-<br />
| style="width:30%" | <span id="semilogy">[http://itp.tugraz.at/matlab/techdoc/ref/semilogy.html semilogy]</span><br />
| Semilogarithmic plots<br />
|-<br />
| style="width:30%" | <span id="send">[http://itp.tugraz.at/matlab/techdoc/ref/send.html send]</span><br />
| Return list of events control can trigger<br />
|-<br />
| style="width:30%" | <span id="sendmail">[http://itp.tugraz.at/matlab/techdoc/ref/sendmail.html sendmail]</span><br />
| Send e-mail message to list of addresses<br />
|-<br />
| style="width:30%" | <span id="serial">[http://itp.tugraz.at/matlab/techdoc/ref/serial.html serial]</span><br />
| Create a serial port object<br />
|-<br />
| style="width:30%" | <span id="serialbreak">[http://itp.tugraz.at/matlab/techdoc/ref/serialbreak.html serialbreak]</span><br />
| Send a break to the device connected to the serial port<br />
|-<br />
| style="width:30%" | <span id="set">[http://itp.tugraz.at/matlab/techdoc/ref/set.html set]</span><br />
| Set object properties<br />
|-<br />
| style="width:30%" | <span id="setappdata">[http://itp.tugraz.at/matlab/techdoc/ref/setappdata.html setappdata]</span><br />
| Specify application-defined data<br />
|-<br />
| style="width:30%" | <span id="setcom">[http://itp.tugraz.at/matlab/techdoc/ref/setcom.html setcom]</span><br />
| Set object or interface property to specified value<br />
|-<br />
| style="width:30%" | <span id="setdiff">[http://itp.tugraz.at/matlab/techdoc/ref/setdiff.html setdiff]</span><br />
| Find set difference of two vectors<br />
|-<br />
| style="width:30%" | <span id="setfield">[http://itp.tugraz.at/matlab/techdoc/ref/setfield.html setfield]</span><br />
| Set value of structure array field<br />
|-<br />
| style="width:30%" | <span id="setpref">[http://itp.tugraz.at/matlab/techdoc/ref/setpref.html setpref]</span><br />
| Set preference<br />
|-<br />
| style="width:30%" | <span id="setserial">[http://itp.tugraz.at/matlab/techdoc/ref/setserial.html setserial]</span><br />
| Configure or display serial port object properties<br />
|-<br />
| style="width:30%" | <span id="setstr">[http://itp.tugraz.at/matlab/techdoc/ref/setstr.html setstr]</span><br />
| Set string flag<br />
|-<br />
| style="width:30%" | <span id="settimer">[http://itp.tugraz.at/matlab/techdoc/ref/settimer.html settimer]</span><br />
| Configure or display timer object properties<br />
|-<br />
| style="width:30%" | <span id="setxor">[http://itp.tugraz.at/matlab/techdoc/ref/setxor.html setxor]</span><br />
| Find set exclusive OR of two vectors<br />
|-<br />
| style="width:30%" | <span id="shading">[http://itp.tugraz.at/matlab/techdoc/ref/shading.html shading]</span><br />
| Set color shading properties<br />
|-<br />
| style="width:30%" | <span id="shiftdim">[http://itp.tugraz.at/matlab/techdoc/ref/shiftdim.html shiftdim]</span><br />
| Shift dimensions<br />
|-<br />
| style="width:30%" | <span id="specialcharacters">[http://itp.tugraz.at/matlab/techdoc/ref/specialcharacters.html specialcharacters]</span><br />
| Special characters<br />
|-<br />
| style="width:30%" | <span id="shrinkfaces">[http://itp.tugraz.at/matlab/techdoc/ref/shrinkfaces.html shrinkfaces]</span><br />
| Reduce the size of patch faces<br />
|-<br />
| style="width:30%" | <span id="sign">[http://itp.tugraz.at/matlab/techdoc/ref/sign.html sign]</span><br />
| Signum function<br />
|-<br />
| style="width:30%" | <span id="sin">[http://itp.tugraz.at/matlab/techdoc/ref/sin.html sin]</span><br />
| Sine of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="sind">[http://itp.tugraz.at/matlab/techdoc/ref/sind.html sind]</span><br />
| Sine of an argument in degrees<br />
|-<br />
| style="width:30%" | <span id="single">[http://itp.tugraz.at/matlab/techdoc/ref/single.html single]</span><br />
| Convert to single-precision<br />
|-<br />
| style="width:30%" | <span id="sinh">[http://itp.tugraz.at/matlab/techdoc/ref/sinh.html sinh]</span><br />
| Hyperbolic sine of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="size">[http://itp.tugraz.at/matlab/techdoc/ref/size.html size]</span><br />
| Array dimensions<br />
|-<br />
| style="width:30%" | <span id="sizeserial">[http://itp.tugraz.at/matlab/techdoc/ref/sizeserial.html sizeserial]</span><br />
| Size of serial port object array<br />
|-<br />
| style="width:30%" | <span id="slice">[http://itp.tugraz.at/matlab/techdoc/ref/slice.html slice]</span><br />
| Volumetric slice plot<br />
|-<br />
| style="width:30%" | <span id="smooth3">[http://itp.tugraz.at/matlab/techdoc/ref/smooth3.html smooth3]</span><br />
| Smooth 3-D data<br />
|-<br />
| style="width:30%" | <span id="sort">[http://itp.tugraz.at/matlab/techdoc/ref/sort.html sort]</span><br />
| Sort array elements in ascending or descending order<br />
|-<br />
| style="width:30%" | <span id="sortrows">[http://itp.tugraz.at/matlab/techdoc/ref/sortrows.html sortrows]</span><br />
| Sort rows in ascending order<br />
|-<br />
| style="width:30%" | <span id="sound">[http://itp.tugraz.at/matlab/techdoc/ref/sound.html sound]</span><br />
| Convert vector into sound<br />
|-<br />
| style="width:30%" | <span id="soundsc">[http://itp.tugraz.at/matlab/techdoc/ref/soundsc.html soundsc]</span><br />
| Scale data and play as sound<br />
|-<br />
| style="width:30%" | <span id="spalloc">[http://itp.tugraz.at/matlab/techdoc/ref/spalloc.html spalloc]</span><br />
| Allocate space for sparse matrix<br />
|-<br />
| style="width:30%" | <span id="sparse">[http://itp.tugraz.at/matlab/techdoc/ref/sparse.html sparse]</span><br />
| Create sparse matrix<br />
|-<br />
| style="width:30%" | <span id="spaugment">[http://itp.tugraz.at/matlab/techdoc/ref/spaugment.html spaugment]</span><br />
| Form least squares augmented system<br />
|-<br />
| style="width:30%" | <span id="spconvert">[http://itp.tugraz.at/matlab/techdoc/ref/spconvert.html spconvert]</span><br />
| Import matrix from sparse matrix external format<br />
|-<br />
| style="width:30%" | <span id="spdiags">[http://itp.tugraz.at/matlab/techdoc/ref/spdiags.html spdiags]</span><br />
| Extract and create sparse band and diagonal matrices<br />
|-<br />
| style="width:30%" | <span id="sph2cart">[http://itp.tugraz.at/matlab/techdoc/ref/sph2cart.html sph2cart]</span><br />
| Transform spherical coordinates to Cartesian<br />
|-<br />
| style="width:30%" | <span id="speye">[http://itp.tugraz.at/matlab/techdoc/ref/speye.html speye]</span><br />
| Sparse identity matrix<br />
|-<br />
| style="width:30%" | <span id="spfun">[http://itp.tugraz.at/matlab/techdoc/ref/spfun.html spfun]</span><br />
| Apply function to nonzero sparse matrix elements<br />
|-<br />
| style="width:30%" | <span id="sprandsym">[http://itp.tugraz.at/matlab/techdoc/ref/sprandsym.html sprandsym]</span><br />
| returns a symmetric random matrix whose lower triangle and diagonal have the same structure as <code>S</code>. Its elements are normally distributed, with mean <code>0</code> and variance <code>1</code>.<br />
|-<br />
| style="width:30%" | <span id="sphere">[http://itp.tugraz.at/matlab/techdoc/ref/sphere.html sphere]</span><br />
| Generate sphere<br />
|-<br />
| style="width:30%" | <span id="spinmap">[http://itp.tugraz.at/matlab/techdoc/ref/spinmap.html spinmap]</span><br />
| Spin colormap<br />
|-<br />
| style="width:30%" | <span id="spline">[http://itp.tugraz.at/matlab/techdoc/ref/spline.html spline]</span><br />
| Cubic spline data interpolation<br />
|-<br />
| style="width:30%" | <span id="spones">[http://itp.tugraz.at/matlab/techdoc/ref/spones.html spones]</span><br />
| Replace nonzero sparse matrix elements with ones<br />
|-<br />
| style="width:30%" | <span id="spparms">[http://itp.tugraz.at/matlab/techdoc/ref/spparms.html spparms]</span><br />
| Set parameters for sparse matrix routines<br />
|-<br />
| style="width:30%" | <span id="sprand">[http://itp.tugraz.at/matlab/techdoc/ref/sprand.html sprand]</span><br />
| Sparse uniformly distributed random matrix<br />
|-<br />
| style="width:30%" | <span id="sprandn">[http://itp.tugraz.at/matlab/techdoc/ref/sprandn.html sprandn]</span><br />
| Sparse normally distributed random matrix<br />
|-<br />
| style="width:30%" | <span id="sprank">[http://itp.tugraz.at/matlab/techdoc/ref/sprank.html sprank]</span><br />
| Structural rank<br />
|-<br />
| style="width:30%" | <span id="stopasync">[http://itp.tugraz.at/matlab/techdoc/ref/stopasync.html stopasync]</span><br />
| Stop asynchronous read and write operations<br />
|-<br />
| style="width:30%" | <span id="sprintf">[http://itp.tugraz.at/matlab/techdoc/ref/sprintf.html sprintf]</span><br />
| Write formatted data to string<br />
|-<br />
| style="width:30%" | <span id="spy">[http://itp.tugraz.at/matlab/techdoc/ref/spy.html spy]</span><br />
| Visualize sparsity pattern<br />
|-<br />
| style="width:30%" | <span id="sqrt">[http://itp.tugraz.at/matlab/techdoc/ref/sqrt.html sqrt]</span><br />
| Square root<br />
|-<br />
| style="width:30%" | <span id="sqrtm">[http://itp.tugraz.at/matlab/techdoc/ref/sqrtm.html sqrtm]</span><br />
| Matrix square root<br />
|-<br />
| style="width:30%" | <span id="squeeze">[http://itp.tugraz.at/matlab/techdoc/ref/squeeze.html squeeze]</span><br />
| Remove singleton dimensions<br />
|-<br />
| style="width:30%" | <span id="ss2tf">[http://itp.tugraz.at/matlab/techdoc/ref/ss2tf.html ss2tf]</span><br />
| Convert state-space filter parameters to transfer function form<br />
|-<br />
| style="width:30%" | <span id="sscanf">[http://itp.tugraz.at/matlab/techdoc/ref/sscanf.html sscanf]</span><br />
| Read string under format control<br />
|-<br />
| style="width:30%" | <span id="stairs">[http://itp.tugraz.at/matlab/techdoc/ref/stairs.html stairs]</span><br />
| Stairstep graph<br />
|-<br />
| style="width:30%" | <span id="start">[http://itp.tugraz.at/matlab/techdoc/ref/start.html start]</span><br />
| Start timer(s) running<br />
|-<br />
| style="width:30%" | <span id="startat">[http://itp.tugraz.at/matlab/techdoc/ref/startat.html startat]</span><br />
| Start timer(s) running at the specified time<br />
|-<br />
| style="width:30%" | <span id="stairseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/stairseriesproperties.html stairseriesproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="startup">[http://itp.tugraz.at/matlab/techdoc/ref/startup.html startup]</span><br />
| MATLAB startup M-file for user-defined options<br />
|-<br />
| style="width:30%" | <span id="std">[http://itp.tugraz.at/matlab/techdoc/ref/std.html std]</span><br />
| Standard deviation<br />
|-<br />
| style="width:30%" | <span id="stem">[http://itp.tugraz.at/matlab/techdoc/ref/stem.html stem]</span><br />
| Plot discrete sequence data<br />
|-<br />
| style="width:30%" | <span id="stem3">[http://itp.tugraz.at/matlab/techdoc/ref/stem3.html stem3]</span><br />
| Plot three-dimensional discrete sequence data<br />
|-<br />
| style="width:30%" | <span id="stop">[http://itp.tugraz.at/matlab/techdoc/ref/stop.html stop]</span><br />
| Stop timer(s)<br />
|-<br />
| style="width:30%" | <span id="str2double">[http://itp.tugraz.at/matlab/techdoc/ref/str2double.html str2double]</span><br />
| Convert string to double-precision value<br />
|-<br />
| style="width:30%" | <span id="stemseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/stemseriesproperties.html stemseriesproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="streamparticles">[http://itp.tugraz.at/matlab/techdoc/ref/streamparticles.html streamparticles]</span><br />
| Display stream particles<br />
|-<br />
| style="width:30%" | <span id="str2func">[http://itp.tugraz.at/matlab/techdoc/ref/str2func.html str2func]</span><br />
| Construct function handle from function name string<br />
|-<br />
| style="width:30%" | <span id="str2mat">[http://itp.tugraz.at/matlab/techdoc/ref/str2mat.html str2mat]</span><br />
| Form blank-padded character matrix from strings<br />
|-<br />
| style="width:30%" | <span id="str2num">[http://itp.tugraz.at/matlab/techdoc/ref/str2num.html str2num]</span><br />
| Convert string to number<br />
|-<br />
| style="width:30%" | <span id="strcat">[http://itp.tugraz.at/matlab/techdoc/ref/strcat.html strcat]</span><br />
| Concatenate strings horizontally<br />
|-<br />
| style="width:30%" | <span id="strcmp">[http://itp.tugraz.at/matlab/techdoc/ref/strcmp.html strcmp]</span><br />
| Compare strings<br />
|-<br />
| style="width:30%" | <span id="strcmpi">[http://itp.tugraz.at/matlab/techdoc/ref/strcmpi.html strcmpi]</span><br />
| Compare strings, ignoring case<br />
|-<br />
| style="width:30%" | <span id="stream2">[http://itp.tugraz.at/matlab/techdoc/ref/stream2.html stream2]</span><br />
| Compute 2-D streamline data<br />
|-<br />
| style="width:30%" | <span id="stream3">[http://itp.tugraz.at/matlab/techdoc/ref/stream3.html stream3]</span><br />
| Compute 3-D streamline data<br />
|-<br />
| style="width:30%" | <span id="streamline">[http://itp.tugraz.at/matlab/techdoc/ref/streamline.html streamline]</span><br />
| Draw streamlines from 2-D or 3-D vector data<br />
|-<br />
| style="width:30%" | <span id="surfaceplotproperties">[http://itp.tugraz.at/matlab/techdoc/ref/surfaceplotproperties.html surfaceplotproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="streamribbon">[http://itp.tugraz.at/matlab/techdoc/ref/streamribbon.html streamribbon]</span><br />
| Create a 3-D stream ribbon plot<br />
|-<br />
| style="width:30%" | <span id="streamslice">[http://itp.tugraz.at/matlab/techdoc/ref/streamslice.html streamslice]</span><br />
| Draws streamlines in slice planes<br />
|-<br />
| style="width:30%" | <span id="streamtube">[http://itp.tugraz.at/matlab/techdoc/ref/streamtube.html streamtube]</span><br />
| Creates a 3-D stream tube plot<br />
|-<br />
| style="width:30%" | <span id="strfind">[http://itp.tugraz.at/matlab/techdoc/ref/strfind.html strfind]</span><br />
| Find one string within another<br />
|-<br />
| style="width:30%" | <span id="strings">[http://itp.tugraz.at/matlab/techdoc/ref/strings.html strings]</span><br />
| MATLAB string handling<br />
|-<br />
| style="width:30%" | <span id="strjust">[http://itp.tugraz.at/matlab/techdoc/ref/strjust.html strjust]</span><br />
| Justify character array<br />
|-<br />
| style="width:30%" | <span id="strmatch">[http://itp.tugraz.at/matlab/techdoc/ref/strmatch.html strmatch]</span><br />
| Find possible matches for string<br />
|-<br />
| style="width:30%" | <span id="strncmp">[http://itp.tugraz.at/matlab/techdoc/ref/strncmp.html strncmp]</span><br />
| Compare first <code>n</code> characters of strings<br />
|-<br />
| style="width:30%" | <span id="strncmpi">[http://itp.tugraz.at/matlab/techdoc/ref/strncmpi.html strncmpi]</span><br />
| Compare first <code>n</code> characters of strings, ignoring case<br />
|-<br />
| style="width:30%" | <span id="strread">[http://itp.tugraz.at/matlab/techdoc/ref/strread.html strread]</span><br />
| Read formatted data from string<br />
|-<br />
| style="width:30%" | <span id="strrep">[http://itp.tugraz.at/matlab/techdoc/ref/strrep.html strrep]</span><br />
| Find and replace substring<br />
|-<br />
| style="width:30%" | <span id="strtok">[http://itp.tugraz.at/matlab/techdoc/ref/strtok.html strtok]</span><br />
| Return selected parts of string<br />
|-<br />
| style="width:30%" | <span id="strtrim">[http://itp.tugraz.at/matlab/techdoc/ref/strtrim.html strtrim]</span><br />
| Remove leading and trailing white-space from string<br />
|-<br />
| style="width:30%" | <span id="struct">[http://itp.tugraz.at/matlab/techdoc/ref/struct.html struct]</span><br />
| Create structure array<br />
|-<br />
| style="width:30%" | <span id="struct2cell">[http://itp.tugraz.at/matlab/techdoc/ref/struct2cell.html struct2cell]</span><br />
| Convert structure to cell array<br />
|-<br />
| style="width:30%" | <span id="structfun">[http://itp.tugraz.at/matlab/techdoc/ref/structfun.html structfun]</span><br />
| Apply function to each field of scalar structure<br />
|-<br />
| style="width:30%" | <span id="strvcat">[http://itp.tugraz.at/matlab/techdoc/ref/strvcat.html strvcat]</span><br />
| Concatenate strings vertically<br />
|-<br />
| style="width:30%" | <span id="sub2ind">[http://itp.tugraz.at/matlab/techdoc/ref/sub2ind.html sub2ind]</span><br />
| Single index from subscripts<br />
|-<br />
| style="width:30%" | <span id="subplot">[http://itp.tugraz.at/matlab/techdoc/ref/subplot.html subplot]</span><br />
| Create axes object in tiled positions<br />
|-<br />
| style="width:30%" | <span id="subsasgn">[http://itp.tugraz.at/matlab/techdoc/ref/subsasgn.html subsasgn]</span><br />
| Overloaded method for <code>A(I)=B</code>, <code>A{I}=B</code>, and <code>A.field=B</code><br />
|-<br />
| style="width:30%" | <span id="subsindex">[http://itp.tugraz.at/matlab/techdoc/ref/subsindex.html subsindex]</span><br />
| Overloaded method for <code>X(A)</code><br />
|-<br />
| style="width:30%" | <span id="subspace">[http://itp.tugraz.at/matlab/techdoc/ref/subspace.html subspace]</span><br />
| Angle between two subspaces<br />
|-<br />
| style="width:30%" | <span id="subsref">[http://itp.tugraz.at/matlab/techdoc/ref/subsref.html subsref]</span><br />
| Overloaded method for <code>A(I)</code>, <code>A{I}</code> and <code>A.field</code><br />
|-<br />
| style="width:30%" | <span id="substruct">[http://itp.tugraz.at/matlab/techdoc/ref/substruct.html substruct]</span><br />
| Create structure argument for <code>subsasgn</code> or <code>subsref</code><br />
|-<br />
| style="width:30%" | <span id="subvolume">[http://itp.tugraz.at/matlab/techdoc/ref/subvolume.html subvolume]</span><br />
| Extract subset of volume data set<br />
|-<br />
| style="width:30%" | <span id="sum">[http://itp.tugraz.at/matlab/techdoc/ref/sum.html sum]</span><br />
| Sum of array elements<br />
|-<br />
| style="width:30%" | <span id="superiorto">[http://itp.tugraz.at/matlab/techdoc/ref/superiorto.html superiorto]</span><br />
| Establish superior class relationship<br />
|-<br />
| style="width:30%" | <span id="support">[http://itp.tugraz.at/matlab/techdoc/ref/support.html support]</span><br />
| Open MathWorks Technical Support Web page<br />
|-<br />
| style="width:30%" | <span id="surf">[http://itp.tugraz.at/matlab/techdoc/ref/surf.html surf]</span><br />
| 3-D shaded surface plot<br />
|-<br />
| style="width:30%" | <span id="surf2patch">[http://itp.tugraz.at/matlab/techdoc/ref/surf2patch.html surf2patch]</span><br />
| Convert surface data to patch data<br />
|-<br />
| style="width:30%" | <span id="surface">[http://itp.tugraz.at/matlab/techdoc/ref/surface.html surface]</span><br />
| Create surface object<br />
|-<br />
| style="width:30%" | <span id="surface_props">[http://itp.tugraz.at/matlab/techdoc/ref/surface_props.html surface_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="surfnorm">[http://itp.tugraz.at/matlab/techdoc/ref/surfnorm.html surfnorm]</span><br />
| Compute and display 3-D surface normals <br />
|-<br />
| style="width:30%" | <span id="surfc">[http://itp.tugraz.at/matlab/techdoc/ref/surfc.html surfc]</span><br />
| 3-D shaded surface plot<br />
|-<br />
| style="width:30%" | <span id="surfl">[http://itp.tugraz.at/matlab/techdoc/ref/surfl.html surfl]</span><br />
| Surface plot with colormap-based lighting<br />
|-<br />
| style="width:30%" | <span id="svds">[http://itp.tugraz.at/matlab/techdoc/ref/svds.html svds]</span><br />
| A few singular values<br />
|-<br />
| style="width:30%" | <span id="svd">[http://itp.tugraz.at/matlab/techdoc/ref/svd.html svd]</span><br />
| Singular value decomposition<br />
|-<br />
| style="width:30%" | <span id="swapbytes">[http://itp.tugraz.at/matlab/techdoc/ref/swapbytes.html swapbytes]</span><br />
| Swap byte ordering<br />
|-<br />
| style="width:30%" | <span id="switch">[http://itp.tugraz.at/matlab/techdoc/ref/switch.html switch]</span><br />
| Switch among several cases, based on expression<br />
|-<br />
| style="width:30%" | <span id="symamd">[http://itp.tugraz.at/matlab/techdoc/ref/symamd.html symamd]</span><br />
| Symmetric approximate minimum degree permutation<br />
|-<br />
| style="width:30%" | <span id="symbfact">[http://itp.tugraz.at/matlab/techdoc/ref/symbfact.html symbfact]</span><br />
| Symbolic factorization analysis<br />
|-<br />
| style="width:30%" | <span id="symmlq">[http://itp.tugraz.at/matlab/techdoc/ref/symmlq.html symmlq]</span><br />
| Symmetric LQ method<br />
|-<br />
| style="width:30%" | <span id="symmmd">[http://itp.tugraz.at/matlab/techdoc/ref/symmmd.html symmmd]</span><br />
| Sparse symmetric minimum degree ordering<br />
|-<br />
| style="width:30%" | <span id="symrcm">[http://itp.tugraz.at/matlab/techdoc/ref/symrcm.html symrcm]</span><br />
| Sparse reverse Cuthill-McKee ordering<br />
|-<br />
| style="width:30%" | <span id="symvar">[http://itp.tugraz.at/matlab/techdoc/ref/symvar.html symvar]</span><br />
| Determine the symbolic variables in an expression<br />
|-<br />
| style="width:30%" | <span id="syntax">[http://itp.tugraz.at/matlab/techdoc/ref/syntax.html syntax]</span><br />
| Two ways to call MATLAB functions<br />
|-<br />
| style="width:30%" | <span id="system">[http://itp.tugraz.at/matlab/techdoc/ref/system.html system]</span><br />
| Execute operating system command and return result<br />
|-<br />
|}<br />
<br />
= t =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="timerfindall">[http://itp.tugraz.at/matlab/techdoc/ref/timerfindall.html timerfindall]</span><br />
| Find timer objects, including invisible objects<br />
|-<br />
| style="width:30%" | <span id="tan">[http://itp.tugraz.at/matlab/techdoc/ref/tan.html tan]</span><br />
| Tangent of an argument in radians<br />
|-<br />
| style="width:30%" | <span id="tand">[http://itp.tugraz.at/matlab/techdoc/ref/tand.html tand]</span><br />
| Tangent of an argument in degrees<br />
|-<br />
| style="width:30%" | <span id="tanh">[http://itp.tugraz.at/matlab/techdoc/ref/tanh.html tanh]</span><br />
| Hyperbolic tangent<br />
|-<br />
| style="width:30%" | <span id="tar">[http://itp.tugraz.at/matlab/techdoc/ref/tar.html tar]</span><br />
| Compress files into TAR-file<br />
|-<br />
| style="width:30%" | <span id="tempdir">[http://itp.tugraz.at/matlab/techdoc/ref/tempdir.html tempdir]</span><br />
| Return name of system's temporary directory<br />
|-<br />
| style="width:30%" | <span id="tempname">[http://itp.tugraz.at/matlab/techdoc/ref/tempname.html tempname]</span><br />
| Unique name for temporary file<br />
|-<br />
| style="width:30%" | <span id="tetramesh">[http://itp.tugraz.at/matlab/techdoc/ref/tetramesh.html tetramesh]</span><br />
| Tetrahedron mesh plot<br />
|-<br />
| style="width:30%" | <span id="texlabel">[http://itp.tugraz.at/matlab/techdoc/ref/texlabel.html texlabel]</span><br />
| Produce TeX format from character string<br />
|-<br />
| style="width:30%" | <span id="text">[http://itp.tugraz.at/matlab/techdoc/ref/text.html text]</span><br />
| Create text object in current axes<br />
|-<br />
| style="width:30%" | <span id="text_props">[http://itp.tugraz.at/matlab/techdoc/ref/text_props.html text_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="textread">[http://itp.tugraz.at/matlab/techdoc/ref/textread.html textread]</span><br />
| Read data from text file, write to multiple outputs <br />
|-<br />
| style="width:30%" | <span id="textscan">[http://itp.tugraz.at/matlab/techdoc/ref/textscan.html textscan]</span><br />
| Read data from text file, convert, and write to cell array <br />
|-<br />
| style="width:30%" | <span id="textwrap">[http://itp.tugraz.at/matlab/techdoc/ref/textwrap.html textwrap]</span><br />
| Return wrapped string matrix for given uicontrol<br />
|-<br />
| style="width:30%" | <span id="tic">[http://itp.tugraz.at/matlab/techdoc/ref/tic.html tic]</span><br />
| Measure performance using stopwatch timer<br />
|-<br />
| style="width:30%" | <span id="timer">[http://itp.tugraz.at/matlab/techdoc/ref/timer.html timer]</span><br />
| Construct timer object<br />
|-<br />
| style="width:30%" | <span id="timerfind">[http://itp.tugraz.at/matlab/techdoc/ref/timerfind.html timerfind]</span><br />
| Find timer objects<br />
|-<br />
| style="width:30%" | <span id="todatenum">[http://itp.tugraz.at/matlab/techdoc/ref/todatenum.html todatenum]</span><br />
| Convert CDF epoch object to MATLAB datenum<br />
|-<br />
| style="width:30%" | <span id="title">[http://itp.tugraz.at/matlab/techdoc/ref/title.html title]</span><br />
| Add title to current axes<br />
|-<br />
| style="width:30%" | <span id="toc">[http://itp.tugraz.at/matlab/techdoc/ref/toc.html toc]</span><br />
| Measure performance using stopwatch timer<br />
|-<br />
| style="width:30%" | <span id="toeplitz">[http://itp.tugraz.at/matlab/techdoc/ref/toeplitz.html toeplitz]</span><br />
| Toeplitz matrix<br />
|-<br />
| style="width:30%" | <span id="trace">[http://itp.tugraz.at/matlab/techdoc/ref/trace.html trace]</span><br />
| Sum of diagonal elements<br />
|-<br />
| style="width:30%" | <span id="trapz">[http://itp.tugraz.at/matlab/techdoc/ref/trapz.html trapz]</span><br />
| Trapezoidal numerical integration<br />
|-<br />
| style="width:30%" | <span id="treelayout">[http://itp.tugraz.at/matlab/techdoc/ref/treelayout.html treelayout]</span><br />
| Lay out tree or forest<br />
|-<br />
| style="width:30%" | <span id="treeplot">[http://itp.tugraz.at/matlab/techdoc/ref/treeplot.html treeplot]</span><br />
| Plot picture of tree<br />
|-<br />
| style="width:30%" | <span id="tril">[http://itp.tugraz.at/matlab/techdoc/ref/tril.html tril]</span><br />
| Lower triangular part of a matrix<br />
|-<br />
| style="width:30%" | <span id="trimesh">[http://itp.tugraz.at/matlab/techdoc/ref/trimesh.html trimesh]</span><br />
| Triangular mesh plot<br />
|-<br />
| style="width:30%" | <span id="triplequad">[http://itp.tugraz.at/matlab/techdoc/ref/triplequad.html triplequad]</span><br />
| Numerically evaluate triple integral<br />
|-<br />
| style="width:30%" | <span id="triplot">[http://itp.tugraz.at/matlab/techdoc/ref/triplot.html triplot]</span><br />
| 2-D triangular plot<br />
|-<br />
| style="width:30%" | <span id="trisurf">[http://itp.tugraz.at/matlab/techdoc/ref/trisurf.html trisurf]</span><br />
| Triangular surface plot<br />
|-<br />
| style="width:30%" | <span id="triu">[http://itp.tugraz.at/matlab/techdoc/ref/triu.html triu]</span><br />
| Upper triangular part of a matrix<br />
|-<br />
| style="width:30%" | <span id="true">[http://itp.tugraz.at/matlab/techdoc/ref/true.html true]</span><br />
| Return logical 1 (true)<br />
|-<br />
| style="width:30%" | <span id="try">[http://itp.tugraz.at/matlab/techdoc/ref/try.html try]</span><br />
| Attempt to execute block of code, and catch errors<br />
|-<br />
| style="width:30%" | <span id="tsearch">[http://itp.tugraz.at/matlab/techdoc/ref/tsearch.html tsearch]</span><br />
| Search for enclosing Delaunay triangle<br />
|-<br />
| style="width:30%" | <span id="tsearchn">[http://itp.tugraz.at/matlab/techdoc/ref/tsearchn.html tsearchn]</span><br />
| N-dimensional closest simplex search<br />
|-<br />
| style="width:30%" | <span id="type">[http://itp.tugraz.at/matlab/techdoc/ref/type.html type]</span><br />
| Display contents of file<br />
|-<br />
| style="width:30%" | <span id="typecast">[http://itp.tugraz.at/matlab/techdoc/ref/typecast.html typecast]</span><br />
| Convert data types without changing underlying data<br />
|-<br />
|}<br />
<br />
= u =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="uibuttongroup">[http://itp.tugraz.at/matlab/techdoc/ref/uibuttongroup.html uibuttongroup]</span><br />
| Create container object to exclusively manage radio buttons and toggle buttons<br />
|-<br />
| style="width:30%" | <span id="uibuttongroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uibuttongroupproperties.html uibuttongroupproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uicontextmenu">[http://itp.tugraz.at/matlab/techdoc/ref/uicontextmenu.html uicontextmenu]</span><br />
| Create context menu<br />
|-<br />
| style="width:30%" | <span id="uicontextmenu_props">[http://itp.tugraz.at/matlab/techdoc/ref/uicontextmenu_props.html uicontextmenu_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uicontrol">[http://itp.tugraz.at/matlab/techdoc/ref/uicontrol.html uicontrol]</span><br />
| Create user interface control object<br />
|-<br />
| style="width:30%" | <span id="uicontrol_props">[http://itp.tugraz.at/matlab/techdoc/ref/uicontrol_props.html uicontrol_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uigetdir">[http://itp.tugraz.at/matlab/techdoc/ref/uigetdir.html uigetdir]</span><br />
| Display standard dialog box for selecting a directory<br />
|-<br />
| style="width:30%" | <span id="uigetfile">[http://itp.tugraz.at/matlab/techdoc/ref/uigetfile.html uigetfile]</span><br />
| Display standard dialog box for retrieving files<br />
|-<br />
| style="width:30%" | <span id="uigetpref">[http://itp.tugraz.at/matlab/techdoc/ref/uigetpref.html uigetpref]</span><br />
| Display dialog box for retrieving preferences<br />
|-<br />
| style="width:30%" | <span id="uiimport">[http://itp.tugraz.at/matlab/techdoc/ref/uiimport.html uiimport]</span><br />
| Open Import Wizard interface to import data<br />
|-<br />
| style="width:30%" | <span id="uimenu">[http://itp.tugraz.at/matlab/techdoc/ref/uimenu.html uimenu]</span><br />
| Create menus on figure windows<br />
|-<br />
| style="width:30%" | <span id="uimenu_props">[http://itp.tugraz.at/matlab/techdoc/ref/uimenu_props.html uimenu_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uint16">[http://itp.tugraz.at/matlab/techdoc/ref/uint16.html uint16]</span><br />
| Convert to unsigned integer<br />
|-<br />
| style="width:30%" | <span id="uint32">[http://itp.tugraz.at/matlab/techdoc/ref/uint32.html uint32]</span><br />
| Convert to unsigned integer<br />
|-<br />
| style="width:30%" | <span id="uint64">[http://itp.tugraz.at/matlab/techdoc/ref/uint64.html uint64]</span><br />
| Convert to unsigned integer<br />
|-<br />
| style="width:30%" | <span id="uint8">[http://itp.tugraz.at/matlab/techdoc/ref/uint8.html uint8]</span><br />
| Convert to unsigned integer<br />
|-<br />
| style="width:30%" | <span id="uiopen">[http://itp.tugraz.at/matlab/techdoc/ref/uiopen.html uiopen]</span><br />
| Display file selection dialog box with appropriate file filters<br />
|-<br />
| style="width:30%" | <span id="uipanel">[http://itp.tugraz.at/matlab/techdoc/ref/uipanel.html uipanel]</span><br />
| Create panel container object<br />
|-<br />
| style="width:30%" | <span id="uipanelproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uipanelproperties.html uipanelproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uipushtool">[http://itp.tugraz.at/matlab/techdoc/ref/uipushtool.html uipushtool]</span><br />
| Create push button on a toolbar<br />
|-<br />
| style="width:30%" | <span id="uipushtool_props">[http://itp.tugraz.at/matlab/techdoc/ref/uipushtool_props.html uipushtool_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uiputfile">[http://itp.tugraz.at/matlab/techdoc/ref/uiputfile.html uiputfile]</span><br />
| Display standard dialog box for saving files<br />
|-<br />
| style="width:30%" | <span id="uiresume">[http://itp.tugraz.at/matlab/techdoc/ref/uiresume.html uiresume]</span><br />
| Control program execution<br />
|-<br />
| style="width:30%" | <span id="uisave">[http://itp.tugraz.at/matlab/techdoc/ref/uisave.html uisave]</span><br />
| Display standard dialog box for saving workspace variables<br />
|-<br />
| style="width:30%" | <span id="uisetcolor">[http://itp.tugraz.at/matlab/techdoc/ref/uisetcolor.html uisetcolor]</span><br />
| Display standard dialog box for setting an object's [http://itp.tugraz.at/matlab/techdoc/ref/colorspec.html ColorSpec]<br />
|-<br />
| style="width:30%" | <span id="uisetfont">[http://itp.tugraz.at/matlab/techdoc/ref/uisetfont.html uisetfont]</span><br />
| Display standard dialog box for setting an object's font characteristics<br />
|-<br />
| style="width:30%" | <span id="uisetpref">[http://itp.tugraz.at/matlab/techdoc/ref/uisetpref.html uisetpref]</span><br />
| Manage preferences used in <code>uigetpref</code><br />
|-<br />
| style="width:30%" | <span id="uistack">[http://itp.tugraz.at/matlab/techdoc/ref/uistack.html uistack]</span><br />
| Restack objects<br />
|-<br />
| style="width:30%" | <span id="uitoggletool">[http://itp.tugraz.at/matlab/techdoc/ref/uitoggletool.html uitoggletool]</span><br />
| Create toggle button on a toolbar<br />
|-<br />
| style="width:30%" | <span id="uitoggletool_props">[http://itp.tugraz.at/matlab/techdoc/ref/uitoggletool_props.html uitoggletool_props]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uitoolbar">[http://itp.tugraz.at/matlab/techdoc/ref/uitoolbar.html uitoolbar]</span><br />
| Create toolbar on a figure<br />
|-<br />
| style="width:30%" | <span id="uitoolbarproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uitoolbarproperties.html uitoolbarproperties]</span><br />
| Modifying Properties<br />
|-<br />
| style="width:30%" | <span id="uiwait">[http://itp.tugraz.at/matlab/techdoc/ref/uiwait.html uiwait]</span><br />
| Control program execution<br />
|-<br />
| style="width:30%" | <span id="undocheckout">[http://itp.tugraz.at/matlab/techdoc/ref/undocheckout.html undocheckout]</span><br />
| Undo previous checkout from source control system (UNIX only)<br />
|-<br />
| style="width:30%" | <span id="unicode2native">[http://itp.tugraz.at/matlab/techdoc/ref/unicode2native.html unicode2native]</span><br />
| Convert Unicode characters to numeric bytes<br />
|-<br />
| style="width:30%" | <span id="union">[http://itp.tugraz.at/matlab/techdoc/ref/union.html union]</span><br />
| Find set union of two vectors<br />
|-<br />
| style="width:30%" | <span id="unique">[http://itp.tugraz.at/matlab/techdoc/ref/unique.html unique]</span><br />
| Find unique elements of vector<br />
|-<br />
| style="width:30%" | <span id="unix">[http://itp.tugraz.at/matlab/techdoc/ref/unix.html unix]</span><br />
| Execute UNIX command and return result<br />
|-<br />
| style="width:30%" | <span id="unloadlibrary">[http://itp.tugraz.at/matlab/techdoc/ref/unloadlibrary.html unloadlibrary]</span><br />
| Unload external library from memory<br />
|-<br />
| style="width:30%" | <span id="unmkpp">[http://itp.tugraz.at/matlab/techdoc/ref/unmkpp.html unmkpp]</span><br />
| Piecewise polynomial details<br />
|-<br />
| style="width:30%" | <span id="unregisterallevents">[http://itp.tugraz.at/matlab/techdoc/ref/unregisterallevents.html unregisterallevents]</span><br />
| Unregister all events for control<br />
|-<br />
| style="width:30%" | <span id="unregisterevent">[http://itp.tugraz.at/matlab/techdoc/ref/unregisterevent.html unregisterevent]</span><br />
| Unregister event handler with control's event<br />
|-<br />
| style="width:30%" | <span id="untar">[http://itp.tugraz.at/matlab/techdoc/ref/untar.html untar]</span><br />
| Extract contents of TAR-file<br />
|-<br />
| style="width:30%" | <span id="unwrap">[http://itp.tugraz.at/matlab/techdoc/ref/unwrap.html unwrap]</span><br />
| Correct phase angles to produce smoother phase plots<br />
|-<br />
| style="width:30%" | <span id="unzip">[http://itp.tugraz.at/matlab/techdoc/ref/unzip.html unzip]</span><br />
| Extract contents of ZIP-file<br />
|-<br />
| style="width:30%" | <span id="upper">[http://itp.tugraz.at/matlab/techdoc/ref/upper.html upper]</span><br />
| Convert string to uppercase<br />
|-<br />
| style="width:30%" | <span id="urlread">[http://itp.tugraz.at/matlab/techdoc/ref/urlread.html urlread]</span><br />
| Read content at URL<br />
|-<br />
| style="width:30%" | <span id="urlwrite">[http://itp.tugraz.at/matlab/techdoc/ref/urlwrite.html urlwrite]</span><br />
| Save contents of URL to file<br />
|-<br />
| style="width:30%" | <span id="usejava">[http://itp.tugraz.at/matlab/techdoc/ref/usejava.html usejava]</span><br />
| Determine if Java feature is supported in MATLAB<br />
|-<br />
|}<br />
<br />
= v =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="varargin">[http://itp.tugraz.at/matlab/techdoc/ref/varargin.html varargin]</span><br />
| Return variable number of arguments<br />
|-<br />
| style="width:30%" | <span id="var">[http://itp.tugraz.at/matlab/techdoc/ref/var.html var]</span><br />
| Variance<br />
|-<br />
| style="width:30%" | <span id="vander">[http://itp.tugraz.at/matlab/techdoc/ref/vander.html vander]</span><br />
| Vandermonde matrix<br />
|-<br />
| style="width:30%" | <span id="volumebounds">[http://itp.tugraz.at/matlab/techdoc/ref/volumebounds.html volumebounds]</span><br />
| Return coordinate and color limits for volume data<br />
|-<br />
| style="width:30%" | <span id="varargout">[http://itp.tugraz.at/matlab/techdoc/ref/varargout.html varargout]</span><br />
| Return variable number of arguments<br />
|-<br />
| style="width:30%" | <span id="vectorize">[http://itp.tugraz.at/matlab/techdoc/ref/vectorize.html vectorize]</span><br />
| Vectorize expression<br />
|-<br />
| style="width:30%" | <span id="ver">[http://itp.tugraz.at/matlab/techdoc/ref/ver.html ver]</span><br />
| Display version information for MathWorks products<br />
|-<br />
| style="width:30%" | <span id="verctrl">[http://itp.tugraz.at/matlab/techdoc/ref/verctrl.html verctrl]</span><br />
| <font face=sansserif>Source control actions (Windows only)</font><br />
|-<br />
| style="width:30%" | <span id="version">[http://itp.tugraz.at/matlab/techdoc/ref/version.html version]</span><br />
| Display version number for MATLAB<br />
|-<br />
| style="width:30%" | <span id="vertcat">[http://itp.tugraz.at/matlab/techdoc/ref/vertcat.html vertcat]</span><br />
| Concatenate arrays vertically<br />
|-<br />
| style="width:30%" | <span id="view">[http://itp.tugraz.at/matlab/techdoc/ref/view.html view]</span><br />
| Viewpoint specification<br />
|-<br />
| style="width:30%" | <span id="viewmtx">[http://itp.tugraz.at/matlab/techdoc/ref/viewmtx.html viewmtx]</span><br />
| View transformation matrices<br />
|-<br />
| style="width:30%" | <span id="voronoi">[http://itp.tugraz.at/matlab/techdoc/ref/voronoi.html voronoi]</span><br />
| Voronoi diagram<br />
|-<br />
| style="width:30%" | <span id="voronoin">[http://itp.tugraz.at/matlab/techdoc/ref/voronoin.html voronoin]</span><br />
| N-dimensional Voronoi diagram<br />
|-<br />
|}<br />
<br />
= w =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="waitforbuttonpress">[http://itp.tugraz.at/matlab/techdoc/ref/waitforbuttonpress.html waitforbuttonpress]</span><br />
| Wait for key or mouse button press<br />
|-<br />
| style="width:30%" | <span id="wait">[http://itp.tugraz.at/matlab/techdoc/ref/wait.html wait]</span><br />
| Wait until a timer stops running<br />
|-<br />
| style="width:30%" | <span id="waitbar">[http://itp.tugraz.at/matlab/techdoc/ref/waitbar.html waitbar]</span><br />
| Display waitbar<br />
|-<br />
| style="width:30%" | <span id="waitfor">[http://itp.tugraz.at/matlab/techdoc/ref/waitfor.html waitfor]</span><br />
| Wait for condition before resuming execution<br />
|-<br />
| style="width:30%" | <span id="waterfall">[http://itp.tugraz.at/matlab/techdoc/ref/waterfall.html waterfall]</span><br />
| Waterfall plot<br />
|-<br />
| style="width:30%" | <span id="warndlg">[http://itp.tugraz.at/matlab/techdoc/ref/warndlg.html warndlg]</span><br />
| Display warning dialog box<br />
|-<br />
| style="width:30%" | <span id="warning">[http://itp.tugraz.at/matlab/techdoc/ref/warning.html warning]</span><br />
| Display warning message<br />
|-<br />
| style="width:30%" | <span id="wavfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/wavfinfo.html wavfinfo]</span><br />
| Return information about Microsoft WAVE (<code>.wav</code>) sound file<br />
|-<br />
| style="width:30%" | <span id="wavplay">[http://itp.tugraz.at/matlab/techdoc/ref/wavplay.html wavplay]</span><br />
| Play recorded sound on PC-based audio output device<br />
|-<br />
| style="width:30%" | <span id="wavread">[http://itp.tugraz.at/matlab/techdoc/ref/wavread.html wavread]</span><br />
| Read Microsoft WAVE (<code>.wav</code>) sound file<br />
|-<br />
| style="width:30%" | <span id="wavrecord">[http://itp.tugraz.at/matlab/techdoc/ref/wavrecord.html wavrecord]</span><br />
| Record sound using PC-based audio input device.<br />
|-<br />
| style="width:30%" | <span id="wavwrite">[http://itp.tugraz.at/matlab/techdoc/ref/wavwrite.html wavwrite]</span><br />
| Write Microsoft WAVE (<code>.wav</code>) sound file<br />
|-<br />
| style="width:30%" | <span id="web">[http://itp.tugraz.at/matlab/techdoc/ref/web.html web]</span><br />
| Open Web site or file in Web browser or Help browser<br />
|-<br />
| style="width:30%" | <span id="weekday">[http://itp.tugraz.at/matlab/techdoc/ref/weekday.html weekday]</span><br />
| Return day of week<br />
|-<br />
| style="width:30%" | <span id="what">[http://itp.tugraz.at/matlab/techdoc/ref/what.html what]</span><br />
| List MATLAB files in current directory<br />
|-<br />
| style="width:30%" | <span id="whatsnew">[http://itp.tugraz.at/matlab/techdoc/ref/whatsnew.html whatsnew]</span><br />
| Display Release Notes for MathWorks products<br />
|-<br />
| style="width:30%" | <span id="which">[http://itp.tugraz.at/matlab/techdoc/ref/which.html which]</span><br />
| Locate functions and files<br />
|-<br />
| style="width:30%" | <span id="while">[http://itp.tugraz.at/matlab/techdoc/ref/while.html while]</span><br />
| Repeatedly execute statements while condition is true<br />
|-<br />
| style="width:30%" | <span id="whitebg">[http://itp.tugraz.at/matlab/techdoc/ref/whitebg.html whitebg]</span><br />
| Change axes background color<br />
|-<br />
| style="width:30%" | <span id="who">[http://itp.tugraz.at/matlab/techdoc/ref/who.html who]</span><br />
| List variables in workspace<br />
|-<br />
| style="width:30%" | <span id="whos">[http://itp.tugraz.at/matlab/techdoc/ref/whos.html whos]</span><br />
| List variables in workspace<br />
|-<br />
| style="width:30%" | <span id="wilkinson">[http://itp.tugraz.at/matlab/techdoc/ref/wilkinson.html wilkinson]</span><br />
| Wilkinson's eigenvalue test matrix<br />
|-<br />
| style="width:30%" | <span id="winopen">[http://itp.tugraz.at/matlab/techdoc/ref/winopen.html winopen]</span><br />
| Open file in appropriate application (Windows only)<br />
|-<br />
| style="width:30%" | <span id="winqueryreg">[http://itp.tugraz.at/matlab/techdoc/ref/winqueryreg.html winqueryreg]</span><br />
| Get item from Microsoft Windows registry<br />
|-<br />
| style="width:30%" | <span id="wk1finfo">[http://itp.tugraz.at/matlab/techdoc/ref/wk1finfo.html wk1finfo]</span><br />
| Determine if file contains Lotus WK1 worksheet<br />
|-<br />
| style="width:30%" | <span id="wk1read">[http://itp.tugraz.at/matlab/techdoc/ref/wk1read.html wk1read]</span><br />
| Read Lotus123 spreadsheet file (<code>.wk1</code>)<br />
|-<br />
| style="width:30%" | <span id="wk1write">[http://itp.tugraz.at/matlab/techdoc/ref/wk1write.html wk1write]</span><br />
| Write matrix to Lotus123 WK1 spreadsheet file<br />
|-<br />
| style="width:30%" | <span id="workspace">[http://itp.tugraz.at/matlab/techdoc/ref/workspace.html workspace]</span><br />
| Display Workspace browser, a tool for managing the workspace<br />
|-<br />
|}<br />
<br />
= x =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="xlabel">[http://itp.tugraz.at/matlab/techdoc/ref/xlabel.html xlabel]</span><br />
| Label the <em>x</em>-, <em>y</em>-, and <em>z</em>-axis<br />
|-<br />
| style="width:30%" | <span id="xlim">[http://itp.tugraz.at/matlab/techdoc/ref/xlim.html xlim]</span><br />
| Set or query axis limits<br />
|-<br />
| style="width:30%" | <span id="xlsfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/xlsfinfo.html xlsfinfo]</span><br />
| Determine if file contains Microsoft Excel (<code>.xls</code>) spreadsheet<br />
|-<br />
| style="width:30%" | <span id="xlsread">[http://itp.tugraz.at/matlab/techdoc/ref/xlsread.html xlsread]</span><br />
| Read Microsoft Excel spreadsheet file (<code>.xls</code>)<br />
|-<br />
| style="width:30%" | <span id="xlswrite">[http://itp.tugraz.at/matlab/techdoc/ref/xlswrite.html xlswrite]</span><br />
| Write Microsoft Excel spreadsheet file (<code>.xls</code>)<br />
|-<br />
| style="width:30%" | <span id="xmlread">[http://itp.tugraz.at/matlab/techdoc/ref/xmlread.html xmlread]</span><br />
| Parse XML document and return Document Object Model node<br />
|-<br />
| style="width:30%" | <span id="xmlwrite">[http://itp.tugraz.at/matlab/techdoc/ref/xmlwrite.html xmlwrite]</span><br />
| Serialize XML Document Object Model node<br />
|-<br />
| style="width:30%" | <span id="xor">[http://itp.tugraz.at/matlab/techdoc/ref/xor.html xor]</span><br />
| Logical exclusive-OR<br />
|-<br />
| style="width:30%" | <span id="xslt">[http://itp.tugraz.at/matlab/techdoc/ref/xslt.html xslt]</span><br />
| Transform XML document using XSLT engine<br />
|-<br />
|}<br />
<br />
= y =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="ylabel">[http://itp.tugraz.at/matlab/techdoc/ref/ylabel.html ylabel]</span><br />
| Label the <em>x</em>-, <em>y</em>-, and <em>z</em>-axis<br />
|-<br />
| style="width:30%" | <span id="ylim">[http://itp.tugraz.at/matlab/techdoc/ref/ylim.html ylim]</span><br />
| Set or query axis limits<br />
|-<br />
|}<br />
<br />
= z =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:30%" | <span id="zeros">[http://itp.tugraz.at/matlab/techdoc/ref/zeros.html zeros]</span><br />
| Create an array of all zeros<br />
|-<br />
| style="width:30%" | <span id="zip">[http://itp.tugraz.at/matlab/techdoc/ref/zip.html zip]</span><br />
| Compress files into ZIP-file archive<br />
|-<br />
| style="width:30%" | <span id="zlabel">[http://itp.tugraz.at/matlab/techdoc/ref/zlabel.html zlabel]</span><br />
| Label the <em>x</em>-, <em>y</em>-, and <em>z</em>-axis<br />
|-<br />
| style="width:30%" | <span id="zlim">[http://itp.tugraz.at/matlab/techdoc/ref/zlim.html zlim]</span><br />
| Set or query axis limits<br />
|-<br />
| style="width:30%" | <span id="zoom">[http://itp.tugraz.at/matlab/techdoc/ref/zoom.html zoom]</span><br />
| Zoom in and out on a 2-D plot<br />
|-<br />
|}</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Matlab_-_Reference&diff=5341Matlab - Reference2008-01-19T14:11:20Z<p>Osiris: /* Special Pages */</p>
<hr />
<div>= Special Pages = <br />
[http://itp.tugraz.at/matlab/techdoc/ref/index.html Matlab Function Reference] <br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/arithmeticoperators.html Arithmetic Operators + - * / \ ^ ']<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/relationaloperators.html Relational Operators < > <= >= == ~=]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorselementwise.html Logical Operators: Elementwise & | ~]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorsshortcircuit.html Logical Operators: Short-circuit && ||]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/specialcharacters.html <nowiki>Special Characters [ ] ( ) {} = ' . ... , ; : % ! @</nowiki>]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/colon.html colon (:)]<br />
<br />
= a =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="arithmeticoperators">[http://itp.tugraz.at/matlab/techdoc/ref/arithmeticoperators.html arithmeticoperators]</span><br />
| style="width:20%" | <span id="abs">[http://itp.tugraz.at/matlab/techdoc/ref/abs.html abs]</span><br />
| style="width:20%" | <span id="accumarray">[http://itp.tugraz.at/matlab/techdoc/ref/accumarray.html accumarray]</span><br />
| style="width:20%" | <span id="acos">[http://itp.tugraz.at/matlab/techdoc/ref/acos.html acos]</span><br />
| style="width:20%" | <span id="acosd">[http://itp.tugraz.at/matlab/techdoc/ref/acosd.html acosd]</span><br />
|-<br />
| style="width:20%" | <span id="acosh">[http://itp.tugraz.at/matlab/techdoc/ref/acosh.html acosh]</span><br />
| style="width:20%" | <span id="acot">[http://itp.tugraz.at/matlab/techdoc/ref/acot.html acot]</span><br />
| style="width:20%" | <span id="acotd">[http://itp.tugraz.at/matlab/techdoc/ref/acotd.html acotd]</span><br />
| style="width:20%" | <span id="acoth">[http://itp.tugraz.at/matlab/techdoc/ref/acoth.html acoth]</span><br />
| style="width:20%" | <span id="acsc">[http://itp.tugraz.at/matlab/techdoc/ref/acsc.html acsc]</span><br />
|-<br />
| style="width:20%" | <span id="acscd">[http://itp.tugraz.at/matlab/techdoc/ref/acscd.html acscd]</span><br />
| style="width:20%" | <span id="acsch">[http://itp.tugraz.at/matlab/techdoc/ref/acsch.html acsch]</span><br />
| style="width:20%" | <span id="actxcontrol">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrol.html actxcontrol]</span><br />
| style="width:20%" | <span id="actxcontrollist">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrollist.html actxcontrollist]</span><br />
| style="width:20%" | <span id="actxcontrolselect">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrolselect.html actxcontrolselect]</span><br />
|-<br />
| style="width:20%" | <span id="actxgetrunningserver">[http://itp.tugraz.at/matlab/techdoc/ref/actxgetrunningserver.html actxgetrunningserver]</span><br />
| style="width:20%" | <span id="actxserver">[http://itp.tugraz.at/matlab/techdoc/ref/actxserver.html actxserver]</span><br />
| style="width:20%" | <span id="addcausemexception">[http://itp.tugraz.at/matlab/techdoc/ref/addcausemexception.html addcausemexception]</span><br />
| style="width:20%" | <span id="addevent">[http://itp.tugraz.at/matlab/techdoc/ref/addevent.html addevent]</span><br />
| style="width:20%" | <span id="addframe">[http://itp.tugraz.at/matlab/techdoc/ref/addframe.html addframe]</span><br />
|-<br />
| style="width:20%" | <span id="addoptionalinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/addoptionalinputparser.html addoptionalinputparser]</span><br />
| style="width:20%" | <span id="addparamvalueinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/addparamvalueinputparser.html addparamvalueinputparser]</span><br />
| style="width:20%" | <span id="addpath">[http://itp.tugraz.at/matlab/techdoc/ref/addpath.html addpath]</span><br />
| style="width:20%" | <span id="addpref">[http://itp.tugraz.at/matlab/techdoc/ref/addpref.html addpref]</span><br />
| style="width:20%" | <span id="addproperty">[http://itp.tugraz.at/matlab/techdoc/ref/addproperty.html addproperty]</span><br />
|-<br />
| style="width:20%" | <span id="addrequiredinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/addrequiredinputparser.html addrequiredinputparser]</span><br />
| style="width:20%" | <span id="addsample">[http://itp.tugraz.at/matlab/techdoc/ref/addsample.html addsample]</span><br />
| style="width:20%" | <span id="addsampletocollection">[http://itp.tugraz.at/matlab/techdoc/ref/addsampletocollection.html addsampletocollection]</span><br />
| style="width:20%" | <span id="addtodate">[http://itp.tugraz.at/matlab/techdoc/ref/addtodate.html addtodate]</span><br />
| style="width:20%" | <span id="addts">[http://itp.tugraz.at/matlab/techdoc/ref/addts.html addts]</span><br />
|-<br />
| style="width:20%" | <span id="airy">[http://itp.tugraz.at/matlab/techdoc/ref/airy.html airy]</span><br />
| style="width:20%" | <span id="align">[http://itp.tugraz.at/matlab/techdoc/ref/align.html align]</span><br />
| style="width:20%" | <span id="alim">[http://itp.tugraz.at/matlab/techdoc/ref/alim.html alim]</span><br />
| style="width:20%" | <span id="all">[http://itp.tugraz.at/matlab/techdoc/ref/all.html all]</span><br />
| style="width:20%" | <span id="allchild">[http://itp.tugraz.at/matlab/techdoc/ref/allchild.html allchild]</span><br />
|-<br />
| style="width:20%" | <span id="alpha">[http://itp.tugraz.at/matlab/techdoc/ref/alpha.html alpha]</span><br />
| style="width:20%" | <span id="alphamap">[http://itp.tugraz.at/matlab/techdoc/ref/alphamap.html alphamap]</span><br />
| style="width:20%" | <span id="amd">[http://itp.tugraz.at/matlab/techdoc/ref/amd.html amd]</span><br />
| style="width:20%" | <span id="ancestor">[http://itp.tugraz.at/matlab/techdoc/ref/ancestor.html ancestor]</span><br />
| style="width:20%" | <span id="and">[http://itp.tugraz.at/matlab/techdoc/ref/and.html and]</span><br />
|-<br />
| style="width:20%" | <span id="angle">[http://itp.tugraz.at/matlab/techdoc/ref/angle.html angle]</span><br />
| style="width:20%" | <span id="annotation">[http://itp.tugraz.at/matlab/techdoc/ref/annotation.html annotation]</span><br />
| style="width:20%" | <span id="annotationarrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationarrowproperties.html annotationarrowproperties]</span><br />
| style="width:20%" | <span id="ans">[http://itp.tugraz.at/matlab/techdoc/ref/ans.html ans]</span><br />
| style="width:20%" | <span id="annotationdoublearrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationdoublearrowproperties.html annotationdoublearrowproperties]</span><br />
|-<br />
| style="width:20%" | <span id="annotationellipseproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationellipseproperties.html annotationellipseproperties]</span><br />
| style="width:20%" | <span id="annotationlineproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationlineproperties.html annotationlineproperties]</span><br />
| style="width:20%" | <span id="annotationrectangleproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationrectangleproperties.html annotationrectangleproperties]</span><br />
| style="width:20%" | <span id="annotationtextarrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationtextarrowproperties.html annotationtextarrowproperties]</span><br />
| style="width:20%" | <span id="annotationtextboxproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationtextboxproperties.html annotationtextboxproperties]</span><br />
|-<br />
| style="width:20%" | <span id="any">[http://itp.tugraz.at/matlab/techdoc/ref/any.html any]</span><br />
| style="width:20%" | <span id="area">[http://itp.tugraz.at/matlab/techdoc/ref/area.html area]</span><br />
| style="width:20%" | <span id="areaseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/areaseriesproperties.html areaseriesproperties]</span><br />
| style="width:20%" | <span id="arrayfun">[http://itp.tugraz.at/matlab/techdoc/ref/arrayfun.html arrayfun]</span><br />
| style="width:20%" | <span id="ascii">[http://itp.tugraz.at/matlab/techdoc/ref/ascii.html ascii]</span><br />
|-<br />
| style="width:20%" | <span id="asec">[http://itp.tugraz.at/matlab/techdoc/ref/asec.html asec]</span><br />
| style="width:20%" | <span id="asecd">[http://itp.tugraz.at/matlab/techdoc/ref/asecd.html asecd]</span><br />
| style="width:20%" | <span id="asech">[http://itp.tugraz.at/matlab/techdoc/ref/asech.html asech]</span><br />
| style="width:20%" | <span id="asin">[http://itp.tugraz.at/matlab/techdoc/ref/asin.html asin]</span><br />
| style="width:20%" | <span id="asind">[http://itp.tugraz.at/matlab/techdoc/ref/asind.html asind]</span><br />
|-<br />
| style="width:20%" | <span id="asinh">[http://itp.tugraz.at/matlab/techdoc/ref/asinh.html asinh]</span><br />
| style="width:20%" | <span id="assert">[http://itp.tugraz.at/matlab/techdoc/ref/assert.html assert]</span><br />
| style="width:20%" | <span id="assignin">[http://itp.tugraz.at/matlab/techdoc/ref/assignin.html assignin]</span><br />
| style="width:20%" | <span id="atan">[http://itp.tugraz.at/matlab/techdoc/ref/atan.html atan]</span><br />
| style="width:20%" | <span id="atan2">[http://itp.tugraz.at/matlab/techdoc/ref/atan2.html atan2]</span><br />
|-<br />
| style="width:20%" | <span id="atand">[http://itp.tugraz.at/matlab/techdoc/ref/atand.html atand]</span><br />
| style="width:20%" | <span id="atanh">[http://itp.tugraz.at/matlab/techdoc/ref/atanh.html atanh]</span><br />
| style="width:20%" | <span id="audioplayer">[http://itp.tugraz.at/matlab/techdoc/ref/audioplayer.html audioplayer]</span><br />
| style="width:20%" | <span id="audiorecorder">[http://itp.tugraz.at/matlab/techdoc/ref/audiorecorder.html audiorecorder]</span><br />
| style="width:20%" | <span id="aufinfo">[http://itp.tugraz.at/matlab/techdoc/ref/aufinfo.html aufinfo]</span><br />
|-<br />
| style="width:20%" | <span id="auread">[http://itp.tugraz.at/matlab/techdoc/ref/auread.html auread]</span><br />
| style="width:20%" | <span id="auwrite">[http://itp.tugraz.at/matlab/techdoc/ref/auwrite.html auwrite]</span><br />
| style="width:20%" | <span id="avifile">[http://itp.tugraz.at/matlab/techdoc/ref/avifile.html avifile]</span><br />
| style="width:20%" | <span id="aviinfo">[http://itp.tugraz.at/matlab/techdoc/ref/aviinfo.html aviinfo]</span><br />
| style="width:20%" | <span id="aviread">[http://itp.tugraz.at/matlab/techdoc/ref/aviread.html aviread]</span><br />
|-<br />
| style="width:20%" | <span id="axes">[http://itp.tugraz.at/matlab/techdoc/ref/axes.html axes]</span><br />
| style="width:20%" | <span id="axes_props">[http://itp.tugraz.at/matlab/techdoc/ref/axes_props.html axes_props]</span><br />
| style="width:20%" | <span id="axis">[http://itp.tugraz.at/matlab/techdoc/ref/axis.html axis]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= b =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="balance">[http://itp.tugraz.at/matlab/techdoc/ref/balance.html balance]</span><br />
| style="width:20%" | <span id="bar">[http://itp.tugraz.at/matlab/techdoc/ref/bar.html bar]</span><br />
| style="width:20%" | <span id="barh">[http://itp.tugraz.at/matlab/techdoc/ref/barh.html barh]</span><br />
| style="width:20%" | <span id="bar3">[http://itp.tugraz.at/matlab/techdoc/ref/bar3.html bar3]</span><br />
| style="width:20%" | <span id="bar3h">[http://itp.tugraz.at/matlab/techdoc/ref/bar3h.html bar3h]</span><br />
|-<br />
| style="width:20%" | <span id="barseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/barseriesproperties.html barseriesproperties]</span><br />
| style="width:20%" | <span id="base2dec">[http://itp.tugraz.at/matlab/techdoc/ref/base2dec.html base2dec]</span><br />
| style="width:20%" | <span id="beep">[http://itp.tugraz.at/matlab/techdoc/ref/beep.html beep]</span><br />
| style="width:20%" | <span id="besselh">[http://itp.tugraz.at/matlab/techdoc/ref/besselh.html besselh]</span><br />
| style="width:20%" | <span id="besseli">[http://itp.tugraz.at/matlab/techdoc/ref/besseli.html besseli]</span><br />
|-<br />
| style="width:20%" | <span id="besselj">[http://itp.tugraz.at/matlab/techdoc/ref/besselj.html besselj]</span><br />
| style="width:20%" | <span id="besselk">[http://itp.tugraz.at/matlab/techdoc/ref/besselk.html besselk]</span><br />
| style="width:20%" | <span id="bessely">[http://itp.tugraz.at/matlab/techdoc/ref/bessely.html bessely]</span><br />
| style="width:20%" | <span id="beta">[http://itp.tugraz.at/matlab/techdoc/ref/beta.html beta]</span><br />
| style="width:20%" | <span id="betainc">[http://itp.tugraz.at/matlab/techdoc/ref/betainc.html betainc]</span><br />
|-<br />
| style="width:20%" | <span id="betaln">[http://itp.tugraz.at/matlab/techdoc/ref/betaln.html betaln]</span><br />
| style="width:20%" | <span id="bicg">[http://itp.tugraz.at/matlab/techdoc/ref/bicg.html bicg]</span><br />
| style="width:20%" | <span id="bicgstab">[http://itp.tugraz.at/matlab/techdoc/ref/bicgstab.html bicgstab]</span><br />
| style="width:20%" | <span id="bin2dec">[http://itp.tugraz.at/matlab/techdoc/ref/bin2dec.html bin2dec]</span><br />
| style="width:20%" | <span id="binary">[http://itp.tugraz.at/matlab/techdoc/ref/binary.html binary]</span><br />
|-<br />
| style="width:20%" | <span id="bitand">[http://itp.tugraz.at/matlab/techdoc/ref/bitand.html bitand]</span><br />
| style="width:20%" | <span id="bitcmp">[http://itp.tugraz.at/matlab/techdoc/ref/bitcmp.html bitcmp]</span><br />
| style="width:20%" | <span id="bitget">[http://itp.tugraz.at/matlab/techdoc/ref/bitget.html bitget]</span><br />
| style="width:20%" | <span id="bitmax">[http://itp.tugraz.at/matlab/techdoc/ref/bitmax.html bitmax]</span><br />
| style="width:20%" | <span id="bitor">[http://itp.tugraz.at/matlab/techdoc/ref/bitor.html bitor]</span><br />
|-<br />
| style="width:20%" | <span id="bitset">[http://itp.tugraz.at/matlab/techdoc/ref/bitset.html bitset]</span><br />
| style="width:20%" | <span id="bitshift">[http://itp.tugraz.at/matlab/techdoc/ref/bitshift.html bitshift]</span><br />
| style="width:20%" | <span id="bitxor">[http://itp.tugraz.at/matlab/techdoc/ref/bitxor.html bitxor]</span><br />
| style="width:20%" | <span id="blanks">[http://itp.tugraz.at/matlab/techdoc/ref/blanks.html blanks]</span><br />
| style="width:20%" | <span id="blkdiag">[http://itp.tugraz.at/matlab/techdoc/ref/blkdiag.html blkdiag]</span><br />
|-<br />
| style="width:20%" | <span id="box">[http://itp.tugraz.at/matlab/techdoc/ref/box.html box]</span><br />
| style="width:20%" | <span id="break">[http://itp.tugraz.at/matlab/techdoc/ref/break.html break]</span><br />
| style="width:20%" | <span id="brighten">[http://itp.tugraz.at/matlab/techdoc/ref/brighten.html brighten]</span><br />
| style="width:20%" | <span id="builddocsearchdb">[http://itp.tugraz.at/matlab/techdoc/ref/builddocsearchdb.html builddocsearchdb]</span><br />
| style="width:20%" | <span id="builtin">[http://itp.tugraz.at/matlab/techdoc/ref/builtin.html builtin]</span><br />
|-<br />
| style="width:20%" | <span id="bsxfun">[http://itp.tugraz.at/matlab/techdoc/ref/bsxfun.html bsxfun]</span><br />
| style="width:20%" | <span id="bvp4c">[http://itp.tugraz.at/matlab/techdoc/ref/bvp4c.html bvp4c]</span><br />
| style="width:20%" | <span id="bvp5c">[http://itp.tugraz.at/matlab/techdoc/ref/bvp5c.html bvp5c]</span><br />
| style="width:20%" | <span id="bvpget">[http://itp.tugraz.at/matlab/techdoc/ref/bvpget.html bvpget]</span><br />
| style="width:20%" | <span id="bvpinit">[http://itp.tugraz.at/matlab/techdoc/ref/bvpinit.html bvpinit]</span><br />
|-<br />
| style="width:20%" | <span id="bvpset">[http://itp.tugraz.at/matlab/techdoc/ref/bvpset.html bvpset]</span><br />
| style="width:20%" | <span id="bvpxtend">[http://itp.tugraz.at/matlab/techdoc/ref/bvpxtend.html bvpxtend]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= c =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="colon">[http://itp.tugraz.at/matlab/techdoc/ref/colon.html colon]</span><br />
| style="width:20%" | <span id="calendar">[http://itp.tugraz.at/matlab/techdoc/ref/calendar.html calendar]</span><br />
| style="width:20%" | <span id="calllib">[http://itp.tugraz.at/matlab/techdoc/ref/calllib.html calllib]</span><br />
| style="width:20%" | <span id="callsoapservice">[http://itp.tugraz.at/matlab/techdoc/ref/callsoapservice.html callsoapservice]</span><br />
| style="width:20%" | <span id="camdolly">[http://itp.tugraz.at/matlab/techdoc/ref/camdolly.html camdolly]</span><br />
|-<br />
| style="width:20%" | <span id="cameratoolbar">[http://itp.tugraz.at/matlab/techdoc/ref/cameratoolbar.html cameratoolbar]</span><br />
| style="width:20%" | <span id="camlight">[http://itp.tugraz.at/matlab/techdoc/ref/camlight.html camlight]</span><br />
| style="width:20%" | <span id="camlookat">[http://itp.tugraz.at/matlab/techdoc/ref/camlookat.html camlookat]</span><br />
| style="width:20%" | <span id="camorbit">[http://itp.tugraz.at/matlab/techdoc/ref/camorbit.html camorbit]</span><br />
| style="width:20%" | <span id="campan">[http://itp.tugraz.at/matlab/techdoc/ref/campan.html campan]</span><br />
|-<br />
| style="width:20%" | <span id="campos">[http://itp.tugraz.at/matlab/techdoc/ref/campos.html campos]</span><br />
| style="width:20%" | <span id="camproj">[http://itp.tugraz.at/matlab/techdoc/ref/camproj.html camproj]</span><br />
| style="width:20%" | <span id="camroll">[http://itp.tugraz.at/matlab/techdoc/ref/camroll.html camroll]</span><br />
| style="width:20%" | <span id="camtarget">[http://itp.tugraz.at/matlab/techdoc/ref/camtarget.html camtarget]</span><br />
| style="width:20%" | <span id="camup">[http://itp.tugraz.at/matlab/techdoc/ref/camup.html camup]</span><br />
|-<br />
| style="width:20%" | <span id="camva">[http://itp.tugraz.at/matlab/techdoc/ref/camva.html camva]</span><br />
| style="width:20%" | <span id="camzoom">[http://itp.tugraz.at/matlab/techdoc/ref/camzoom.html camzoom]</span><br />
| style="width:20%" | <span id="cart2pol">[http://itp.tugraz.at/matlab/techdoc/ref/cart2pol.html cart2pol]</span><br />
| style="width:20%" | <span id="cart2sph">[http://itp.tugraz.at/matlab/techdoc/ref/cart2sph.html cart2sph]</span><br />
| style="width:20%" | <span id="case">[http://itp.tugraz.at/matlab/techdoc/ref/case.html case]</span><br />
|-<br />
| style="width:20%" | <span id="cast">[http://itp.tugraz.at/matlab/techdoc/ref/cast.html cast]</span><br />
| style="width:20%" | <span id="cat">[http://itp.tugraz.at/matlab/techdoc/ref/cat.html cat]</span><br />
| style="width:20%" | <span id="catch">[http://itp.tugraz.at/matlab/techdoc/ref/catch.html catch]</span><br />
| style="width:20%" | <span id="caxis">[http://itp.tugraz.at/matlab/techdoc/ref/caxis.html caxis]</span><br />
| style="width:20%" | <span id="cd">[http://itp.tugraz.at/matlab/techdoc/ref/cd.html cd]</span><br />
|-<br />
| style="width:20%" | <span id="cdf2rdf">[http://itp.tugraz.at/matlab/techdoc/ref/cdf2rdf.html cdf2rdf]</span><br />
| style="width:20%" | <span id="cdfepoch">[http://itp.tugraz.at/matlab/techdoc/ref/cdfepoch.html cdfepoch]</span><br />
| style="width:20%" | <span id="cdfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/cdfinfo.html cdfinfo]</span><br />
| style="width:20%" | <span id="cdfread">[http://itp.tugraz.at/matlab/techdoc/ref/cdfread.html cdfread]</span><br />
| style="width:20%" | <span id="cdfwrite">[http://itp.tugraz.at/matlab/techdoc/ref/cdfwrite.html cdfwrite]</span><br />
|-<br />
| style="width:20%" | <span id="ceil">[http://itp.tugraz.at/matlab/techdoc/ref/ceil.html ceil]</span><br />
| style="width:20%" | <span id="cell">[http://itp.tugraz.at/matlab/techdoc/ref/cell.html cell]</span><br />
| style="width:20%" | <span id="cell2mat">[http://itp.tugraz.at/matlab/techdoc/ref/cell2mat.html cell2mat]</span><br />
| style="width:20%" | <span id="cell2struct">[http://itp.tugraz.at/matlab/techdoc/ref/cell2struct.html cell2struct]</span><br />
| style="width:20%" | <span id="celldisp">[http://itp.tugraz.at/matlab/techdoc/ref/celldisp.html celldisp]</span><br />
|-<br />
| style="width:20%" | <span id="cellfun">[http://itp.tugraz.at/matlab/techdoc/ref/cellfun.html cellfun]</span><br />
| style="width:20%" | <span id="cellplot">[http://itp.tugraz.at/matlab/techdoc/ref/cellplot.html cellplot]</span><br />
| style="width:20%" | <span id="cellstr">[http://itp.tugraz.at/matlab/techdoc/ref/cellstr.html cellstr]</span><br />
| style="width:20%" | <span id="cgs">[http://itp.tugraz.at/matlab/techdoc/ref/cgs.html cgs]</span><br />
| style="width:20%" | <span id="char">[http://itp.tugraz.at/matlab/techdoc/ref/char.html char]</span><br />
|-<br />
| style="width:20%" | <span id="checkin">[http://itp.tugraz.at/matlab/techdoc/ref/checkin.html checkin]</span><br />
| style="width:20%" | <span id="checkout">[http://itp.tugraz.at/matlab/techdoc/ref/checkout.html checkout]</span><br />
| style="width:20%" | <span id="chol">[http://itp.tugraz.at/matlab/techdoc/ref/chol.html chol]</span><br />
| style="width:20%" | <span id="cholinc">[http://itp.tugraz.at/matlab/techdoc/ref/cholinc.html cholinc]</span><br />
| style="width:20%" | <span id="cholupdate">[http://itp.tugraz.at/matlab/techdoc/ref/cholupdate.html cholupdate]</span><br />
|-<br />
| style="width:20%" | <span id="circshift">[http://itp.tugraz.at/matlab/techdoc/ref/circshift.html circshift]</span><br />
| style="width:20%" | <span id="cla">[http://itp.tugraz.at/matlab/techdoc/ref/cla.html cla]</span><br />
| style="width:20%" | <span id="clabel">[http://itp.tugraz.at/matlab/techdoc/ref/clabel.html clabel]</span><br />
| style="width:20%" | <span id="class">[http://itp.tugraz.at/matlab/techdoc/ref/class.html class]</span><br />
| style="width:20%" | <span id="clc">[http://itp.tugraz.at/matlab/techdoc/ref/clc.html clc]</span><br />
|-<br />
| style="width:20%" | <span id="clear">[http://itp.tugraz.at/matlab/techdoc/ref/clear.html clear]</span><br />
| style="width:20%" | <span id="clf">[http://itp.tugraz.at/matlab/techdoc/ref/clf.html clf]</span><br />
| style="width:20%" | <span id="clipboard">[http://itp.tugraz.at/matlab/techdoc/ref/clipboard.html clipboard]</span><br />
| style="width:20%" | <span id="clock">[http://itp.tugraz.at/matlab/techdoc/ref/clock.html clock]</span><br />
| style="width:20%" | <span id="close">[http://itp.tugraz.at/matlab/techdoc/ref/close.html close]</span><br />
|-<br />
| style="width:20%" | <span id="closeavifile">[http://itp.tugraz.at/matlab/techdoc/ref/closeavifile.html closeavifile]</span><br />
| style="width:20%" | <span id="closereq">[http://itp.tugraz.at/matlab/techdoc/ref/closereq.html closereq]</span><br />
| style="width:20%" | <span id="cmopts">[http://itp.tugraz.at/matlab/techdoc/ref/cmopts.html cmopts]</span><br />
| style="width:20%" | <span id="colamd">[http://itp.tugraz.at/matlab/techdoc/ref/colamd.html colamd]</span><br />
| style="width:20%" | <span id="colmmd">[http://itp.tugraz.at/matlab/techdoc/ref/colmmd.html colmmd]</span><br />
|-<br />
| style="width:20%" | <span id="colorbar">[http://itp.tugraz.at/matlab/techdoc/ref/colorbar.html colorbar]</span><br />
| style="width:20%" | <span id="colordef">[http://itp.tugraz.at/matlab/techdoc/ref/colordef.html colordef]</span><br />
| style="width:20%" | <span id="colormap">[http://itp.tugraz.at/matlab/techdoc/ref/colormap.html colormap]</span><br />
| style="width:20%" | <span id="colormapeditor">[http://itp.tugraz.at/matlab/techdoc/ref/colormapeditor.html colormapeditor]</span><br />
| style="width:20%" | <span id="colorspec">[http://itp.tugraz.at/matlab/techdoc/ref/colorspec.html colorspec]</span><br />
|-<br />
| style="width:20%" | <span id="colperm">[http://itp.tugraz.at/matlab/techdoc/ref/colperm.html colperm]</span><br />
| style="width:20%" | <span id="comet">[http://itp.tugraz.at/matlab/techdoc/ref/comet.html comet]</span><br />
| style="width:20%" | <span id="comet3">[http://itp.tugraz.at/matlab/techdoc/ref/comet3.html comet3]</span><br />
| style="width:20%" | <span id="commandhistory">[http://itp.tugraz.at/matlab/techdoc/ref/commandhistory.html commandhistory]</span><br />
| style="width:20%" | <span id="commandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/commandwindow.html commandwindow]</span><br />
|-<br />
| style="width:20%" | <span id="compan">[http://itp.tugraz.at/matlab/techdoc/ref/compan.html compan]</span><br />
| style="width:20%" | <span id="compass">[http://itp.tugraz.at/matlab/techdoc/ref/compass.html compass]</span><br />
| style="width:20%" | <span id="complex">[http://itp.tugraz.at/matlab/techdoc/ref/complex.html complex]</span><br />
| style="width:20%" | <span id="computer">[http://itp.tugraz.at/matlab/techdoc/ref/computer.html computer]</span><br />
| style="width:20%" | <span id="cond">[http://itp.tugraz.at/matlab/techdoc/ref/cond.html cond]</span><br />
|-<br />
| style="width:20%" | <span id="condeig">[http://itp.tugraz.at/matlab/techdoc/ref/condeig.html condeig]</span><br />
| style="width:20%" | <span id="condest">[http://itp.tugraz.at/matlab/techdoc/ref/condest.html condest]</span><br />
| style="width:20%" | <span id="conj">[http://itp.tugraz.at/matlab/techdoc/ref/conj.html conj]</span><br />
| style="width:20%" | <span id="coneplot">[http://itp.tugraz.at/matlab/techdoc/ref/coneplot.html coneplot]</span><br />
| style="width:20%" | <span id="continue">[http://itp.tugraz.at/matlab/techdoc/ref/continue.html continue]</span><br />
|-<br />
| style="width:20%" | <span id="contour">[http://itp.tugraz.at/matlab/techdoc/ref/contour.html contour]</span><br />
| style="width:20%" | <span id="contour3">[http://itp.tugraz.at/matlab/techdoc/ref/contour3.html contour3]</span><br />
| style="width:20%" | <span id="contourc">[http://itp.tugraz.at/matlab/techdoc/ref/contourc.html contourc]</span><br />
| style="width:20%" | <span id="contourf">[http://itp.tugraz.at/matlab/techdoc/ref/contourf.html contourf]</span><br />
| style="width:20%" | <span id="contourgroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/contourgroupproperties.html contourgroupproperties]</span><br />
|-<br />
| style="width:20%" | <span id="contourslice">[http://itp.tugraz.at/matlab/techdoc/ref/contourslice.html contourslice]</span><br />
| style="width:20%" | <span id="contrast">[http://itp.tugraz.at/matlab/techdoc/ref/contrast.html contrast]</span><br />
| style="width:20%" | <span id="conv">[http://itp.tugraz.at/matlab/techdoc/ref/conv.html conv]</span><br />
| style="width:20%" | <span id="conv2">[http://itp.tugraz.at/matlab/techdoc/ref/conv2.html conv2]</span><br />
| style="width:20%" | <span id="convhull">[http://itp.tugraz.at/matlab/techdoc/ref/convhull.html convhull]</span><br />
|-<br />
| style="width:20%" | <span id="convhulln">[http://itp.tugraz.at/matlab/techdoc/ref/convhulln.html convhulln]</span><br />
| style="width:20%" | <span id="convn">[http://itp.tugraz.at/matlab/techdoc/ref/convn.html convn]</span><br />
| style="width:20%" | <span id="copyfile">[http://itp.tugraz.at/matlab/techdoc/ref/copyfile.html copyfile]</span><br />
| style="width:20%" | <span id="copyobj">[http://itp.tugraz.at/matlab/techdoc/ref/copyobj.html copyobj]</span><br />
| style="width:20%" | <span id="corrcoef">[http://itp.tugraz.at/matlab/techdoc/ref/corrcoef.html corrcoef]</span><br />
|-<br />
| style="width:20%" | <span id="cos">[http://itp.tugraz.at/matlab/techdoc/ref/cos.html cos]</span><br />
| style="width:20%" | <span id="cosd">[http://itp.tugraz.at/matlab/techdoc/ref/cosd.html cosd]</span><br />
| style="width:20%" | <span id="cosh">[http://itp.tugraz.at/matlab/techdoc/ref/cosh.html cosh]</span><br />
| style="width:20%" | <span id="cot">[http://itp.tugraz.at/matlab/techdoc/ref/cot.html cot]</span><br />
| style="width:20%" | <span id="cotd">[http://itp.tugraz.at/matlab/techdoc/ref/cotd.html cotd]</span><br />
|-<br />
| style="width:20%" | <span id="coth">[http://itp.tugraz.at/matlab/techdoc/ref/coth.html coth]</span><br />
| style="width:20%" | <span id="cov">[http://itp.tugraz.at/matlab/techdoc/ref/cov.html cov]</span><br />
| style="width:20%" | <span id="cplxpair">[http://itp.tugraz.at/matlab/techdoc/ref/cplxpair.html cplxpair]</span><br />
| style="width:20%" | <span id="cputime">[http://itp.tugraz.at/matlab/techdoc/ref/cputime.html cputime]</span><br />
| style="width:20%" | <span id="createclassfromwsdl">[http://itp.tugraz.at/matlab/techdoc/ref/createclassfromwsdl.html createclassfromwsdl]</span><br />
|-<br />
| style="width:20%" | <span id="createcopyinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/createcopyinputparser.html createcopyinputparser]</span><br />
| style="width:20%" | <span id="createsoapmessage">[http://itp.tugraz.at/matlab/techdoc/ref/createsoapmessage.html createsoapmessage]</span><br />
| style="width:20%" | <span id="cross">[http://itp.tugraz.at/matlab/techdoc/ref/cross.html cross]</span><br />
| style="width:20%" | <span id="csc">[http://itp.tugraz.at/matlab/techdoc/ref/csc.html csc]</span><br />
| style="width:20%" | <span id="cscd">[http://itp.tugraz.at/matlab/techdoc/ref/cscd.html cscd]</span><br />
|-<br />
| style="width:20%" | <span id="csch">[http://itp.tugraz.at/matlab/techdoc/ref/csch.html csch]</span><br />
| style="width:20%" | <span id="csvread">[http://itp.tugraz.at/matlab/techdoc/ref/csvread.html csvread]</span><br />
| style="width:20%" | <span id="csvwrite">[http://itp.tugraz.at/matlab/techdoc/ref/csvwrite.html csvwrite]</span><br />
| style="width:20%" | <span id="ctransposetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/ctransposetimeseries.html ctransposetimeseries]</span><br />
| style="width:20%" | <span id="cumprod">[http://itp.tugraz.at/matlab/techdoc/ref/cumprod.html cumprod]</span><br />
|-<br />
| style="width:20%" | <span id="cumsum">[http://itp.tugraz.at/matlab/techdoc/ref/cumsum.html cumsum]</span><br />
| style="width:20%" | <span id="cumtrapz">[http://itp.tugraz.at/matlab/techdoc/ref/cumtrapz.html cumtrapz]</span><br />
| style="width:20%" | <span id="curl">[http://itp.tugraz.at/matlab/techdoc/ref/curl.html curl]</span><br />
| style="width:20%" | <span id="customverctrl">[http://itp.tugraz.at/matlab/techdoc/ref/customverctrl.html customverctrl]</span><br />
| style="width:20%" | <span id="cylinder">[http://itp.tugraz.at/matlab/techdoc/ref/cylinder.html cylinder]</span><br />
|-<br />
| style="width:20%" | <span id="com.delete">[http://itp.tugraz.at/matlab/techdoc/ref/com.delete.html com.delete]</span><br />
| style="width:20%" | <span id="com.feval">[http://itp.tugraz.at/matlab/techdoc/ref/com.feval.html com.feval]</span><br />
| style="width:20%" | <span id="com.get">[http://itp.tugraz.at/matlab/techdoc/ref/com.get.html com.get]</span><br />
| style="width:20%" | <span id="com.load">[http://itp.tugraz.at/matlab/techdoc/ref/com.load.html com.load]</span><br />
| style="width:20%" | <span id="com.propedit">[http://itp.tugraz.at/matlab/techdoc/ref/com.propedit.html com.propedit]</span><br />
|-<br />
| style="width:20%" | <span id="com.quit">[http://itp.tugraz.at/matlab/techdoc/ref/com.quit.html com.quit]</span><br />
| style="width:20%" | <span id="com.save">[http://itp.tugraz.at/matlab/techdoc/ref/com.save.html com.save]</span><br />
| style="width:20%" | <span id="com.set">[http://itp.tugraz.at/matlab/techdoc/ref/com.set.html com.set]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= d =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="daqread">[http://itp.tugraz.at/matlab/techdoc/ref/daqread.html daqread]</span><br />
| style="width:20%" | <span id="daspect">[http://itp.tugraz.at/matlab/techdoc/ref/daspect.html daspect]</span><br />
| style="width:20%" | <span id="datacursormode">[http://itp.tugraz.at/matlab/techdoc/ref/datacursormode.html datacursormode]</span><br />
| style="width:20%" | <span id="datatipinfo">[http://itp.tugraz.at/matlab/techdoc/ref/datatipinfo.html datatipinfo]</span><br />
| style="width:20%" | <span id="date">[http://itp.tugraz.at/matlab/techdoc/ref/date.html date]</span><br />
|-<br />
| style="width:20%" | <span id="datenum">[http://itp.tugraz.at/matlab/techdoc/ref/datenum.html datenum]</span><br />
| style="width:20%" | <span id="datestr">[http://itp.tugraz.at/matlab/techdoc/ref/datestr.html datestr]</span><br />
| style="width:20%" | <span id="datetick">[http://itp.tugraz.at/matlab/techdoc/ref/datetick.html datetick]</span><br />
| style="width:20%" | <span id="datevec">[http://itp.tugraz.at/matlab/techdoc/ref/datevec.html datevec]</span><br />
| style="width:20%" | <span id="dbclear">[http://itp.tugraz.at/matlab/techdoc/ref/dbclear.html dbclear]</span><br />
|-<br />
| style="width:20%" | <span id="dbcont">[http://itp.tugraz.at/matlab/techdoc/ref/dbcont.html dbcont]</span><br />
| style="width:20%" | <span id="dbdown">[http://itp.tugraz.at/matlab/techdoc/ref/dbdown.html dbdown]</span><br />
| style="width:20%" | <span id="dblquad">[http://itp.tugraz.at/matlab/techdoc/ref/dblquad.html dblquad]</span><br />
| style="width:20%" | <span id="dbmex">[http://itp.tugraz.at/matlab/techdoc/ref/dbmex.html dbmex]</span><br />
| style="width:20%" | <span id="dbquit">[http://itp.tugraz.at/matlab/techdoc/ref/dbquit.html dbquit]</span><br />
|-<br />
| style="width:20%" | <span id="dbstack">[http://itp.tugraz.at/matlab/techdoc/ref/dbstack.html dbstack]</span><br />
| style="width:20%" | <span id="dbstatus">[http://itp.tugraz.at/matlab/techdoc/ref/dbstatus.html dbstatus]</span><br />
| style="width:20%" | <span id="dbstep">[http://itp.tugraz.at/matlab/techdoc/ref/dbstep.html dbstep]</span><br />
| style="width:20%" | <span id="dbstop">[http://itp.tugraz.at/matlab/techdoc/ref/dbstop.html dbstop]</span><br />
| style="width:20%" | <span id="dbtype">[http://itp.tugraz.at/matlab/techdoc/ref/dbtype.html dbtype]</span><br />
|-<br />
| style="width:20%" | <span id="dbup">[http://itp.tugraz.at/matlab/techdoc/ref/dbup.html dbup]</span><br />
| style="width:20%" | <span id="dde23">[http://itp.tugraz.at/matlab/techdoc/ref/dde23.html dde23]</span><br />
| style="width:20%" | <span id="ddeadv">[http://itp.tugraz.at/matlab/techdoc/ref/ddeadv.html ddeadv]</span><br />
| style="width:20%" | <span id="ddeexec">[http://itp.tugraz.at/matlab/techdoc/ref/ddeexec.html ddeexec]</span><br />
| style="width:20%" | <span id="ddeget">[http://itp.tugraz.at/matlab/techdoc/ref/ddeget.html ddeget]</span><br />
|-<br />
| style="width:20%" | <span id="ddeinit">[http://itp.tugraz.at/matlab/techdoc/ref/ddeinit.html ddeinit]</span><br />
| style="width:20%" | <span id="ddepoke">[http://itp.tugraz.at/matlab/techdoc/ref/ddepoke.html ddepoke]</span><br />
| style="width:20%" | <span id="ddereq">[http://itp.tugraz.at/matlab/techdoc/ref/ddereq.html ddereq]</span><br />
| style="width:20%" | <span id="ddesd">[http://itp.tugraz.at/matlab/techdoc/ref/ddesd.html ddesd]</span><br />
| style="width:20%" | <span id="ddeset">[http://itp.tugraz.at/matlab/techdoc/ref/ddeset.html ddeset]</span><br />
|-<br />
| style="width:20%" | <span id="ddeterm">[http://itp.tugraz.at/matlab/techdoc/ref/ddeterm.html ddeterm]</span><br />
| style="width:20%" | <span id="ddeunadv">[http://itp.tugraz.at/matlab/techdoc/ref/ddeunadv.html ddeunadv]</span><br />
| style="width:20%" | <span id="deal">[http://itp.tugraz.at/matlab/techdoc/ref/deal.html deal]</span><br />
| style="width:20%" | <span id="deblank">[http://itp.tugraz.at/matlab/techdoc/ref/deblank.html deblank]</span><br />
| style="width:20%" | <span id="debug">[http://itp.tugraz.at/matlab/techdoc/ref/debug.html debug]</span><br />
|-<br />
| style="width:20%" | <span id="dec2base">[http://itp.tugraz.at/matlab/techdoc/ref/dec2base.html dec2base]</span><br />
| style="width:20%" | <span id="dec2bin">[http://itp.tugraz.at/matlab/techdoc/ref/dec2bin.html dec2bin]</span><br />
| style="width:20%" | <span id="dec2hex">[http://itp.tugraz.at/matlab/techdoc/ref/dec2hex.html dec2hex]</span><br />
| style="width:20%" | <span id="decic">[http://itp.tugraz.at/matlab/techdoc/ref/decic.html decic]</span><br />
| style="width:20%" | <span id="deconv">[http://itp.tugraz.at/matlab/techdoc/ref/deconv.html deconv]</span><br />
|-<br />
| style="width:20%" | <span id="del2">[http://itp.tugraz.at/matlab/techdoc/ref/del2.html del2]</span><br />
| style="width:20%" | <span id="delaunay">[http://itp.tugraz.at/matlab/techdoc/ref/delaunay.html delaunay]</span><br />
| style="width:20%" | <span id="delaunay3">[http://itp.tugraz.at/matlab/techdoc/ref/delaunay3.html delaunay3]</span><br />
| style="width:20%" | <span id="delaunayn">[http://itp.tugraz.at/matlab/techdoc/ref/delaunayn.html delaunayn]</span><br />
| style="width:20%" | <span id="delete">[http://itp.tugraz.at/matlab/techdoc/ref/delete.html delete]</span><br />
|-<br />
| style="width:20%" | <span id="deletetimer">[http://itp.tugraz.at/matlab/techdoc/ref/deletetimer.html deletetimer]</span><br />
| style="width:20%" | <span id="deleteproperty">[http://itp.tugraz.at/matlab/techdoc/ref/deleteproperty.html deleteproperty]</span><br />
| style="width:20%" | <span id="delevent">[http://itp.tugraz.at/matlab/techdoc/ref/delevent.html delevent]</span><br />
| style="width:20%" | <span id="delsample">[http://itp.tugraz.at/matlab/techdoc/ref/delsample.html delsample]</span><br />
| style="width:20%" | <span id="delsamplefromcollection">[http://itp.tugraz.at/matlab/techdoc/ref/delsamplefromcollection.html delsamplefromcollection]</span><br />
|-<br />
| style="width:20%" | <span id="demo">[http://itp.tugraz.at/matlab/techdoc/ref/demo.html demo]</span><br />
| style="width:20%" | <span id="depdir">[http://itp.tugraz.at/matlab/techdoc/ref/depdir.html depdir]</span><br />
| style="width:20%" | <span id="depfun">[http://itp.tugraz.at/matlab/techdoc/ref/depfun.html depfun]</span><br />
| style="width:20%" | <span id="det">[http://itp.tugraz.at/matlab/techdoc/ref/det.html det]</span><br />
| style="width:20%" | <span id="detrend">[http://itp.tugraz.at/matlab/techdoc/ref/detrend.html detrend]</span><br />
|-<br />
| style="width:20%" | <span id="detrendtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/detrendtimeseries.html detrendtimeseries]</span><br />
| style="width:20%" | <span id="deval">[http://itp.tugraz.at/matlab/techdoc/ref/deval.html deval]</span><br />
| style="width:20%" | <span id="diag">[http://itp.tugraz.at/matlab/techdoc/ref/diag.html diag]</span><br />
| style="width:20%" | <span id="dialog">[http://itp.tugraz.at/matlab/techdoc/ref/dialog.html dialog]</span><br />
| style="width:20%" | <span id="diary">[http://itp.tugraz.at/matlab/techdoc/ref/diary.html diary]</span><br />
|-<br />
| style="width:20%" | <span id="diff">[http://itp.tugraz.at/matlab/techdoc/ref/diff.html diff]</span><br />
| style="width:20%" | <span id="diffuse">[http://itp.tugraz.at/matlab/techdoc/ref/diffuse.html diffuse]</span><br />
| style="width:20%" | <span id="dir">[http://itp.tugraz.at/matlab/techdoc/ref/dir.html dir]</span><br />
| style="width:20%" | <span id="disp">[http://itp.tugraz.at/matlab/techdoc/ref/disp.html disp]</span><br />
| style="width:20%" | <span id="dispmemmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/dispmemmapfile.html dispmemmapfile]</span><br />
|-<br />
| style="width:20%" | <span id="dispmexception">[http://itp.tugraz.at/matlab/techdoc/ref/dispmexception.html dispmexception]</span><br />
| style="width:20%" | <span id="disptimer">[http://itp.tugraz.at/matlab/techdoc/ref/disptimer.html disptimer]</span><br />
| style="width:20%" | <span id="display">[http://itp.tugraz.at/matlab/techdoc/ref/display.html display]</span><br />
| style="width:20%" | <span id="divergence">[http://itp.tugraz.at/matlab/techdoc/ref/divergence.html divergence]</span><br />
| style="width:20%" | <span id="dlmread">[http://itp.tugraz.at/matlab/techdoc/ref/dlmread.html dlmread]</span><br />
|-<br />
| style="width:20%" | <span id="dlmwrite">[http://itp.tugraz.at/matlab/techdoc/ref/dlmwrite.html dlmwrite]</span><br />
| style="width:20%" | <span id="dmperm">[http://itp.tugraz.at/matlab/techdoc/ref/dmperm.html dmperm]</span><br />
| style="width:20%" | <span id="doc">[http://itp.tugraz.at/matlab/techdoc/ref/doc.html doc]</span><br />
| style="width:20%" | <span id="docopt">[http://itp.tugraz.at/matlab/techdoc/ref/docopt.html docopt]</span><br />
| style="width:20%" | <span id="docsearch">[http://itp.tugraz.at/matlab/techdoc/ref/docsearch.html docsearch]</span><br />
|-<br />
| style="width:20%" | <span id="dos">[http://itp.tugraz.at/matlab/techdoc/ref/dos.html dos]</span><br />
| style="width:20%" | <span id="dot">[http://itp.tugraz.at/matlab/techdoc/ref/dot.html dot]</span><br />
| style="width:20%" | <span id="double">[http://itp.tugraz.at/matlab/techdoc/ref/double.html double]</span><br />
| style="width:20%" | <span id="dragrect">[http://itp.tugraz.at/matlab/techdoc/ref/dragrect.html dragrect]</span><br />
| style="width:20%" | <span id="drawnow">[http://itp.tugraz.at/matlab/techdoc/ref/drawnow.html drawnow]</span><br />
|-<br />
| style="width:20%" | <span id="dsearch">[http://itp.tugraz.at/matlab/techdoc/ref/dsearch.html dsearch]</span><br />
| style="width:20%" | <span id="dsearchn">[http://itp.tugraz.at/matlab/techdoc/ref/dsearchn.html dsearchn]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= e =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="echo">[http://itp.tugraz.at/matlab/techdoc/ref/echo.html echo]</span><br />
| style="width:20%" | <span id="echodemo">[http://itp.tugraz.at/matlab/techdoc/ref/echodemo.html echodemo]</span><br />
| style="width:20%" | <span id="edit">[http://itp.tugraz.at/matlab/techdoc/ref/edit.html edit]</span><br />
| style="width:20%" | <span id="eig">[http://itp.tugraz.at/matlab/techdoc/ref/eig.html eig]</span><br />
| style="width:20%" | <span id="eigs">[http://itp.tugraz.at/matlab/techdoc/ref/eigs.html eigs]</span><br />
|-<br />
| style="width:20%" | <span id="ellipj">[http://itp.tugraz.at/matlab/techdoc/ref/ellipj.html ellipj]</span><br />
| style="width:20%" | <span id="ellipke">[http://itp.tugraz.at/matlab/techdoc/ref/ellipke.html ellipke]</span><br />
| style="width:20%" | <span id="ellipsoid">[http://itp.tugraz.at/matlab/techdoc/ref/ellipsoid.html ellipsoid]</span><br />
| style="width:20%" | <span id="else">[http://itp.tugraz.at/matlab/techdoc/ref/else.html else]</span><br />
| style="width:20%" | <span id="elseif">[http://itp.tugraz.at/matlab/techdoc/ref/elseif.html elseif]</span><br />
|-<br />
| style="width:20%" | <span id="enableservice">[http://itp.tugraz.at/matlab/techdoc/ref/enableservice.html enableservice]</span><br />
| style="width:20%" | <span id="end">[http://itp.tugraz.at/matlab/techdoc/ref/end.html end]</span><br />
| style="width:20%" | <span id="eomday">[http://itp.tugraz.at/matlab/techdoc/ref/eomday.html eomday]</span><br />
| style="width:20%" | <span id="eps">[http://itp.tugraz.at/matlab/techdoc/ref/eps.html eps]</span><br />
| style="width:20%" | <span id="eq">[http://itp.tugraz.at/matlab/techdoc/ref/eq.html eq]</span><br />
|-<br />
| style="width:20%" | <span id="eqmexception">[http://itp.tugraz.at/matlab/techdoc/ref/eqmexception.html eqmexception]</span><br />
| style="width:20%" | <span id="erf">[http://itp.tugraz.at/matlab/techdoc/ref/erf.html erf]</span><br />
| style="width:20%" | <span id="erfc">[http://itp.tugraz.at/matlab/techdoc/ref/erfc.html erfc]</span><br />
| style="width:20%" | <span id="erfcx">[http://itp.tugraz.at/matlab/techdoc/ref/erfcx.html erfcx]</span><br />
| style="width:20%" | <span id="erfinv">[http://itp.tugraz.at/matlab/techdoc/ref/erfinv.html erfinv]</span><br />
|-<br />
| style="width:20%" | <span id="erfcinv">[http://itp.tugraz.at/matlab/techdoc/ref/erfcinv.html erfcinv]</span><br />
| style="width:20%" | <span id="error">[http://itp.tugraz.at/matlab/techdoc/ref/error.html error]</span><br />
| style="width:20%" | <span id="errorbar">[http://itp.tugraz.at/matlab/techdoc/ref/errorbar.html errorbar]</span><br />
| style="width:20%" | <span id="errorbarseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/errorbarseriesproperties.html errorbarseriesproperties]</span><br />
| style="width:20%" | <span id="errordlg">[http://itp.tugraz.at/matlab/techdoc/ref/errordlg.html errordlg]</span><br />
|-<br />
| style="width:20%" | <span id="etime">[http://itp.tugraz.at/matlab/techdoc/ref/etime.html etime]</span><br />
| style="width:20%" | <span id="etree">[http://itp.tugraz.at/matlab/techdoc/ref/etree.html etree]</span><br />
| style="width:20%" | <span id="etreeplot">[http://itp.tugraz.at/matlab/techdoc/ref/etreeplot.html etreeplot]</span><br />
| style="width:20%" | <span id="eval">[http://itp.tugraz.at/matlab/techdoc/ref/eval.html eval]</span><br />
| style="width:20%" | <span id="evalc">[http://itp.tugraz.at/matlab/techdoc/ref/evalc.html evalc]</span><br />
|-<br />
| style="width:20%" | <span id="evalin">[http://itp.tugraz.at/matlab/techdoc/ref/evalin.html evalin]</span><br />
| style="width:20%" | <span id="eventlisteners">[http://itp.tugraz.at/matlab/techdoc/ref/eventlisteners.html eventlisteners]</span><br />
| style="width:20%" | <span id="events">[http://itp.tugraz.at/matlab/techdoc/ref/events.html events]</span><br />
| style="width:20%" | <span id="execute">[http://itp.tugraz.at/matlab/techdoc/ref/execute.html execute]</span><br />
| style="width:20%" | <span id="exifread">[http://itp.tugraz.at/matlab/techdoc/ref/exifread.html exifread]</span><br />
|-<br />
| style="width:20%" | <span id="exist">[http://itp.tugraz.at/matlab/techdoc/ref/exist.html exist]</span><br />
| style="width:20%" | <span id="exit">[http://itp.tugraz.at/matlab/techdoc/ref/exit.html exit]</span><br />
| style="width:20%" | <span id="exp">[http://itp.tugraz.at/matlab/techdoc/ref/exp.html exp]</span><br />
| style="width:20%" | <span id="expint">[http://itp.tugraz.at/matlab/techdoc/ref/expint.html expint]</span><br />
| style="width:20%" | <span id="expm">[http://itp.tugraz.at/matlab/techdoc/ref/expm.html expm]</span><br />
|-<br />
| style="width:20%" | <span id="expm1">[http://itp.tugraz.at/matlab/techdoc/ref/expm1.html expm1]</span><br />
| style="width:20%" | <span id="export2wsdlg">[http://itp.tugraz.at/matlab/techdoc/ref/export2wsdlg.html export2wsdlg]</span><br />
| style="width:20%" | <span id="eye">[http://itp.tugraz.at/matlab/techdoc/ref/eye.html eye]</span><br />
| style="width:20%" | <span id="ezcontour">[http://itp.tugraz.at/matlab/techdoc/ref/ezcontour.html ezcontour]</span><br />
| style="width:20%" | <span id="ezcontourf">[http://itp.tugraz.at/matlab/techdoc/ref/ezcontourf.html ezcontourf]</span><br />
|-<br />
| style="width:20%" | <span id="ezmesh">[http://itp.tugraz.at/matlab/techdoc/ref/ezmesh.html ezmesh]</span><br />
| style="width:20%" | <span id="ezmeshc">[http://itp.tugraz.at/matlab/techdoc/ref/ezmeshc.html ezmeshc]</span><br />
| style="width:20%" | <span id="ezplot">[http://itp.tugraz.at/matlab/techdoc/ref/ezplot.html ezplot]</span><br />
| style="width:20%" | <span id="ezplot3">[http://itp.tugraz.at/matlab/techdoc/ref/ezplot3.html ezplot3]</span><br />
| style="width:20%" | <span id="ezpolar">[http://itp.tugraz.at/matlab/techdoc/ref/ezpolar.html ezpolar]</span><br />
|-<br />
| style="width:20%" | <span id="ezsurf">[http://itp.tugraz.at/matlab/techdoc/ref/ezsurf.html ezsurf]</span><br />
| style="width:20%" | <span id="ezsurfc">[http://itp.tugraz.at/matlab/techdoc/ref/ezsurfc.html ezsurfc]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= f =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="f16-6011">[http://itp.tugraz.at/matlab/techdoc/ref/f16-6011.html f16-6011]</span><br />
| style="width:20%" | <span id="ftp.cd">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.cd.html ftp.cd]</span><br />
| style="width:20%" | <span id="ftp.close">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.close.html ftp.close]</span><br />
| style="width:20%" | <span id="ftp.delete">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.delete.html ftp.delete]</span><br />
| style="width:20%" | <span id="ftp.dir">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.dir.html ftp.dir]</span><br />
|-<br />
| style="width:20%" | <span id="factor">[http://itp.tugraz.at/matlab/techdoc/ref/factor.html factor]</span><br />
| style="width:20%" | <span id="factorial">[http://itp.tugraz.at/matlab/techdoc/ref/factorial.html factorial]</span><br />
| style="width:20%" | <span id="false">[http://itp.tugraz.at/matlab/techdoc/ref/false.html false]</span><br />
| style="width:20%" | <span id="fclose">[http://itp.tugraz.at/matlab/techdoc/ref/fclose.html fclose]</span><br />
| style="width:20%" | <span id="feather">[http://itp.tugraz.at/matlab/techdoc/ref/feather.html feather]</span><br />
|-<br />
| style="width:20%" | <span id="feof">[http://itp.tugraz.at/matlab/techdoc/ref/feof.html feof]</span><br />
| style="width:20%" | <span id="ferror">[http://itp.tugraz.at/matlab/techdoc/ref/ferror.html ferror]</span><br />
| style="width:20%" | <span id="feval">[http://itp.tugraz.at/matlab/techdoc/ref/feval.html feval]</span><br />
| style="width:20%" | <span id="fft">[http://itp.tugraz.at/matlab/techdoc/ref/fft.html fft]</span><br />
| style="width:20%" | <span id="fft2">[http://itp.tugraz.at/matlab/techdoc/ref/fft2.html fft2]</span><br />
|-<br />
| style="width:20%" | <span id="fftn">[http://itp.tugraz.at/matlab/techdoc/ref/fftn.html fftn]</span><br />
| style="width:20%" | <span id="fftshift">[http://itp.tugraz.at/matlab/techdoc/ref/fftshift.html fftshift]</span><br />
| style="width:20%" | <span id="fftw">[http://itp.tugraz.at/matlab/techdoc/ref/fftw.html fftw]</span><br />
| style="width:20%" | <span id="fgetl">[http://itp.tugraz.at/matlab/techdoc/ref/fgetl.html fgetl]</span><br />
| style="width:20%" | <span id="fgets">[http://itp.tugraz.at/matlab/techdoc/ref/fgets.html fgets]</span><br />
|-<br />
| style="width:20%" | <span id="fieldnames">[http://itp.tugraz.at/matlab/techdoc/ref/fieldnames.html fieldnames]</span><br />
| style="width:20%" | <span id="figure">[http://itp.tugraz.at/matlab/techdoc/ref/figure.html figure]</span><br />
| style="width:20%" | <span id="figure_props">[http://itp.tugraz.at/matlab/techdoc/ref/figure_props.html figure_props]</span><br />
| style="width:20%" | <span id="figurepalette">[http://itp.tugraz.at/matlab/techdoc/ref/figurepalette.html figurepalette]</span><br />
| style="width:20%" | <span id="fileattrib">[http://itp.tugraz.at/matlab/techdoc/ref/fileattrib.html fileattrib]</span><br />
|-<br />
| style="width:20%" | <span id="filebrowser">[http://itp.tugraz.at/matlab/techdoc/ref/filebrowser.html filebrowser]</span><br />
| style="width:20%" | <span id="fileformats">[http://itp.tugraz.at/matlab/techdoc/ref/fileformats.html fileformats]</span><br />
| style="width:20%" | <span id="filemarker">[http://itp.tugraz.at/matlab/techdoc/ref/filemarker.html filemarker]</span><br />
| style="width:20%" | <span id="fileparts">[http://itp.tugraz.at/matlab/techdoc/ref/fileparts.html fileparts]</span><br />
| style="width:20%" | <span id="filehandle">[http://itp.tugraz.at/matlab/techdoc/ref/filehandle.html filehandle]</span><br />
|-<br />
| style="width:20%" | <span id="filesep">[http://itp.tugraz.at/matlab/techdoc/ref/filesep.html filesep]</span><br />
| style="width:20%" | <span id="fill">[http://itp.tugraz.at/matlab/techdoc/ref/fill.html fill]</span><br />
| style="width:20%" | <span id="fill3">[http://itp.tugraz.at/matlab/techdoc/ref/fill3.html fill3]</span><br />
| style="width:20%" | <span id="filter">[http://itp.tugraz.at/matlab/techdoc/ref/filter.html filter]</span><br />
| style="width:20%" | <span id="filtertimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/filtertimeseries.html filtertimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="filter2">[http://itp.tugraz.at/matlab/techdoc/ref/filter2.html filter2]</span><br />
| style="width:20%" | <span id="find">[http://itp.tugraz.at/matlab/techdoc/ref/find.html find]</span><br />
| style="width:20%" | <span id="findall">[http://itp.tugraz.at/matlab/techdoc/ref/findall.html findall]</span><br />
| style="width:20%" | <span id="findfigs">[http://itp.tugraz.at/matlab/techdoc/ref/findfigs.html findfigs]</span><br />
| style="width:20%" | <span id="findobj">[http://itp.tugraz.at/matlab/techdoc/ref/findobj.html findobj]</span><br />
|-<br />
| style="width:20%" | <span id="findstr">[http://itp.tugraz.at/matlab/techdoc/ref/findstr.html findstr]</span><br />
| style="width:20%" | <span id="finish">[http://itp.tugraz.at/matlab/techdoc/ref/finish.html finish]</span><br />
| style="width:20%" | <span id="fitsinfo">[http://itp.tugraz.at/matlab/techdoc/ref/fitsinfo.html fitsinfo]</span><br />
| style="width:20%" | <span id="fitsread">[http://itp.tugraz.at/matlab/techdoc/ref/fitsread.html fitsread]</span><br />
| style="width:20%" | <span id="fix">[http://itp.tugraz.at/matlab/techdoc/ref/fix.html fix]</span><br />
|-<br />
| style="width:20%" | <span id="flipdim">[http://itp.tugraz.at/matlab/techdoc/ref/flipdim.html flipdim]</span><br />
| style="width:20%" | <span id="fliplr">[http://itp.tugraz.at/matlab/techdoc/ref/fliplr.html fliplr]</span><br />
| style="width:20%" | <span id="flipud">[http://itp.tugraz.at/matlab/techdoc/ref/flipud.html flipud]</span><br />
| style="width:20%" | <span id="floor">[http://itp.tugraz.at/matlab/techdoc/ref/floor.html floor]</span><br />
| style="width:20%" | <span id="flops">[http://itp.tugraz.at/matlab/techdoc/ref/flops.html flops]</span><br />
|-<br />
| style="width:20%" | <span id="flow">[http://itp.tugraz.at/matlab/techdoc/ref/flow.html flow]</span><br />
| style="width:20%" | <span id="fminbnd">[http://itp.tugraz.at/matlab/techdoc/ref/fminbnd.html fminbnd]</span><br />
| style="width:20%" | <span id="fminsearch">[http://itp.tugraz.at/matlab/techdoc/ref/fminsearch.html fminsearch]</span><br />
| style="width:20%" | <span id="fopen">[http://itp.tugraz.at/matlab/techdoc/ref/fopen.html fopen]</span><br />
| style="width:20%" | <span id="for">[http://itp.tugraz.at/matlab/techdoc/ref/for.html for]</span><br />
|-<br />
| style="width:20%" | <span id="format">[http://itp.tugraz.at/matlab/techdoc/ref/format.html format]</span><br />
| style="width:20%" | <span id="fplot">[http://itp.tugraz.at/matlab/techdoc/ref/fplot.html fplot]</span><br />
| style="width:20%" | <span id="fprintf">[http://itp.tugraz.at/matlab/techdoc/ref/fprintf.html fprintf]</span><br />
| style="width:20%" | <span id="frame2im">[http://itp.tugraz.at/matlab/techdoc/ref/frame2im.html frame2im]</span><br />
| style="width:20%" | <span id="frameedit">[http://itp.tugraz.at/matlab/techdoc/ref/frameedit.html frameedit]</span><br />
|-<br />
| style="width:20%" | <span id="fread">[http://itp.tugraz.at/matlab/techdoc/ref/fread.html fread]</span><br />
| style="width:20%" | <span id="freqspace">[http://itp.tugraz.at/matlab/techdoc/ref/freqspace.html freqspace]</span><br />
| style="width:20%" | <span id="frewind">[http://itp.tugraz.at/matlab/techdoc/ref/frewind.html frewind]</span><br />
| style="width:20%" | <span id="fscanf">[http://itp.tugraz.at/matlab/techdoc/ref/fscanf.html fscanf]</span><br />
| style="width:20%" | <span id="fseek">[http://itp.tugraz.at/matlab/techdoc/ref/fseek.html fseek]</span><br />
|-<br />
| style="width:20%" | <span id="ftell">[http://itp.tugraz.at/matlab/techdoc/ref/ftell.html ftell]</span><br />
| style="width:20%" | <span id="ftp">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.html ftp]</span><br />
| style="width:20%" | <span id="full">[http://itp.tugraz.at/matlab/techdoc/ref/full.html full]</span><br />
| style="width:20%" | <span id="fullfile">[http://itp.tugraz.at/matlab/techdoc/ref/fullfile.html fullfile]</span><br />
| style="width:20%" | <span id="funm">[http://itp.tugraz.at/matlab/techdoc/ref/funm.html funm]</span><br />
|-<br />
| style="width:20%" | <span id="fwrite">[http://itp.tugraz.at/matlab/techdoc/ref/fwrite.html fwrite]</span><br />
| style="width:20%" | <span id="fzero">[http://itp.tugraz.at/matlab/techdoc/ref/fzero.html fzero]</span><br />
| style="width:20%" | <span id="ftp.mkdir">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.mkdir.html ftp.mkdir]</span><br />
| style="width:20%" | <span id="ftp.rmdir">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.rmdir.html ftp.rmdir]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= g =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="gallery">[http://itp.tugraz.at/matlab/techdoc/ref/gallery.html gallery]</span><br />
| style="width:20%" | <span id="gamma">[http://itp.tugraz.at/matlab/techdoc/ref/gamma.html gamma]</span><br />
| style="width:20%" | <span id="gammainc">[http://itp.tugraz.at/matlab/techdoc/ref/gammainc.html gammainc]</span><br />
| style="width:20%" | <span id="gammaln">[http://itp.tugraz.at/matlab/techdoc/ref/gammaln.html gammaln]</span><br />
| style="width:20%" | <span id="gca">[http://itp.tugraz.at/matlab/techdoc/ref/gca.html gca]</span><br />
|-<br />
| style="width:20%" | <span id="gcbf">[http://itp.tugraz.at/matlab/techdoc/ref/gcbf.html gcbf]</span><br />
| style="width:20%" | <span id="gcbo">[http://itp.tugraz.at/matlab/techdoc/ref/gcbo.html gcbo]</span><br />
| style="width:20%" | <span id="gcd">[http://itp.tugraz.at/matlab/techdoc/ref/gcd.html gcd]</span><br />
| style="width:20%" | <span id="gcf">[http://itp.tugraz.at/matlab/techdoc/ref/gcf.html gcf]</span><br />
| style="width:20%" | <span id="gco">[http://itp.tugraz.at/matlab/techdoc/ref/gco.html gco]</span><br />
|-<br />
| style="width:20%" | <span id="ge">[http://itp.tugraz.at/matlab/techdoc/ref/ge.html ge]</span><br />
| style="width:20%" | <span id="genpath">[http://itp.tugraz.at/matlab/techdoc/ref/genpath.html genpath]</span><br />
| style="width:20%" | <span id="genvarname">[http://itp.tugraz.at/matlab/techdoc/ref/genvarname.html genvarname]</span><br />
| style="width:20%" | <span id="get">[http://itp.tugraz.at/matlab/techdoc/ref/get.html get]</span><br />
| style="width:20%" | <span id="getmemmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/getmemmapfile.html getmemmapfile]</span><br />
|-<br />
| style="width:20%" | <span id="gettimer">[http://itp.tugraz.at/matlab/techdoc/ref/gettimer.html gettimer]</span><br />
| style="width:20%" | <span id="gettimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/gettimeseries.html gettimeseries]</span><br />
| style="width:20%" | <span id="gettscollection">[http://itp.tugraz.at/matlab/techdoc/ref/gettscollection.html gettscollection]</span><br />
| style="width:20%" | <span id="getabstimetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/getabstimetimeseries.html getabstimetimeseries]</span><br />
| style="width:20%" | <span id="getabstimetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/getabstimetscollection.html getabstimetscollection]</span><br />
|-<br />
| style="width:20%" | <span id="getappdata">[http://itp.tugraz.at/matlab/techdoc/ref/getappdata.html getappdata]</span><br />
| style="width:20%" | <span id="getchararray">[http://itp.tugraz.at/matlab/techdoc/ref/getchararray.html getchararray]</span><br />
| style="width:20%" | <span id="getdatasamplesize">[http://itp.tugraz.at/matlab/techdoc/ref/getdatasamplesize.html getdatasamplesize]</span><br />
| style="width:20%" | <span id="getenv">[http://itp.tugraz.at/matlab/techdoc/ref/getenv.html getenv]</span><br />
| style="width:20%" | <span id="getfield">[http://itp.tugraz.at/matlab/techdoc/ref/getfield.html getfield]</span><br />
|-<br />
| style="width:20%" | <span id="getframe">[http://itp.tugraz.at/matlab/techdoc/ref/getframe.html getframe]</span><br />
| style="width:20%" | <span id="getfullmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/getfullmatrix.html getfullmatrix]</span><br />
| style="width:20%" | <span id="getinterpmethod">[http://itp.tugraz.at/matlab/techdoc/ref/getinterpmethod.html getinterpmethod]</span><br />
| style="width:20%" | <span id="getpixelposition">[http://itp.tugraz.at/matlab/techdoc/ref/getpixelposition.html getpixelposition]</span><br />
| style="width:20%" | <span id="getpref">[http://itp.tugraz.at/matlab/techdoc/ref/getpref.html getpref]</span><br />
|-<br />
| style="width:20%" | <span id="getqualitydesc">[http://itp.tugraz.at/matlab/techdoc/ref/getqualitydesc.html getqualitydesc]</span><br />
| style="width:20%" | <span id="getreportmexception">[http://itp.tugraz.at/matlab/techdoc/ref/getreportmexception.html getreportmexception]</span><br />
| style="width:20%" | <span id="getsampleusingtimetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/getsampleusingtimetimeseries.html getsampleusingtimetimeseries]</span><br />
| style="width:20%" | <span id="getsampleusingtimetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/getsampleusingtimetscollection.html getsampleusingtimetscollection]</span><br />
| style="width:20%" | <span id="gettimeseriesnames">[http://itp.tugraz.at/matlab/techdoc/ref/gettimeseriesnames.html gettimeseriesnames]</span><br />
|-<br />
| style="width:20%" | <span id="gettsafteratevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsafteratevent.html gettsafteratevent]</span><br />
| style="width:20%" | <span id="gettsafterevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsafterevent.html gettsafterevent]</span><br />
| style="width:20%" | <span id="gettsatevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsatevent.html gettsatevent]</span><br />
| style="width:20%" | <span id="gettsbeforeatevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsbeforeatevent.html gettsbeforeatevent]</span><br />
| style="width:20%" | <span id="gettsbeforeevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsbeforeevent.html gettsbeforeevent]</span><br />
|-<br />
| style="width:20%" | <span id="gettsbetweenevents">[http://itp.tugraz.at/matlab/techdoc/ref/gettsbetweenevents.html gettsbetweenevents]</span><br />
| style="width:20%" | <span id="getvariable">[http://itp.tugraz.at/matlab/techdoc/ref/getvariable.html getvariable]</span><br />
| style="width:20%" | <span id="getworkspacedata">[http://itp.tugraz.at/matlab/techdoc/ref/getworkspacedata.html getworkspacedata]</span><br />
| style="width:20%" | <span id="ginput">[http://itp.tugraz.at/matlab/techdoc/ref/ginput.html ginput]</span><br />
| style="width:20%" | <span id="global">[http://itp.tugraz.at/matlab/techdoc/ref/global.html global]</span><br />
|-<br />
| style="width:20%" | <span id="gmres">[http://itp.tugraz.at/matlab/techdoc/ref/gmres.html gmres]</span><br />
| style="width:20%" | <span id="gplot">[http://itp.tugraz.at/matlab/techdoc/ref/gplot.html gplot]</span><br />
| style="width:20%" | <span id="grabcode">[http://itp.tugraz.at/matlab/techdoc/ref/grabcode.html grabcode]</span><br />
| style="width:20%" | <span id="gradient">[http://itp.tugraz.at/matlab/techdoc/ref/gradient.html gradient]</span><br />
| style="width:20%" | <span id="graymon">[http://itp.tugraz.at/matlab/techdoc/ref/graymon.html graymon]</span><br />
|-<br />
| style="width:20%" | <span id="grid">[http://itp.tugraz.at/matlab/techdoc/ref/grid.html grid]</span><br />
| style="width:20%" | <span id="griddata">[http://itp.tugraz.at/matlab/techdoc/ref/griddata.html griddata]</span><br />
| style="width:20%" | <span id="griddata3">[http://itp.tugraz.at/matlab/techdoc/ref/griddata3.html griddata3]</span><br />
| style="width:20%" | <span id="griddatan">[http://itp.tugraz.at/matlab/techdoc/ref/griddatan.html griddatan]</span><br />
| style="width:20%" | <span id="gsvd">[http://itp.tugraz.at/matlab/techdoc/ref/gsvd.html gsvd]</span><br />
|-<br />
| style="width:20%" | <span id="gt">[http://itp.tugraz.at/matlab/techdoc/ref/gt.html gt]</span><br />
| style="width:20%" | <span id="gtext">[http://itp.tugraz.at/matlab/techdoc/ref/gtext.html gtext]</span><br />
| style="width:20%" | <span id="guidata">[http://itp.tugraz.at/matlab/techdoc/ref/guidata.html guidata]</span><br />
| style="width:20%" | <span id="guide">[http://itp.tugraz.at/matlab/techdoc/ref/guide.html guide]</span><br />
| style="width:20%" | <span id="guihandles">[http://itp.tugraz.at/matlab/techdoc/ref/guihandles.html guihandles]</span><br />
|-<br />
| style="width:20%" | <span id="gunzip">[http://itp.tugraz.at/matlab/techdoc/ref/gunzip.html gunzip]</span><br />
| style="width:20%" | <span id="gzip">[http://itp.tugraz.at/matlab/techdoc/ref/gzip.html gzip]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= h =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="hadamard">[http://itp.tugraz.at/matlab/techdoc/ref/hadamard.html hadamard]</span><br />
| style="width:20%" | <span id="hankel">[http://itp.tugraz.at/matlab/techdoc/ref/hankel.html hankel]</span><br />
| style="width:20%" | <span id="hdf">[http://itp.tugraz.at/matlab/techdoc/ref/hdf.html hdf]</span><br />
| style="width:20%" | <span id="hdf5">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5.html hdf5]</span><br />
| style="width:20%" | <span id="hdf5info">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5info.html hdf5info]</span><br />
|-<br />
| style="width:20%" | <span id="hdf5read">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5read.html hdf5read]</span><br />
| style="width:20%" | <span id="hdf5write">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5write.html hdf5write]</span><br />
| style="width:20%" | <span id="hdfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/hdfinfo.html hdfinfo]</span><br />
| style="width:20%" | <span id="hdfread">[http://itp.tugraz.at/matlab/techdoc/ref/hdfread.html hdfread]</span><br />
| style="width:20%" | <span id="hdftool">[http://itp.tugraz.at/matlab/techdoc/ref/hdftool.html hdftool]</span><br />
|-<br />
| style="width:20%" | <span id="help">[http://itp.tugraz.at/matlab/techdoc/ref/help.html help]</span><br />
| style="width:20%" | <span id="helpbrowser">[http://itp.tugraz.at/matlab/techdoc/ref/helpbrowser.html helpbrowser]</span><br />
| style="width:20%" | <span id="helpdesk">[http://itp.tugraz.at/matlab/techdoc/ref/helpdesk.html helpdesk]</span><br />
| style="width:20%" | <span id="helpdlg">[http://itp.tugraz.at/matlab/techdoc/ref/helpdlg.html helpdlg]</span><br />
| style="width:20%" | <span id="helpwin">[http://itp.tugraz.at/matlab/techdoc/ref/helpwin.html helpwin]</span><br />
|-<br />
| style="width:20%" | <span id="hess">[http://itp.tugraz.at/matlab/techdoc/ref/hess.html hess]</span><br />
| style="width:20%" | <span id="hex2dec">[http://itp.tugraz.at/matlab/techdoc/ref/hex2dec.html hex2dec]</span><br />
| style="width:20%" | <span id="hex2num">[http://itp.tugraz.at/matlab/techdoc/ref/hex2num.html hex2num]</span><br />
| style="width:20%" | <span id="hgexport">[http://itp.tugraz.at/matlab/techdoc/ref/hgexport.html hgexport]</span><br />
| style="width:20%" | <span id="hggroup">[http://itp.tugraz.at/matlab/techdoc/ref/hggroup.html hggroup]</span><br />
|-<br />
| style="width:20%" | <span id="hggroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/hggroupproperties.html hggroupproperties]</span><br />
| style="width:20%" | <span id="hgload">[http://itp.tugraz.at/matlab/techdoc/ref/hgload.html hgload]</span><br />
| style="width:20%" | <span id="hgsave">[http://itp.tugraz.at/matlab/techdoc/ref/hgsave.html hgsave]</span><br />
| style="width:20%" | <span id="hgtransform">[http://itp.tugraz.at/matlab/techdoc/ref/hgtransform.html hgtransform]</span><br />
| style="width:20%" | <span id="hgtransformproperties">[http://itp.tugraz.at/matlab/techdoc/ref/hgtransformproperties.html hgtransformproperties]</span><br />
|-<br />
| style="width:20%" | <span id="hidden">[http://itp.tugraz.at/matlab/techdoc/ref/hidden.html hidden]</span><br />
| style="width:20%" | <span id="hilb">[http://itp.tugraz.at/matlab/techdoc/ref/hilb.html hilb]</span><br />
| style="width:20%" | <span id="hist">[http://itp.tugraz.at/matlab/techdoc/ref/hist.html hist]</span><br />
| style="width:20%" | <span id="histc">[http://itp.tugraz.at/matlab/techdoc/ref/histc.html histc]</span><br />
| style="width:20%" | <span id="hold">[http://itp.tugraz.at/matlab/techdoc/ref/hold.html hold]</span><br />
|-<br />
| style="width:20%" | <span id="home">[http://itp.tugraz.at/matlab/techdoc/ref/home.html home]</span><br />
| style="width:20%" | <span id="horzcat">[http://itp.tugraz.at/matlab/techdoc/ref/horzcat.html horzcat]</span><br />
| style="width:20%" | <span id="horzcattscollection">[http://itp.tugraz.at/matlab/techdoc/ref/horzcattscollection.html horzcattscollection]</span><br />
| style="width:20%" | <span id="hostid">[http://itp.tugraz.at/matlab/techdoc/ref/hostid.html hostid]</span><br />
| style="width:20%" | <span id="hsv2rgb">[http://itp.tugraz.at/matlab/techdoc/ref/hsv2rgb.html hsv2rgb]</span><br />
|-<br />
| style="width:20%" | <span id="hypot">[http://itp.tugraz.at/matlab/techdoc/ref/hypot.html hypot]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= i =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="index">[http://itp.tugraz.at/matlab/techdoc/ref/index.html index]</span><br />
| style="width:20%" | <span id="i">[http://itp.tugraz.at/matlab/techdoc/ref/i.html i]</span><br />
| style="width:20%" | <span id="idealfiltertimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/idealfiltertimeseries.html idealfiltertimeseries]</span><br />
| style="width:20%" | <span id="idivide">[http://itp.tugraz.at/matlab/techdoc/ref/idivide.html idivide]</span><br />
| style="width:20%" | <span id="if">[http://itp.tugraz.at/matlab/techdoc/ref/if.html if]</span><br />
|-<br />
| style="width:20%" | <span id="ifft">[http://itp.tugraz.at/matlab/techdoc/ref/ifft.html ifft]</span><br />
| style="width:20%" | <span id="ilu">[http://itp.tugraz.at/matlab/techdoc/ref/ilu.html ilu]</span><br />
| style="width:20%" | <span id="ifft2">[http://itp.tugraz.at/matlab/techdoc/ref/ifft2.html ifft2]</span><br />
| style="width:20%" | <span id="ifftn">[http://itp.tugraz.at/matlab/techdoc/ref/ifftn.html ifftn]</span><br />
| style="width:20%" | <span id="ifftshift">[http://itp.tugraz.at/matlab/techdoc/ref/ifftshift.html ifftshift]</span><br />
|-<br />
| style="width:20%" | <span id="im2frame">[http://itp.tugraz.at/matlab/techdoc/ref/im2frame.html im2frame]</span><br />
| style="width:20%" | <span id="im2java">[http://itp.tugraz.at/matlab/techdoc/ref/im2java.html im2java]</span><br />
| style="width:20%" | <span id="imag">[http://itp.tugraz.at/matlab/techdoc/ref/imag.html imag]</span><br />
| style="width:20%" | <span id="image">[http://itp.tugraz.at/matlab/techdoc/ref/image.html image]</span><br />
| style="width:20%" | <span id="image_props">[http://itp.tugraz.at/matlab/techdoc/ref/image_props.html image_props]</span><br />
|-<br />
| style="width:20%" | <span id="imagesc">[http://itp.tugraz.at/matlab/techdoc/ref/imagesc.html imagesc]</span><br />
| style="width:20%" | <span id="imfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/imfinfo.html imfinfo]</span><br />
| style="width:20%" | <span id="imformats">[http://itp.tugraz.at/matlab/techdoc/ref/imformats.html imformats]</span><br />
| style="width:20%" | <span id="import">[http://itp.tugraz.at/matlab/techdoc/ref/import.html import]</span><br />
| style="width:20%" | <span id="importdata">[http://itp.tugraz.at/matlab/techdoc/ref/importdata.html importdata]</span><br />
|-<br />
| style="width:20%" | <span id="imread">[http://itp.tugraz.at/matlab/techdoc/ref/imread.html imread]</span><br />
| style="width:20%" | <span id="imwrite">[http://itp.tugraz.at/matlab/techdoc/ref/imwrite.html imwrite]</span><br />
| style="width:20%" | <span id="ind2rgb">[http://itp.tugraz.at/matlab/techdoc/ref/ind2rgb.html ind2rgb]</span><br />
| style="width:20%" | <span id="ind2sub">[http://itp.tugraz.at/matlab/techdoc/ref/ind2sub.html ind2sub]</span><br />
| style="width:20%" | <span id="inf">[http://itp.tugraz.at/matlab/techdoc/ref/inf.html inf]</span><br />
|-<br />
| style="width:20%" | <span id="inferiorto">[http://itp.tugraz.at/matlab/techdoc/ref/inferiorto.html inferiorto]</span><br />
| style="width:20%" | <span id="info">[http://itp.tugraz.at/matlab/techdoc/ref/info.html info]</span><br />
| style="width:20%" | <span id="inline">[http://itp.tugraz.at/matlab/techdoc/ref/inline.html inline]</span><br />
| style="width:20%" | <span id="inmem">[http://itp.tugraz.at/matlab/techdoc/ref/inmem.html inmem]</span><br />
| style="width:20%" | <span id="inpolygon">[http://itp.tugraz.at/matlab/techdoc/ref/inpolygon.html inpolygon]</span><br />
|-<br />
| style="width:20%" | <span id="input">[http://itp.tugraz.at/matlab/techdoc/ref/input.html input]</span><br />
| style="width:20%" | <span id="inputdlg">[http://itp.tugraz.at/matlab/techdoc/ref/inputdlg.html inputdlg]</span><br />
| style="width:20%" | <span id="inputname">[http://itp.tugraz.at/matlab/techdoc/ref/inputname.html inputname]</span><br />
| style="width:20%" | <span id="inputparser">[http://itp.tugraz.at/matlab/techdoc/ref/inputparser.html inputparser]</span><br />
| style="width:20%" | <span id="inspect">[http://itp.tugraz.at/matlab/techdoc/ref/inspect.html inspect]</span><br />
|-<br />
| style="width:20%" | <span id="instrcallback">[http://itp.tugraz.at/matlab/techdoc/ref/instrcallback.html instrcallback]</span><br />
| style="width:20%" | <span id="instrfind">[http://itp.tugraz.at/matlab/techdoc/ref/instrfind.html instrfind]</span><br />
| style="width:20%" | <span id="instrfindall">[http://itp.tugraz.at/matlab/techdoc/ref/instrfindall.html instrfindall]</span><br />
| style="width:20%" | <span id="int2str">[http://itp.tugraz.at/matlab/techdoc/ref/int2str.html int2str]</span><br />
| style="width:20%" | <span id="int8">[http://itp.tugraz.at/matlab/techdoc/ref/int8.html int8]</span><br />
|-<br />
| style="width:20%" | <span id="int16">[http://itp.tugraz.at/matlab/techdoc/ref/int16.html int16]</span><br />
| style="width:20%" | <span id="int32">[http://itp.tugraz.at/matlab/techdoc/ref/int32.html int32]</span><br />
| style="width:20%" | <span id="int64">[http://itp.tugraz.at/matlab/techdoc/ref/int64.html int64]</span><br />
| style="width:20%" | <span id="interfaces">[http://itp.tugraz.at/matlab/techdoc/ref/interfaces.html interfaces]</span><br />
| style="width:20%" | <span id="interp1">[http://itp.tugraz.at/matlab/techdoc/ref/interp1.html interp1]</span><br />
|-<br />
| style="width:20%" | <span id="interp1q">[http://itp.tugraz.at/matlab/techdoc/ref/interp1q.html interp1q]</span><br />
| style="width:20%" | <span id="interp2">[http://itp.tugraz.at/matlab/techdoc/ref/interp2.html interp2]</span><br />
| style="width:20%" | <span id="interp3">[http://itp.tugraz.at/matlab/techdoc/ref/interp3.html interp3]</span><br />
| style="width:20%" | <span id="interpft">[http://itp.tugraz.at/matlab/techdoc/ref/interpft.html interpft]</span><br />
| style="width:20%" | <span id="interpn">[http://itp.tugraz.at/matlab/techdoc/ref/interpn.html interpn]</span><br />
|-<br />
| style="width:20%" | <span id="interpstreamspeed">[http://itp.tugraz.at/matlab/techdoc/ref/interpstreamspeed.html interpstreamspeed]</span><br />
| style="width:20%" | <span id="intersect">[http://itp.tugraz.at/matlab/techdoc/ref/intersect.html intersect]</span><br />
| style="width:20%" | <span id="intmax">[http://itp.tugraz.at/matlab/techdoc/ref/intmax.html intmax]</span><br />
| style="width:20%" | <span id="intmin">[http://itp.tugraz.at/matlab/techdoc/ref/intmin.html intmin]</span><br />
| style="width:20%" | <span id="intwarning">[http://itp.tugraz.at/matlab/techdoc/ref/intwarning.html intwarning]</span><br />
|-<br />
| style="width:20%" | <span id="inv">[http://itp.tugraz.at/matlab/techdoc/ref/inv.html inv]</span><br />
| style="width:20%" | <span id="invhilb">[http://itp.tugraz.at/matlab/techdoc/ref/invhilb.html invhilb]</span><br />
| style="width:20%" | <span id="invoke">[http://itp.tugraz.at/matlab/techdoc/ref/invoke.html invoke]</span><br />
| style="width:20%" | <span id="ipermute">[http://itp.tugraz.at/matlab/techdoc/ref/ipermute.html ipermute]</span><br />
| style="width:20%" | <span id="iqrtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/iqrtimeseries.html iqrtimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="is">[http://itp.tugraz.at/matlab/techdoc/ref/is.html is]</span><br />
| style="width:20%" | <span id="isa">[http://itp.tugraz.at/matlab/techdoc/ref/isa.html isa]</span><br />
| style="width:20%" | <span id="isappdata">[http://itp.tugraz.at/matlab/techdoc/ref/isappdata.html isappdata]</span><br />
| style="width:20%" | <span id="iscell">[http://itp.tugraz.at/matlab/techdoc/ref/iscell.html iscell]</span><br />
| style="width:20%" | <span id="iscellstr">[http://itp.tugraz.at/matlab/techdoc/ref/iscellstr.html iscellstr]</span><br />
|-<br />
| style="width:20%" | <span id="ischar">[http://itp.tugraz.at/matlab/techdoc/ref/ischar.html ischar]</span><br />
| style="width:20%" | <span id="iscom">[http://itp.tugraz.at/matlab/techdoc/ref/iscom.html iscom]</span><br />
| style="width:20%" | <span id="isdir">[http://itp.tugraz.at/matlab/techdoc/ref/isdir.html isdir]</span><br />
| style="width:20%" | <span id="isempty">[http://itp.tugraz.at/matlab/techdoc/ref/isempty.html isempty]</span><br />
| style="width:20%" | <span id="isemptytimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/isemptytimeseries.html isemptytimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="isemptytscollection">[http://itp.tugraz.at/matlab/techdoc/ref/isemptytscollection.html isemptytscollection]</span><br />
| style="width:20%" | <span id="isequal">[http://itp.tugraz.at/matlab/techdoc/ref/isequal.html isequal]</span><br />
| style="width:20%" | <span id="isequalmexception">[http://itp.tugraz.at/matlab/techdoc/ref/isequalmexception.html isequalmexception]</span><br />
| style="width:20%" | <span id="isequalwithequalnans">[http://itp.tugraz.at/matlab/techdoc/ref/isequalwithequalnans.html isequalwithequalnans]</span><br />
| style="width:20%" | <span id="isevent">[http://itp.tugraz.at/matlab/techdoc/ref/isevent.html isevent]</span><br />
|-<br />
| style="width:20%" | <span id="isfield">[http://itp.tugraz.at/matlab/techdoc/ref/isfield.html isfield]</span><br />
| style="width:20%" | <span id="isfinite">[http://itp.tugraz.at/matlab/techdoc/ref/isfinite.html isfinite]</span><br />
| style="width:20%" | <span id="isfloat">[http://itp.tugraz.at/matlab/techdoc/ref/isfloat.html isfloat]</span><br />
| style="width:20%" | <span id="isglobal">[http://itp.tugraz.at/matlab/techdoc/ref/isglobal.html isglobal]</span><br />
| style="width:20%" | <span id="ishandle">[http://itp.tugraz.at/matlab/techdoc/ref/ishandle.html ishandle]</span><br />
|-<br />
| style="width:20%" | <span id="ishold">[http://itp.tugraz.at/matlab/techdoc/ref/ishold.html ishold]</span><br />
| style="width:20%" | <span id="isinf">[http://itp.tugraz.at/matlab/techdoc/ref/isinf.html isinf]</span><br />
| style="width:20%" | <span id="isinteger">[http://itp.tugraz.at/matlab/techdoc/ref/isinteger.html isinteger]</span><br />
| style="width:20%" | <span id="isinterface">[http://itp.tugraz.at/matlab/techdoc/ref/isinterface.html isinterface]</span><br />
| style="width:20%" | <span id="isjava">[http://itp.tugraz.at/matlab/techdoc/ref/isjava.html isjava]</span><br />
|-<br />
| style="width:20%" | <span id="iskeyword">[http://itp.tugraz.at/matlab/techdoc/ref/iskeyword.html iskeyword]</span><br />
| style="width:20%" | <span id="isletter">[http://itp.tugraz.at/matlab/techdoc/ref/isletter.html isletter]</span><br />
| style="width:20%" | <span id="islogical">[http://itp.tugraz.at/matlab/techdoc/ref/islogical.html islogical]</span><br />
| style="width:20%" | <span id="ismac">[http://itp.tugraz.at/matlab/techdoc/ref/ismac.html ismac]</span><br />
| style="width:20%" | <span id="ismember">[http://itp.tugraz.at/matlab/techdoc/ref/ismember.html ismember]</span><br />
|-<br />
| style="width:20%" | <span id="ismethod">[http://itp.tugraz.at/matlab/techdoc/ref/ismethod.html ismethod]</span><br />
| style="width:20%" | <span id="isnan">[http://itp.tugraz.at/matlab/techdoc/ref/isnan.html isnan]</span><br />
| style="width:20%" | <span id="isnumeric">[http://itp.tugraz.at/matlab/techdoc/ref/isnumeric.html isnumeric]</span><br />
| style="width:20%" | <span id="isobject">[http://itp.tugraz.at/matlab/techdoc/ref/isobject.html isobject]</span><br />
| style="width:20%" | <span id="isocaps">[http://itp.tugraz.at/matlab/techdoc/ref/isocaps.html isocaps]</span><br />
|-<br />
| style="width:20%" | <span id="isocolors">[http://itp.tugraz.at/matlab/techdoc/ref/isocolors.html isocolors]</span><br />
| style="width:20%" | <span id="isonormals">[http://itp.tugraz.at/matlab/techdoc/ref/isonormals.html isonormals]</span><br />
| style="width:20%" | <span id="isosurface">[http://itp.tugraz.at/matlab/techdoc/ref/isosurface.html isosurface]</span><br />
| style="width:20%" | <span id="ispc">[http://itp.tugraz.at/matlab/techdoc/ref/ispc.html ispc]</span><br />
| style="width:20%" | <span id="ispref">[http://itp.tugraz.at/matlab/techdoc/ref/ispref.html ispref]</span><br />
|-<br />
| style="width:20%" | <span id="isprime">[http://itp.tugraz.at/matlab/techdoc/ref/isprime.html isprime]</span><br />
| style="width:20%" | <span id="isprop">[http://itp.tugraz.at/matlab/techdoc/ref/isprop.html isprop]</span><br />
| style="width:20%" | <span id="isreal">[http://itp.tugraz.at/matlab/techdoc/ref/isreal.html isreal]</span><br />
| style="width:20%" | <span id="isscalar">[http://itp.tugraz.at/matlab/techdoc/ref/isscalar.html isscalar]</span><br />
| style="width:20%" | <span id="issorted">[http://itp.tugraz.at/matlab/techdoc/ref/issorted.html issorted]</span><br />
|-<br />
| style="width:20%" | <span id="isspace">[http://itp.tugraz.at/matlab/techdoc/ref/isspace.html isspace]</span><br />
| style="width:20%" | <span id="issparse">[http://itp.tugraz.at/matlab/techdoc/ref/issparse.html issparse]</span><br />
| style="width:20%" | <span id="isstr">[http://itp.tugraz.at/matlab/techdoc/ref/isstr.html isstr]</span><br />
| style="width:20%" | <span id="isstrprop">[http://itp.tugraz.at/matlab/techdoc/ref/isstrprop.html isstrprop]</span><br />
| style="width:20%" | <span id="isstruct">[http://itp.tugraz.at/matlab/techdoc/ref/isstruct.html isstruct]</span><br />
|-<br />
| style="width:20%" | <span id="isstudent">[http://itp.tugraz.at/matlab/techdoc/ref/isstudent.html isstudent]</span><br />
| style="width:20%" | <span id="isunix">[http://itp.tugraz.at/matlab/techdoc/ref/isunix.html isunix]</span><br />
| style="width:20%" | <span id="isvalidtimer">[http://itp.tugraz.at/matlab/techdoc/ref/isvalidtimer.html isvalidtimer]</span><br />
| style="width:20%" | <span id="isvarname">[http://itp.tugraz.at/matlab/techdoc/ref/isvarname.html isvarname]</span><br />
| style="width:20%" | <span id="isvector">[http://itp.tugraz.at/matlab/techdoc/ref/isvector.html isvector]</span><br />
|-<br />
|}<br />
<br />
= j =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="j">[http://itp.tugraz.at/matlab/techdoc/ref/j.html j]</span><br />
| style="width:20%" | <span id="javaaddpath">[http://itp.tugraz.at/matlab/techdoc/ref/javaaddpath.html javaaddpath]</span><br />
| style="width:20%" | <span id="javaarray">[http://itp.tugraz.at/matlab/techdoc/ref/javaarray.html javaarray]</span><br />
| style="width:20%" | <span id="javachk">[http://itp.tugraz.at/matlab/techdoc/ref/javachk.html javachk]</span><br />
| style="width:20%" | <span id="javaclasspath">[http://itp.tugraz.at/matlab/techdoc/ref/javaclasspath.html javaclasspath]</span><br />
|-<br />
| style="width:20%" | <span id="javamethod">[http://itp.tugraz.at/matlab/techdoc/ref/javamethod.html javamethod]</span><br />
| style="width:20%" | <span id="javaobject">[http://itp.tugraz.at/matlab/techdoc/ref/javaobject.html javaobject]</span><br />
| style="width:20%" | <span id="javarmpath">[http://itp.tugraz.at/matlab/techdoc/ref/javarmpath.html javarmpath]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= k =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="keyboard">[http://itp.tugraz.at/matlab/techdoc/ref/keyboard.html keyboard]</span><br />
| style="width:20%" | <span id="kron">[http://itp.tugraz.at/matlab/techdoc/ref/kron.html kron]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= l =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="logicaloperatorselementwise">[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorselementwise.html logicaloperatorselementwise]</span><br />
| style="width:20%" | <span id="logicaloperatorsshortcircuit">[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorsshortcircuit.html logicaloperatorsshortcircuit]</span><br />
| style="width:20%" | <span id="lastmexception">[http://itp.tugraz.at/matlab/techdoc/ref/lastmexception.html lastmexception]</span><br />
| style="width:20%" | <span id="lasterr">[http://itp.tugraz.at/matlab/techdoc/ref/lasterr.html lasterr]</span><br />
| style="width:20%" | <span id="lasterror">[http://itp.tugraz.at/matlab/techdoc/ref/lasterror.html lasterror]</span><br />
|-<br />
| style="width:20%" | <span id="lastwarn">[http://itp.tugraz.at/matlab/techdoc/ref/lastwarn.html lastwarn]</span><br />
| style="width:20%" | <span id="lcm">[http://itp.tugraz.at/matlab/techdoc/ref/lcm.html lcm]</span><br />
| style="width:20%" | <span id="ldl">[http://itp.tugraz.at/matlab/techdoc/ref/ldl.html ldl]</span><br />
| style="width:20%" | <span id="ldivide">[http://itp.tugraz.at/matlab/techdoc/ref/ldivide.html ldivide]</span><br />
| style="width:20%" | <span id="le">[http://itp.tugraz.at/matlab/techdoc/ref/le.html le]</span><br />
|-<br />
| style="width:20%" | <span id="legend">[http://itp.tugraz.at/matlab/techdoc/ref/legend.html legend]</span><br />
| style="width:20%" | <span id="legendre">[http://itp.tugraz.at/matlab/techdoc/ref/legendre.html legendre]</span><br />
| style="width:20%" | <span id="length">[http://itp.tugraz.at/matlab/techdoc/ref/length.html length]</span><br />
| style="width:20%" | <span id="lengthtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/lengthtimeseries.html lengthtimeseries]</span><br />
| style="width:20%" | <span id="lengthtscollection">[http://itp.tugraz.at/matlab/techdoc/ref/lengthtscollection.html lengthtscollection]</span><br />
|-<br />
| style="width:20%" | <span id="libfunctions">[http://itp.tugraz.at/matlab/techdoc/ref/libfunctions.html libfunctions]</span><br />
| style="width:20%" | <span id="libfunctionsview">[http://itp.tugraz.at/matlab/techdoc/ref/libfunctionsview.html libfunctionsview]</span><br />
| style="width:20%" | <span id="libisloaded">[http://itp.tugraz.at/matlab/techdoc/ref/libisloaded.html libisloaded]</span><br />
| style="width:20%" | <span id="libpointer">[http://itp.tugraz.at/matlab/techdoc/ref/libpointer.html libpointer]</span><br />
| style="width:20%" | <span id="libstruct">[http://itp.tugraz.at/matlab/techdoc/ref/libstruct.html libstruct]</span><br />
|-<br />
| style="width:20%" | <span id="license">[http://itp.tugraz.at/matlab/techdoc/ref/license.html license]</span><br />
| style="width:20%" | <span id="light">[http://itp.tugraz.at/matlab/techdoc/ref/light.html light]</span><br />
| style="width:20%" | <span id="light_props">[http://itp.tugraz.at/matlab/techdoc/ref/light_props.html light_props]</span><br />
| style="width:20%" | <span id="lightangle">[http://itp.tugraz.at/matlab/techdoc/ref/lightangle.html lightangle]</span><br />
| style="width:20%" | <span id="lighting">[http://itp.tugraz.at/matlab/techdoc/ref/lighting.html lighting]</span><br />
|-<br />
| style="width:20%" | <span id="lin2mu">[http://itp.tugraz.at/matlab/techdoc/ref/lin2mu.html lin2mu]</span><br />
| style="width:20%" | <span id="line">[http://itp.tugraz.at/matlab/techdoc/ref/line.html line]</span><br />
| style="width:20%" | <span id="line_props">[http://itp.tugraz.at/matlab/techdoc/ref/line_props.html line_props]</span><br />
| style="width:20%" | <span id="lineseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/lineseriesproperties.html lineseriesproperties]</span><br />
| style="width:20%" | <span id="linespec">[http://itp.tugraz.at/matlab/techdoc/ref/linespec.html linespec]</span><br />
|-<br />
| style="width:20%" | <span id="linkaxes">[http://itp.tugraz.at/matlab/techdoc/ref/linkaxes.html linkaxes]</span><br />
| style="width:20%" | <span id="linkprop">[http://itp.tugraz.at/matlab/techdoc/ref/linkprop.html linkprop]</span><br />
| style="width:20%" | <span id="linsolve">[http://itp.tugraz.at/matlab/techdoc/ref/linsolve.html linsolve]</span><br />
| style="width:20%" | <span id="linspace">[http://itp.tugraz.at/matlab/techdoc/ref/linspace.html linspace]</span><br />
| style="width:20%" | <span id="listdlg">[http://itp.tugraz.at/matlab/techdoc/ref/listdlg.html listdlg]</span><br />
|-<br />
| style="width:20%" | <span id="listfonts">[http://itp.tugraz.at/matlab/techdoc/ref/listfonts.html listfonts]</span><br />
| style="width:20%" | <span id="load">[http://itp.tugraz.at/matlab/techdoc/ref/load.html load]</span><br />
| style="width:20%" | <span id="loadlibrary">[http://itp.tugraz.at/matlab/techdoc/ref/loadlibrary.html loadlibrary]</span><br />
| style="width:20%" | <span id="loadobj">[http://itp.tugraz.at/matlab/techdoc/ref/loadobj.html loadobj]</span><br />
| style="width:20%" | <span id="log">[http://itp.tugraz.at/matlab/techdoc/ref/log.html log]</span><br />
|-<br />
| style="width:20%" | <span id="log10">[http://itp.tugraz.at/matlab/techdoc/ref/log10.html log10]</span><br />
| style="width:20%" | <span id="log1p">[http://itp.tugraz.at/matlab/techdoc/ref/log1p.html log1p]</span><br />
| style="width:20%" | <span id="log2">[http://itp.tugraz.at/matlab/techdoc/ref/log2.html log2]</span><br />
| style="width:20%" | <span id="logical">[http://itp.tugraz.at/matlab/techdoc/ref/logical.html logical]</span><br />
| style="width:20%" | <span id="loglog">[http://itp.tugraz.at/matlab/techdoc/ref/loglog.html loglog]</span><br />
|-<br />
| style="width:20%" | <span id="logm">[http://itp.tugraz.at/matlab/techdoc/ref/logm.html logm]</span><br />
| style="width:20%" | <span id="logspace">[http://itp.tugraz.at/matlab/techdoc/ref/logspace.html logspace]</span><br />
| style="width:20%" | <span id="lookfor">[http://itp.tugraz.at/matlab/techdoc/ref/lookfor.html lookfor]</span><br />
| style="width:20%" | <span id="lower">[http://itp.tugraz.at/matlab/techdoc/ref/lower.html lower]</span><br />
| style="width:20%" | <span id="ls">[http://itp.tugraz.at/matlab/techdoc/ref/ls.html ls]</span><br />
|-<br />
| style="width:20%" | <span id="lscov">[http://itp.tugraz.at/matlab/techdoc/ref/lscov.html lscov]</span><br />
| style="width:20%" | <span id="lsqnonneg">[http://itp.tugraz.at/matlab/techdoc/ref/lsqnonneg.html lsqnonneg]</span><br />
| style="width:20%" | <span id="lsqr">[http://itp.tugraz.at/matlab/techdoc/ref/lsqr.html lsqr]</span><br />
| style="width:20%" | <span id="lt">[http://itp.tugraz.at/matlab/techdoc/ref/lt.html lt]</span><br />
| style="width:20%" | <span id="lu">[http://itp.tugraz.at/matlab/techdoc/ref/lu.html lu]</span><br />
|-<br />
| style="width:20%" | <span id="luinc">[http://itp.tugraz.at/matlab/techdoc/ref/luinc.html luinc]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= m =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="magic">[http://itp.tugraz.at/matlab/techdoc/ref/magic.html magic]</span><br />
| style="width:20%" | <span id="makehgtform">[http://itp.tugraz.at/matlab/techdoc/ref/makehgtform.html makehgtform]</span><br />
| style="width:20%" | <span id="mat2cell">[http://itp.tugraz.at/matlab/techdoc/ref/mat2cell.html mat2cell]</span><br />
| style="width:20%" | <span id="mat2str">[http://itp.tugraz.at/matlab/techdoc/ref/mat2str.html mat2str]</span><br />
| style="width:20%" | <span id="material">[http://itp.tugraz.at/matlab/techdoc/ref/material.html material]</span><br />
|-<br />
| style="width:20%" | <span id="matlabcolon">[http://itp.tugraz.at/matlab/techdoc/ref/matlabcolon.html matlabcolon]</span><br />
| style="width:20%" | <span id="matlabrc">[http://itp.tugraz.at/matlab/techdoc/ref/matlabrc.html matlabrc]</span><br />
| style="width:20%" | <span id="matlabroot">[http://itp.tugraz.at/matlab/techdoc/ref/matlabroot.html matlabroot]</span><br />
| style="width:20%" | <span id="matlabunix">[http://itp.tugraz.at/matlab/techdoc/ref/matlabunix.html matlabunix]</span><br />
| style="width:20%" | <span id="matlabwindows">[http://itp.tugraz.at/matlab/techdoc/ref/matlabwindows.html matlabwindows]</span><br />
|-<br />
| style="width:20%" | <span id="max">[http://itp.tugraz.at/matlab/techdoc/ref/max.html max]</span><br />
| style="width:20%" | <span id="maxtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/maxtimeseries.html maxtimeseries]</span><br />
| style="width:20%" | <span id="maximizecommandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/maximizecommandwindow.html maximizecommandwindow]</span><br />
| style="width:20%" | <span id="maxnumcompthreads">[http://itp.tugraz.at/matlab/techdoc/ref/maxnumcompthreads.html maxnumcompthreads]</span><br />
| style="width:20%" | <span id="mean">[http://itp.tugraz.at/matlab/techdoc/ref/mean.html mean]</span><br />
|-<br />
| style="width:20%" | <span id="meantimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/meantimeseries.html meantimeseries]</span><br />
| style="width:20%" | <span id="median">[http://itp.tugraz.at/matlab/techdoc/ref/median.html median]</span><br />
| style="width:20%" | <span id="mediantimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/mediantimeseries.html mediantimeseries]</span><br />
| style="width:20%" | <span id="memmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/memmapfile.html memmapfile]</span><br />
| style="width:20%" | <span id="memory">[http://itp.tugraz.at/matlab/techdoc/ref/memory.html memory]</span><br />
|-<br />
| style="width:20%" | <span id="mexception">[http://itp.tugraz.at/matlab/techdoc/ref/mexception.html mexception]</span><br />
| style="width:20%" | <span id="menu">[http://itp.tugraz.at/matlab/techdoc/ref/menu.html menu]</span><br />
| style="width:20%" | <span id="mesh">[http://itp.tugraz.at/matlab/techdoc/ref/mesh.html mesh]</span><br />
| style="width:20%" | <span id="meshc">[http://itp.tugraz.at/matlab/techdoc/ref/meshc.html meshc]</span><br />
| style="width:20%" | <span id="meshz">[http://itp.tugraz.at/matlab/techdoc/ref/meshz.html meshz]</span><br />
|-<br />
| style="width:20%" | <span id="meshgrid">[http://itp.tugraz.at/matlab/techdoc/ref/meshgrid.html meshgrid]</span><br />
| style="width:20%" | <span id="methods">[http://itp.tugraz.at/matlab/techdoc/ref/methods.html methods]</span><br />
| style="width:20%" | <span id="methodsview">[http://itp.tugraz.at/matlab/techdoc/ref/methodsview.html methodsview]</span><br />
| style="width:20%" | <span id="mex">[http://itp.tugraz.at/matlab/techdoc/ref/mex.html mex]</span><br />
| style="width:20%" | <span id="mexext">[http://itp.tugraz.at/matlab/techdoc/ref/mexext.html mexext]</span><br />
|-<br />
| style="width:20%" | <span id="mfilename">[http://itp.tugraz.at/matlab/techdoc/ref/mfilename.html mfilename]</span><br />
| style="width:20%" | <span id="mget">[http://itp.tugraz.at/matlab/techdoc/ref/mget.html mget]</span><br />
| style="width:20%" | <span id="min">[http://itp.tugraz.at/matlab/techdoc/ref/min.html min]</span><br />
| style="width:20%" | <span id="mintimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/mintimeseries.html mintimeseries]</span><br />
| style="width:20%" | <span id="minimizecommandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/minimizecommandwindow.html minimizecommandwindow]</span><br />
|-<br />
| style="width:20%" | <span id="minres">[http://itp.tugraz.at/matlab/techdoc/ref/minres.html minres]</span><br />
| style="width:20%" | <span id="mislocked">[http://itp.tugraz.at/matlab/techdoc/ref/mislocked.html mislocked]</span><br />
| style="width:20%" | <span id="mkdir">[http://itp.tugraz.at/matlab/techdoc/ref/mkdir.html mkdir]</span><br />
| style="width:20%" | <span id="mkpp">[http://itp.tugraz.at/matlab/techdoc/ref/mkpp.html mkpp]</span><br />
| style="width:20%" | <span id="mldivide">[http://itp.tugraz.at/matlab/techdoc/ref/mldivide.html mldivide]</span><br />
|-<br />
| style="width:20%" | <span id="mrdivide">[http://itp.tugraz.at/matlab/techdoc/ref/mrdivide.html mrdivide]</span><br />
| style="width:20%" | <span id="mlint">[http://itp.tugraz.at/matlab/techdoc/ref/mlint.html mlint]</span><br />
| style="width:20%" | <span id="mlintrpt">[http://itp.tugraz.at/matlab/techdoc/ref/mlintrpt.html mlintrpt]</span><br />
| style="width:20%" | <span id="mlock">[http://itp.tugraz.at/matlab/techdoc/ref/mlock.html mlock]</span><br />
| style="width:20%" | <span id="mmfileinfo">[http://itp.tugraz.at/matlab/techdoc/ref/mmfileinfo.html mmfileinfo]</span><br />
|-<br />
| style="width:20%" | <span id="mmreader">[http://itp.tugraz.at/matlab/techdoc/ref/mmreader.html mmreader]</span><br />
| style="width:20%" | <span id="mod">[http://itp.tugraz.at/matlab/techdoc/ref/mod.html mod]</span><br />
| style="width:20%" | <span id="mode">[http://itp.tugraz.at/matlab/techdoc/ref/mode.html mode]</span><br />
| style="width:20%" | <span id="more">[http://itp.tugraz.at/matlab/techdoc/ref/more.html more]</span><br />
| style="width:20%" | <span id="move">[http://itp.tugraz.at/matlab/techdoc/ref/move.html move]</span><br />
|-<br />
| style="width:20%" | <span id="movefile">[http://itp.tugraz.at/matlab/techdoc/ref/movefile.html movefile]</span><br />
| style="width:20%" | <span id="movegui">[http://itp.tugraz.at/matlab/techdoc/ref/movegui.html movegui]</span><br />
| style="width:20%" | <span id="movie">[http://itp.tugraz.at/matlab/techdoc/ref/movie.html movie]</span><br />
| style="width:20%" | <span id="movie2avi">[http://itp.tugraz.at/matlab/techdoc/ref/movie2avi.html movie2avi]</span><br />
| style="width:20%" | <span id="mput">[http://itp.tugraz.at/matlab/techdoc/ref/mput.html mput]</span><br />
|-<br />
| style="width:20%" | <span id="msgbox">[http://itp.tugraz.at/matlab/techdoc/ref/msgbox.html msgbox]</span><br />
| style="width:20%" | <span id="mtimes">[http://itp.tugraz.at/matlab/techdoc/ref/mtimes.html mtimes]</span><br />
| style="width:20%" | <span id="mu2lin">[http://itp.tugraz.at/matlab/techdoc/ref/mu2lin.html mu2lin]</span><br />
| style="width:20%" | <span id="multibandread">[http://itp.tugraz.at/matlab/techdoc/ref/multibandread.html multibandread]</span><br />
| style="width:20%" | <span id="multibandwrite">[http://itp.tugraz.at/matlab/techdoc/ref/multibandwrite.html multibandwrite]</span><br />
|-<br />
| style="width:20%" | <span id="munlock">[http://itp.tugraz.at/matlab/techdoc/ref/munlock.html munlock]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= n =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="namelengthmax">[http://itp.tugraz.at/matlab/techdoc/ref/namelengthmax.html namelengthmax]</span><br />
| style="width:20%" | <span id="nan">[http://itp.tugraz.at/matlab/techdoc/ref/nan.html nan]</span><br />
| style="width:20%" | <span id="nargchk">[http://itp.tugraz.at/matlab/techdoc/ref/nargchk.html nargchk]</span><br />
| style="width:20%" | <span id="nargin">[http://itp.tugraz.at/matlab/techdoc/ref/nargin.html nargin]</span><br />
| style="width:20%" | <span id="nargout">[http://itp.tugraz.at/matlab/techdoc/ref/nargout.html nargout]</span><br />
|-<br />
| style="width:20%" | <span id="nargoutchk">[http://itp.tugraz.at/matlab/techdoc/ref/nargoutchk.html nargoutchk]</span><br />
| style="width:20%" | <span id="native2unicode">[http://itp.tugraz.at/matlab/techdoc/ref/native2unicode.html native2unicode]</span><br />
| style="width:20%" | <span id="nchoosek">[http://itp.tugraz.at/matlab/techdoc/ref/nchoosek.html nchoosek]</span><br />
| style="width:20%" | <span id="ndgrid">[http://itp.tugraz.at/matlab/techdoc/ref/ndgrid.html ndgrid]</span><br />
| style="width:20%" | <span id="ndims">[http://itp.tugraz.at/matlab/techdoc/ref/ndims.html ndims]</span><br />
|-<br />
| style="width:20%" | <span id="ne">[http://itp.tugraz.at/matlab/techdoc/ref/ne.html ne]</span><br />
| style="width:20%" | <span id="nemexception">[http://itp.tugraz.at/matlab/techdoc/ref/nemexception.html nemexception]</span><br />
| style="width:20%" | <span id="newplot">[http://itp.tugraz.at/matlab/techdoc/ref/newplot.html newplot]</span><br />
| style="width:20%" | <span id="nextpow2">[http://itp.tugraz.at/matlab/techdoc/ref/nextpow2.html nextpow2]</span><br />
| style="width:20%" | <span id="nnz">[http://itp.tugraz.at/matlab/techdoc/ref/nnz.html nnz]</span><br />
|-<br />
| style="width:20%" | <span id="noanimate">[http://itp.tugraz.at/matlab/techdoc/ref/noanimate.html noanimate]</span><br />
| style="width:20%" | <span id="nonzeros">[http://itp.tugraz.at/matlab/techdoc/ref/nonzeros.html nonzeros]</span><br />
| style="width:20%" | <span id="norm">[http://itp.tugraz.at/matlab/techdoc/ref/norm.html norm]</span><br />
| style="width:20%" | <span id="normest">[http://itp.tugraz.at/matlab/techdoc/ref/normest.html normest]</span><br />
| style="width:20%" | <span id="not">[http://itp.tugraz.at/matlab/techdoc/ref/not.html not]</span><br />
|-<br />
| style="width:20%" | <span id="notebook">[http://itp.tugraz.at/matlab/techdoc/ref/notebook.html notebook]</span><br />
| style="width:20%" | <span id="now">[http://itp.tugraz.at/matlab/techdoc/ref/now.html now]</span><br />
| style="width:20%" | <span id="nthroot">[http://itp.tugraz.at/matlab/techdoc/ref/nthroot.html nthroot]</span><br />
| style="width:20%" | <span id="null">[http://itp.tugraz.at/matlab/techdoc/ref/null.html null]</span><br />
| style="width:20%" | <span id="num2cell">[http://itp.tugraz.at/matlab/techdoc/ref/num2cell.html num2cell]</span><br />
|-<br />
| style="width:20%" | <span id="num2hex">[http://itp.tugraz.at/matlab/techdoc/ref/num2hex.html num2hex]</span><br />
| style="width:20%" | <span id="num2str">[http://itp.tugraz.at/matlab/techdoc/ref/num2str.html num2str]</span><br />
| style="width:20%" | <span id="numel">[http://itp.tugraz.at/matlab/techdoc/ref/numel.html numel]</span><br />
| style="width:20%" | <span id="nzmax">[http://itp.tugraz.at/matlab/techdoc/ref/nzmax.html nzmax]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= o =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="ode15i">[http://itp.tugraz.at/matlab/techdoc/ref/ode15i.html ode15i]</span><br />
| style="width:20%" | <span id="ode23">[http://itp.tugraz.at/matlab/techdoc/ref/ode23.html ode23]</span><br />
| style="width:20%" | <span id="ode45">[http://itp.tugraz.at/matlab/techdoc/ref/ode45.html ode45]</span><br />
| style="width:20%" | <span id="ode113">[http://itp.tugraz.at/matlab/techdoc/ref/ode113.html ode113]</span><br />
| style="width:20%" | <span id="ode15s">[http://itp.tugraz.at/matlab/techdoc/ref/ode15s.html ode15s]</span><br />
|-<br />
| style="width:20%" | <span id="ode23s">[http://itp.tugraz.at/matlab/techdoc/ref/ode23s.html ode23s]</span><br />
| style="width:20%" | <span id="ode23t">[http://itp.tugraz.at/matlab/techdoc/ref/ode23t.html ode23t]</span><br />
| style="width:20%" | <span id="ode23tb">[http://itp.tugraz.at/matlab/techdoc/ref/ode23tb.html ode23tb]</span><br />
| style="width:20%" | <span id="odefile">[http://itp.tugraz.at/matlab/techdoc/ref/odefile.html odefile]</span><br />
| style="width:20%" | <span id="odeget">[http://itp.tugraz.at/matlab/techdoc/ref/odeget.html odeget]</span><br />
|-<br />
| style="width:20%" | <span id="odeset">[http://itp.tugraz.at/matlab/techdoc/ref/odeset.html odeset]</span><br />
| style="width:20%" | <span id="odextend">[http://itp.tugraz.at/matlab/techdoc/ref/odextend.html odextend]</span><br />
| style="width:20%" | <span id="ones">[http://itp.tugraz.at/matlab/techdoc/ref/ones.html ones]</span><br />
| style="width:20%" | <span id="open">[http://itp.tugraz.at/matlab/techdoc/ref/open.html open]</span><br />
| style="width:20%" | <span id="openfig">[http://itp.tugraz.at/matlab/techdoc/ref/openfig.html openfig]</span><br />
|-<br />
| style="width:20%" | <span id="opengl">[http://itp.tugraz.at/matlab/techdoc/ref/opengl.html opengl]</span><br />
| style="width:20%" | <span id="openvar">[http://itp.tugraz.at/matlab/techdoc/ref/openvar.html openvar]</span><br />
| style="width:20%" | <span id="optimget">[http://itp.tugraz.at/matlab/techdoc/ref/optimget.html optimget]</span><br />
| style="width:20%" | <span id="optimset">[http://itp.tugraz.at/matlab/techdoc/ref/optimset.html optimset]</span><br />
| style="width:20%" | <span id="or">[http://itp.tugraz.at/matlab/techdoc/ref/or.html or]</span><br />
|-<br />
| style="width:20%" | <span id="ordeig">[http://itp.tugraz.at/matlab/techdoc/ref/ordeig.html ordeig]</span><br />
| style="width:20%" | <span id="orderfields">[http://itp.tugraz.at/matlab/techdoc/ref/orderfields.html orderfields]</span><br />
| style="width:20%" | <span id="ordqz">[http://itp.tugraz.at/matlab/techdoc/ref/ordqz.html ordqz]</span><br />
| style="width:20%" | <span id="ordschur">[http://itp.tugraz.at/matlab/techdoc/ref/ordschur.html ordschur]</span><br />
| style="width:20%" | <span id="orient">[http://itp.tugraz.at/matlab/techdoc/ref/orient.html orient]</span><br />
|-<br />
| style="width:20%" | <span id="orth">[http://itp.tugraz.at/matlab/techdoc/ref/orth.html orth]</span><br />
| style="width:20%" | <span id="otherwise">[http://itp.tugraz.at/matlab/techdoc/ref/otherwise.html otherwise]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= p =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="pack">[http://itp.tugraz.at/matlab/techdoc/ref/pack.html pack]</span><br />
| style="width:20%" | <span id="padecoef">[http://itp.tugraz.at/matlab/techdoc/ref/padecoef.html padecoef]</span><br />
| style="width:20%" | <span id="pagesetupdlg">[http://itp.tugraz.at/matlab/techdoc/ref/pagesetupdlg.html pagesetupdlg]</span><br />
| style="width:20%" | <span id="pan">[http://itp.tugraz.at/matlab/techdoc/ref/pan.html pan]</span><br />
| style="width:20%" | <span id="pareto">[http://itp.tugraz.at/matlab/techdoc/ref/pareto.html pareto]</span><br />
|-<br />
| style="width:20%" | <span id="parseinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/parseinputparser.html parseinputparser]</span><br />
| style="width:20%" | <span id="parsesoapresponse">[http://itp.tugraz.at/matlab/techdoc/ref/parsesoapresponse.html parsesoapresponse]</span><br />
| style="width:20%" | <span id="partialpath">[http://itp.tugraz.at/matlab/techdoc/ref/partialpath.html partialpath]</span><br />
| style="width:20%" | <span id="pascal">[http://itp.tugraz.at/matlab/techdoc/ref/pascal.html pascal]</span><br />
| style="width:20%" | <span id="patch">[http://itp.tugraz.at/matlab/techdoc/ref/patch.html patch]</span><br />
|-<br />
| style="width:20%" | <span id="patch_props">[http://itp.tugraz.at/matlab/techdoc/ref/patch_props.html patch_props]</span><br />
| style="width:20%" | <span id="path">[http://itp.tugraz.at/matlab/techdoc/ref/path.html path]</span><br />
| style="width:20%" | <span id="path2rc">[http://itp.tugraz.at/matlab/techdoc/ref/path2rc.html path2rc]</span><br />
| style="width:20%" | <span id="pathdef">[http://itp.tugraz.at/matlab/techdoc/ref/pathdef.html pathdef]</span><br />
| style="width:20%" | <span id="pathsep">[http://itp.tugraz.at/matlab/techdoc/ref/pathsep.html pathsep]</span><br />
|-<br />
| style="width:20%" | <span id="pathtool">[http://itp.tugraz.at/matlab/techdoc/ref/pathtool.html pathtool]</span><br />
| style="width:20%" | <span id="pause">[http://itp.tugraz.at/matlab/techdoc/ref/pause.html pause]</span><br />
| style="width:20%" | <span id="pbaspect">[http://itp.tugraz.at/matlab/techdoc/ref/pbaspect.html pbaspect]</span><br />
| style="width:20%" | <span id="pcg">[http://itp.tugraz.at/matlab/techdoc/ref/pcg.html pcg]</span><br />
| style="width:20%" | <span id="pchip">[http://itp.tugraz.at/matlab/techdoc/ref/pchip.html pchip]</span><br />
|-<br />
| style="width:20%" | <span id="pcode">[http://itp.tugraz.at/matlab/techdoc/ref/pcode.html pcode]</span><br />
| style="width:20%" | <span id="pcolor">[http://itp.tugraz.at/matlab/techdoc/ref/pcolor.html pcolor]</span><br />
| style="width:20%" | <span id="pdepe">[http://itp.tugraz.at/matlab/techdoc/ref/pdepe.html pdepe]</span><br />
| style="width:20%" | <span id="pdeval">[http://itp.tugraz.at/matlab/techdoc/ref/pdeval.html pdeval]</span><br />
| style="width:20%" | <span id="peaks">[http://itp.tugraz.at/matlab/techdoc/ref/peaks.html peaks]</span><br />
|-<br />
| style="width:20%" | <span id="perl">[http://itp.tugraz.at/matlab/techdoc/ref/perl.html perl]</span><br />
| style="width:20%" | <span id="perms">[http://itp.tugraz.at/matlab/techdoc/ref/perms.html perms]</span><br />
| style="width:20%" | <span id="permute">[http://itp.tugraz.at/matlab/techdoc/ref/permute.html permute]</span><br />
| style="width:20%" | <span id="persistent">[http://itp.tugraz.at/matlab/techdoc/ref/persistent.html persistent]</span><br />
| style="width:20%" | <span id="pi">[http://itp.tugraz.at/matlab/techdoc/ref/pi.html pi]</span><br />
|-<br />
| style="width:20%" | <span id="pie">[http://itp.tugraz.at/matlab/techdoc/ref/pie.html pie]</span><br />
| style="width:20%" | <span id="pie3">[http://itp.tugraz.at/matlab/techdoc/ref/pie3.html pie3]</span><br />
| style="width:20%" | <span id="pinv">[http://itp.tugraz.at/matlab/techdoc/ref/pinv.html pinv]</span><br />
| style="width:20%" | <span id="planerot">[http://itp.tugraz.at/matlab/techdoc/ref/planerot.html planerot]</span><br />
| style="width:20%" | <span id="playshow">[http://itp.tugraz.at/matlab/techdoc/ref/playshow.html playshow]</span><br />
|-<br />
| style="width:20%" | <span id="plot">[http://itp.tugraz.at/matlab/techdoc/ref/plot.html plot]</span><br />
| style="width:20%" | <span id="plottimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/plottimeseries.html plottimeseries]</span><br />
| style="width:20%" | <span id="plot3">[http://itp.tugraz.at/matlab/techdoc/ref/plot3.html plot3]</span><br />
| style="width:20%" | <span id="plotbrowser">[http://itp.tugraz.at/matlab/techdoc/ref/plotbrowser.html plotbrowser]</span><br />
| style="width:20%" | <span id="plotedit">[http://itp.tugraz.at/matlab/techdoc/ref/plotedit.html plotedit]</span><br />
|-<br />
| style="width:20%" | <span id="plotmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/plotmatrix.html plotmatrix]</span><br />
| style="width:20%" | <span id="plottools">[http://itp.tugraz.at/matlab/techdoc/ref/plottools.html plottools]</span><br />
| style="width:20%" | <span id="plotyy">[http://itp.tugraz.at/matlab/techdoc/ref/plotyy.html plotyy]</span><br />
| style="width:20%" | <span id="pol2cart">[http://itp.tugraz.at/matlab/techdoc/ref/pol2cart.html pol2cart]</span><br />
| style="width:20%" | <span id="polar">[http://itp.tugraz.at/matlab/techdoc/ref/polar.html polar]</span><br />
|-<br />
| style="width:20%" | <span id="poly">[http://itp.tugraz.at/matlab/techdoc/ref/poly.html poly]</span><br />
| style="width:20%" | <span id="polyarea">[http://itp.tugraz.at/matlab/techdoc/ref/polyarea.html polyarea]</span><br />
| style="width:20%" | <span id="polyder">[http://itp.tugraz.at/matlab/techdoc/ref/polyder.html polyder]</span><br />
| style="width:20%" | <span id="polyeig">[http://itp.tugraz.at/matlab/techdoc/ref/polyeig.html polyeig]</span><br />
| style="width:20%" | <span id="polyfit">[http://itp.tugraz.at/matlab/techdoc/ref/polyfit.html polyfit]</span><br />
|-<br />
| style="width:20%" | <span id="polyint">[http://itp.tugraz.at/matlab/techdoc/ref/polyint.html polyint]</span><br />
| style="width:20%" | <span id="polyval">[http://itp.tugraz.at/matlab/techdoc/ref/polyval.html polyval]</span><br />
| style="width:20%" | <span id="polyvalm">[http://itp.tugraz.at/matlab/techdoc/ref/polyvalm.html polyvalm]</span><br />
| style="width:20%" | <span id="pow2">[http://itp.tugraz.at/matlab/techdoc/ref/pow2.html pow2]</span><br />
| style="width:20%" | <span id="power">[http://itp.tugraz.at/matlab/techdoc/ref/power.html power]</span><br />
|-<br />
| style="width:20%" | <span id="ppval">[http://itp.tugraz.at/matlab/techdoc/ref/ppval.html ppval]</span><br />
| style="width:20%" | <span id="prefdir">[http://itp.tugraz.at/matlab/techdoc/ref/prefdir.html prefdir]</span><br />
| style="width:20%" | <span id="preferences">[http://itp.tugraz.at/matlab/techdoc/ref/preferences.html preferences]</span><br />
| style="width:20%" | <span id="primes">[http://itp.tugraz.at/matlab/techdoc/ref/primes.html primes]</span><br />
| style="width:20%" | <span id="print">[http://itp.tugraz.at/matlab/techdoc/ref/print.html print]</span><br />
|-<br />
| style="width:20%" | <span id="printopt">[http://itp.tugraz.at/matlab/techdoc/ref/printopt.html printopt]</span><br />
| style="width:20%" | <span id="printdlg">[http://itp.tugraz.at/matlab/techdoc/ref/printdlg.html printdlg]</span><br />
| style="width:20%" | <span id="printpreview">[http://itp.tugraz.at/matlab/techdoc/ref/printpreview.html printpreview]</span><br />
| style="width:20%" | <span id="prod">[http://itp.tugraz.at/matlab/techdoc/ref/prod.html prod]</span><br />
| style="width:20%" | <span id="profile">[http://itp.tugraz.at/matlab/techdoc/ref/profile.html profile]</span><br />
|-<br />
| style="width:20%" | <span id="profsave">[http://itp.tugraz.at/matlab/techdoc/ref/profsave.html profsave]</span><br />
| style="width:20%" | <span id="propedit">[http://itp.tugraz.at/matlab/techdoc/ref/propedit.html propedit]</span><br />
| style="width:20%" | <span id="propertyeditor">[http://itp.tugraz.at/matlab/techdoc/ref/propertyeditor.html propertyeditor]</span><br />
| style="width:20%" | <span id="psi">[http://itp.tugraz.at/matlab/techdoc/ref/psi.html psi]</span><br />
| style="width:20%" | <span id="publish">[http://itp.tugraz.at/matlab/techdoc/ref/publish.html publish]</span><br />
|-<br />
| style="width:20%" | <span id="putchararray">[http://itp.tugraz.at/matlab/techdoc/ref/putchararray.html putchararray]</span><br />
| style="width:20%" | <span id="putfullmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/putfullmatrix.html putfullmatrix]</span><br />
| style="width:20%" | <span id="putworkspacedata">[http://itp.tugraz.at/matlab/techdoc/ref/putworkspacedata.html putworkspacedata]</span><br />
| style="width:20%" | <span id="pwd">[http://itp.tugraz.at/matlab/techdoc/ref/pwd.html pwd]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= q =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="qmr">[http://itp.tugraz.at/matlab/techdoc/ref/qmr.html qmr]</span><br />
| style="width:20%" | <span id="qr">[http://itp.tugraz.at/matlab/techdoc/ref/qr.html qr]</span><br />
| style="width:20%" | <span id="qrdelete">[http://itp.tugraz.at/matlab/techdoc/ref/qrdelete.html qrdelete]</span><br />
| style="width:20%" | <span id="qrinsert">[http://itp.tugraz.at/matlab/techdoc/ref/qrinsert.html qrinsert]</span><br />
| style="width:20%" | <span id="qrupdate">[http://itp.tugraz.at/matlab/techdoc/ref/qrupdate.html qrupdate]</span><br />
|-<br />
| style="width:20%" | <span id="quad">[http://itp.tugraz.at/matlab/techdoc/ref/quad.html quad]</span><br />
| style="width:20%" | <span id="quadgk">[http://itp.tugraz.at/matlab/techdoc/ref/quadgk.html quadgk]</span><br />
| style="width:20%" | <span id="quadl">[http://itp.tugraz.at/matlab/techdoc/ref/quadl.html quadl]</span><br />
| style="width:20%" | <span id="quadv">[http://itp.tugraz.at/matlab/techdoc/ref/quadv.html quadv]</span><br />
| style="width:20%" | <span id="questdlg">[http://itp.tugraz.at/matlab/techdoc/ref/questdlg.html questdlg]</span><br />
|-<br />
| style="width:20%" | <span id="quit">[http://itp.tugraz.at/matlab/techdoc/ref/quit.html quit]</span><br />
| style="width:20%" | <span id="quiver">[http://itp.tugraz.at/matlab/techdoc/ref/quiver.html quiver]</span><br />
| style="width:20%" | <span id="quiver3">[http://itp.tugraz.at/matlab/techdoc/ref/quiver3.html quiver3]</span><br />
| style="width:20%" | <span id="quivergroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/quivergroupproperties.html quivergroupproperties]</span><br />
| style="width:20%" | <span id="qz">[http://itp.tugraz.at/matlab/techdoc/ref/qz.html qz]</span><br />
|-<br />
|}<br />
<br />
= r =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="relationaloperators">[http://itp.tugraz.at/matlab/techdoc/ref/relationaloperators.html relationaloperators]</span><br />
| style="width:20%" | <span id="rdivide">[http://itp.tugraz.at/matlab/techdoc/ref/rdivide.html rdivide]</span><br />
| style="width:20%" | <span id="rand">[http://itp.tugraz.at/matlab/techdoc/ref/rand.html rand]</span><br />
| style="width:20%" | <span id="randn">[http://itp.tugraz.at/matlab/techdoc/ref/randn.html randn]</span><br />
| style="width:20%" | <span id="randperm">[http://itp.tugraz.at/matlab/techdoc/ref/randperm.html randperm]</span><br />
|-<br />
| style="width:20%" | <span id="rank">[http://itp.tugraz.at/matlab/techdoc/ref/rank.html rank]</span><br />
| style="width:20%" | <span id="rat">[http://itp.tugraz.at/matlab/techdoc/ref/rat.html rat]</span><br />
| style="width:20%" | <span id="rats">[http://itp.tugraz.at/matlab/techdoc/ref/rats.html rats]</span><br />
| style="width:20%" | <span id="rbbox">[http://itp.tugraz.at/matlab/techdoc/ref/rbbox.html rbbox]</span><br />
| style="width:20%" | <span id="rcond">[http://itp.tugraz.at/matlab/techdoc/ref/rcond.html rcond]</span><br />
|-<br />
| style="width:20%" | <span id="read">[http://itp.tugraz.at/matlab/techdoc/ref/read.html read]</span><br />
| style="width:20%" | <span id="readasync">[http://itp.tugraz.at/matlab/techdoc/ref/readasync.html readasync]</span><br />
| style="width:20%" | <span id="real">[http://itp.tugraz.at/matlab/techdoc/ref/real.html real]</span><br />
| style="width:20%" | <span id="reallog">[http://itp.tugraz.at/matlab/techdoc/ref/reallog.html reallog]</span><br />
| style="width:20%" | <span id="realmax">[http://itp.tugraz.at/matlab/techdoc/ref/realmax.html realmax]</span><br />
|-<br />
| style="width:20%" | <span id="realmin">[http://itp.tugraz.at/matlab/techdoc/ref/realmin.html realmin]</span><br />
| style="width:20%" | <span id="realpow">[http://itp.tugraz.at/matlab/techdoc/ref/realpow.html realpow]</span><br />
| style="width:20%" | <span id="realsqrt">[http://itp.tugraz.at/matlab/techdoc/ref/realsqrt.html realsqrt]</span><br />
| style="width:20%" | <span id="record">[http://itp.tugraz.at/matlab/techdoc/ref/record.html record]</span><br />
| style="width:20%" | <span id="rectangle">[http://itp.tugraz.at/matlab/techdoc/ref/rectangle.html rectangle]</span><br />
|-<br />
| style="width:20%" | <span id="rectangle_props">[http://itp.tugraz.at/matlab/techdoc/ref/rectangle_props.html rectangle_props]</span><br />
| style="width:20%" | <span id="rectint">[http://itp.tugraz.at/matlab/techdoc/ref/rectint.html rectint]</span><br />
| style="width:20%" | <span id="recycle">[http://itp.tugraz.at/matlab/techdoc/ref/recycle.html recycle]</span><br />
| style="width:20%" | <span id="reducepatch">[http://itp.tugraz.at/matlab/techdoc/ref/reducepatch.html reducepatch]</span><br />
| style="width:20%" | <span id="reducevolume">[http://itp.tugraz.at/matlab/techdoc/ref/reducevolume.html reducevolume]</span><br />
|-<br />
| style="width:20%" | <span id="refresh">[http://itp.tugraz.at/matlab/techdoc/ref/refresh.html refresh]</span><br />
| style="width:20%" | <span id="refreshdata">[http://itp.tugraz.at/matlab/techdoc/ref/refreshdata.html refreshdata]</span><br />
| style="width:20%" | <span id="regexpi">[http://itp.tugraz.at/matlab/techdoc/ref/regexpi.html regexpi]</span><br />
| style="width:20%" | <span id="regexp">[http://itp.tugraz.at/matlab/techdoc/ref/regexp.html regexp]</span><br />
| style="width:20%" | <span id="regexprep">[http://itp.tugraz.at/matlab/techdoc/ref/regexprep.html regexprep]</span><br />
|-<br />
| style="width:20%" | <span id="regexptranslate">[http://itp.tugraz.at/matlab/techdoc/ref/regexptranslate.html regexptranslate]</span><br />
| style="width:20%" | <span id="registerevent">[http://itp.tugraz.at/matlab/techdoc/ref/registerevent.html registerevent]</span><br />
| style="width:20%" | <span id="rehash">[http://itp.tugraz.at/matlab/techdoc/ref/rehash.html rehash]</span><br />
| style="width:20%" | <span id="release">[http://itp.tugraz.at/matlab/techdoc/ref/release.html release]</span><br />
| style="width:20%" | <span id="rem">[http://itp.tugraz.at/matlab/techdoc/ref/rem.html rem]</span><br />
|-<br />
| style="width:20%" | <span id="removets">[http://itp.tugraz.at/matlab/techdoc/ref/removets.html removets]</span><br />
| style="width:20%" | <span id="rename">[http://itp.tugraz.at/matlab/techdoc/ref/rename.html rename]</span><br />
| style="width:20%" | <span id="repmat">[http://itp.tugraz.at/matlab/techdoc/ref/repmat.html repmat]</span><br />
| style="width:20%" | <span id="resampletimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/resampletimeseries.html resampletimeseries]</span><br />
| style="width:20%" | <span id="resampletscollection">[http://itp.tugraz.at/matlab/techdoc/ref/resampletscollection.html resampletscollection]</span><br />
|-<br />
| style="width:20%" | <span id="reset">[http://itp.tugraz.at/matlab/techdoc/ref/reset.html reset]</span><br />
| style="width:20%" | <span id="reshape">[http://itp.tugraz.at/matlab/techdoc/ref/reshape.html reshape]</span><br />
| style="width:20%" | <span id="residue">[http://itp.tugraz.at/matlab/techdoc/ref/residue.html residue]</span><br />
| style="width:20%" | <span id="restoredefaultpath">[http://itp.tugraz.at/matlab/techdoc/ref/restoredefaultpath.html restoredefaultpath]</span><br />
| style="width:20%" | <span id="rethrow">[http://itp.tugraz.at/matlab/techdoc/ref/rethrow.html rethrow]</span><br />
|-<br />
| style="width:20%" | <span id="rethrowmexception">[http://itp.tugraz.at/matlab/techdoc/ref/rethrowmexception.html rethrowmexception]</span><br />
| style="width:20%" | <span id="return">[http://itp.tugraz.at/matlab/techdoc/ref/return.html return]</span><br />
| style="width:20%" | <span id="rgb2hsv">[http://itp.tugraz.at/matlab/techdoc/ref/rgb2hsv.html rgb2hsv]</span><br />
| style="width:20%" | <span id="rgbplot">[http://itp.tugraz.at/matlab/techdoc/ref/rgbplot.html rgbplot]</span><br />
| style="width:20%" | <span id="ribbon">[http://itp.tugraz.at/matlab/techdoc/ref/ribbon.html ribbon]</span><br />
|-<br />
| style="width:20%" | <span id="rmappdata">[http://itp.tugraz.at/matlab/techdoc/ref/rmappdata.html rmappdata]</span><br />
| style="width:20%" | <span id="rmdir">[http://itp.tugraz.at/matlab/techdoc/ref/rmdir.html rmdir]</span><br />
| style="width:20%" | <span id="rmfield">[http://itp.tugraz.at/matlab/techdoc/ref/rmfield.html rmfield]</span><br />
| style="width:20%" | <span id="rmpath">[http://itp.tugraz.at/matlab/techdoc/ref/rmpath.html rmpath]</span><br />
| style="width:20%" | <span id="rmpref">[http://itp.tugraz.at/matlab/techdoc/ref/rmpref.html rmpref]</span><br />
|-<br />
| style="width:20%" | <span id="rootobject">[http://itp.tugraz.at/matlab/techdoc/ref/rootobject.html rootobject]</span><br />
| style="width:20%" | <span id="rootobject_props">[http://itp.tugraz.at/matlab/techdoc/ref/rootobject_props.html rootobject_props]</span><br />
| style="width:20%" | <span id="roots">[http://itp.tugraz.at/matlab/techdoc/ref/roots.html roots]</span><br />
| style="width:20%" | <span id="rose">[http://itp.tugraz.at/matlab/techdoc/ref/rose.html rose]</span><br />
| style="width:20%" | <span id="rosser">[http://itp.tugraz.at/matlab/techdoc/ref/rosser.html rosser]</span><br />
|-<br />
| style="width:20%" | <span id="rot90">[http://itp.tugraz.at/matlab/techdoc/ref/rot90.html rot90]</span><br />
| style="width:20%" | <span id="rotate">[http://itp.tugraz.at/matlab/techdoc/ref/rotate.html rotate]</span><br />
| style="width:20%" | <span id="rotate3d">[http://itp.tugraz.at/matlab/techdoc/ref/rotate3d.html rotate3d]</span><br />
| style="width:20%" | <span id="round">[http://itp.tugraz.at/matlab/techdoc/ref/round.html round]</span><br />
| style="width:20%" | <span id="rref">[http://itp.tugraz.at/matlab/techdoc/ref/rref.html rref]</span><br />
|-<br />
| style="width:20%" | <span id="rsf2csf">[http://itp.tugraz.at/matlab/techdoc/ref/rsf2csf.html rsf2csf]</span><br />
| style="width:20%" | <span id="run">[http://itp.tugraz.at/matlab/techdoc/ref/run.html run]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= s =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="specialcharacters">[http://itp.tugraz.at/matlab/techdoc/ref/specialcharacters.html specialcharacters]</span><br />
| style="width:20%" | <span id="serial.clear">[http://itp.tugraz.at/matlab/techdoc/ref/serial.clear.html serial.clear]</span><br />
| style="width:20%" | <span id="serial.delete">[http://itp.tugraz.at/matlab/techdoc/ref/serial.delete.html serial.delete]</span><br />
| style="width:20%" | <span id="serial.disp">[http://itp.tugraz.at/matlab/techdoc/ref/serial.disp.html serial.disp]</span><br />
| style="width:20%" | <span id="serial.fclose">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fclose.html serial.fclose]</span><br />
|-<br />
| style="width:20%" | <span id="serial.fgetl">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fgetl.html serial.fgetl]</span><br />
| style="width:20%" | <span id="serial.fgets">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fgets.html serial.fgets]</span><br />
| style="width:20%" | <span id="serial.fopen">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fopen.html serial.fopen]</span><br />
| style="width:20%" | <span id="serial.fprintf">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fprintf.html serial.fprintf]</span><br />
| style="width:20%" | <span id="serial.fread">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fread.html serial.fread]</span><br />
|-<br />
| style="width:20%" | <span id="serial.fscanf">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fscanf.html serial.fscanf]</span><br />
| style="width:20%" | <span id="serial.fwrite">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fwrite.html serial.fwrite]</span><br />
| style="width:20%" | <span id="serial.get">[http://itp.tugraz.at/matlab/techdoc/ref/serial.get.html serial.get]</span><br />
| style="width:20%" | <span id="serial.isvalid">[http://itp.tugraz.at/matlab/techdoc/ref/serial.isvalid.html serial.isvalid]</span><br />
| style="width:20%" | <span id="serial.length">[http://itp.tugraz.at/matlab/techdoc/ref/serial.length.html serial.length]</span><br />
|-<br />
| style="width:20%" | <span id="serial.load">[http://itp.tugraz.at/matlab/techdoc/ref/serial.load.html serial.load]</span><br />
| style="width:20%" | <span id="save">[http://itp.tugraz.at/matlab/techdoc/ref/save.html save]</span><br />
| style="width:20%" | <span id="serial.save">[http://itp.tugraz.at/matlab/techdoc/ref/serial.save.html serial.save]</span><br />
| style="width:20%" | <span id="saveas">[http://itp.tugraz.at/matlab/techdoc/ref/saveas.html saveas]</span><br />
| style="width:20%" | <span id="saveobj">[http://itp.tugraz.at/matlab/techdoc/ref/saveobj.html saveobj]</span><br />
|-<br />
| style="width:20%" | <span id="savepath">[http://itp.tugraz.at/matlab/techdoc/ref/savepath.html savepath]</span><br />
| style="width:20%" | <span id="scatter">[http://itp.tugraz.at/matlab/techdoc/ref/scatter.html scatter]</span><br />
| style="width:20%" | <span id="scatter3">[http://itp.tugraz.at/matlab/techdoc/ref/scatter3.html scatter3]</span><br />
| style="width:20%" | <span id="scattergroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/scattergroupproperties.html scattergroupproperties]</span><br />
| style="width:20%" | <span id="schur">[http://itp.tugraz.at/matlab/techdoc/ref/schur.html schur]</span><br />
|-<br />
| style="width:20%" | <span id="script">[http://itp.tugraz.at/matlab/techdoc/ref/script.html script]</span><br />
| style="width:20%" | <span id="sec">[http://itp.tugraz.at/matlab/techdoc/ref/sec.html sec]</span><br />
| style="width:20%" | <span id="secd">[http://itp.tugraz.at/matlab/techdoc/ref/secd.html secd]</span><br />
| style="width:20%" | <span id="sech">[http://itp.tugraz.at/matlab/techdoc/ref/sech.html sech]</span><br />
| style="width:20%" | <span id="selectmoveresize">[http://itp.tugraz.at/matlab/techdoc/ref/selectmoveresize.html selectmoveresize]</span><br />
|-<br />
| style="width:20%" | <span id="semilogx">[http://itp.tugraz.at/matlab/techdoc/ref/semilogx.html semilogx]</span><br />
| style="width:20%" | <span id="semilogy">[http://itp.tugraz.at/matlab/techdoc/ref/semilogy.html semilogy]</span><br />
| style="width:20%" | <span id="sendmail">[http://itp.tugraz.at/matlab/techdoc/ref/sendmail.html sendmail]</span><br />
| style="width:20%" | <span id="serial">[http://itp.tugraz.at/matlab/techdoc/ref/serial.html serial]</span><br />
| style="width:20%" | <span id="serialbreak">[http://itp.tugraz.at/matlab/techdoc/ref/serialbreak.html serialbreak]</span><br />
|-<br />
| style="width:20%" | <span id="set">[http://itp.tugraz.at/matlab/techdoc/ref/set.html set]</span><br />
| style="width:20%" | <span id="serial.set">[http://itp.tugraz.at/matlab/techdoc/ref/serial.set.html serial.set]</span><br />
| style="width:20%" | <span id="settimer">[http://itp.tugraz.at/matlab/techdoc/ref/settimer.html settimer]</span><br />
| style="width:20%" | <span id="settimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/settimeseries.html settimeseries]</span><br />
| style="width:20%" | <span id="settscollection">[http://itp.tugraz.at/matlab/techdoc/ref/settscollection.html settscollection]</span><br />
|-<br />
| style="width:20%" | <span id="setabstimetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/setabstimetimeseries.html setabstimetimeseries]</span><br />
| style="width:20%" | <span id="setabstimetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/setabstimetscollection.html setabstimetscollection]</span><br />
| style="width:20%" | <span id="setappdata">[http://itp.tugraz.at/matlab/techdoc/ref/setappdata.html setappdata]</span><br />
| style="width:20%" | <span id="setdiff">[http://itp.tugraz.at/matlab/techdoc/ref/setdiff.html setdiff]</span><br />
| style="width:20%" | <span id="setenv">[http://itp.tugraz.at/matlab/techdoc/ref/setenv.html setenv]</span><br />
|-<br />
| style="width:20%" | <span id="setfield">[http://itp.tugraz.at/matlab/techdoc/ref/setfield.html setfield]</span><br />
| style="width:20%" | <span id="setinterpmethod">[http://itp.tugraz.at/matlab/techdoc/ref/setinterpmethod.html setinterpmethod]</span><br />
| style="width:20%" | <span id="setpixelposition">[http://itp.tugraz.at/matlab/techdoc/ref/setpixelposition.html setpixelposition]</span><br />
| style="width:20%" | <span id="setpref">[http://itp.tugraz.at/matlab/techdoc/ref/setpref.html setpref]</span><br />
| style="width:20%" | <span id="setstr">[http://itp.tugraz.at/matlab/techdoc/ref/setstr.html setstr]</span><br />
|-<br />
| style="width:20%" | <span id="settimeseriesnames">[http://itp.tugraz.at/matlab/techdoc/ref/settimeseriesnames.html settimeseriesnames]</span><br />
| style="width:20%" | <span id="setxor">[http://itp.tugraz.at/matlab/techdoc/ref/setxor.html setxor]</span><br />
| style="width:20%" | <span id="shading">[http://itp.tugraz.at/matlab/techdoc/ref/shading.html shading]</span><br />
| style="width:20%" | <span id="shiftdim">[http://itp.tugraz.at/matlab/techdoc/ref/shiftdim.html shiftdim]</span><br />
| style="width:20%" | <span id="showplottool">[http://itp.tugraz.at/matlab/techdoc/ref/showplottool.html showplottool]</span><br />
|-<br />
| style="width:20%" | <span id="shrinkfaces">[http://itp.tugraz.at/matlab/techdoc/ref/shrinkfaces.html shrinkfaces]</span><br />
| style="width:20%" | <span id="sign">[http://itp.tugraz.at/matlab/techdoc/ref/sign.html sign]</span><br />
| style="width:20%" | <span id="sin">[http://itp.tugraz.at/matlab/techdoc/ref/sin.html sin]</span><br />
| style="width:20%" | <span id="sind">[http://itp.tugraz.at/matlab/techdoc/ref/sind.html sind]</span><br />
| style="width:20%" | <span id="single">[http://itp.tugraz.at/matlab/techdoc/ref/single.html single]</span><br />
|-<br />
| style="width:20%" | <span id="sinh">[http://itp.tugraz.at/matlab/techdoc/ref/sinh.html sinh]</span><br />
| style="width:20%" | <span id="size">[http://itp.tugraz.at/matlab/techdoc/ref/size.html size]</span><br />
| style="width:20%" | <span id="serial.size">[http://itp.tugraz.at/matlab/techdoc/ref/serial.size.html serial.size]</span><br />
| style="width:20%" | <span id="sizetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/sizetimeseries.html sizetimeseries]</span><br />
| style="width:20%" | <span id="sizetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/sizetscollection.html sizetscollection]</span><br />
|-<br />
| style="width:20%" | <span id="slice">[http://itp.tugraz.at/matlab/techdoc/ref/slice.html slice]</span><br />
| style="width:20%" | <span id="smooth3">[http://itp.tugraz.at/matlab/techdoc/ref/smooth3.html smooth3]</span><br />
| style="width:20%" | <span id="sort">[http://itp.tugraz.at/matlab/techdoc/ref/sort.html sort]</span><br />
| style="width:20%" | <span id="sortrows">[http://itp.tugraz.at/matlab/techdoc/ref/sortrows.html sortrows]</span><br />
| style="width:20%" | <span id="sound">[http://itp.tugraz.at/matlab/techdoc/ref/sound.html sound]</span><br />
|-<br />
| style="width:20%" | <span id="soundsc">[http://itp.tugraz.at/matlab/techdoc/ref/soundsc.html soundsc]</span><br />
| style="width:20%" | <span id="spalloc">[http://itp.tugraz.at/matlab/techdoc/ref/spalloc.html spalloc]</span><br />
| style="width:20%" | <span id="sparse">[http://itp.tugraz.at/matlab/techdoc/ref/sparse.html sparse]</span><br />
| style="width:20%" | <span id="spaugment">[http://itp.tugraz.at/matlab/techdoc/ref/spaugment.html spaugment]</span><br />
| style="width:20%" | <span id="spconvert">[http://itp.tugraz.at/matlab/techdoc/ref/spconvert.html spconvert]</span><br />
|-<br />
| style="width:20%" | <span id="spdiags">[http://itp.tugraz.at/matlab/techdoc/ref/spdiags.html spdiags]</span><br />
| style="width:20%" | <span id="specular">[http://itp.tugraz.at/matlab/techdoc/ref/specular.html specular]</span><br />
| style="width:20%" | <span id="speye">[http://itp.tugraz.at/matlab/techdoc/ref/speye.html speye]</span><br />
| style="width:20%" | <span id="spfun">[http://itp.tugraz.at/matlab/techdoc/ref/spfun.html spfun]</span><br />
| style="width:20%" | <span id="sph2cart">[http://itp.tugraz.at/matlab/techdoc/ref/sph2cart.html sph2cart]</span><br />
|-<br />
| style="width:20%" | <span id="sphere">[http://itp.tugraz.at/matlab/techdoc/ref/sphere.html sphere]</span><br />
| style="width:20%" | <span id="spinmap">[http://itp.tugraz.at/matlab/techdoc/ref/spinmap.html spinmap]</span><br />
| style="width:20%" | <span id="spline">[http://itp.tugraz.at/matlab/techdoc/ref/spline.html spline]</span><br />
| style="width:20%" | <span id="spones">[http://itp.tugraz.at/matlab/techdoc/ref/spones.html spones]</span><br />
| style="width:20%" | <span id="spparms">[http://itp.tugraz.at/matlab/techdoc/ref/spparms.html spparms]</span><br />
|-<br />
| style="width:20%" | <span id="sprand">[http://itp.tugraz.at/matlab/techdoc/ref/sprand.html sprand]</span><br />
| style="width:20%" | <span id="sprandn">[http://itp.tugraz.at/matlab/techdoc/ref/sprandn.html sprandn]</span><br />
| style="width:20%" | <span id="sprandsym">[http://itp.tugraz.at/matlab/techdoc/ref/sprandsym.html sprandsym]</span><br />
| style="width:20%" | <span id="sprank">[http://itp.tugraz.at/matlab/techdoc/ref/sprank.html sprank]</span><br />
| style="width:20%" | <span id="sprintf">[http://itp.tugraz.at/matlab/techdoc/ref/sprintf.html sprintf]</span><br />
|-<br />
| style="width:20%" | <span id="spy">[http://itp.tugraz.at/matlab/techdoc/ref/spy.html spy]</span><br />
| style="width:20%" | <span id="sqrt">[http://itp.tugraz.at/matlab/techdoc/ref/sqrt.html sqrt]</span><br />
| style="width:20%" | <span id="sqrtm">[http://itp.tugraz.at/matlab/techdoc/ref/sqrtm.html sqrtm]</span><br />
| style="width:20%" | <span id="squeeze">[http://itp.tugraz.at/matlab/techdoc/ref/squeeze.html squeeze]</span><br />
| style="width:20%" | <span id="ss2tf">[http://itp.tugraz.at/matlab/techdoc/ref/ss2tf.html ss2tf]</span><br />
|-<br />
| style="width:20%" | <span id="sscanf">[http://itp.tugraz.at/matlab/techdoc/ref/sscanf.html sscanf]</span><br />
| style="width:20%" | <span id="stairs">[http://itp.tugraz.at/matlab/techdoc/ref/stairs.html stairs]</span><br />
| style="width:20%" | <span id="stairseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/stairseriesproperties.html stairseriesproperties]</span><br />
| style="width:20%" | <span id="start">[http://itp.tugraz.at/matlab/techdoc/ref/start.html start]</span><br />
| style="width:20%" | <span id="startat">[http://itp.tugraz.at/matlab/techdoc/ref/startat.html startat]</span><br />
|-<br />
| style="width:20%" | <span id="startup">[http://itp.tugraz.at/matlab/techdoc/ref/startup.html startup]</span><br />
| style="width:20%" | <span id="std">[http://itp.tugraz.at/matlab/techdoc/ref/std.html std]</span><br />
| style="width:20%" | <span id="stdtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/stdtimeseries.html stdtimeseries]</span><br />
| style="width:20%" | <span id="stem">[http://itp.tugraz.at/matlab/techdoc/ref/stem.html stem]</span><br />
| style="width:20%" | <span id="stem3">[http://itp.tugraz.at/matlab/techdoc/ref/stem3.html stem3]</span><br />
|-<br />
| style="width:20%" | <span id="stemseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/stemseriesproperties.html stemseriesproperties]</span><br />
| style="width:20%" | <span id="stop">[http://itp.tugraz.at/matlab/techdoc/ref/stop.html stop]</span><br />
| style="width:20%" | <span id="stopasync">[http://itp.tugraz.at/matlab/techdoc/ref/stopasync.html stopasync]</span><br />
| style="width:20%" | <span id="str2double">[http://itp.tugraz.at/matlab/techdoc/ref/str2double.html str2double]</span><br />
| style="width:20%" | <span id="str2func">[http://itp.tugraz.at/matlab/techdoc/ref/str2func.html str2func]</span><br />
|-<br />
| style="width:20%" | <span id="str2mat">[http://itp.tugraz.at/matlab/techdoc/ref/str2mat.html str2mat]</span><br />
| style="width:20%" | <span id="str2num">[http://itp.tugraz.at/matlab/techdoc/ref/str2num.html str2num]</span><br />
| style="width:20%" | <span id="strcat">[http://itp.tugraz.at/matlab/techdoc/ref/strcat.html strcat]</span><br />
| style="width:20%" | <span id="strcmp">[http://itp.tugraz.at/matlab/techdoc/ref/strcmp.html strcmp]</span><br />
| style="width:20%" | <span id="strcmpi">[http://itp.tugraz.at/matlab/techdoc/ref/strcmpi.html strcmpi]</span><br />
|-<br />
| style="width:20%" | <span id="stream2">[http://itp.tugraz.at/matlab/techdoc/ref/stream2.html stream2]</span><br />
| style="width:20%" | <span id="stream3">[http://itp.tugraz.at/matlab/techdoc/ref/stream3.html stream3]</span><br />
| style="width:20%" | <span id="streamline">[http://itp.tugraz.at/matlab/techdoc/ref/streamline.html streamline]</span><br />
| style="width:20%" | <span id="streamparticles">[http://itp.tugraz.at/matlab/techdoc/ref/streamparticles.html streamparticles]</span><br />
| style="width:20%" | <span id="streamribbon">[http://itp.tugraz.at/matlab/techdoc/ref/streamribbon.html streamribbon]</span><br />
|-<br />
| style="width:20%" | <span id="streamslice">[http://itp.tugraz.at/matlab/techdoc/ref/streamslice.html streamslice]</span><br />
| style="width:20%" | <span id="streamtube">[http://itp.tugraz.at/matlab/techdoc/ref/streamtube.html streamtube]</span><br />
| style="width:20%" | <span id="strfind">[http://itp.tugraz.at/matlab/techdoc/ref/strfind.html strfind]</span><br />
| style="width:20%" | <span id="strings">[http://itp.tugraz.at/matlab/techdoc/ref/strings.html strings]</span><br />
| style="width:20%" | <span id="strjust">[http://itp.tugraz.at/matlab/techdoc/ref/strjust.html strjust]</span><br />
|-<br />
| style="width:20%" | <span id="strmatch">[http://itp.tugraz.at/matlab/techdoc/ref/strmatch.html strmatch]</span><br />
| style="width:20%" | <span id="strncmpi">[http://itp.tugraz.at/matlab/techdoc/ref/strncmpi.html strncmpi]</span><br />
| style="width:20%" | <span id="strncmp">[http://itp.tugraz.at/matlab/techdoc/ref/strncmp.html strncmp]</span><br />
| style="width:20%" | <span id="strread">[http://itp.tugraz.at/matlab/techdoc/ref/strread.html strread]</span><br />
| style="width:20%" | <span id="strrep">[http://itp.tugraz.at/matlab/techdoc/ref/strrep.html strrep]</span><br />
|-<br />
| style="width:20%" | <span id="strtok">[http://itp.tugraz.at/matlab/techdoc/ref/strtok.html strtok]</span><br />
| style="width:20%" | <span id="strtrim">[http://itp.tugraz.at/matlab/techdoc/ref/strtrim.html strtrim]</span><br />
| style="width:20%" | <span id="struct">[http://itp.tugraz.at/matlab/techdoc/ref/struct.html struct]</span><br />
| style="width:20%" | <span id="struct2cell">[http://itp.tugraz.at/matlab/techdoc/ref/struct2cell.html struct2cell]</span><br />
| style="width:20%" | <span id="structfun">[http://itp.tugraz.at/matlab/techdoc/ref/structfun.html structfun]</span><br />
|-<br />
| style="width:20%" | <span id="strvcat">[http://itp.tugraz.at/matlab/techdoc/ref/strvcat.html strvcat]</span><br />
| style="width:20%" | <span id="sub2ind">[http://itp.tugraz.at/matlab/techdoc/ref/sub2ind.html sub2ind]</span><br />
| style="width:20%" | <span id="subplot">[http://itp.tugraz.at/matlab/techdoc/ref/subplot.html subplot]</span><br />
| style="width:20%" | <span id="subsasgn">[http://itp.tugraz.at/matlab/techdoc/ref/subsasgn.html subsasgn]</span><br />
| style="width:20%" | <span id="subsindex">[http://itp.tugraz.at/matlab/techdoc/ref/subsindex.html subsindex]</span><br />
|-<br />
| style="width:20%" | <span id="subspace">[http://itp.tugraz.at/matlab/techdoc/ref/subspace.html subspace]</span><br />
| style="width:20%" | <span id="subsref">[http://itp.tugraz.at/matlab/techdoc/ref/subsref.html subsref]</span><br />
| style="width:20%" | <span id="substruct">[http://itp.tugraz.at/matlab/techdoc/ref/substruct.html substruct]</span><br />
| style="width:20%" | <span id="subvolume">[http://itp.tugraz.at/matlab/techdoc/ref/subvolume.html subvolume]</span><br />
| style="width:20%" | <span id="sum">[http://itp.tugraz.at/matlab/techdoc/ref/sum.html sum]</span><br />
|-<br />
| style="width:20%" | <span id="sumtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/sumtimeseries.html sumtimeseries]</span><br />
| style="width:20%" | <span id="superiorto">[http://itp.tugraz.at/matlab/techdoc/ref/superiorto.html superiorto]</span><br />
| style="width:20%" | <span id="support">[http://itp.tugraz.at/matlab/techdoc/ref/support.html support]</span><br />
| style="width:20%" | <span id="surf">[http://itp.tugraz.at/matlab/techdoc/ref/surf.html surf]</span><br />
| style="width:20%" | <span id="surfc">[http://itp.tugraz.at/matlab/techdoc/ref/surfc.html surfc]</span><br />
|-<br />
| style="width:20%" | <span id="surf2patch">[http://itp.tugraz.at/matlab/techdoc/ref/surf2patch.html surf2patch]</span><br />
| style="width:20%" | <span id="surface">[http://itp.tugraz.at/matlab/techdoc/ref/surface.html surface]</span><br />
| style="width:20%" | <span id="surface_props">[http://itp.tugraz.at/matlab/techdoc/ref/surface_props.html surface_props]</span><br />
| style="width:20%" | <span id="surfaceplotproperties">[http://itp.tugraz.at/matlab/techdoc/ref/surfaceplotproperties.html surfaceplotproperties]</span><br />
| style="width:20%" | <span id="surfl">[http://itp.tugraz.at/matlab/techdoc/ref/surfl.html surfl]</span><br />
|-<br />
| style="width:20%" | <span id="surfnorm">[http://itp.tugraz.at/matlab/techdoc/ref/surfnorm.html surfnorm]</span><br />
| style="width:20%" | <span id="svd">[http://itp.tugraz.at/matlab/techdoc/ref/svd.html svd]</span><br />
| style="width:20%" | <span id="svds">[http://itp.tugraz.at/matlab/techdoc/ref/svds.html svds]</span><br />
| style="width:20%" | <span id="swapbytes">[http://itp.tugraz.at/matlab/techdoc/ref/swapbytes.html swapbytes]</span><br />
| style="width:20%" | <span id="switch">[http://itp.tugraz.at/matlab/techdoc/ref/switch.html switch]</span><br />
|-<br />
| style="width:20%" | <span id="symamd">[http://itp.tugraz.at/matlab/techdoc/ref/symamd.html symamd]</span><br />
| style="width:20%" | <span id="symbfact">[http://itp.tugraz.at/matlab/techdoc/ref/symbfact.html symbfact]</span><br />
| style="width:20%" | <span id="symmlq">[http://itp.tugraz.at/matlab/techdoc/ref/symmlq.html symmlq]</span><br />
| style="width:20%" | <span id="symmmd">[http://itp.tugraz.at/matlab/techdoc/ref/symmmd.html symmmd]</span><br />
| style="width:20%" | <span id="symrcm">[http://itp.tugraz.at/matlab/techdoc/ref/symrcm.html symrcm]</span><br />
|-<br />
| style="width:20%" | <span id="symvar">[http://itp.tugraz.at/matlab/techdoc/ref/symvar.html symvar]</span><br />
| style="width:20%" | <span id="synchronize">[http://itp.tugraz.at/matlab/techdoc/ref/synchronize.html synchronize]</span><br />
| style="width:20%" | <span id="syntax">[http://itp.tugraz.at/matlab/techdoc/ref/syntax.html syntax]</span><br />
| style="width:20%" | <span id="system">[http://itp.tugraz.at/matlab/techdoc/ref/system.html system]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= t =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="tan">[http://itp.tugraz.at/matlab/techdoc/ref/tan.html tan]</span><br />
| style="width:20%" | <span id="tand">[http://itp.tugraz.at/matlab/techdoc/ref/tand.html tand]</span><br />
| style="width:20%" | <span id="tanh">[http://itp.tugraz.at/matlab/techdoc/ref/tanh.html tanh]</span><br />
| style="width:20%" | <span id="tar">[http://itp.tugraz.at/matlab/techdoc/ref/tar.html tar]</span><br />
| style="width:20%" | <span id="tempdir">[http://itp.tugraz.at/matlab/techdoc/ref/tempdir.html tempdir]</span><br />
|-<br />
| style="width:20%" | <span id="tempname">[http://itp.tugraz.at/matlab/techdoc/ref/tempname.html tempname]</span><br />
| style="width:20%" | <span id="tetramesh">[http://itp.tugraz.at/matlab/techdoc/ref/tetramesh.html tetramesh]</span><br />
| style="width:20%" | <span id="texlabel">[http://itp.tugraz.at/matlab/techdoc/ref/texlabel.html texlabel]</span><br />
| style="width:20%" | <span id="text">[http://itp.tugraz.at/matlab/techdoc/ref/text.html text]</span><br />
| style="width:20%" | <span id="text_props">[http://itp.tugraz.at/matlab/techdoc/ref/text_props.html text_props]</span><br />
|-<br />
| style="width:20%" | <span id="textread">[http://itp.tugraz.at/matlab/techdoc/ref/textread.html textread]</span><br />
| style="width:20%" | <span id="textscan">[http://itp.tugraz.at/matlab/techdoc/ref/textscan.html textscan]</span><br />
| style="width:20%" | <span id="textwrap">[http://itp.tugraz.at/matlab/techdoc/ref/textwrap.html textwrap]</span><br />
| style="width:20%" | <span id="throwmexception">[http://itp.tugraz.at/matlab/techdoc/ref/throwmexception.html throwmexception]</span><br />
| style="width:20%" | <span id="throwascallermexception">[http://itp.tugraz.at/matlab/techdoc/ref/throwascallermexception.html throwascallermexception]</span><br />
|-<br />
| style="width:20%" | <span id="tic">[http://itp.tugraz.at/matlab/techdoc/ref/tic.html tic]</span><br />
| style="width:20%" | <span id="toc">[http://itp.tugraz.at/matlab/techdoc/ref/toc.html toc]</span><br />
| style="width:20%" | <span id="timer">[http://itp.tugraz.at/matlab/techdoc/ref/timer.html timer]</span><br />
| style="width:20%" | <span id="timerfind">[http://itp.tugraz.at/matlab/techdoc/ref/timerfind.html timerfind]</span><br />
| style="width:20%" | <span id="timerfindall">[http://itp.tugraz.at/matlab/techdoc/ref/timerfindall.html timerfindall]</span><br />
|-<br />
| style="width:20%" | <span id="timeseries">[http://itp.tugraz.at/matlab/techdoc/ref/timeseries.html timeseries]</span><br />
| style="width:20%" | <span id="title">[http://itp.tugraz.at/matlab/techdoc/ref/title.html title]</span><br />
| style="width:20%" | <span id="todatenum">[http://itp.tugraz.at/matlab/techdoc/ref/todatenum.html todatenum]</span><br />
| style="width:20%" | <span id="toeplitz">[http://itp.tugraz.at/matlab/techdoc/ref/toeplitz.html toeplitz]</span><br />
| style="width:20%" | <span id="toolboxdir">[http://itp.tugraz.at/matlab/techdoc/ref/toolboxdir.html toolboxdir]</span><br />
|-<br />
| style="width:20%" | <span id="trace">[http://itp.tugraz.at/matlab/techdoc/ref/trace.html trace]</span><br />
| style="width:20%" | <span id="transposetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/transposetimeseries.html transposetimeseries]</span><br />
| style="width:20%" | <span id="trapz">[http://itp.tugraz.at/matlab/techdoc/ref/trapz.html trapz]</span><br />
| style="width:20%" | <span id="treelayout">[http://itp.tugraz.at/matlab/techdoc/ref/treelayout.html treelayout]</span><br />
| style="width:20%" | <span id="treeplot">[http://itp.tugraz.at/matlab/techdoc/ref/treeplot.html treeplot]</span><br />
|-<br />
| style="width:20%" | <span id="tril">[http://itp.tugraz.at/matlab/techdoc/ref/tril.html tril]</span><br />
| style="width:20%" | <span id="trimesh">[http://itp.tugraz.at/matlab/techdoc/ref/trimesh.html trimesh]</span><br />
| style="width:20%" | <span id="triplequad">[http://itp.tugraz.at/matlab/techdoc/ref/triplequad.html triplequad]</span><br />
| style="width:20%" | <span id="triplot">[http://itp.tugraz.at/matlab/techdoc/ref/triplot.html triplot]</span><br />
| style="width:20%" | <span id="trisurf">[http://itp.tugraz.at/matlab/techdoc/ref/trisurf.html trisurf]</span><br />
|-<br />
| style="width:20%" | <span id="triu">[http://itp.tugraz.at/matlab/techdoc/ref/triu.html triu]</span><br />
| style="width:20%" | <span id="true">[http://itp.tugraz.at/matlab/techdoc/ref/true.html true]</span><br />
| style="width:20%" | <span id="try">[http://itp.tugraz.at/matlab/techdoc/ref/try.html try]</span><br />
| style="width:20%" | <span id="tscollection">[http://itp.tugraz.at/matlab/techdoc/ref/tscollection.html tscollection]</span><br />
| style="width:20%" | <span id="tsdata.event">[http://itp.tugraz.at/matlab/techdoc/ref/tsdata.event.html tsdata.event]</span><br />
|-<br />
| style="width:20%" | <span id="tsearch">[http://itp.tugraz.at/matlab/techdoc/ref/tsearch.html tsearch]</span><br />
| style="width:20%" | <span id="tsearchn">[http://itp.tugraz.at/matlab/techdoc/ref/tsearchn.html tsearchn]</span><br />
| style="width:20%" | <span id="tsprops">[http://itp.tugraz.at/matlab/techdoc/ref/tsprops.html tsprops]</span><br />
| style="width:20%" | <span id="tstool">[http://itp.tugraz.at/matlab/techdoc/ref/tstool.html tstool]</span><br />
| style="width:20%" | <span id="type">[http://itp.tugraz.at/matlab/techdoc/ref/type.html type]</span><br />
|-<br />
| style="width:20%" | <span id="typecast">[http://itp.tugraz.at/matlab/techdoc/ref/typecast.html typecast]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= u =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="uibuttongroup">[http://itp.tugraz.at/matlab/techdoc/ref/uibuttongroup.html uibuttongroup]</span><br />
| style="width:20%" | <span id="uibuttongroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uibuttongroupproperties.html uibuttongroupproperties]</span><br />
| style="width:20%" | <span id="uicontextmenu">[http://itp.tugraz.at/matlab/techdoc/ref/uicontextmenu.html uicontextmenu]</span><br />
| style="width:20%" | <span id="uicontextmenu_props">[http://itp.tugraz.at/matlab/techdoc/ref/uicontextmenu_props.html uicontextmenu_props]</span><br />
| style="width:20%" | <span id="uicontrol">[http://itp.tugraz.at/matlab/techdoc/ref/uicontrol.html uicontrol]</span><br />
|-<br />
| style="width:20%" | <span id="uicontrol_props">[http://itp.tugraz.at/matlab/techdoc/ref/uicontrol_props.html uicontrol_props]</span><br />
| style="width:20%" | <span id="uigetdir">[http://itp.tugraz.at/matlab/techdoc/ref/uigetdir.html uigetdir]</span><br />
| style="width:20%" | <span id="uigetfile">[http://itp.tugraz.at/matlab/techdoc/ref/uigetfile.html uigetfile]</span><br />
| style="width:20%" | <span id="uigetpref">[http://itp.tugraz.at/matlab/techdoc/ref/uigetpref.html uigetpref]</span><br />
| style="width:20%" | <span id="uiimport">[http://itp.tugraz.at/matlab/techdoc/ref/uiimport.html uiimport]</span><br />
|-<br />
| style="width:20%" | <span id="uimenu">[http://itp.tugraz.at/matlab/techdoc/ref/uimenu.html uimenu]</span><br />
| style="width:20%" | <span id="uimenu_props">[http://itp.tugraz.at/matlab/techdoc/ref/uimenu_props.html uimenu_props]</span><br />
| style="width:20%" | <span id="uint8">[http://itp.tugraz.at/matlab/techdoc/ref/uint8.html uint8]</span><br />
| style="width:20%" | <span id="uint16">[http://itp.tugraz.at/matlab/techdoc/ref/uint16.html uint16]</span><br />
| style="width:20%" | <span id="uint32">[http://itp.tugraz.at/matlab/techdoc/ref/uint32.html uint32]</span><br />
|-<br />
| style="width:20%" | <span id="uint64">[http://itp.tugraz.at/matlab/techdoc/ref/uint64.html uint64]</span><br />
| style="width:20%" | <span id="uiopen">[http://itp.tugraz.at/matlab/techdoc/ref/uiopen.html uiopen]</span><br />
| style="width:20%" | <span id="uipanel">[http://itp.tugraz.at/matlab/techdoc/ref/uipanel.html uipanel]</span><br />
| style="width:20%" | <span id="uipanelproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uipanelproperties.html uipanelproperties]</span><br />
| style="width:20%" | <span id="uipushtool">[http://itp.tugraz.at/matlab/techdoc/ref/uipushtool.html uipushtool]</span><br />
|-<br />
| style="width:20%" | <span id="uipushtool_props">[http://itp.tugraz.at/matlab/techdoc/ref/uipushtool_props.html uipushtool_props]</span><br />
| style="width:20%" | <span id="uiputfile">[http://itp.tugraz.at/matlab/techdoc/ref/uiputfile.html uiputfile]</span><br />
| style="width:20%" | <span id="uiresume">[http://itp.tugraz.at/matlab/techdoc/ref/uiresume.html uiresume]</span><br />
| style="width:20%" | <span id="uiwait">[http://itp.tugraz.at/matlab/techdoc/ref/uiwait.html uiwait]</span><br />
| style="width:20%" | <span id="uisave">[http://itp.tugraz.at/matlab/techdoc/ref/uisave.html uisave]</span><br />
|-<br />
| style="width:20%" | <span id="uisetcolor">[http://itp.tugraz.at/matlab/techdoc/ref/uisetcolor.html uisetcolor]</span><br />
| style="width:20%" | <span id="uisetfont">[http://itp.tugraz.at/matlab/techdoc/ref/uisetfont.html uisetfont]</span><br />
| style="width:20%" | <span id="uisetpref">[http://itp.tugraz.at/matlab/techdoc/ref/uisetpref.html uisetpref]</span><br />
| style="width:20%" | <span id="uistack">[http://itp.tugraz.at/matlab/techdoc/ref/uistack.html uistack]</span><br />
| style="width:20%" | <span id="uitoggletool">[http://itp.tugraz.at/matlab/techdoc/ref/uitoggletool.html uitoggletool]</span><br />
|-<br />
| style="width:20%" | <span id="uitoggletool_props">[http://itp.tugraz.at/matlab/techdoc/ref/uitoggletool_props.html uitoggletool_props]</span><br />
| style="width:20%" | <span id="uitoolbar">[http://itp.tugraz.at/matlab/techdoc/ref/uitoolbar.html uitoolbar]</span><br />
| style="width:20%" | <span id="uitoolbarproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uitoolbarproperties.html uitoolbarproperties]</span><br />
| style="width:20%" | <span id="undocheckout">[http://itp.tugraz.at/matlab/techdoc/ref/undocheckout.html undocheckout]</span><br />
| style="width:20%" | <span id="unicode2native">[http://itp.tugraz.at/matlab/techdoc/ref/unicode2native.html unicode2native]</span><br />
|-<br />
| style="width:20%" | <span id="union">[http://itp.tugraz.at/matlab/techdoc/ref/union.html union]</span><br />
| style="width:20%" | <span id="unique">[http://itp.tugraz.at/matlab/techdoc/ref/unique.html unique]</span><br />
| style="width:20%" | <span id="unix">[http://itp.tugraz.at/matlab/techdoc/ref/unix.html unix]</span><br />
| style="width:20%" | <span id="unloadlibrary">[http://itp.tugraz.at/matlab/techdoc/ref/unloadlibrary.html unloadlibrary]</span><br />
| style="width:20%" | <span id="unmkpp">[http://itp.tugraz.at/matlab/techdoc/ref/unmkpp.html unmkpp]</span><br />
|-<br />
| style="width:20%" | <span id="unregisterallevents">[http://itp.tugraz.at/matlab/techdoc/ref/unregisterallevents.html unregisterallevents]</span><br />
| style="width:20%" | <span id="unregisterevent">[http://itp.tugraz.at/matlab/techdoc/ref/unregisterevent.html unregisterevent]</span><br />
| style="width:20%" | <span id="untar">[http://itp.tugraz.at/matlab/techdoc/ref/untar.html untar]</span><br />
| style="width:20%" | <span id="unwrap">[http://itp.tugraz.at/matlab/techdoc/ref/unwrap.html unwrap]</span><br />
| style="width:20%" | <span id="unzip">[http://itp.tugraz.at/matlab/techdoc/ref/unzip.html unzip]</span><br />
|-<br />
| style="width:20%" | <span id="upper">[http://itp.tugraz.at/matlab/techdoc/ref/upper.html upper]</span><br />
| style="width:20%" | <span id="urlread">[http://itp.tugraz.at/matlab/techdoc/ref/urlread.html urlread]</span><br />
| style="width:20%" | <span id="urlwrite">[http://itp.tugraz.at/matlab/techdoc/ref/urlwrite.html urlwrite]</span><br />
| style="width:20%" | <span id="usejava">[http://itp.tugraz.at/matlab/techdoc/ref/usejava.html usejava]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= v =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="validateattributes">[http://itp.tugraz.at/matlab/techdoc/ref/validateattributes.html validateattributes]</span><br />
| style="width:20%" | <span id="validatestring">[http://itp.tugraz.at/matlab/techdoc/ref/validatestring.html validatestring]</span><br />
| style="width:20%" | <span id="vander">[http://itp.tugraz.at/matlab/techdoc/ref/vander.html vander]</span><br />
| style="width:20%" | <span id="var">[http://itp.tugraz.at/matlab/techdoc/ref/var.html var]</span><br />
| style="width:20%" | <span id="vartimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/vartimeseries.html vartimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="varargin">[http://itp.tugraz.at/matlab/techdoc/ref/varargin.html varargin]</span><br />
| style="width:20%" | <span id="varargout">[http://itp.tugraz.at/matlab/techdoc/ref/varargout.html varargout]</span><br />
| style="width:20%" | <span id="vectorize">[http://itp.tugraz.at/matlab/techdoc/ref/vectorize.html vectorize]</span><br />
| style="width:20%" | <span id="ver">[http://itp.tugraz.at/matlab/techdoc/ref/ver.html ver]</span><br />
| style="width:20%" | <span id="verctrl">[http://itp.tugraz.at/matlab/techdoc/ref/verctrl.html verctrl]</span><br />
|-<br />
| style="width:20%" | <span id="verlessthan">[http://itp.tugraz.at/matlab/techdoc/ref/verlessthan.html verlessthan]</span><br />
| style="width:20%" | <span id="version">[http://itp.tugraz.at/matlab/techdoc/ref/version.html version]</span><br />
| style="width:20%" | <span id="vertcat">[http://itp.tugraz.at/matlab/techdoc/ref/vertcat.html vertcat]</span><br />
| style="width:20%" | <span id="vertcattimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/vertcattimeseries.html vertcattimeseries]</span><br />
| style="width:20%" | <span id="vertcattscollection">[http://itp.tugraz.at/matlab/techdoc/ref/vertcattscollection.html vertcattscollection]</span><br />
|-<br />
| style="width:20%" | <span id="view">[http://itp.tugraz.at/matlab/techdoc/ref/view.html view]</span><br />
| style="width:20%" | <span id="viewmtx">[http://itp.tugraz.at/matlab/techdoc/ref/viewmtx.html viewmtx]</span><br />
| style="width:20%" | <span id="volumebounds">[http://itp.tugraz.at/matlab/techdoc/ref/volumebounds.html volumebounds]</span><br />
| style="width:20%" | <span id="voronoi">[http://itp.tugraz.at/matlab/techdoc/ref/voronoi.html voronoi]</span><br />
| style="width:20%" | <span id="voronoin">[http://itp.tugraz.at/matlab/techdoc/ref/voronoin.html voronoin]</span><br />
|-<br />
|}<br />
<br />
= w =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="wait">[http://itp.tugraz.at/matlab/techdoc/ref/wait.html wait]</span><br />
| style="width:20%" | <span id="waitbar">[http://itp.tugraz.at/matlab/techdoc/ref/waitbar.html waitbar]</span><br />
| style="width:20%" | <span id="waitfor">[http://itp.tugraz.at/matlab/techdoc/ref/waitfor.html waitfor]</span><br />
| style="width:20%" | <span id="waitforbuttonpress">[http://itp.tugraz.at/matlab/techdoc/ref/waitforbuttonpress.html waitforbuttonpress]</span><br />
| style="width:20%" | <span id="warndlg">[http://itp.tugraz.at/matlab/techdoc/ref/warndlg.html warndlg]</span><br />
|-<br />
| style="width:20%" | <span id="warning">[http://itp.tugraz.at/matlab/techdoc/ref/warning.html warning]</span><br />
| style="width:20%" | <span id="waterfall">[http://itp.tugraz.at/matlab/techdoc/ref/waterfall.html waterfall]</span><br />
| style="width:20%" | <span id="wavfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/wavfinfo.html wavfinfo]</span><br />
| style="width:20%" | <span id="wavplay">[http://itp.tugraz.at/matlab/techdoc/ref/wavplay.html wavplay]</span><br />
| style="width:20%" | <span id="wavread">[http://itp.tugraz.at/matlab/techdoc/ref/wavread.html wavread]</span><br />
|-<br />
| style="width:20%" | <span id="wavrecord">[http://itp.tugraz.at/matlab/techdoc/ref/wavrecord.html wavrecord]</span><br />
| style="width:20%" | <span id="wavwrite">[http://itp.tugraz.at/matlab/techdoc/ref/wavwrite.html wavwrite]</span><br />
| style="width:20%" | <span id="web">[http://itp.tugraz.at/matlab/techdoc/ref/web.html web]</span><br />
| style="width:20%" | <span id="weekday">[http://itp.tugraz.at/matlab/techdoc/ref/weekday.html weekday]</span><br />
| style="width:20%" | <span id="what">[http://itp.tugraz.at/matlab/techdoc/ref/what.html what]</span><br />
|-<br />
| style="width:20%" | <span id="whatsnew">[http://itp.tugraz.at/matlab/techdoc/ref/whatsnew.html whatsnew]</span><br />
| style="width:20%" | <span id="which">[http://itp.tugraz.at/matlab/techdoc/ref/which.html which]</span><br />
| style="width:20%" | <span id="while">[http://itp.tugraz.at/matlab/techdoc/ref/while.html while]</span><br />
| style="width:20%" | <span id="whitebg">[http://itp.tugraz.at/matlab/techdoc/ref/whitebg.html whitebg]</span><br />
| style="width:20%" | <span id="who">[http://itp.tugraz.at/matlab/techdoc/ref/who.html who]</span><br />
|-<br />
| style="width:20%" | <span id="whos">[http://itp.tugraz.at/matlab/techdoc/ref/whos.html whos]</span><br />
| style="width:20%" | <span id="wilkinson">[http://itp.tugraz.at/matlab/techdoc/ref/wilkinson.html wilkinson]</span><br />
| style="width:20%" | <span id="winopen">[http://itp.tugraz.at/matlab/techdoc/ref/winopen.html winopen]</span><br />
| style="width:20%" | <span id="winqueryreg">[http://itp.tugraz.at/matlab/techdoc/ref/winqueryreg.html winqueryreg]</span><br />
| style="width:20%" | <span id="wk1finfo">[http://itp.tugraz.at/matlab/techdoc/ref/wk1finfo.html wk1finfo]</span><br />
|-<br />
| style="width:20%" | <span id="wk1read">[http://itp.tugraz.at/matlab/techdoc/ref/wk1read.html wk1read]</span><br />
| style="width:20%" | <span id="wk1write">[http://itp.tugraz.at/matlab/techdoc/ref/wk1write.html wk1write]</span><br />
| style="width:20%" | <span id="workspace">[http://itp.tugraz.at/matlab/techdoc/ref/workspace.html workspace]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= x =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="xlabel">[http://itp.tugraz.at/matlab/techdoc/ref/xlabel.html xlabel]</span><br />
| style="width:20%" | <span id="xlim">[http://itp.tugraz.at/matlab/techdoc/ref/xlim.html xlim]</span><br />
| style="width:20%" | <span id="xlsfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/xlsfinfo.html xlsfinfo]</span><br />
| style="width:20%" | <span id="xlsread">[http://itp.tugraz.at/matlab/techdoc/ref/xlsread.html xlsread]</span><br />
| style="width:20%" | <span id="xlswrite">[http://itp.tugraz.at/matlab/techdoc/ref/xlswrite.html xlswrite]</span><br />
|-<br />
| style="width:20%" | <span id="xmlread">[http://itp.tugraz.at/matlab/techdoc/ref/xmlread.html xmlread]</span><br />
| style="width:20%" | <span id="xmlwrite">[http://itp.tugraz.at/matlab/techdoc/ref/xmlwrite.html xmlwrite]</span><br />
| style="width:20%" | <span id="xor">[http://itp.tugraz.at/matlab/techdoc/ref/xor.html xor]</span><br />
| style="width:20%" | <span id="xslt">[http://itp.tugraz.at/matlab/techdoc/ref/xslt.html xslt]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= y =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="ylabel">[http://itp.tugraz.at/matlab/techdoc/ref/ylabel.html ylabel]</span><br />
| style="width:20%" | <span id="ylim">[http://itp.tugraz.at/matlab/techdoc/ref/ylim.html ylim]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= z =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e37999_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e37999_508longdesc.html zmw57dd0e37999_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38251_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38251_508longdesc.html zmw57dd0e38251_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38258_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38258_508longdesc.html zmw57dd0e38258_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38265_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38265_508longdesc.html zmw57dd0e38265_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38349_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38349_508longdesc.html zmw57dd0e38349_508longdesc]</span><br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e38384_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38384_508longdesc.html zmw57dd0e38384_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38397_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38397_508longdesc.html zmw57dd0e38397_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38404_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38404_508longdesc.html zmw57dd0e38404_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38411_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38411_508longdesc.html zmw57dd0e38411_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38421_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38421_508longdesc.html zmw57dd0e38421_508longdesc]</span><br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e38463_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38463_508longdesc.html zmw57dd0e38463_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38470_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38470_508longdesc.html zmw57dd0e38470_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38483_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38483_508longdesc.html zmw57dd0e38483_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38490_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38490_508longdesc.html zmw57dd0e38490_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38537_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38537_508longdesc.html zmw57dd0e38537_508longdesc]</span><br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e38552_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38552_508longdesc.html zmw57dd0e38552_508longdesc]</span><br />
| style="width:20%" | <span id="zlabel">[http://itp.tugraz.at/matlab/techdoc/ref/zlabel.html zlabel]</span><br />
| style="width:20%" | <span id="zlim">[http://itp.tugraz.at/matlab/techdoc/ref/zlim.html zlim]</span><br />
| style="width:20%" | <span id="zeros">[http://itp.tugraz.at/matlab/techdoc/ref/zeros.html zeros]</span><br />
| style="width:20%" | <span id="zip">[http://itp.tugraz.at/matlab/techdoc/ref/zip.html zip]</span><br />
|-<br />
| style="width:20%" | <span id="zoom">[http://itp.tugraz.at/matlab/techdoc/ref/zoom.html zoom]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Matlab_Dokumentation&diff=5340Matlab Dokumentation2008-01-19T14:10:08Z<p>Osiris: /* Matlab Dokumente im HTML-Format */ Links korrigiert</p>
<hr />
<div>== Matlab Dokumente im HTML-Format ==<br />
<br />
Dies ist eine Sammlung von HTML-Dokumenten, die von der Firma [http://www.mathworks.com/ Mathworks], dem Hersteller <br />
von Matlab, angeboten werden. Aus Effizienzgründen bei der Absolvierung der Übungen werden sie aber am <br />
[http://itp.tugraz.at/ ITP] gespiegelt. Eine Erläuterung zur Anzahl der Sterne im Feld "Bereich" gibt es im Abschnitt<br />
[[Matlab_Dokumentation#Bewertung|Bewertung]].<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|+'''Matlab Dokumente am Web'''<br />
|-<br />
! style="background:#efefef;" | Link<br />
! style="background:#efefef;" | Typ<br />
! style="background:#efefef;" | Anmerkung<br />
! style="background:#efefef;" | Bereich<br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/ref/ Reference]<br />
| html<br />
| Übersicht über alle Basisbefehle in Matlab <br />
! <tt style="color:orange">*****</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/learn_matlab/ Learning Matlab]<br />
| html<br />
| Einstieg zum Lernen<br />
! <tt style="color:orange">****</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/math/ Mathematics]<br />
| html<br />
| Mathematik<br />
! <tt style="color:orange">****</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/creating_plots/ Creating Plots]<br />
| html<br />
| Erzeugung von Plots und Graphiken<br />
! <tt style="color:orange">****</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/matlab_prog/ Matlab Programming]<br />
| html<br />
| Programmieren mit Matlab<br />
! <tt style="color:orange">***</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/data_analysis/ Data Analysis]<br />
| html<br />
| Daten Analyse<br />
! <tt style="color:orange">***</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/matlab_env/ Matlab Environment]<br />
| html<br />
| Matlab Umgebung und Oberfläche<br />
! <tt style="color:orange">***</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/visualize/ Visualize]<br />
| html<br />
| Erzeugung von 3-D Graphiken<br />
! <tt style="color:orange">**</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/creating_guis/ Creating GUIs]<br />
| html<br />
| Erzeugung von Graphischen Benutzer Interfaces<br />
! <tt style="color:orange">**</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/apiref/ C and Fortran API Reference]<br />
| html<br />
| Externe Referenz<br />
! <tt style="color:orange">*</tt><br />
|-<br />
| [http://itp.tugraz.at/matlab/techdoc/matlab_external/ Matlab External]<br />
| html<br />
| Externe Interfaces<br />
! <tt style="color:orange">*</tt><br />
|-<br />
|}<br />
<br />
== Bewertung ==<br />
<br />
Die folgende Bewertung kann als Leitfaden für die Bedeutung der Dokumente angesehen werden. <br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|+'''Bewertung'''<br />
|-<br />
! style="background:#efefef;" | Bereich<br />
! style="background:#efefef;" | Charakterisierung<br />
|-<br />
! <tt style="color:orange">*****</tt><br />
! Referenz<br />
|-<br />
! <tt style="color:orange">****</tt><br />
! Basis Hilfe beim Lernen<br />
|-<br />
! <tt style="color:orange">***</tt><br />
! Praktische Unterstützung beim Lernen<br />
|-<br />
! <tt style="color:orange">**</tt><br />
! Höherer Schwierigkeitsgrad<br />
|-<br />
! <tt style="color:orange">*</tt><br />
! Für fortgeschrittene Benutzer<br />
|-<br />
|}<br />
<br />
== Matlab Dokumente im PDF-Format ==<br />
Dies ist eine Sammlung von PDF-Dokumenten, die von der Firma [http://www.mathworks.com/ Mathworks], dem Hersteller <br />
von Matlab, angeboten werden. Aus Effizienzgründen bei der Absolvierung der Übungen werden sie aber am <br />
[http://itp.tugraz.at/ ITP] gespiegelt. Eine Erläuterung zur Anzahl der Sterne im Feld "Bereich" gibt es im Abschnitt<br />
[[Matlab_Dokumentation#Bewertung|Bewertung]].<br />
<br />
Für Online-Arbeiten empfiehlt sich die Verwendung von<br />
[[Matlab_Dokumentation#Matlab_Dokumente_im_HTML-Format|Matlab Dokumenten im HTML-Format]],<br />
will man die Unterlagen jedoch eher im Buchformat dann sollte man diese Links verwenden.<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|+'''Unterlagen'''<br />
|-<br />
! style="background:#efefef;" | Link<br />
! style="background:#efefef;" | Typ<br />
! style="background:#efefef;" | Anmerkung<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/getstart.pdf Getting Started]<br />
| pdf <br />
| Einführung<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/math.pdf Mathematics]<br />
| pdf <br />
| Mathematische Anwendung<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/graphg.pdf Graphics]<br />
| pdf <br />
| Erstellung von Graphiken<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/data_analysis.pdf Data Analysis]<br />
| pdf <br />
| Datenanalyse<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/matlab_prog.pdf Programming]<br />
| pdf <br />
| Programmieren mit Matlab<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/programming_tips.pdf Programming Tips]<br />
| pdf <br />
| Programmier Tipps<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/ode_suite.pdf ODE-Suite]<br />
| pdf <br />
| Gewöhnliche Differentialgleichungen<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/matlab_env.pdf Development Environment]<br />
| pdf <br />
| Matlab Umgebung<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/build_gui.pdf Building GUIs]<br />
| pdf <br />
| Graphische Benutzeroberfl]chen<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/refbook.pdf Matlab Reference A - E]<br />
| pdf <br />
| Referenzbook, Volume 1, A - E<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/refbook2.pdf Matlab Reference F - O]<br />
| pdf <br />
| Referenzbook, Volume 2, F - O<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/refbook3.pdf Matlab Reference P - Z]<br />
| pdf <br />
| Referenzbook, Volume 3, P - Z<br />
|-<br />
| [http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabBooks/apiext.pdf Application Program Interface]<br />
| pdf <br />
| Externes Interface zu Matlab<br />
|-<br />
|}<br />
<br />
== Unterlagen zur Lehrveranstaltung ==<br />
Die Unterlagen zur Lehrveranstaltung "Applikationssoftware und Programmierung" werden in einem<br />
eigenen <br />
Abschnitt mit allen <br />
[[Applikationssoftware_-_Dokumente|Dokumenten]] offeriert.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5316Meditor2007-12-20T15:09:23Z<p>Osiris: /* Unterscheidung Funktionen - Keywords */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Hilfe für Toolbox-Funktionen<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
TOOLBOX_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei derzeit zwischen Matlab-Funktionen, Toolbox-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5315Meditor2007-12-20T15:08:12Z<p>Osiris: /* Partitionstypen */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Hilfe für Toolbox-Funktionen<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
TOOLBOX_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5314Meditor2007-12-20T15:07:40Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Hilfe für Toolbox-Funktionen<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5313Meditor2007-12-17T09:47:26Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Hilfe für Toolbox-Funktionen<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5312Filetools2007-12-17T09:45:37Z<p>Osiris: /* Konkrete Klasse <tt>MatlabfunctionFileSearch</tt> */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) in primitiven ASCII Files, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Die gefundenen Funktionen werden getrennt in Matlab- und Toolbox-Funktionen und entsprechend dieser Einteilung in zwei Ausgabefiles gespeichert. Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die ein (oder kein, je nach Einstellung) Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht. Als Matlab-Funktionen werden jene erkannt, deren Pfad "<tt>toolbox/matlab</tt>" beinhaltet. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-om <outputfile_matlab_functions>] [-ot <outputfile_toolbox_functions>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-om</tt> <br />
| Name des Ausgabefiles für die Liste der Matlab-Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ot</tt> <br />
| Name des Ausgabefiles für die Liste der Toolbox-Funktionen. Wird keiner angegeben, so wird das File <tt>toolbox_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt.<br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird.<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5311Filetools2007-12-17T09:41:13Z<p>Osiris: /* Verwendung als Anwendung */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-om <outputfile_matlab_functions>] [-ot <outputfile_toolbox_functions>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-om</tt> <br />
| Name des Ausgabefiles für die Liste der Matlab-Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ot</tt> <br />
| Name des Ausgabefiles für die Liste der Toolbox-Funktionen. Wird keiner angegeben, so wird das File <tt>toolbox_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt.<br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird.<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5308Meditor2007-11-16T13:22:13Z<p>Osiris: /* Vorhandene Preference Pages */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">HelpBrowserPrefsPage</span></tt><br />
| Konfiguration des zu verwendenden Browsers und der Basis-URL für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5307Meditor2007-11-16T13:17:29Z<p>Osiris: /* Konfiguration */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Es existiert eine Property Page, in welcher die Art des Browseraufrufs (Editor, View oder externer Browser) und eine Basis-URL für die Hilfeseiten-Aufrufe angegeben werden. Zwei mögliche solcher URLs sind:<br />
* http://itp.tugraz.at/matlab/<br />
* http://www.mathworks.com/access/helpdesk/help/<br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5306Meditor2007-11-16T13:00:43Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5305Meditor2007-11-16T12:59:11Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Matlab_-_Reference&diff=5301Matlab - Reference2007-11-05T12:47:12Z<p>Osiris: </p>
<hr />
<div>= Special Pages = <br />
[http://itp.tugraz.at/matlab/techdoc/ref/ref.html Matlab Function Reference] <br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/arithmeticoperators.html Arithmetic Operators + - * / \ ^ ']<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/relationaloperators.html Relational Operators < > <= >= == ~=]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorselementwise.html Logical Operators: Elementwise & | ~]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorsshortcircuit.html Logical Operators: Short-circuit && ||]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/specialcharacters.html <nowiki>Special Characters [ ] ( ) {} = ' . ... , ; : % ! @</nowiki>]<br />
<br />
[http://itp.tugraz.at/matlab/techdoc/ref/colon.html colon (:)]<br />
<br />
= a =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="arithmeticoperators">[http://itp.tugraz.at/matlab/techdoc/ref/arithmeticoperators.html arithmeticoperators]</span><br />
| style="width:20%" | <span id="abs">[http://itp.tugraz.at/matlab/techdoc/ref/abs.html abs]</span><br />
| style="width:20%" | <span id="accumarray">[http://itp.tugraz.at/matlab/techdoc/ref/accumarray.html accumarray]</span><br />
| style="width:20%" | <span id="acos">[http://itp.tugraz.at/matlab/techdoc/ref/acos.html acos]</span><br />
| style="width:20%" | <span id="acosd">[http://itp.tugraz.at/matlab/techdoc/ref/acosd.html acosd]</span><br />
|-<br />
| style="width:20%" | <span id="acosh">[http://itp.tugraz.at/matlab/techdoc/ref/acosh.html acosh]</span><br />
| style="width:20%" | <span id="acot">[http://itp.tugraz.at/matlab/techdoc/ref/acot.html acot]</span><br />
| style="width:20%" | <span id="acotd">[http://itp.tugraz.at/matlab/techdoc/ref/acotd.html acotd]</span><br />
| style="width:20%" | <span id="acoth">[http://itp.tugraz.at/matlab/techdoc/ref/acoth.html acoth]</span><br />
| style="width:20%" | <span id="acsc">[http://itp.tugraz.at/matlab/techdoc/ref/acsc.html acsc]</span><br />
|-<br />
| style="width:20%" | <span id="acscd">[http://itp.tugraz.at/matlab/techdoc/ref/acscd.html acscd]</span><br />
| style="width:20%" | <span id="acsch">[http://itp.tugraz.at/matlab/techdoc/ref/acsch.html acsch]</span><br />
| style="width:20%" | <span id="actxcontrol">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrol.html actxcontrol]</span><br />
| style="width:20%" | <span id="actxcontrollist">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrollist.html actxcontrollist]</span><br />
| style="width:20%" | <span id="actxcontrolselect">[http://itp.tugraz.at/matlab/techdoc/ref/actxcontrolselect.html actxcontrolselect]</span><br />
|-<br />
| style="width:20%" | <span id="actxgetrunningserver">[http://itp.tugraz.at/matlab/techdoc/ref/actxgetrunningserver.html actxgetrunningserver]</span><br />
| style="width:20%" | <span id="actxserver">[http://itp.tugraz.at/matlab/techdoc/ref/actxserver.html actxserver]</span><br />
| style="width:20%" | <span id="addcausemexception">[http://itp.tugraz.at/matlab/techdoc/ref/addcausemexception.html addcausemexception]</span><br />
| style="width:20%" | <span id="addevent">[http://itp.tugraz.at/matlab/techdoc/ref/addevent.html addevent]</span><br />
| style="width:20%" | <span id="addframe">[http://itp.tugraz.at/matlab/techdoc/ref/addframe.html addframe]</span><br />
|-<br />
| style="width:20%" | <span id="addoptionalinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/addoptionalinputparser.html addoptionalinputparser]</span><br />
| style="width:20%" | <span id="addparamvalueinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/addparamvalueinputparser.html addparamvalueinputparser]</span><br />
| style="width:20%" | <span id="addpath">[http://itp.tugraz.at/matlab/techdoc/ref/addpath.html addpath]</span><br />
| style="width:20%" | <span id="addpref">[http://itp.tugraz.at/matlab/techdoc/ref/addpref.html addpref]</span><br />
| style="width:20%" | <span id="addproperty">[http://itp.tugraz.at/matlab/techdoc/ref/addproperty.html addproperty]</span><br />
|-<br />
| style="width:20%" | <span id="addrequiredinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/addrequiredinputparser.html addrequiredinputparser]</span><br />
| style="width:20%" | <span id="addsample">[http://itp.tugraz.at/matlab/techdoc/ref/addsample.html addsample]</span><br />
| style="width:20%" | <span id="addsampletocollection">[http://itp.tugraz.at/matlab/techdoc/ref/addsampletocollection.html addsampletocollection]</span><br />
| style="width:20%" | <span id="addtodate">[http://itp.tugraz.at/matlab/techdoc/ref/addtodate.html addtodate]</span><br />
| style="width:20%" | <span id="addts">[http://itp.tugraz.at/matlab/techdoc/ref/addts.html addts]</span><br />
|-<br />
| style="width:20%" | <span id="airy">[http://itp.tugraz.at/matlab/techdoc/ref/airy.html airy]</span><br />
| style="width:20%" | <span id="align">[http://itp.tugraz.at/matlab/techdoc/ref/align.html align]</span><br />
| style="width:20%" | <span id="alim">[http://itp.tugraz.at/matlab/techdoc/ref/alim.html alim]</span><br />
| style="width:20%" | <span id="all">[http://itp.tugraz.at/matlab/techdoc/ref/all.html all]</span><br />
| style="width:20%" | <span id="allchild">[http://itp.tugraz.at/matlab/techdoc/ref/allchild.html allchild]</span><br />
|-<br />
| style="width:20%" | <span id="alpha">[http://itp.tugraz.at/matlab/techdoc/ref/alpha.html alpha]</span><br />
| style="width:20%" | <span id="alphamap">[http://itp.tugraz.at/matlab/techdoc/ref/alphamap.html alphamap]</span><br />
| style="width:20%" | <span id="amd">[http://itp.tugraz.at/matlab/techdoc/ref/amd.html amd]</span><br />
| style="width:20%" | <span id="ancestor">[http://itp.tugraz.at/matlab/techdoc/ref/ancestor.html ancestor]</span><br />
| style="width:20%" | <span id="and">[http://itp.tugraz.at/matlab/techdoc/ref/and.html and]</span><br />
|-<br />
| style="width:20%" | <span id="angle">[http://itp.tugraz.at/matlab/techdoc/ref/angle.html angle]</span><br />
| style="width:20%" | <span id="annotation">[http://itp.tugraz.at/matlab/techdoc/ref/annotation.html annotation]</span><br />
| style="width:20%" | <span id="annotationarrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationarrowproperties.html annotationarrowproperties]</span><br />
| style="width:20%" | <span id="ans">[http://itp.tugraz.at/matlab/techdoc/ref/ans.html ans]</span><br />
| style="width:20%" | <span id="annotationdoublearrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationdoublearrowproperties.html annotationdoublearrowproperties]</span><br />
|-<br />
| style="width:20%" | <span id="annotationellipseproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationellipseproperties.html annotationellipseproperties]</span><br />
| style="width:20%" | <span id="annotationlineproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationlineproperties.html annotationlineproperties]</span><br />
| style="width:20%" | <span id="annotationrectangleproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationrectangleproperties.html annotationrectangleproperties]</span><br />
| style="width:20%" | <span id="annotationtextarrowproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationtextarrowproperties.html annotationtextarrowproperties]</span><br />
| style="width:20%" | <span id="annotationtextboxproperties">[http://itp.tugraz.at/matlab/techdoc/ref/annotationtextboxproperties.html annotationtextboxproperties]</span><br />
|-<br />
| style="width:20%" | <span id="any">[http://itp.tugraz.at/matlab/techdoc/ref/any.html any]</span><br />
| style="width:20%" | <span id="area">[http://itp.tugraz.at/matlab/techdoc/ref/area.html area]</span><br />
| style="width:20%" | <span id="areaseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/areaseriesproperties.html areaseriesproperties]</span><br />
| style="width:20%" | <span id="arrayfun">[http://itp.tugraz.at/matlab/techdoc/ref/arrayfun.html arrayfun]</span><br />
| style="width:20%" | <span id="ascii">[http://itp.tugraz.at/matlab/techdoc/ref/ascii.html ascii]</span><br />
|-<br />
| style="width:20%" | <span id="asec">[http://itp.tugraz.at/matlab/techdoc/ref/asec.html asec]</span><br />
| style="width:20%" | <span id="asecd">[http://itp.tugraz.at/matlab/techdoc/ref/asecd.html asecd]</span><br />
| style="width:20%" | <span id="asech">[http://itp.tugraz.at/matlab/techdoc/ref/asech.html asech]</span><br />
| style="width:20%" | <span id="asin">[http://itp.tugraz.at/matlab/techdoc/ref/asin.html asin]</span><br />
| style="width:20%" | <span id="asind">[http://itp.tugraz.at/matlab/techdoc/ref/asind.html asind]</span><br />
|-<br />
| style="width:20%" | <span id="asinh">[http://itp.tugraz.at/matlab/techdoc/ref/asinh.html asinh]</span><br />
| style="width:20%" | <span id="assert">[http://itp.tugraz.at/matlab/techdoc/ref/assert.html assert]</span><br />
| style="width:20%" | <span id="assignin">[http://itp.tugraz.at/matlab/techdoc/ref/assignin.html assignin]</span><br />
| style="width:20%" | <span id="atan">[http://itp.tugraz.at/matlab/techdoc/ref/atan.html atan]</span><br />
| style="width:20%" | <span id="atan2">[http://itp.tugraz.at/matlab/techdoc/ref/atan2.html atan2]</span><br />
|-<br />
| style="width:20%" | <span id="atand">[http://itp.tugraz.at/matlab/techdoc/ref/atand.html atand]</span><br />
| style="width:20%" | <span id="atanh">[http://itp.tugraz.at/matlab/techdoc/ref/atanh.html atanh]</span><br />
| style="width:20%" | <span id="audioplayer">[http://itp.tugraz.at/matlab/techdoc/ref/audioplayer.html audioplayer]</span><br />
| style="width:20%" | <span id="audiorecorder">[http://itp.tugraz.at/matlab/techdoc/ref/audiorecorder.html audiorecorder]</span><br />
| style="width:20%" | <span id="aufinfo">[http://itp.tugraz.at/matlab/techdoc/ref/aufinfo.html aufinfo]</span><br />
|-<br />
| style="width:20%" | <span id="auread">[http://itp.tugraz.at/matlab/techdoc/ref/auread.html auread]</span><br />
| style="width:20%" | <span id="auwrite">[http://itp.tugraz.at/matlab/techdoc/ref/auwrite.html auwrite]</span><br />
| style="width:20%" | <span id="avifile">[http://itp.tugraz.at/matlab/techdoc/ref/avifile.html avifile]</span><br />
| style="width:20%" | <span id="aviinfo">[http://itp.tugraz.at/matlab/techdoc/ref/aviinfo.html aviinfo]</span><br />
| style="width:20%" | <span id="aviread">[http://itp.tugraz.at/matlab/techdoc/ref/aviread.html aviread]</span><br />
|-<br />
| style="width:20%" | <span id="axes">[http://itp.tugraz.at/matlab/techdoc/ref/axes.html axes]</span><br />
| style="width:20%" | <span id="axes_props">[http://itp.tugraz.at/matlab/techdoc/ref/axes_props.html axes_props]</span><br />
| style="width:20%" | <span id="axis">[http://itp.tugraz.at/matlab/techdoc/ref/axis.html axis]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= b =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="balance">[http://itp.tugraz.at/matlab/techdoc/ref/balance.html balance]</span><br />
| style="width:20%" | <span id="bar">[http://itp.tugraz.at/matlab/techdoc/ref/bar.html bar]</span><br />
| style="width:20%" | <span id="barh">[http://itp.tugraz.at/matlab/techdoc/ref/barh.html barh]</span><br />
| style="width:20%" | <span id="bar3">[http://itp.tugraz.at/matlab/techdoc/ref/bar3.html bar3]</span><br />
| style="width:20%" | <span id="bar3h">[http://itp.tugraz.at/matlab/techdoc/ref/bar3h.html bar3h]</span><br />
|-<br />
| style="width:20%" | <span id="barseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/barseriesproperties.html barseriesproperties]</span><br />
| style="width:20%" | <span id="base2dec">[http://itp.tugraz.at/matlab/techdoc/ref/base2dec.html base2dec]</span><br />
| style="width:20%" | <span id="beep">[http://itp.tugraz.at/matlab/techdoc/ref/beep.html beep]</span><br />
| style="width:20%" | <span id="besselh">[http://itp.tugraz.at/matlab/techdoc/ref/besselh.html besselh]</span><br />
| style="width:20%" | <span id="besseli">[http://itp.tugraz.at/matlab/techdoc/ref/besseli.html besseli]</span><br />
|-<br />
| style="width:20%" | <span id="besselj">[http://itp.tugraz.at/matlab/techdoc/ref/besselj.html besselj]</span><br />
| style="width:20%" | <span id="besselk">[http://itp.tugraz.at/matlab/techdoc/ref/besselk.html besselk]</span><br />
| style="width:20%" | <span id="bessely">[http://itp.tugraz.at/matlab/techdoc/ref/bessely.html bessely]</span><br />
| style="width:20%" | <span id="beta">[http://itp.tugraz.at/matlab/techdoc/ref/beta.html beta]</span><br />
| style="width:20%" | <span id="betainc">[http://itp.tugraz.at/matlab/techdoc/ref/betainc.html betainc]</span><br />
|-<br />
| style="width:20%" | <span id="betaln">[http://itp.tugraz.at/matlab/techdoc/ref/betaln.html betaln]</span><br />
| style="width:20%" | <span id="bicg">[http://itp.tugraz.at/matlab/techdoc/ref/bicg.html bicg]</span><br />
| style="width:20%" | <span id="bicgstab">[http://itp.tugraz.at/matlab/techdoc/ref/bicgstab.html bicgstab]</span><br />
| style="width:20%" | <span id="bin2dec">[http://itp.tugraz.at/matlab/techdoc/ref/bin2dec.html bin2dec]</span><br />
| style="width:20%" | <span id="binary">[http://itp.tugraz.at/matlab/techdoc/ref/binary.html binary]</span><br />
|-<br />
| style="width:20%" | <span id="bitand">[http://itp.tugraz.at/matlab/techdoc/ref/bitand.html bitand]</span><br />
| style="width:20%" | <span id="bitcmp">[http://itp.tugraz.at/matlab/techdoc/ref/bitcmp.html bitcmp]</span><br />
| style="width:20%" | <span id="bitget">[http://itp.tugraz.at/matlab/techdoc/ref/bitget.html bitget]</span><br />
| style="width:20%" | <span id="bitmax">[http://itp.tugraz.at/matlab/techdoc/ref/bitmax.html bitmax]</span><br />
| style="width:20%" | <span id="bitor">[http://itp.tugraz.at/matlab/techdoc/ref/bitor.html bitor]</span><br />
|-<br />
| style="width:20%" | <span id="bitset">[http://itp.tugraz.at/matlab/techdoc/ref/bitset.html bitset]</span><br />
| style="width:20%" | <span id="bitshift">[http://itp.tugraz.at/matlab/techdoc/ref/bitshift.html bitshift]</span><br />
| style="width:20%" | <span id="bitxor">[http://itp.tugraz.at/matlab/techdoc/ref/bitxor.html bitxor]</span><br />
| style="width:20%" | <span id="blanks">[http://itp.tugraz.at/matlab/techdoc/ref/blanks.html blanks]</span><br />
| style="width:20%" | <span id="blkdiag">[http://itp.tugraz.at/matlab/techdoc/ref/blkdiag.html blkdiag]</span><br />
|-<br />
| style="width:20%" | <span id="box">[http://itp.tugraz.at/matlab/techdoc/ref/box.html box]</span><br />
| style="width:20%" | <span id="break">[http://itp.tugraz.at/matlab/techdoc/ref/break.html break]</span><br />
| style="width:20%" | <span id="brighten">[http://itp.tugraz.at/matlab/techdoc/ref/brighten.html brighten]</span><br />
| style="width:20%" | <span id="builddocsearchdb">[http://itp.tugraz.at/matlab/techdoc/ref/builddocsearchdb.html builddocsearchdb]</span><br />
| style="width:20%" | <span id="builtin">[http://itp.tugraz.at/matlab/techdoc/ref/builtin.html builtin]</span><br />
|-<br />
| style="width:20%" | <span id="bsxfun">[http://itp.tugraz.at/matlab/techdoc/ref/bsxfun.html bsxfun]</span><br />
| style="width:20%" | <span id="bvp4c">[http://itp.tugraz.at/matlab/techdoc/ref/bvp4c.html bvp4c]</span><br />
| style="width:20%" | <span id="bvp5c">[http://itp.tugraz.at/matlab/techdoc/ref/bvp5c.html bvp5c]</span><br />
| style="width:20%" | <span id="bvpget">[http://itp.tugraz.at/matlab/techdoc/ref/bvpget.html bvpget]</span><br />
| style="width:20%" | <span id="bvpinit">[http://itp.tugraz.at/matlab/techdoc/ref/bvpinit.html bvpinit]</span><br />
|-<br />
| style="width:20%" | <span id="bvpset">[http://itp.tugraz.at/matlab/techdoc/ref/bvpset.html bvpset]</span><br />
| style="width:20%" | <span id="bvpxtend">[http://itp.tugraz.at/matlab/techdoc/ref/bvpxtend.html bvpxtend]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= c =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="colon">[http://itp.tugraz.at/matlab/techdoc/ref/colon.html colon]</span><br />
| style="width:20%" | <span id="calendar">[http://itp.tugraz.at/matlab/techdoc/ref/calendar.html calendar]</span><br />
| style="width:20%" | <span id="calllib">[http://itp.tugraz.at/matlab/techdoc/ref/calllib.html calllib]</span><br />
| style="width:20%" | <span id="callsoapservice">[http://itp.tugraz.at/matlab/techdoc/ref/callsoapservice.html callsoapservice]</span><br />
| style="width:20%" | <span id="camdolly">[http://itp.tugraz.at/matlab/techdoc/ref/camdolly.html camdolly]</span><br />
|-<br />
| style="width:20%" | <span id="cameratoolbar">[http://itp.tugraz.at/matlab/techdoc/ref/cameratoolbar.html cameratoolbar]</span><br />
| style="width:20%" | <span id="camlight">[http://itp.tugraz.at/matlab/techdoc/ref/camlight.html camlight]</span><br />
| style="width:20%" | <span id="camlookat">[http://itp.tugraz.at/matlab/techdoc/ref/camlookat.html camlookat]</span><br />
| style="width:20%" | <span id="camorbit">[http://itp.tugraz.at/matlab/techdoc/ref/camorbit.html camorbit]</span><br />
| style="width:20%" | <span id="campan">[http://itp.tugraz.at/matlab/techdoc/ref/campan.html campan]</span><br />
|-<br />
| style="width:20%" | <span id="campos">[http://itp.tugraz.at/matlab/techdoc/ref/campos.html campos]</span><br />
| style="width:20%" | <span id="camproj">[http://itp.tugraz.at/matlab/techdoc/ref/camproj.html camproj]</span><br />
| style="width:20%" | <span id="camroll">[http://itp.tugraz.at/matlab/techdoc/ref/camroll.html camroll]</span><br />
| style="width:20%" | <span id="camtarget">[http://itp.tugraz.at/matlab/techdoc/ref/camtarget.html camtarget]</span><br />
| style="width:20%" | <span id="camup">[http://itp.tugraz.at/matlab/techdoc/ref/camup.html camup]</span><br />
|-<br />
| style="width:20%" | <span id="camva">[http://itp.tugraz.at/matlab/techdoc/ref/camva.html camva]</span><br />
| style="width:20%" | <span id="camzoom">[http://itp.tugraz.at/matlab/techdoc/ref/camzoom.html camzoom]</span><br />
| style="width:20%" | <span id="cart2pol">[http://itp.tugraz.at/matlab/techdoc/ref/cart2pol.html cart2pol]</span><br />
| style="width:20%" | <span id="cart2sph">[http://itp.tugraz.at/matlab/techdoc/ref/cart2sph.html cart2sph]</span><br />
| style="width:20%" | <span id="case">[http://itp.tugraz.at/matlab/techdoc/ref/case.html case]</span><br />
|-<br />
| style="width:20%" | <span id="cast">[http://itp.tugraz.at/matlab/techdoc/ref/cast.html cast]</span><br />
| style="width:20%" | <span id="cat">[http://itp.tugraz.at/matlab/techdoc/ref/cat.html cat]</span><br />
| style="width:20%" | <span id="catch">[http://itp.tugraz.at/matlab/techdoc/ref/catch.html catch]</span><br />
| style="width:20%" | <span id="caxis">[http://itp.tugraz.at/matlab/techdoc/ref/caxis.html caxis]</span><br />
| style="width:20%" | <span id="cd">[http://itp.tugraz.at/matlab/techdoc/ref/cd.html cd]</span><br />
|-<br />
| style="width:20%" | <span id="cdf2rdf">[http://itp.tugraz.at/matlab/techdoc/ref/cdf2rdf.html cdf2rdf]</span><br />
| style="width:20%" | <span id="cdfepoch">[http://itp.tugraz.at/matlab/techdoc/ref/cdfepoch.html cdfepoch]</span><br />
| style="width:20%" | <span id="cdfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/cdfinfo.html cdfinfo]</span><br />
| style="width:20%" | <span id="cdfread">[http://itp.tugraz.at/matlab/techdoc/ref/cdfread.html cdfread]</span><br />
| style="width:20%" | <span id="cdfwrite">[http://itp.tugraz.at/matlab/techdoc/ref/cdfwrite.html cdfwrite]</span><br />
|-<br />
| style="width:20%" | <span id="ceil">[http://itp.tugraz.at/matlab/techdoc/ref/ceil.html ceil]</span><br />
| style="width:20%" | <span id="cell">[http://itp.tugraz.at/matlab/techdoc/ref/cell.html cell]</span><br />
| style="width:20%" | <span id="cell2mat">[http://itp.tugraz.at/matlab/techdoc/ref/cell2mat.html cell2mat]</span><br />
| style="width:20%" | <span id="cell2struct">[http://itp.tugraz.at/matlab/techdoc/ref/cell2struct.html cell2struct]</span><br />
| style="width:20%" | <span id="celldisp">[http://itp.tugraz.at/matlab/techdoc/ref/celldisp.html celldisp]</span><br />
|-<br />
| style="width:20%" | <span id="cellfun">[http://itp.tugraz.at/matlab/techdoc/ref/cellfun.html cellfun]</span><br />
| style="width:20%" | <span id="cellplot">[http://itp.tugraz.at/matlab/techdoc/ref/cellplot.html cellplot]</span><br />
| style="width:20%" | <span id="cellstr">[http://itp.tugraz.at/matlab/techdoc/ref/cellstr.html cellstr]</span><br />
| style="width:20%" | <span id="cgs">[http://itp.tugraz.at/matlab/techdoc/ref/cgs.html cgs]</span><br />
| style="width:20%" | <span id="char">[http://itp.tugraz.at/matlab/techdoc/ref/char.html char]</span><br />
|-<br />
| style="width:20%" | <span id="checkin">[http://itp.tugraz.at/matlab/techdoc/ref/checkin.html checkin]</span><br />
| style="width:20%" | <span id="checkout">[http://itp.tugraz.at/matlab/techdoc/ref/checkout.html checkout]</span><br />
| style="width:20%" | <span id="chol">[http://itp.tugraz.at/matlab/techdoc/ref/chol.html chol]</span><br />
| style="width:20%" | <span id="cholinc">[http://itp.tugraz.at/matlab/techdoc/ref/cholinc.html cholinc]</span><br />
| style="width:20%" | <span id="cholupdate">[http://itp.tugraz.at/matlab/techdoc/ref/cholupdate.html cholupdate]</span><br />
|-<br />
| style="width:20%" | <span id="circshift">[http://itp.tugraz.at/matlab/techdoc/ref/circshift.html circshift]</span><br />
| style="width:20%" | <span id="cla">[http://itp.tugraz.at/matlab/techdoc/ref/cla.html cla]</span><br />
| style="width:20%" | <span id="clabel">[http://itp.tugraz.at/matlab/techdoc/ref/clabel.html clabel]</span><br />
| style="width:20%" | <span id="class">[http://itp.tugraz.at/matlab/techdoc/ref/class.html class]</span><br />
| style="width:20%" | <span id="clc">[http://itp.tugraz.at/matlab/techdoc/ref/clc.html clc]</span><br />
|-<br />
| style="width:20%" | <span id="clear">[http://itp.tugraz.at/matlab/techdoc/ref/clear.html clear]</span><br />
| style="width:20%" | <span id="clf">[http://itp.tugraz.at/matlab/techdoc/ref/clf.html clf]</span><br />
| style="width:20%" | <span id="clipboard">[http://itp.tugraz.at/matlab/techdoc/ref/clipboard.html clipboard]</span><br />
| style="width:20%" | <span id="clock">[http://itp.tugraz.at/matlab/techdoc/ref/clock.html clock]</span><br />
| style="width:20%" | <span id="close">[http://itp.tugraz.at/matlab/techdoc/ref/close.html close]</span><br />
|-<br />
| style="width:20%" | <span id="closeavifile">[http://itp.tugraz.at/matlab/techdoc/ref/closeavifile.html closeavifile]</span><br />
| style="width:20%" | <span id="closereq">[http://itp.tugraz.at/matlab/techdoc/ref/closereq.html closereq]</span><br />
| style="width:20%" | <span id="cmopts">[http://itp.tugraz.at/matlab/techdoc/ref/cmopts.html cmopts]</span><br />
| style="width:20%" | <span id="colamd">[http://itp.tugraz.at/matlab/techdoc/ref/colamd.html colamd]</span><br />
| style="width:20%" | <span id="colmmd">[http://itp.tugraz.at/matlab/techdoc/ref/colmmd.html colmmd]</span><br />
|-<br />
| style="width:20%" | <span id="colorbar">[http://itp.tugraz.at/matlab/techdoc/ref/colorbar.html colorbar]</span><br />
| style="width:20%" | <span id="colordef">[http://itp.tugraz.at/matlab/techdoc/ref/colordef.html colordef]</span><br />
| style="width:20%" | <span id="colormap">[http://itp.tugraz.at/matlab/techdoc/ref/colormap.html colormap]</span><br />
| style="width:20%" | <span id="colormapeditor">[http://itp.tugraz.at/matlab/techdoc/ref/colormapeditor.html colormapeditor]</span><br />
| style="width:20%" | <span id="colorspec">[http://itp.tugraz.at/matlab/techdoc/ref/colorspec.html colorspec]</span><br />
|-<br />
| style="width:20%" | <span id="colperm">[http://itp.tugraz.at/matlab/techdoc/ref/colperm.html colperm]</span><br />
| style="width:20%" | <span id="comet">[http://itp.tugraz.at/matlab/techdoc/ref/comet.html comet]</span><br />
| style="width:20%" | <span id="comet3">[http://itp.tugraz.at/matlab/techdoc/ref/comet3.html comet3]</span><br />
| style="width:20%" | <span id="commandhistory">[http://itp.tugraz.at/matlab/techdoc/ref/commandhistory.html commandhistory]</span><br />
| style="width:20%" | <span id="commandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/commandwindow.html commandwindow]</span><br />
|-<br />
| style="width:20%" | <span id="compan">[http://itp.tugraz.at/matlab/techdoc/ref/compan.html compan]</span><br />
| style="width:20%" | <span id="compass">[http://itp.tugraz.at/matlab/techdoc/ref/compass.html compass]</span><br />
| style="width:20%" | <span id="complex">[http://itp.tugraz.at/matlab/techdoc/ref/complex.html complex]</span><br />
| style="width:20%" | <span id="computer">[http://itp.tugraz.at/matlab/techdoc/ref/computer.html computer]</span><br />
| style="width:20%" | <span id="cond">[http://itp.tugraz.at/matlab/techdoc/ref/cond.html cond]</span><br />
|-<br />
| style="width:20%" | <span id="condeig">[http://itp.tugraz.at/matlab/techdoc/ref/condeig.html condeig]</span><br />
| style="width:20%" | <span id="condest">[http://itp.tugraz.at/matlab/techdoc/ref/condest.html condest]</span><br />
| style="width:20%" | <span id="conj">[http://itp.tugraz.at/matlab/techdoc/ref/conj.html conj]</span><br />
| style="width:20%" | <span id="coneplot">[http://itp.tugraz.at/matlab/techdoc/ref/coneplot.html coneplot]</span><br />
| style="width:20%" | <span id="continue">[http://itp.tugraz.at/matlab/techdoc/ref/continue.html continue]</span><br />
|-<br />
| style="width:20%" | <span id="contour">[http://itp.tugraz.at/matlab/techdoc/ref/contour.html contour]</span><br />
| style="width:20%" | <span id="contour3">[http://itp.tugraz.at/matlab/techdoc/ref/contour3.html contour3]</span><br />
| style="width:20%" | <span id="contourc">[http://itp.tugraz.at/matlab/techdoc/ref/contourc.html contourc]</span><br />
| style="width:20%" | <span id="contourf">[http://itp.tugraz.at/matlab/techdoc/ref/contourf.html contourf]</span><br />
| style="width:20%" | <span id="contourgroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/contourgroupproperties.html contourgroupproperties]</span><br />
|-<br />
| style="width:20%" | <span id="contourslice">[http://itp.tugraz.at/matlab/techdoc/ref/contourslice.html contourslice]</span><br />
| style="width:20%" | <span id="contrast">[http://itp.tugraz.at/matlab/techdoc/ref/contrast.html contrast]</span><br />
| style="width:20%" | <span id="conv">[http://itp.tugraz.at/matlab/techdoc/ref/conv.html conv]</span><br />
| style="width:20%" | <span id="conv2">[http://itp.tugraz.at/matlab/techdoc/ref/conv2.html conv2]</span><br />
| style="width:20%" | <span id="convhull">[http://itp.tugraz.at/matlab/techdoc/ref/convhull.html convhull]</span><br />
|-<br />
| style="width:20%" | <span id="convhulln">[http://itp.tugraz.at/matlab/techdoc/ref/convhulln.html convhulln]</span><br />
| style="width:20%" | <span id="convn">[http://itp.tugraz.at/matlab/techdoc/ref/convn.html convn]</span><br />
| style="width:20%" | <span id="copyfile">[http://itp.tugraz.at/matlab/techdoc/ref/copyfile.html copyfile]</span><br />
| style="width:20%" | <span id="copyobj">[http://itp.tugraz.at/matlab/techdoc/ref/copyobj.html copyobj]</span><br />
| style="width:20%" | <span id="corrcoef">[http://itp.tugraz.at/matlab/techdoc/ref/corrcoef.html corrcoef]</span><br />
|-<br />
| style="width:20%" | <span id="cos">[http://itp.tugraz.at/matlab/techdoc/ref/cos.html cos]</span><br />
| style="width:20%" | <span id="cosd">[http://itp.tugraz.at/matlab/techdoc/ref/cosd.html cosd]</span><br />
| style="width:20%" | <span id="cosh">[http://itp.tugraz.at/matlab/techdoc/ref/cosh.html cosh]</span><br />
| style="width:20%" | <span id="cot">[http://itp.tugraz.at/matlab/techdoc/ref/cot.html cot]</span><br />
| style="width:20%" | <span id="cotd">[http://itp.tugraz.at/matlab/techdoc/ref/cotd.html cotd]</span><br />
|-<br />
| style="width:20%" | <span id="coth">[http://itp.tugraz.at/matlab/techdoc/ref/coth.html coth]</span><br />
| style="width:20%" | <span id="cov">[http://itp.tugraz.at/matlab/techdoc/ref/cov.html cov]</span><br />
| style="width:20%" | <span id="cplxpair">[http://itp.tugraz.at/matlab/techdoc/ref/cplxpair.html cplxpair]</span><br />
| style="width:20%" | <span id="cputime">[http://itp.tugraz.at/matlab/techdoc/ref/cputime.html cputime]</span><br />
| style="width:20%" | <span id="createclassfromwsdl">[http://itp.tugraz.at/matlab/techdoc/ref/createclassfromwsdl.html createclassfromwsdl]</span><br />
|-<br />
| style="width:20%" | <span id="createcopyinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/createcopyinputparser.html createcopyinputparser]</span><br />
| style="width:20%" | <span id="createsoapmessage">[http://itp.tugraz.at/matlab/techdoc/ref/createsoapmessage.html createsoapmessage]</span><br />
| style="width:20%" | <span id="cross">[http://itp.tugraz.at/matlab/techdoc/ref/cross.html cross]</span><br />
| style="width:20%" | <span id="csc">[http://itp.tugraz.at/matlab/techdoc/ref/csc.html csc]</span><br />
| style="width:20%" | <span id="cscd">[http://itp.tugraz.at/matlab/techdoc/ref/cscd.html cscd]</span><br />
|-<br />
| style="width:20%" | <span id="csch">[http://itp.tugraz.at/matlab/techdoc/ref/csch.html csch]</span><br />
| style="width:20%" | <span id="csvread">[http://itp.tugraz.at/matlab/techdoc/ref/csvread.html csvread]</span><br />
| style="width:20%" | <span id="csvwrite">[http://itp.tugraz.at/matlab/techdoc/ref/csvwrite.html csvwrite]</span><br />
| style="width:20%" | <span id="ctransposetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/ctransposetimeseries.html ctransposetimeseries]</span><br />
| style="width:20%" | <span id="cumprod">[http://itp.tugraz.at/matlab/techdoc/ref/cumprod.html cumprod]</span><br />
|-<br />
| style="width:20%" | <span id="cumsum">[http://itp.tugraz.at/matlab/techdoc/ref/cumsum.html cumsum]</span><br />
| style="width:20%" | <span id="cumtrapz">[http://itp.tugraz.at/matlab/techdoc/ref/cumtrapz.html cumtrapz]</span><br />
| style="width:20%" | <span id="curl">[http://itp.tugraz.at/matlab/techdoc/ref/curl.html curl]</span><br />
| style="width:20%" | <span id="customverctrl">[http://itp.tugraz.at/matlab/techdoc/ref/customverctrl.html customverctrl]</span><br />
| style="width:20%" | <span id="cylinder">[http://itp.tugraz.at/matlab/techdoc/ref/cylinder.html cylinder]</span><br />
|-<br />
| style="width:20%" | <span id="com.delete">[http://itp.tugraz.at/matlab/techdoc/ref/com.delete.html com.delete]</span><br />
| style="width:20%" | <span id="com.feval">[http://itp.tugraz.at/matlab/techdoc/ref/com.feval.html com.feval]</span><br />
| style="width:20%" | <span id="com.get">[http://itp.tugraz.at/matlab/techdoc/ref/com.get.html com.get]</span><br />
| style="width:20%" | <span id="com.load">[http://itp.tugraz.at/matlab/techdoc/ref/com.load.html com.load]</span><br />
| style="width:20%" | <span id="com.propedit">[http://itp.tugraz.at/matlab/techdoc/ref/com.propedit.html com.propedit]</span><br />
|-<br />
| style="width:20%" | <span id="com.quit">[http://itp.tugraz.at/matlab/techdoc/ref/com.quit.html com.quit]</span><br />
| style="width:20%" | <span id="com.save">[http://itp.tugraz.at/matlab/techdoc/ref/com.save.html com.save]</span><br />
| style="width:20%" | <span id="com.set">[http://itp.tugraz.at/matlab/techdoc/ref/com.set.html com.set]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= d =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="daqread">[http://itp.tugraz.at/matlab/techdoc/ref/daqread.html daqread]</span><br />
| style="width:20%" | <span id="daspect">[http://itp.tugraz.at/matlab/techdoc/ref/daspect.html daspect]</span><br />
| style="width:20%" | <span id="datacursormode">[http://itp.tugraz.at/matlab/techdoc/ref/datacursormode.html datacursormode]</span><br />
| style="width:20%" | <span id="datatipinfo">[http://itp.tugraz.at/matlab/techdoc/ref/datatipinfo.html datatipinfo]</span><br />
| style="width:20%" | <span id="date">[http://itp.tugraz.at/matlab/techdoc/ref/date.html date]</span><br />
|-<br />
| style="width:20%" | <span id="datenum">[http://itp.tugraz.at/matlab/techdoc/ref/datenum.html datenum]</span><br />
| style="width:20%" | <span id="datestr">[http://itp.tugraz.at/matlab/techdoc/ref/datestr.html datestr]</span><br />
| style="width:20%" | <span id="datetick">[http://itp.tugraz.at/matlab/techdoc/ref/datetick.html datetick]</span><br />
| style="width:20%" | <span id="datevec">[http://itp.tugraz.at/matlab/techdoc/ref/datevec.html datevec]</span><br />
| style="width:20%" | <span id="dbclear">[http://itp.tugraz.at/matlab/techdoc/ref/dbclear.html dbclear]</span><br />
|-<br />
| style="width:20%" | <span id="dbcont">[http://itp.tugraz.at/matlab/techdoc/ref/dbcont.html dbcont]</span><br />
| style="width:20%" | <span id="dbdown">[http://itp.tugraz.at/matlab/techdoc/ref/dbdown.html dbdown]</span><br />
| style="width:20%" | <span id="dblquad">[http://itp.tugraz.at/matlab/techdoc/ref/dblquad.html dblquad]</span><br />
| style="width:20%" | <span id="dbmex">[http://itp.tugraz.at/matlab/techdoc/ref/dbmex.html dbmex]</span><br />
| style="width:20%" | <span id="dbquit">[http://itp.tugraz.at/matlab/techdoc/ref/dbquit.html dbquit]</span><br />
|-<br />
| style="width:20%" | <span id="dbstack">[http://itp.tugraz.at/matlab/techdoc/ref/dbstack.html dbstack]</span><br />
| style="width:20%" | <span id="dbstatus">[http://itp.tugraz.at/matlab/techdoc/ref/dbstatus.html dbstatus]</span><br />
| style="width:20%" | <span id="dbstep">[http://itp.tugraz.at/matlab/techdoc/ref/dbstep.html dbstep]</span><br />
| style="width:20%" | <span id="dbstop">[http://itp.tugraz.at/matlab/techdoc/ref/dbstop.html dbstop]</span><br />
| style="width:20%" | <span id="dbtype">[http://itp.tugraz.at/matlab/techdoc/ref/dbtype.html dbtype]</span><br />
|-<br />
| style="width:20%" | <span id="dbup">[http://itp.tugraz.at/matlab/techdoc/ref/dbup.html dbup]</span><br />
| style="width:20%" | <span id="dde23">[http://itp.tugraz.at/matlab/techdoc/ref/dde23.html dde23]</span><br />
| style="width:20%" | <span id="ddeadv">[http://itp.tugraz.at/matlab/techdoc/ref/ddeadv.html ddeadv]</span><br />
| style="width:20%" | <span id="ddeexec">[http://itp.tugraz.at/matlab/techdoc/ref/ddeexec.html ddeexec]</span><br />
| style="width:20%" | <span id="ddeget">[http://itp.tugraz.at/matlab/techdoc/ref/ddeget.html ddeget]</span><br />
|-<br />
| style="width:20%" | <span id="ddeinit">[http://itp.tugraz.at/matlab/techdoc/ref/ddeinit.html ddeinit]</span><br />
| style="width:20%" | <span id="ddepoke">[http://itp.tugraz.at/matlab/techdoc/ref/ddepoke.html ddepoke]</span><br />
| style="width:20%" | <span id="ddereq">[http://itp.tugraz.at/matlab/techdoc/ref/ddereq.html ddereq]</span><br />
| style="width:20%" | <span id="ddesd">[http://itp.tugraz.at/matlab/techdoc/ref/ddesd.html ddesd]</span><br />
| style="width:20%" | <span id="ddeset">[http://itp.tugraz.at/matlab/techdoc/ref/ddeset.html ddeset]</span><br />
|-<br />
| style="width:20%" | <span id="ddeterm">[http://itp.tugraz.at/matlab/techdoc/ref/ddeterm.html ddeterm]</span><br />
| style="width:20%" | <span id="ddeunadv">[http://itp.tugraz.at/matlab/techdoc/ref/ddeunadv.html ddeunadv]</span><br />
| style="width:20%" | <span id="deal">[http://itp.tugraz.at/matlab/techdoc/ref/deal.html deal]</span><br />
| style="width:20%" | <span id="deblank">[http://itp.tugraz.at/matlab/techdoc/ref/deblank.html deblank]</span><br />
| style="width:20%" | <span id="debug">[http://itp.tugraz.at/matlab/techdoc/ref/debug.html debug]</span><br />
|-<br />
| style="width:20%" | <span id="dec2base">[http://itp.tugraz.at/matlab/techdoc/ref/dec2base.html dec2base]</span><br />
| style="width:20%" | <span id="dec2bin">[http://itp.tugraz.at/matlab/techdoc/ref/dec2bin.html dec2bin]</span><br />
| style="width:20%" | <span id="dec2hex">[http://itp.tugraz.at/matlab/techdoc/ref/dec2hex.html dec2hex]</span><br />
| style="width:20%" | <span id="decic">[http://itp.tugraz.at/matlab/techdoc/ref/decic.html decic]</span><br />
| style="width:20%" | <span id="deconv">[http://itp.tugraz.at/matlab/techdoc/ref/deconv.html deconv]</span><br />
|-<br />
| style="width:20%" | <span id="del2">[http://itp.tugraz.at/matlab/techdoc/ref/del2.html del2]</span><br />
| style="width:20%" | <span id="delaunay">[http://itp.tugraz.at/matlab/techdoc/ref/delaunay.html delaunay]</span><br />
| style="width:20%" | <span id="delaunay3">[http://itp.tugraz.at/matlab/techdoc/ref/delaunay3.html delaunay3]</span><br />
| style="width:20%" | <span id="delaunayn">[http://itp.tugraz.at/matlab/techdoc/ref/delaunayn.html delaunayn]</span><br />
| style="width:20%" | <span id="delete">[http://itp.tugraz.at/matlab/techdoc/ref/delete.html delete]</span><br />
|-<br />
| style="width:20%" | <span id="deletetimer">[http://itp.tugraz.at/matlab/techdoc/ref/deletetimer.html deletetimer]</span><br />
| style="width:20%" | <span id="deleteproperty">[http://itp.tugraz.at/matlab/techdoc/ref/deleteproperty.html deleteproperty]</span><br />
| style="width:20%" | <span id="delevent">[http://itp.tugraz.at/matlab/techdoc/ref/delevent.html delevent]</span><br />
| style="width:20%" | <span id="delsample">[http://itp.tugraz.at/matlab/techdoc/ref/delsample.html delsample]</span><br />
| style="width:20%" | <span id="delsamplefromcollection">[http://itp.tugraz.at/matlab/techdoc/ref/delsamplefromcollection.html delsamplefromcollection]</span><br />
|-<br />
| style="width:20%" | <span id="demo">[http://itp.tugraz.at/matlab/techdoc/ref/demo.html demo]</span><br />
| style="width:20%" | <span id="depdir">[http://itp.tugraz.at/matlab/techdoc/ref/depdir.html depdir]</span><br />
| style="width:20%" | <span id="depfun">[http://itp.tugraz.at/matlab/techdoc/ref/depfun.html depfun]</span><br />
| style="width:20%" | <span id="det">[http://itp.tugraz.at/matlab/techdoc/ref/det.html det]</span><br />
| style="width:20%" | <span id="detrend">[http://itp.tugraz.at/matlab/techdoc/ref/detrend.html detrend]</span><br />
|-<br />
| style="width:20%" | <span id="detrendtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/detrendtimeseries.html detrendtimeseries]</span><br />
| style="width:20%" | <span id="deval">[http://itp.tugraz.at/matlab/techdoc/ref/deval.html deval]</span><br />
| style="width:20%" | <span id="diag">[http://itp.tugraz.at/matlab/techdoc/ref/diag.html diag]</span><br />
| style="width:20%" | <span id="dialog">[http://itp.tugraz.at/matlab/techdoc/ref/dialog.html dialog]</span><br />
| style="width:20%" | <span id="diary">[http://itp.tugraz.at/matlab/techdoc/ref/diary.html diary]</span><br />
|-<br />
| style="width:20%" | <span id="diff">[http://itp.tugraz.at/matlab/techdoc/ref/diff.html diff]</span><br />
| style="width:20%" | <span id="diffuse">[http://itp.tugraz.at/matlab/techdoc/ref/diffuse.html diffuse]</span><br />
| style="width:20%" | <span id="dir">[http://itp.tugraz.at/matlab/techdoc/ref/dir.html dir]</span><br />
| style="width:20%" | <span id="disp">[http://itp.tugraz.at/matlab/techdoc/ref/disp.html disp]</span><br />
| style="width:20%" | <span id="dispmemmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/dispmemmapfile.html dispmemmapfile]</span><br />
|-<br />
| style="width:20%" | <span id="dispmexception">[http://itp.tugraz.at/matlab/techdoc/ref/dispmexception.html dispmexception]</span><br />
| style="width:20%" | <span id="disptimer">[http://itp.tugraz.at/matlab/techdoc/ref/disptimer.html disptimer]</span><br />
| style="width:20%" | <span id="display">[http://itp.tugraz.at/matlab/techdoc/ref/display.html display]</span><br />
| style="width:20%" | <span id="divergence">[http://itp.tugraz.at/matlab/techdoc/ref/divergence.html divergence]</span><br />
| style="width:20%" | <span id="dlmread">[http://itp.tugraz.at/matlab/techdoc/ref/dlmread.html dlmread]</span><br />
|-<br />
| style="width:20%" | <span id="dlmwrite">[http://itp.tugraz.at/matlab/techdoc/ref/dlmwrite.html dlmwrite]</span><br />
| style="width:20%" | <span id="dmperm">[http://itp.tugraz.at/matlab/techdoc/ref/dmperm.html dmperm]</span><br />
| style="width:20%" | <span id="doc">[http://itp.tugraz.at/matlab/techdoc/ref/doc.html doc]</span><br />
| style="width:20%" | <span id="docopt">[http://itp.tugraz.at/matlab/techdoc/ref/docopt.html docopt]</span><br />
| style="width:20%" | <span id="docsearch">[http://itp.tugraz.at/matlab/techdoc/ref/docsearch.html docsearch]</span><br />
|-<br />
| style="width:20%" | <span id="dos">[http://itp.tugraz.at/matlab/techdoc/ref/dos.html dos]</span><br />
| style="width:20%" | <span id="dot">[http://itp.tugraz.at/matlab/techdoc/ref/dot.html dot]</span><br />
| style="width:20%" | <span id="double">[http://itp.tugraz.at/matlab/techdoc/ref/double.html double]</span><br />
| style="width:20%" | <span id="dragrect">[http://itp.tugraz.at/matlab/techdoc/ref/dragrect.html dragrect]</span><br />
| style="width:20%" | <span id="drawnow">[http://itp.tugraz.at/matlab/techdoc/ref/drawnow.html drawnow]</span><br />
|-<br />
| style="width:20%" | <span id="dsearch">[http://itp.tugraz.at/matlab/techdoc/ref/dsearch.html dsearch]</span><br />
| style="width:20%" | <span id="dsearchn">[http://itp.tugraz.at/matlab/techdoc/ref/dsearchn.html dsearchn]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= e =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="echo">[http://itp.tugraz.at/matlab/techdoc/ref/echo.html echo]</span><br />
| style="width:20%" | <span id="echodemo">[http://itp.tugraz.at/matlab/techdoc/ref/echodemo.html echodemo]</span><br />
| style="width:20%" | <span id="edit">[http://itp.tugraz.at/matlab/techdoc/ref/edit.html edit]</span><br />
| style="width:20%" | <span id="eig">[http://itp.tugraz.at/matlab/techdoc/ref/eig.html eig]</span><br />
| style="width:20%" | <span id="eigs">[http://itp.tugraz.at/matlab/techdoc/ref/eigs.html eigs]</span><br />
|-<br />
| style="width:20%" | <span id="ellipj">[http://itp.tugraz.at/matlab/techdoc/ref/ellipj.html ellipj]</span><br />
| style="width:20%" | <span id="ellipke">[http://itp.tugraz.at/matlab/techdoc/ref/ellipke.html ellipke]</span><br />
| style="width:20%" | <span id="ellipsoid">[http://itp.tugraz.at/matlab/techdoc/ref/ellipsoid.html ellipsoid]</span><br />
| style="width:20%" | <span id="else">[http://itp.tugraz.at/matlab/techdoc/ref/else.html else]</span><br />
| style="width:20%" | <span id="elseif">[http://itp.tugraz.at/matlab/techdoc/ref/elseif.html elseif]</span><br />
|-<br />
| style="width:20%" | <span id="enableservice">[http://itp.tugraz.at/matlab/techdoc/ref/enableservice.html enableservice]</span><br />
| style="width:20%" | <span id="end">[http://itp.tugraz.at/matlab/techdoc/ref/end.html end]</span><br />
| style="width:20%" | <span id="eomday">[http://itp.tugraz.at/matlab/techdoc/ref/eomday.html eomday]</span><br />
| style="width:20%" | <span id="eps">[http://itp.tugraz.at/matlab/techdoc/ref/eps.html eps]</span><br />
| style="width:20%" | <span id="eq">[http://itp.tugraz.at/matlab/techdoc/ref/eq.html eq]</span><br />
|-<br />
| style="width:20%" | <span id="eqmexception">[http://itp.tugraz.at/matlab/techdoc/ref/eqmexception.html eqmexception]</span><br />
| style="width:20%" | <span id="erf">[http://itp.tugraz.at/matlab/techdoc/ref/erf.html erf]</span><br />
| style="width:20%" | <span id="erfc">[http://itp.tugraz.at/matlab/techdoc/ref/erfc.html erfc]</span><br />
| style="width:20%" | <span id="erfcx">[http://itp.tugraz.at/matlab/techdoc/ref/erfcx.html erfcx]</span><br />
| style="width:20%" | <span id="erfinv">[http://itp.tugraz.at/matlab/techdoc/ref/erfinv.html erfinv]</span><br />
|-<br />
| style="width:20%" | <span id="erfcinv">[http://itp.tugraz.at/matlab/techdoc/ref/erfcinv.html erfcinv]</span><br />
| style="width:20%" | <span id="error">[http://itp.tugraz.at/matlab/techdoc/ref/error.html error]</span><br />
| style="width:20%" | <span id="errorbar">[http://itp.tugraz.at/matlab/techdoc/ref/errorbar.html errorbar]</span><br />
| style="width:20%" | <span id="errorbarseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/errorbarseriesproperties.html errorbarseriesproperties]</span><br />
| style="width:20%" | <span id="errordlg">[http://itp.tugraz.at/matlab/techdoc/ref/errordlg.html errordlg]</span><br />
|-<br />
| style="width:20%" | <span id="etime">[http://itp.tugraz.at/matlab/techdoc/ref/etime.html etime]</span><br />
| style="width:20%" | <span id="etree">[http://itp.tugraz.at/matlab/techdoc/ref/etree.html etree]</span><br />
| style="width:20%" | <span id="etreeplot">[http://itp.tugraz.at/matlab/techdoc/ref/etreeplot.html etreeplot]</span><br />
| style="width:20%" | <span id="eval">[http://itp.tugraz.at/matlab/techdoc/ref/eval.html eval]</span><br />
| style="width:20%" | <span id="evalc">[http://itp.tugraz.at/matlab/techdoc/ref/evalc.html evalc]</span><br />
|-<br />
| style="width:20%" | <span id="evalin">[http://itp.tugraz.at/matlab/techdoc/ref/evalin.html evalin]</span><br />
| style="width:20%" | <span id="eventlisteners">[http://itp.tugraz.at/matlab/techdoc/ref/eventlisteners.html eventlisteners]</span><br />
| style="width:20%" | <span id="events">[http://itp.tugraz.at/matlab/techdoc/ref/events.html events]</span><br />
| style="width:20%" | <span id="execute">[http://itp.tugraz.at/matlab/techdoc/ref/execute.html execute]</span><br />
| style="width:20%" | <span id="exifread">[http://itp.tugraz.at/matlab/techdoc/ref/exifread.html exifread]</span><br />
|-<br />
| style="width:20%" | <span id="exist">[http://itp.tugraz.at/matlab/techdoc/ref/exist.html exist]</span><br />
| style="width:20%" | <span id="exit">[http://itp.tugraz.at/matlab/techdoc/ref/exit.html exit]</span><br />
| style="width:20%" | <span id="exp">[http://itp.tugraz.at/matlab/techdoc/ref/exp.html exp]</span><br />
| style="width:20%" | <span id="expint">[http://itp.tugraz.at/matlab/techdoc/ref/expint.html expint]</span><br />
| style="width:20%" | <span id="expm">[http://itp.tugraz.at/matlab/techdoc/ref/expm.html expm]</span><br />
|-<br />
| style="width:20%" | <span id="expm1">[http://itp.tugraz.at/matlab/techdoc/ref/expm1.html expm1]</span><br />
| style="width:20%" | <span id="export2wsdlg">[http://itp.tugraz.at/matlab/techdoc/ref/export2wsdlg.html export2wsdlg]</span><br />
| style="width:20%" | <span id="eye">[http://itp.tugraz.at/matlab/techdoc/ref/eye.html eye]</span><br />
| style="width:20%" | <span id="ezcontour">[http://itp.tugraz.at/matlab/techdoc/ref/ezcontour.html ezcontour]</span><br />
| style="width:20%" | <span id="ezcontourf">[http://itp.tugraz.at/matlab/techdoc/ref/ezcontourf.html ezcontourf]</span><br />
|-<br />
| style="width:20%" | <span id="ezmesh">[http://itp.tugraz.at/matlab/techdoc/ref/ezmesh.html ezmesh]</span><br />
| style="width:20%" | <span id="ezmeshc">[http://itp.tugraz.at/matlab/techdoc/ref/ezmeshc.html ezmeshc]</span><br />
| style="width:20%" | <span id="ezplot">[http://itp.tugraz.at/matlab/techdoc/ref/ezplot.html ezplot]</span><br />
| style="width:20%" | <span id="ezplot3">[http://itp.tugraz.at/matlab/techdoc/ref/ezplot3.html ezplot3]</span><br />
| style="width:20%" | <span id="ezpolar">[http://itp.tugraz.at/matlab/techdoc/ref/ezpolar.html ezpolar]</span><br />
|-<br />
| style="width:20%" | <span id="ezsurf">[http://itp.tugraz.at/matlab/techdoc/ref/ezsurf.html ezsurf]</span><br />
| style="width:20%" | <span id="ezsurfc">[http://itp.tugraz.at/matlab/techdoc/ref/ezsurfc.html ezsurfc]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= f =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="f16-6011">[http://itp.tugraz.at/matlab/techdoc/ref/f16-6011.html f16-6011]</span><br />
| style="width:20%" | <span id="ftp.cd">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.cd.html ftp.cd]</span><br />
| style="width:20%" | <span id="ftp.close">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.close.html ftp.close]</span><br />
| style="width:20%" | <span id="ftp.delete">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.delete.html ftp.delete]</span><br />
| style="width:20%" | <span id="ftp.dir">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.dir.html ftp.dir]</span><br />
|-<br />
| style="width:20%" | <span id="factor">[http://itp.tugraz.at/matlab/techdoc/ref/factor.html factor]</span><br />
| style="width:20%" | <span id="factorial">[http://itp.tugraz.at/matlab/techdoc/ref/factorial.html factorial]</span><br />
| style="width:20%" | <span id="false">[http://itp.tugraz.at/matlab/techdoc/ref/false.html false]</span><br />
| style="width:20%" | <span id="fclose">[http://itp.tugraz.at/matlab/techdoc/ref/fclose.html fclose]</span><br />
| style="width:20%" | <span id="feather">[http://itp.tugraz.at/matlab/techdoc/ref/feather.html feather]</span><br />
|-<br />
| style="width:20%" | <span id="feof">[http://itp.tugraz.at/matlab/techdoc/ref/feof.html feof]</span><br />
| style="width:20%" | <span id="ferror">[http://itp.tugraz.at/matlab/techdoc/ref/ferror.html ferror]</span><br />
| style="width:20%" | <span id="feval">[http://itp.tugraz.at/matlab/techdoc/ref/feval.html feval]</span><br />
| style="width:20%" | <span id="fft">[http://itp.tugraz.at/matlab/techdoc/ref/fft.html fft]</span><br />
| style="width:20%" | <span id="fft2">[http://itp.tugraz.at/matlab/techdoc/ref/fft2.html fft2]</span><br />
|-<br />
| style="width:20%" | <span id="fftn">[http://itp.tugraz.at/matlab/techdoc/ref/fftn.html fftn]</span><br />
| style="width:20%" | <span id="fftshift">[http://itp.tugraz.at/matlab/techdoc/ref/fftshift.html fftshift]</span><br />
| style="width:20%" | <span id="fftw">[http://itp.tugraz.at/matlab/techdoc/ref/fftw.html fftw]</span><br />
| style="width:20%" | <span id="fgetl">[http://itp.tugraz.at/matlab/techdoc/ref/fgetl.html fgetl]</span><br />
| style="width:20%" | <span id="fgets">[http://itp.tugraz.at/matlab/techdoc/ref/fgets.html fgets]</span><br />
|-<br />
| style="width:20%" | <span id="fieldnames">[http://itp.tugraz.at/matlab/techdoc/ref/fieldnames.html fieldnames]</span><br />
| style="width:20%" | <span id="figure">[http://itp.tugraz.at/matlab/techdoc/ref/figure.html figure]</span><br />
| style="width:20%" | <span id="figure_props">[http://itp.tugraz.at/matlab/techdoc/ref/figure_props.html figure_props]</span><br />
| style="width:20%" | <span id="figurepalette">[http://itp.tugraz.at/matlab/techdoc/ref/figurepalette.html figurepalette]</span><br />
| style="width:20%" | <span id="fileattrib">[http://itp.tugraz.at/matlab/techdoc/ref/fileattrib.html fileattrib]</span><br />
|-<br />
| style="width:20%" | <span id="filebrowser">[http://itp.tugraz.at/matlab/techdoc/ref/filebrowser.html filebrowser]</span><br />
| style="width:20%" | <span id="fileformats">[http://itp.tugraz.at/matlab/techdoc/ref/fileformats.html fileformats]</span><br />
| style="width:20%" | <span id="filemarker">[http://itp.tugraz.at/matlab/techdoc/ref/filemarker.html filemarker]</span><br />
| style="width:20%" | <span id="fileparts">[http://itp.tugraz.at/matlab/techdoc/ref/fileparts.html fileparts]</span><br />
| style="width:20%" | <span id="filehandle">[http://itp.tugraz.at/matlab/techdoc/ref/filehandle.html filehandle]</span><br />
|-<br />
| style="width:20%" | <span id="filesep">[http://itp.tugraz.at/matlab/techdoc/ref/filesep.html filesep]</span><br />
| style="width:20%" | <span id="fill">[http://itp.tugraz.at/matlab/techdoc/ref/fill.html fill]</span><br />
| style="width:20%" | <span id="fill3">[http://itp.tugraz.at/matlab/techdoc/ref/fill3.html fill3]</span><br />
| style="width:20%" | <span id="filter">[http://itp.tugraz.at/matlab/techdoc/ref/filter.html filter]</span><br />
| style="width:20%" | <span id="filtertimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/filtertimeseries.html filtertimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="filter2">[http://itp.tugraz.at/matlab/techdoc/ref/filter2.html filter2]</span><br />
| style="width:20%" | <span id="find">[http://itp.tugraz.at/matlab/techdoc/ref/find.html find]</span><br />
| style="width:20%" | <span id="findall">[http://itp.tugraz.at/matlab/techdoc/ref/findall.html findall]</span><br />
| style="width:20%" | <span id="findfigs">[http://itp.tugraz.at/matlab/techdoc/ref/findfigs.html findfigs]</span><br />
| style="width:20%" | <span id="findobj">[http://itp.tugraz.at/matlab/techdoc/ref/findobj.html findobj]</span><br />
|-<br />
| style="width:20%" | <span id="findstr">[http://itp.tugraz.at/matlab/techdoc/ref/findstr.html findstr]</span><br />
| style="width:20%" | <span id="finish">[http://itp.tugraz.at/matlab/techdoc/ref/finish.html finish]</span><br />
| style="width:20%" | <span id="fitsinfo">[http://itp.tugraz.at/matlab/techdoc/ref/fitsinfo.html fitsinfo]</span><br />
| style="width:20%" | <span id="fitsread">[http://itp.tugraz.at/matlab/techdoc/ref/fitsread.html fitsread]</span><br />
| style="width:20%" | <span id="fix">[http://itp.tugraz.at/matlab/techdoc/ref/fix.html fix]</span><br />
|-<br />
| style="width:20%" | <span id="flipdim">[http://itp.tugraz.at/matlab/techdoc/ref/flipdim.html flipdim]</span><br />
| style="width:20%" | <span id="fliplr">[http://itp.tugraz.at/matlab/techdoc/ref/fliplr.html fliplr]</span><br />
| style="width:20%" | <span id="flipud">[http://itp.tugraz.at/matlab/techdoc/ref/flipud.html flipud]</span><br />
| style="width:20%" | <span id="floor">[http://itp.tugraz.at/matlab/techdoc/ref/floor.html floor]</span><br />
| style="width:20%" | <span id="flops">[http://itp.tugraz.at/matlab/techdoc/ref/flops.html flops]</span><br />
|-<br />
| style="width:20%" | <span id="flow">[http://itp.tugraz.at/matlab/techdoc/ref/flow.html flow]</span><br />
| style="width:20%" | <span id="fminbnd">[http://itp.tugraz.at/matlab/techdoc/ref/fminbnd.html fminbnd]</span><br />
| style="width:20%" | <span id="fminsearch">[http://itp.tugraz.at/matlab/techdoc/ref/fminsearch.html fminsearch]</span><br />
| style="width:20%" | <span id="fopen">[http://itp.tugraz.at/matlab/techdoc/ref/fopen.html fopen]</span><br />
| style="width:20%" | <span id="for">[http://itp.tugraz.at/matlab/techdoc/ref/for.html for]</span><br />
|-<br />
| style="width:20%" | <span id="format">[http://itp.tugraz.at/matlab/techdoc/ref/format.html format]</span><br />
| style="width:20%" | <span id="fplot">[http://itp.tugraz.at/matlab/techdoc/ref/fplot.html fplot]</span><br />
| style="width:20%" | <span id="fprintf">[http://itp.tugraz.at/matlab/techdoc/ref/fprintf.html fprintf]</span><br />
| style="width:20%" | <span id="frame2im">[http://itp.tugraz.at/matlab/techdoc/ref/frame2im.html frame2im]</span><br />
| style="width:20%" | <span id="frameedit">[http://itp.tugraz.at/matlab/techdoc/ref/frameedit.html frameedit]</span><br />
|-<br />
| style="width:20%" | <span id="fread">[http://itp.tugraz.at/matlab/techdoc/ref/fread.html fread]</span><br />
| style="width:20%" | <span id="freqspace">[http://itp.tugraz.at/matlab/techdoc/ref/freqspace.html freqspace]</span><br />
| style="width:20%" | <span id="frewind">[http://itp.tugraz.at/matlab/techdoc/ref/frewind.html frewind]</span><br />
| style="width:20%" | <span id="fscanf">[http://itp.tugraz.at/matlab/techdoc/ref/fscanf.html fscanf]</span><br />
| style="width:20%" | <span id="fseek">[http://itp.tugraz.at/matlab/techdoc/ref/fseek.html fseek]</span><br />
|-<br />
| style="width:20%" | <span id="ftell">[http://itp.tugraz.at/matlab/techdoc/ref/ftell.html ftell]</span><br />
| style="width:20%" | <span id="ftp">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.html ftp]</span><br />
| style="width:20%" | <span id="full">[http://itp.tugraz.at/matlab/techdoc/ref/full.html full]</span><br />
| style="width:20%" | <span id="fullfile">[http://itp.tugraz.at/matlab/techdoc/ref/fullfile.html fullfile]</span><br />
| style="width:20%" | <span id="funm">[http://itp.tugraz.at/matlab/techdoc/ref/funm.html funm]</span><br />
|-<br />
| style="width:20%" | <span id="fwrite">[http://itp.tugraz.at/matlab/techdoc/ref/fwrite.html fwrite]</span><br />
| style="width:20%" | <span id="fzero">[http://itp.tugraz.at/matlab/techdoc/ref/fzero.html fzero]</span><br />
| style="width:20%" | <span id="ftp.mkdir">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.mkdir.html ftp.mkdir]</span><br />
| style="width:20%" | <span id="ftp.rmdir">[http://itp.tugraz.at/matlab/techdoc/ref/ftp.rmdir.html ftp.rmdir]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= g =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="gallery">[http://itp.tugraz.at/matlab/techdoc/ref/gallery.html gallery]</span><br />
| style="width:20%" | <span id="gamma">[http://itp.tugraz.at/matlab/techdoc/ref/gamma.html gamma]</span><br />
| style="width:20%" | <span id="gammainc">[http://itp.tugraz.at/matlab/techdoc/ref/gammainc.html gammainc]</span><br />
| style="width:20%" | <span id="gammaln">[http://itp.tugraz.at/matlab/techdoc/ref/gammaln.html gammaln]</span><br />
| style="width:20%" | <span id="gca">[http://itp.tugraz.at/matlab/techdoc/ref/gca.html gca]</span><br />
|-<br />
| style="width:20%" | <span id="gcbf">[http://itp.tugraz.at/matlab/techdoc/ref/gcbf.html gcbf]</span><br />
| style="width:20%" | <span id="gcbo">[http://itp.tugraz.at/matlab/techdoc/ref/gcbo.html gcbo]</span><br />
| style="width:20%" | <span id="gcd">[http://itp.tugraz.at/matlab/techdoc/ref/gcd.html gcd]</span><br />
| style="width:20%" | <span id="gcf">[http://itp.tugraz.at/matlab/techdoc/ref/gcf.html gcf]</span><br />
| style="width:20%" | <span id="gco">[http://itp.tugraz.at/matlab/techdoc/ref/gco.html gco]</span><br />
|-<br />
| style="width:20%" | <span id="ge">[http://itp.tugraz.at/matlab/techdoc/ref/ge.html ge]</span><br />
| style="width:20%" | <span id="genpath">[http://itp.tugraz.at/matlab/techdoc/ref/genpath.html genpath]</span><br />
| style="width:20%" | <span id="genvarname">[http://itp.tugraz.at/matlab/techdoc/ref/genvarname.html genvarname]</span><br />
| style="width:20%" | <span id="get">[http://itp.tugraz.at/matlab/techdoc/ref/get.html get]</span><br />
| style="width:20%" | <span id="getmemmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/getmemmapfile.html getmemmapfile]</span><br />
|-<br />
| style="width:20%" | <span id="gettimer">[http://itp.tugraz.at/matlab/techdoc/ref/gettimer.html gettimer]</span><br />
| style="width:20%" | <span id="gettimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/gettimeseries.html gettimeseries]</span><br />
| style="width:20%" | <span id="gettscollection">[http://itp.tugraz.at/matlab/techdoc/ref/gettscollection.html gettscollection]</span><br />
| style="width:20%" | <span id="getabstimetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/getabstimetimeseries.html getabstimetimeseries]</span><br />
| style="width:20%" | <span id="getabstimetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/getabstimetscollection.html getabstimetscollection]</span><br />
|-<br />
| style="width:20%" | <span id="getappdata">[http://itp.tugraz.at/matlab/techdoc/ref/getappdata.html getappdata]</span><br />
| style="width:20%" | <span id="getchararray">[http://itp.tugraz.at/matlab/techdoc/ref/getchararray.html getchararray]</span><br />
| style="width:20%" | <span id="getdatasamplesize">[http://itp.tugraz.at/matlab/techdoc/ref/getdatasamplesize.html getdatasamplesize]</span><br />
| style="width:20%" | <span id="getenv">[http://itp.tugraz.at/matlab/techdoc/ref/getenv.html getenv]</span><br />
| style="width:20%" | <span id="getfield">[http://itp.tugraz.at/matlab/techdoc/ref/getfield.html getfield]</span><br />
|-<br />
| style="width:20%" | <span id="getframe">[http://itp.tugraz.at/matlab/techdoc/ref/getframe.html getframe]</span><br />
| style="width:20%" | <span id="getfullmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/getfullmatrix.html getfullmatrix]</span><br />
| style="width:20%" | <span id="getinterpmethod">[http://itp.tugraz.at/matlab/techdoc/ref/getinterpmethod.html getinterpmethod]</span><br />
| style="width:20%" | <span id="getpixelposition">[http://itp.tugraz.at/matlab/techdoc/ref/getpixelposition.html getpixelposition]</span><br />
| style="width:20%" | <span id="getpref">[http://itp.tugraz.at/matlab/techdoc/ref/getpref.html getpref]</span><br />
|-<br />
| style="width:20%" | <span id="getqualitydesc">[http://itp.tugraz.at/matlab/techdoc/ref/getqualitydesc.html getqualitydesc]</span><br />
| style="width:20%" | <span id="getreportmexception">[http://itp.tugraz.at/matlab/techdoc/ref/getreportmexception.html getreportmexception]</span><br />
| style="width:20%" | <span id="getsampleusingtimetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/getsampleusingtimetimeseries.html getsampleusingtimetimeseries]</span><br />
| style="width:20%" | <span id="getsampleusingtimetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/getsampleusingtimetscollection.html getsampleusingtimetscollection]</span><br />
| style="width:20%" | <span id="gettimeseriesnames">[http://itp.tugraz.at/matlab/techdoc/ref/gettimeseriesnames.html gettimeseriesnames]</span><br />
|-<br />
| style="width:20%" | <span id="gettsafteratevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsafteratevent.html gettsafteratevent]</span><br />
| style="width:20%" | <span id="gettsafterevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsafterevent.html gettsafterevent]</span><br />
| style="width:20%" | <span id="gettsatevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsatevent.html gettsatevent]</span><br />
| style="width:20%" | <span id="gettsbeforeatevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsbeforeatevent.html gettsbeforeatevent]</span><br />
| style="width:20%" | <span id="gettsbeforeevent">[http://itp.tugraz.at/matlab/techdoc/ref/gettsbeforeevent.html gettsbeforeevent]</span><br />
|-<br />
| style="width:20%" | <span id="gettsbetweenevents">[http://itp.tugraz.at/matlab/techdoc/ref/gettsbetweenevents.html gettsbetweenevents]</span><br />
| style="width:20%" | <span id="getvariable">[http://itp.tugraz.at/matlab/techdoc/ref/getvariable.html getvariable]</span><br />
| style="width:20%" | <span id="getworkspacedata">[http://itp.tugraz.at/matlab/techdoc/ref/getworkspacedata.html getworkspacedata]</span><br />
| style="width:20%" | <span id="ginput">[http://itp.tugraz.at/matlab/techdoc/ref/ginput.html ginput]</span><br />
| style="width:20%" | <span id="global">[http://itp.tugraz.at/matlab/techdoc/ref/global.html global]</span><br />
|-<br />
| style="width:20%" | <span id="gmres">[http://itp.tugraz.at/matlab/techdoc/ref/gmres.html gmres]</span><br />
| style="width:20%" | <span id="gplot">[http://itp.tugraz.at/matlab/techdoc/ref/gplot.html gplot]</span><br />
| style="width:20%" | <span id="grabcode">[http://itp.tugraz.at/matlab/techdoc/ref/grabcode.html grabcode]</span><br />
| style="width:20%" | <span id="gradient">[http://itp.tugraz.at/matlab/techdoc/ref/gradient.html gradient]</span><br />
| style="width:20%" | <span id="graymon">[http://itp.tugraz.at/matlab/techdoc/ref/graymon.html graymon]</span><br />
|-<br />
| style="width:20%" | <span id="grid">[http://itp.tugraz.at/matlab/techdoc/ref/grid.html grid]</span><br />
| style="width:20%" | <span id="griddata">[http://itp.tugraz.at/matlab/techdoc/ref/griddata.html griddata]</span><br />
| style="width:20%" | <span id="griddata3">[http://itp.tugraz.at/matlab/techdoc/ref/griddata3.html griddata3]</span><br />
| style="width:20%" | <span id="griddatan">[http://itp.tugraz.at/matlab/techdoc/ref/griddatan.html griddatan]</span><br />
| style="width:20%" | <span id="gsvd">[http://itp.tugraz.at/matlab/techdoc/ref/gsvd.html gsvd]</span><br />
|-<br />
| style="width:20%" | <span id="gt">[http://itp.tugraz.at/matlab/techdoc/ref/gt.html gt]</span><br />
| style="width:20%" | <span id="gtext">[http://itp.tugraz.at/matlab/techdoc/ref/gtext.html gtext]</span><br />
| style="width:20%" | <span id="guidata">[http://itp.tugraz.at/matlab/techdoc/ref/guidata.html guidata]</span><br />
| style="width:20%" | <span id="guide">[http://itp.tugraz.at/matlab/techdoc/ref/guide.html guide]</span><br />
| style="width:20%" | <span id="guihandles">[http://itp.tugraz.at/matlab/techdoc/ref/guihandles.html guihandles]</span><br />
|-<br />
| style="width:20%" | <span id="gunzip">[http://itp.tugraz.at/matlab/techdoc/ref/gunzip.html gunzip]</span><br />
| style="width:20%" | <span id="gzip">[http://itp.tugraz.at/matlab/techdoc/ref/gzip.html gzip]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= h =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="hadamard">[http://itp.tugraz.at/matlab/techdoc/ref/hadamard.html hadamard]</span><br />
| style="width:20%" | <span id="hankel">[http://itp.tugraz.at/matlab/techdoc/ref/hankel.html hankel]</span><br />
| style="width:20%" | <span id="hdf">[http://itp.tugraz.at/matlab/techdoc/ref/hdf.html hdf]</span><br />
| style="width:20%" | <span id="hdf5">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5.html hdf5]</span><br />
| style="width:20%" | <span id="hdf5info">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5info.html hdf5info]</span><br />
|-<br />
| style="width:20%" | <span id="hdf5read">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5read.html hdf5read]</span><br />
| style="width:20%" | <span id="hdf5write">[http://itp.tugraz.at/matlab/techdoc/ref/hdf5write.html hdf5write]</span><br />
| style="width:20%" | <span id="hdfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/hdfinfo.html hdfinfo]</span><br />
| style="width:20%" | <span id="hdfread">[http://itp.tugraz.at/matlab/techdoc/ref/hdfread.html hdfread]</span><br />
| style="width:20%" | <span id="hdftool">[http://itp.tugraz.at/matlab/techdoc/ref/hdftool.html hdftool]</span><br />
|-<br />
| style="width:20%" | <span id="help">[http://itp.tugraz.at/matlab/techdoc/ref/help.html help]</span><br />
| style="width:20%" | <span id="helpbrowser">[http://itp.tugraz.at/matlab/techdoc/ref/helpbrowser.html helpbrowser]</span><br />
| style="width:20%" | <span id="helpdesk">[http://itp.tugraz.at/matlab/techdoc/ref/helpdesk.html helpdesk]</span><br />
| style="width:20%" | <span id="helpdlg">[http://itp.tugraz.at/matlab/techdoc/ref/helpdlg.html helpdlg]</span><br />
| style="width:20%" | <span id="helpwin">[http://itp.tugraz.at/matlab/techdoc/ref/helpwin.html helpwin]</span><br />
|-<br />
| style="width:20%" | <span id="hess">[http://itp.tugraz.at/matlab/techdoc/ref/hess.html hess]</span><br />
| style="width:20%" | <span id="hex2dec">[http://itp.tugraz.at/matlab/techdoc/ref/hex2dec.html hex2dec]</span><br />
| style="width:20%" | <span id="hex2num">[http://itp.tugraz.at/matlab/techdoc/ref/hex2num.html hex2num]</span><br />
| style="width:20%" | <span id="hgexport">[http://itp.tugraz.at/matlab/techdoc/ref/hgexport.html hgexport]</span><br />
| style="width:20%" | <span id="hggroup">[http://itp.tugraz.at/matlab/techdoc/ref/hggroup.html hggroup]</span><br />
|-<br />
| style="width:20%" | <span id="hggroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/hggroupproperties.html hggroupproperties]</span><br />
| style="width:20%" | <span id="hgload">[http://itp.tugraz.at/matlab/techdoc/ref/hgload.html hgload]</span><br />
| style="width:20%" | <span id="hgsave">[http://itp.tugraz.at/matlab/techdoc/ref/hgsave.html hgsave]</span><br />
| style="width:20%" | <span id="hgtransform">[http://itp.tugraz.at/matlab/techdoc/ref/hgtransform.html hgtransform]</span><br />
| style="width:20%" | <span id="hgtransformproperties">[http://itp.tugraz.at/matlab/techdoc/ref/hgtransformproperties.html hgtransformproperties]</span><br />
|-<br />
| style="width:20%" | <span id="hidden">[http://itp.tugraz.at/matlab/techdoc/ref/hidden.html hidden]</span><br />
| style="width:20%" | <span id="hilb">[http://itp.tugraz.at/matlab/techdoc/ref/hilb.html hilb]</span><br />
| style="width:20%" | <span id="hist">[http://itp.tugraz.at/matlab/techdoc/ref/hist.html hist]</span><br />
| style="width:20%" | <span id="histc">[http://itp.tugraz.at/matlab/techdoc/ref/histc.html histc]</span><br />
| style="width:20%" | <span id="hold">[http://itp.tugraz.at/matlab/techdoc/ref/hold.html hold]</span><br />
|-<br />
| style="width:20%" | <span id="home">[http://itp.tugraz.at/matlab/techdoc/ref/home.html home]</span><br />
| style="width:20%" | <span id="horzcat">[http://itp.tugraz.at/matlab/techdoc/ref/horzcat.html horzcat]</span><br />
| style="width:20%" | <span id="horzcattscollection">[http://itp.tugraz.at/matlab/techdoc/ref/horzcattscollection.html horzcattscollection]</span><br />
| style="width:20%" | <span id="hostid">[http://itp.tugraz.at/matlab/techdoc/ref/hostid.html hostid]</span><br />
| style="width:20%" | <span id="hsv2rgb">[http://itp.tugraz.at/matlab/techdoc/ref/hsv2rgb.html hsv2rgb]</span><br />
|-<br />
| style="width:20%" | <span id="hypot">[http://itp.tugraz.at/matlab/techdoc/ref/hypot.html hypot]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= i =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="index">[http://itp.tugraz.at/matlab/techdoc/ref/index.html index]</span><br />
| style="width:20%" | <span id="i">[http://itp.tugraz.at/matlab/techdoc/ref/i.html i]</span><br />
| style="width:20%" | <span id="idealfiltertimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/idealfiltertimeseries.html idealfiltertimeseries]</span><br />
| style="width:20%" | <span id="idivide">[http://itp.tugraz.at/matlab/techdoc/ref/idivide.html idivide]</span><br />
| style="width:20%" | <span id="if">[http://itp.tugraz.at/matlab/techdoc/ref/if.html if]</span><br />
|-<br />
| style="width:20%" | <span id="ifft">[http://itp.tugraz.at/matlab/techdoc/ref/ifft.html ifft]</span><br />
| style="width:20%" | <span id="ilu">[http://itp.tugraz.at/matlab/techdoc/ref/ilu.html ilu]</span><br />
| style="width:20%" | <span id="ifft2">[http://itp.tugraz.at/matlab/techdoc/ref/ifft2.html ifft2]</span><br />
| style="width:20%" | <span id="ifftn">[http://itp.tugraz.at/matlab/techdoc/ref/ifftn.html ifftn]</span><br />
| style="width:20%" | <span id="ifftshift">[http://itp.tugraz.at/matlab/techdoc/ref/ifftshift.html ifftshift]</span><br />
|-<br />
| style="width:20%" | <span id="im2frame">[http://itp.tugraz.at/matlab/techdoc/ref/im2frame.html im2frame]</span><br />
| style="width:20%" | <span id="im2java">[http://itp.tugraz.at/matlab/techdoc/ref/im2java.html im2java]</span><br />
| style="width:20%" | <span id="imag">[http://itp.tugraz.at/matlab/techdoc/ref/imag.html imag]</span><br />
| style="width:20%" | <span id="image">[http://itp.tugraz.at/matlab/techdoc/ref/image.html image]</span><br />
| style="width:20%" | <span id="image_props">[http://itp.tugraz.at/matlab/techdoc/ref/image_props.html image_props]</span><br />
|-<br />
| style="width:20%" | <span id="imagesc">[http://itp.tugraz.at/matlab/techdoc/ref/imagesc.html imagesc]</span><br />
| style="width:20%" | <span id="imfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/imfinfo.html imfinfo]</span><br />
| style="width:20%" | <span id="imformats">[http://itp.tugraz.at/matlab/techdoc/ref/imformats.html imformats]</span><br />
| style="width:20%" | <span id="import">[http://itp.tugraz.at/matlab/techdoc/ref/import.html import]</span><br />
| style="width:20%" | <span id="importdata">[http://itp.tugraz.at/matlab/techdoc/ref/importdata.html importdata]</span><br />
|-<br />
| style="width:20%" | <span id="imread">[http://itp.tugraz.at/matlab/techdoc/ref/imread.html imread]</span><br />
| style="width:20%" | <span id="imwrite">[http://itp.tugraz.at/matlab/techdoc/ref/imwrite.html imwrite]</span><br />
| style="width:20%" | <span id="ind2rgb">[http://itp.tugraz.at/matlab/techdoc/ref/ind2rgb.html ind2rgb]</span><br />
| style="width:20%" | <span id="ind2sub">[http://itp.tugraz.at/matlab/techdoc/ref/ind2sub.html ind2sub]</span><br />
| style="width:20%" | <span id="inf">[http://itp.tugraz.at/matlab/techdoc/ref/inf.html inf]</span><br />
|-<br />
| style="width:20%" | <span id="inferiorto">[http://itp.tugraz.at/matlab/techdoc/ref/inferiorto.html inferiorto]</span><br />
| style="width:20%" | <span id="info">[http://itp.tugraz.at/matlab/techdoc/ref/info.html info]</span><br />
| style="width:20%" | <span id="inline">[http://itp.tugraz.at/matlab/techdoc/ref/inline.html inline]</span><br />
| style="width:20%" | <span id="inmem">[http://itp.tugraz.at/matlab/techdoc/ref/inmem.html inmem]</span><br />
| style="width:20%" | <span id="inpolygon">[http://itp.tugraz.at/matlab/techdoc/ref/inpolygon.html inpolygon]</span><br />
|-<br />
| style="width:20%" | <span id="input">[http://itp.tugraz.at/matlab/techdoc/ref/input.html input]</span><br />
| style="width:20%" | <span id="inputdlg">[http://itp.tugraz.at/matlab/techdoc/ref/inputdlg.html inputdlg]</span><br />
| style="width:20%" | <span id="inputname">[http://itp.tugraz.at/matlab/techdoc/ref/inputname.html inputname]</span><br />
| style="width:20%" | <span id="inputparser">[http://itp.tugraz.at/matlab/techdoc/ref/inputparser.html inputparser]</span><br />
| style="width:20%" | <span id="inspect">[http://itp.tugraz.at/matlab/techdoc/ref/inspect.html inspect]</span><br />
|-<br />
| style="width:20%" | <span id="instrcallback">[http://itp.tugraz.at/matlab/techdoc/ref/instrcallback.html instrcallback]</span><br />
| style="width:20%" | <span id="instrfind">[http://itp.tugraz.at/matlab/techdoc/ref/instrfind.html instrfind]</span><br />
| style="width:20%" | <span id="instrfindall">[http://itp.tugraz.at/matlab/techdoc/ref/instrfindall.html instrfindall]</span><br />
| style="width:20%" | <span id="int2str">[http://itp.tugraz.at/matlab/techdoc/ref/int2str.html int2str]</span><br />
| style="width:20%" | <span id="int8">[http://itp.tugraz.at/matlab/techdoc/ref/int8.html int8]</span><br />
|-<br />
| style="width:20%" | <span id="int16">[http://itp.tugraz.at/matlab/techdoc/ref/int16.html int16]</span><br />
| style="width:20%" | <span id="int32">[http://itp.tugraz.at/matlab/techdoc/ref/int32.html int32]</span><br />
| style="width:20%" | <span id="int64">[http://itp.tugraz.at/matlab/techdoc/ref/int64.html int64]</span><br />
| style="width:20%" | <span id="interfaces">[http://itp.tugraz.at/matlab/techdoc/ref/interfaces.html interfaces]</span><br />
| style="width:20%" | <span id="interp1">[http://itp.tugraz.at/matlab/techdoc/ref/interp1.html interp1]</span><br />
|-<br />
| style="width:20%" | <span id="interp1q">[http://itp.tugraz.at/matlab/techdoc/ref/interp1q.html interp1q]</span><br />
| style="width:20%" | <span id="interp2">[http://itp.tugraz.at/matlab/techdoc/ref/interp2.html interp2]</span><br />
| style="width:20%" | <span id="interp3">[http://itp.tugraz.at/matlab/techdoc/ref/interp3.html interp3]</span><br />
| style="width:20%" | <span id="interpft">[http://itp.tugraz.at/matlab/techdoc/ref/interpft.html interpft]</span><br />
| style="width:20%" | <span id="interpn">[http://itp.tugraz.at/matlab/techdoc/ref/interpn.html interpn]</span><br />
|-<br />
| style="width:20%" | <span id="interpstreamspeed">[http://itp.tugraz.at/matlab/techdoc/ref/interpstreamspeed.html interpstreamspeed]</span><br />
| style="width:20%" | <span id="intersect">[http://itp.tugraz.at/matlab/techdoc/ref/intersect.html intersect]</span><br />
| style="width:20%" | <span id="intmax">[http://itp.tugraz.at/matlab/techdoc/ref/intmax.html intmax]</span><br />
| style="width:20%" | <span id="intmin">[http://itp.tugraz.at/matlab/techdoc/ref/intmin.html intmin]</span><br />
| style="width:20%" | <span id="intwarning">[http://itp.tugraz.at/matlab/techdoc/ref/intwarning.html intwarning]</span><br />
|-<br />
| style="width:20%" | <span id="inv">[http://itp.tugraz.at/matlab/techdoc/ref/inv.html inv]</span><br />
| style="width:20%" | <span id="invhilb">[http://itp.tugraz.at/matlab/techdoc/ref/invhilb.html invhilb]</span><br />
| style="width:20%" | <span id="invoke">[http://itp.tugraz.at/matlab/techdoc/ref/invoke.html invoke]</span><br />
| style="width:20%" | <span id="ipermute">[http://itp.tugraz.at/matlab/techdoc/ref/ipermute.html ipermute]</span><br />
| style="width:20%" | <span id="iqrtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/iqrtimeseries.html iqrtimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="is">[http://itp.tugraz.at/matlab/techdoc/ref/is.html is]</span><br />
| style="width:20%" | <span id="isa">[http://itp.tugraz.at/matlab/techdoc/ref/isa.html isa]</span><br />
| style="width:20%" | <span id="isappdata">[http://itp.tugraz.at/matlab/techdoc/ref/isappdata.html isappdata]</span><br />
| style="width:20%" | <span id="iscell">[http://itp.tugraz.at/matlab/techdoc/ref/iscell.html iscell]</span><br />
| style="width:20%" | <span id="iscellstr">[http://itp.tugraz.at/matlab/techdoc/ref/iscellstr.html iscellstr]</span><br />
|-<br />
| style="width:20%" | <span id="ischar">[http://itp.tugraz.at/matlab/techdoc/ref/ischar.html ischar]</span><br />
| style="width:20%" | <span id="iscom">[http://itp.tugraz.at/matlab/techdoc/ref/iscom.html iscom]</span><br />
| style="width:20%" | <span id="isdir">[http://itp.tugraz.at/matlab/techdoc/ref/isdir.html isdir]</span><br />
| style="width:20%" | <span id="isempty">[http://itp.tugraz.at/matlab/techdoc/ref/isempty.html isempty]</span><br />
| style="width:20%" | <span id="isemptytimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/isemptytimeseries.html isemptytimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="isemptytscollection">[http://itp.tugraz.at/matlab/techdoc/ref/isemptytscollection.html isemptytscollection]</span><br />
| style="width:20%" | <span id="isequal">[http://itp.tugraz.at/matlab/techdoc/ref/isequal.html isequal]</span><br />
| style="width:20%" | <span id="isequalmexception">[http://itp.tugraz.at/matlab/techdoc/ref/isequalmexception.html isequalmexception]</span><br />
| style="width:20%" | <span id="isequalwithequalnans">[http://itp.tugraz.at/matlab/techdoc/ref/isequalwithequalnans.html isequalwithequalnans]</span><br />
| style="width:20%" | <span id="isevent">[http://itp.tugraz.at/matlab/techdoc/ref/isevent.html isevent]</span><br />
|-<br />
| style="width:20%" | <span id="isfield">[http://itp.tugraz.at/matlab/techdoc/ref/isfield.html isfield]</span><br />
| style="width:20%" | <span id="isfinite">[http://itp.tugraz.at/matlab/techdoc/ref/isfinite.html isfinite]</span><br />
| style="width:20%" | <span id="isfloat">[http://itp.tugraz.at/matlab/techdoc/ref/isfloat.html isfloat]</span><br />
| style="width:20%" | <span id="isglobal">[http://itp.tugraz.at/matlab/techdoc/ref/isglobal.html isglobal]</span><br />
| style="width:20%" | <span id="ishandle">[http://itp.tugraz.at/matlab/techdoc/ref/ishandle.html ishandle]</span><br />
|-<br />
| style="width:20%" | <span id="ishold">[http://itp.tugraz.at/matlab/techdoc/ref/ishold.html ishold]</span><br />
| style="width:20%" | <span id="isinf">[http://itp.tugraz.at/matlab/techdoc/ref/isinf.html isinf]</span><br />
| style="width:20%" | <span id="isinteger">[http://itp.tugraz.at/matlab/techdoc/ref/isinteger.html isinteger]</span><br />
| style="width:20%" | <span id="isinterface">[http://itp.tugraz.at/matlab/techdoc/ref/isinterface.html isinterface]</span><br />
| style="width:20%" | <span id="isjava">[http://itp.tugraz.at/matlab/techdoc/ref/isjava.html isjava]</span><br />
|-<br />
| style="width:20%" | <span id="iskeyword">[http://itp.tugraz.at/matlab/techdoc/ref/iskeyword.html iskeyword]</span><br />
| style="width:20%" | <span id="isletter">[http://itp.tugraz.at/matlab/techdoc/ref/isletter.html isletter]</span><br />
| style="width:20%" | <span id="islogical">[http://itp.tugraz.at/matlab/techdoc/ref/islogical.html islogical]</span><br />
| style="width:20%" | <span id="ismac">[http://itp.tugraz.at/matlab/techdoc/ref/ismac.html ismac]</span><br />
| style="width:20%" | <span id="ismember">[http://itp.tugraz.at/matlab/techdoc/ref/ismember.html ismember]</span><br />
|-<br />
| style="width:20%" | <span id="ismethod">[http://itp.tugraz.at/matlab/techdoc/ref/ismethod.html ismethod]</span><br />
| style="width:20%" | <span id="isnan">[http://itp.tugraz.at/matlab/techdoc/ref/isnan.html isnan]</span><br />
| style="width:20%" | <span id="isnumeric">[http://itp.tugraz.at/matlab/techdoc/ref/isnumeric.html isnumeric]</span><br />
| style="width:20%" | <span id="isobject">[http://itp.tugraz.at/matlab/techdoc/ref/isobject.html isobject]</span><br />
| style="width:20%" | <span id="isocaps">[http://itp.tugraz.at/matlab/techdoc/ref/isocaps.html isocaps]</span><br />
|-<br />
| style="width:20%" | <span id="isocolors">[http://itp.tugraz.at/matlab/techdoc/ref/isocolors.html isocolors]</span><br />
| style="width:20%" | <span id="isonormals">[http://itp.tugraz.at/matlab/techdoc/ref/isonormals.html isonormals]</span><br />
| style="width:20%" | <span id="isosurface">[http://itp.tugraz.at/matlab/techdoc/ref/isosurface.html isosurface]</span><br />
| style="width:20%" | <span id="ispc">[http://itp.tugraz.at/matlab/techdoc/ref/ispc.html ispc]</span><br />
| style="width:20%" | <span id="ispref">[http://itp.tugraz.at/matlab/techdoc/ref/ispref.html ispref]</span><br />
|-<br />
| style="width:20%" | <span id="isprime">[http://itp.tugraz.at/matlab/techdoc/ref/isprime.html isprime]</span><br />
| style="width:20%" | <span id="isprop">[http://itp.tugraz.at/matlab/techdoc/ref/isprop.html isprop]</span><br />
| style="width:20%" | <span id="isreal">[http://itp.tugraz.at/matlab/techdoc/ref/isreal.html isreal]</span><br />
| style="width:20%" | <span id="isscalar">[http://itp.tugraz.at/matlab/techdoc/ref/isscalar.html isscalar]</span><br />
| style="width:20%" | <span id="issorted">[http://itp.tugraz.at/matlab/techdoc/ref/issorted.html issorted]</span><br />
|-<br />
| style="width:20%" | <span id="isspace">[http://itp.tugraz.at/matlab/techdoc/ref/isspace.html isspace]</span><br />
| style="width:20%" | <span id="issparse">[http://itp.tugraz.at/matlab/techdoc/ref/issparse.html issparse]</span><br />
| style="width:20%" | <span id="isstr">[http://itp.tugraz.at/matlab/techdoc/ref/isstr.html isstr]</span><br />
| style="width:20%" | <span id="isstrprop">[http://itp.tugraz.at/matlab/techdoc/ref/isstrprop.html isstrprop]</span><br />
| style="width:20%" | <span id="isstruct">[http://itp.tugraz.at/matlab/techdoc/ref/isstruct.html isstruct]</span><br />
|-<br />
| style="width:20%" | <span id="isstudent">[http://itp.tugraz.at/matlab/techdoc/ref/isstudent.html isstudent]</span><br />
| style="width:20%" | <span id="isunix">[http://itp.tugraz.at/matlab/techdoc/ref/isunix.html isunix]</span><br />
| style="width:20%" | <span id="isvalidtimer">[http://itp.tugraz.at/matlab/techdoc/ref/isvalidtimer.html isvalidtimer]</span><br />
| style="width:20%" | <span id="isvarname">[http://itp.tugraz.at/matlab/techdoc/ref/isvarname.html isvarname]</span><br />
| style="width:20%" | <span id="isvector">[http://itp.tugraz.at/matlab/techdoc/ref/isvector.html isvector]</span><br />
|-<br />
|}<br />
<br />
= j =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="j">[http://itp.tugraz.at/matlab/techdoc/ref/j.html j]</span><br />
| style="width:20%" | <span id="javaaddpath">[http://itp.tugraz.at/matlab/techdoc/ref/javaaddpath.html javaaddpath]</span><br />
| style="width:20%" | <span id="javaarray">[http://itp.tugraz.at/matlab/techdoc/ref/javaarray.html javaarray]</span><br />
| style="width:20%" | <span id="javachk">[http://itp.tugraz.at/matlab/techdoc/ref/javachk.html javachk]</span><br />
| style="width:20%" | <span id="javaclasspath">[http://itp.tugraz.at/matlab/techdoc/ref/javaclasspath.html javaclasspath]</span><br />
|-<br />
| style="width:20%" | <span id="javamethod">[http://itp.tugraz.at/matlab/techdoc/ref/javamethod.html javamethod]</span><br />
| style="width:20%" | <span id="javaobject">[http://itp.tugraz.at/matlab/techdoc/ref/javaobject.html javaobject]</span><br />
| style="width:20%" | <span id="javarmpath">[http://itp.tugraz.at/matlab/techdoc/ref/javarmpath.html javarmpath]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= k =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="keyboard">[http://itp.tugraz.at/matlab/techdoc/ref/keyboard.html keyboard]</span><br />
| style="width:20%" | <span id="kron">[http://itp.tugraz.at/matlab/techdoc/ref/kron.html kron]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= l =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="logicaloperatorselementwise">[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorselementwise.html logicaloperatorselementwise]</span><br />
| style="width:20%" | <span id="logicaloperatorsshortcircuit">[http://itp.tugraz.at/matlab/techdoc/ref/logicaloperatorsshortcircuit.html logicaloperatorsshortcircuit]</span><br />
| style="width:20%" | <span id="lastmexception">[http://itp.tugraz.at/matlab/techdoc/ref/lastmexception.html lastmexception]</span><br />
| style="width:20%" | <span id="lasterr">[http://itp.tugraz.at/matlab/techdoc/ref/lasterr.html lasterr]</span><br />
| style="width:20%" | <span id="lasterror">[http://itp.tugraz.at/matlab/techdoc/ref/lasterror.html lasterror]</span><br />
|-<br />
| style="width:20%" | <span id="lastwarn">[http://itp.tugraz.at/matlab/techdoc/ref/lastwarn.html lastwarn]</span><br />
| style="width:20%" | <span id="lcm">[http://itp.tugraz.at/matlab/techdoc/ref/lcm.html lcm]</span><br />
| style="width:20%" | <span id="ldl">[http://itp.tugraz.at/matlab/techdoc/ref/ldl.html ldl]</span><br />
| style="width:20%" | <span id="ldivide">[http://itp.tugraz.at/matlab/techdoc/ref/ldivide.html ldivide]</span><br />
| style="width:20%" | <span id="le">[http://itp.tugraz.at/matlab/techdoc/ref/le.html le]</span><br />
|-<br />
| style="width:20%" | <span id="legend">[http://itp.tugraz.at/matlab/techdoc/ref/legend.html legend]</span><br />
| style="width:20%" | <span id="legendre">[http://itp.tugraz.at/matlab/techdoc/ref/legendre.html legendre]</span><br />
| style="width:20%" | <span id="length">[http://itp.tugraz.at/matlab/techdoc/ref/length.html length]</span><br />
| style="width:20%" | <span id="lengthtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/lengthtimeseries.html lengthtimeseries]</span><br />
| style="width:20%" | <span id="lengthtscollection">[http://itp.tugraz.at/matlab/techdoc/ref/lengthtscollection.html lengthtscollection]</span><br />
|-<br />
| style="width:20%" | <span id="libfunctions">[http://itp.tugraz.at/matlab/techdoc/ref/libfunctions.html libfunctions]</span><br />
| style="width:20%" | <span id="libfunctionsview">[http://itp.tugraz.at/matlab/techdoc/ref/libfunctionsview.html libfunctionsview]</span><br />
| style="width:20%" | <span id="libisloaded">[http://itp.tugraz.at/matlab/techdoc/ref/libisloaded.html libisloaded]</span><br />
| style="width:20%" | <span id="libpointer">[http://itp.tugraz.at/matlab/techdoc/ref/libpointer.html libpointer]</span><br />
| style="width:20%" | <span id="libstruct">[http://itp.tugraz.at/matlab/techdoc/ref/libstruct.html libstruct]</span><br />
|-<br />
| style="width:20%" | <span id="license">[http://itp.tugraz.at/matlab/techdoc/ref/license.html license]</span><br />
| style="width:20%" | <span id="light">[http://itp.tugraz.at/matlab/techdoc/ref/light.html light]</span><br />
| style="width:20%" | <span id="light_props">[http://itp.tugraz.at/matlab/techdoc/ref/light_props.html light_props]</span><br />
| style="width:20%" | <span id="lightangle">[http://itp.tugraz.at/matlab/techdoc/ref/lightangle.html lightangle]</span><br />
| style="width:20%" | <span id="lighting">[http://itp.tugraz.at/matlab/techdoc/ref/lighting.html lighting]</span><br />
|-<br />
| style="width:20%" | <span id="lin2mu">[http://itp.tugraz.at/matlab/techdoc/ref/lin2mu.html lin2mu]</span><br />
| style="width:20%" | <span id="line">[http://itp.tugraz.at/matlab/techdoc/ref/line.html line]</span><br />
| style="width:20%" | <span id="line_props">[http://itp.tugraz.at/matlab/techdoc/ref/line_props.html line_props]</span><br />
| style="width:20%" | <span id="lineseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/lineseriesproperties.html lineseriesproperties]</span><br />
| style="width:20%" | <span id="linespec">[http://itp.tugraz.at/matlab/techdoc/ref/linespec.html linespec]</span><br />
|-<br />
| style="width:20%" | <span id="linkaxes">[http://itp.tugraz.at/matlab/techdoc/ref/linkaxes.html linkaxes]</span><br />
| style="width:20%" | <span id="linkprop">[http://itp.tugraz.at/matlab/techdoc/ref/linkprop.html linkprop]</span><br />
| style="width:20%" | <span id="linsolve">[http://itp.tugraz.at/matlab/techdoc/ref/linsolve.html linsolve]</span><br />
| style="width:20%" | <span id="linspace">[http://itp.tugraz.at/matlab/techdoc/ref/linspace.html linspace]</span><br />
| style="width:20%" | <span id="listdlg">[http://itp.tugraz.at/matlab/techdoc/ref/listdlg.html listdlg]</span><br />
|-<br />
| style="width:20%" | <span id="listfonts">[http://itp.tugraz.at/matlab/techdoc/ref/listfonts.html listfonts]</span><br />
| style="width:20%" | <span id="load">[http://itp.tugraz.at/matlab/techdoc/ref/load.html load]</span><br />
| style="width:20%" | <span id="loadlibrary">[http://itp.tugraz.at/matlab/techdoc/ref/loadlibrary.html loadlibrary]</span><br />
| style="width:20%" | <span id="loadobj">[http://itp.tugraz.at/matlab/techdoc/ref/loadobj.html loadobj]</span><br />
| style="width:20%" | <span id="log">[http://itp.tugraz.at/matlab/techdoc/ref/log.html log]</span><br />
|-<br />
| style="width:20%" | <span id="log10">[http://itp.tugraz.at/matlab/techdoc/ref/log10.html log10]</span><br />
| style="width:20%" | <span id="log1p">[http://itp.tugraz.at/matlab/techdoc/ref/log1p.html log1p]</span><br />
| style="width:20%" | <span id="log2">[http://itp.tugraz.at/matlab/techdoc/ref/log2.html log2]</span><br />
| style="width:20%" | <span id="logical">[http://itp.tugraz.at/matlab/techdoc/ref/logical.html logical]</span><br />
| style="width:20%" | <span id="loglog">[http://itp.tugraz.at/matlab/techdoc/ref/loglog.html loglog]</span><br />
|-<br />
| style="width:20%" | <span id="logm">[http://itp.tugraz.at/matlab/techdoc/ref/logm.html logm]</span><br />
| style="width:20%" | <span id="logspace">[http://itp.tugraz.at/matlab/techdoc/ref/logspace.html logspace]</span><br />
| style="width:20%" | <span id="lookfor">[http://itp.tugraz.at/matlab/techdoc/ref/lookfor.html lookfor]</span><br />
| style="width:20%" | <span id="lower">[http://itp.tugraz.at/matlab/techdoc/ref/lower.html lower]</span><br />
| style="width:20%" | <span id="ls">[http://itp.tugraz.at/matlab/techdoc/ref/ls.html ls]</span><br />
|-<br />
| style="width:20%" | <span id="lscov">[http://itp.tugraz.at/matlab/techdoc/ref/lscov.html lscov]</span><br />
| style="width:20%" | <span id="lsqnonneg">[http://itp.tugraz.at/matlab/techdoc/ref/lsqnonneg.html lsqnonneg]</span><br />
| style="width:20%" | <span id="lsqr">[http://itp.tugraz.at/matlab/techdoc/ref/lsqr.html lsqr]</span><br />
| style="width:20%" | <span id="lt">[http://itp.tugraz.at/matlab/techdoc/ref/lt.html lt]</span><br />
| style="width:20%" | <span id="lu">[http://itp.tugraz.at/matlab/techdoc/ref/lu.html lu]</span><br />
|-<br />
| style="width:20%" | <span id="luinc">[http://itp.tugraz.at/matlab/techdoc/ref/luinc.html luinc]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= m =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="magic">[http://itp.tugraz.at/matlab/techdoc/ref/magic.html magic]</span><br />
| style="width:20%" | <span id="makehgtform">[http://itp.tugraz.at/matlab/techdoc/ref/makehgtform.html makehgtform]</span><br />
| style="width:20%" | <span id="mat2cell">[http://itp.tugraz.at/matlab/techdoc/ref/mat2cell.html mat2cell]</span><br />
| style="width:20%" | <span id="mat2str">[http://itp.tugraz.at/matlab/techdoc/ref/mat2str.html mat2str]</span><br />
| style="width:20%" | <span id="material">[http://itp.tugraz.at/matlab/techdoc/ref/material.html material]</span><br />
|-<br />
| style="width:20%" | <span id="matlabcolon">[http://itp.tugraz.at/matlab/techdoc/ref/matlabcolon.html matlabcolon]</span><br />
| style="width:20%" | <span id="matlabrc">[http://itp.tugraz.at/matlab/techdoc/ref/matlabrc.html matlabrc]</span><br />
| style="width:20%" | <span id="matlabroot">[http://itp.tugraz.at/matlab/techdoc/ref/matlabroot.html matlabroot]</span><br />
| style="width:20%" | <span id="matlabunix">[http://itp.tugraz.at/matlab/techdoc/ref/matlabunix.html matlabunix]</span><br />
| style="width:20%" | <span id="matlabwindows">[http://itp.tugraz.at/matlab/techdoc/ref/matlabwindows.html matlabwindows]</span><br />
|-<br />
| style="width:20%" | <span id="max">[http://itp.tugraz.at/matlab/techdoc/ref/max.html max]</span><br />
| style="width:20%" | <span id="maxtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/maxtimeseries.html maxtimeseries]</span><br />
| style="width:20%" | <span id="maximizecommandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/maximizecommandwindow.html maximizecommandwindow]</span><br />
| style="width:20%" | <span id="maxnumcompthreads">[http://itp.tugraz.at/matlab/techdoc/ref/maxnumcompthreads.html maxnumcompthreads]</span><br />
| style="width:20%" | <span id="mean">[http://itp.tugraz.at/matlab/techdoc/ref/mean.html mean]</span><br />
|-<br />
| style="width:20%" | <span id="meantimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/meantimeseries.html meantimeseries]</span><br />
| style="width:20%" | <span id="median">[http://itp.tugraz.at/matlab/techdoc/ref/median.html median]</span><br />
| style="width:20%" | <span id="mediantimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/mediantimeseries.html mediantimeseries]</span><br />
| style="width:20%" | <span id="memmapfile">[http://itp.tugraz.at/matlab/techdoc/ref/memmapfile.html memmapfile]</span><br />
| style="width:20%" | <span id="memory">[http://itp.tugraz.at/matlab/techdoc/ref/memory.html memory]</span><br />
|-<br />
| style="width:20%" | <span id="mexception">[http://itp.tugraz.at/matlab/techdoc/ref/mexception.html mexception]</span><br />
| style="width:20%" | <span id="menu">[http://itp.tugraz.at/matlab/techdoc/ref/menu.html menu]</span><br />
| style="width:20%" | <span id="mesh">[http://itp.tugraz.at/matlab/techdoc/ref/mesh.html mesh]</span><br />
| style="width:20%" | <span id="meshc">[http://itp.tugraz.at/matlab/techdoc/ref/meshc.html meshc]</span><br />
| style="width:20%" | <span id="meshz">[http://itp.tugraz.at/matlab/techdoc/ref/meshz.html meshz]</span><br />
|-<br />
| style="width:20%" | <span id="meshgrid">[http://itp.tugraz.at/matlab/techdoc/ref/meshgrid.html meshgrid]</span><br />
| style="width:20%" | <span id="methods">[http://itp.tugraz.at/matlab/techdoc/ref/methods.html methods]</span><br />
| style="width:20%" | <span id="methodsview">[http://itp.tugraz.at/matlab/techdoc/ref/methodsview.html methodsview]</span><br />
| style="width:20%" | <span id="mex">[http://itp.tugraz.at/matlab/techdoc/ref/mex.html mex]</span><br />
| style="width:20%" | <span id="mexext">[http://itp.tugraz.at/matlab/techdoc/ref/mexext.html mexext]</span><br />
|-<br />
| style="width:20%" | <span id="mfilename">[http://itp.tugraz.at/matlab/techdoc/ref/mfilename.html mfilename]</span><br />
| style="width:20%" | <span id="mget">[http://itp.tugraz.at/matlab/techdoc/ref/mget.html mget]</span><br />
| style="width:20%" | <span id="min">[http://itp.tugraz.at/matlab/techdoc/ref/min.html min]</span><br />
| style="width:20%" | <span id="mintimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/mintimeseries.html mintimeseries]</span><br />
| style="width:20%" | <span id="minimizecommandwindow">[http://itp.tugraz.at/matlab/techdoc/ref/minimizecommandwindow.html minimizecommandwindow]</span><br />
|-<br />
| style="width:20%" | <span id="minres">[http://itp.tugraz.at/matlab/techdoc/ref/minres.html minres]</span><br />
| style="width:20%" | <span id="mislocked">[http://itp.tugraz.at/matlab/techdoc/ref/mislocked.html mislocked]</span><br />
| style="width:20%" | <span id="mkdir">[http://itp.tugraz.at/matlab/techdoc/ref/mkdir.html mkdir]</span><br />
| style="width:20%" | <span id="mkpp">[http://itp.tugraz.at/matlab/techdoc/ref/mkpp.html mkpp]</span><br />
| style="width:20%" | <span id="mldivide">[http://itp.tugraz.at/matlab/techdoc/ref/mldivide.html mldivide]</span><br />
|-<br />
| style="width:20%" | <span id="mrdivide">[http://itp.tugraz.at/matlab/techdoc/ref/mrdivide.html mrdivide]</span><br />
| style="width:20%" | <span id="mlint">[http://itp.tugraz.at/matlab/techdoc/ref/mlint.html mlint]</span><br />
| style="width:20%" | <span id="mlintrpt">[http://itp.tugraz.at/matlab/techdoc/ref/mlintrpt.html mlintrpt]</span><br />
| style="width:20%" | <span id="mlock">[http://itp.tugraz.at/matlab/techdoc/ref/mlock.html mlock]</span><br />
| style="width:20%" | <span id="mmfileinfo">[http://itp.tugraz.at/matlab/techdoc/ref/mmfileinfo.html mmfileinfo]</span><br />
|-<br />
| style="width:20%" | <span id="mmreader">[http://itp.tugraz.at/matlab/techdoc/ref/mmreader.html mmreader]</span><br />
| style="width:20%" | <span id="mod">[http://itp.tugraz.at/matlab/techdoc/ref/mod.html mod]</span><br />
| style="width:20%" | <span id="mode">[http://itp.tugraz.at/matlab/techdoc/ref/mode.html mode]</span><br />
| style="width:20%" | <span id="more">[http://itp.tugraz.at/matlab/techdoc/ref/more.html more]</span><br />
| style="width:20%" | <span id="move">[http://itp.tugraz.at/matlab/techdoc/ref/move.html move]</span><br />
|-<br />
| style="width:20%" | <span id="movefile">[http://itp.tugraz.at/matlab/techdoc/ref/movefile.html movefile]</span><br />
| style="width:20%" | <span id="movegui">[http://itp.tugraz.at/matlab/techdoc/ref/movegui.html movegui]</span><br />
| style="width:20%" | <span id="movie">[http://itp.tugraz.at/matlab/techdoc/ref/movie.html movie]</span><br />
| style="width:20%" | <span id="movie2avi">[http://itp.tugraz.at/matlab/techdoc/ref/movie2avi.html movie2avi]</span><br />
| style="width:20%" | <span id="mput">[http://itp.tugraz.at/matlab/techdoc/ref/mput.html mput]</span><br />
|-<br />
| style="width:20%" | <span id="msgbox">[http://itp.tugraz.at/matlab/techdoc/ref/msgbox.html msgbox]</span><br />
| style="width:20%" | <span id="mtimes">[http://itp.tugraz.at/matlab/techdoc/ref/mtimes.html mtimes]</span><br />
| style="width:20%" | <span id="mu2lin">[http://itp.tugraz.at/matlab/techdoc/ref/mu2lin.html mu2lin]</span><br />
| style="width:20%" | <span id="multibandread">[http://itp.tugraz.at/matlab/techdoc/ref/multibandread.html multibandread]</span><br />
| style="width:20%" | <span id="multibandwrite">[http://itp.tugraz.at/matlab/techdoc/ref/multibandwrite.html multibandwrite]</span><br />
|-<br />
| style="width:20%" | <span id="munlock">[http://itp.tugraz.at/matlab/techdoc/ref/munlock.html munlock]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= n =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="namelengthmax">[http://itp.tugraz.at/matlab/techdoc/ref/namelengthmax.html namelengthmax]</span><br />
| style="width:20%" | <span id="nan">[http://itp.tugraz.at/matlab/techdoc/ref/nan.html nan]</span><br />
| style="width:20%" | <span id="nargchk">[http://itp.tugraz.at/matlab/techdoc/ref/nargchk.html nargchk]</span><br />
| style="width:20%" | <span id="nargin">[http://itp.tugraz.at/matlab/techdoc/ref/nargin.html nargin]</span><br />
| style="width:20%" | <span id="nargout">[http://itp.tugraz.at/matlab/techdoc/ref/nargout.html nargout]</span><br />
|-<br />
| style="width:20%" | <span id="nargoutchk">[http://itp.tugraz.at/matlab/techdoc/ref/nargoutchk.html nargoutchk]</span><br />
| style="width:20%" | <span id="native2unicode">[http://itp.tugraz.at/matlab/techdoc/ref/native2unicode.html native2unicode]</span><br />
| style="width:20%" | <span id="nchoosek">[http://itp.tugraz.at/matlab/techdoc/ref/nchoosek.html nchoosek]</span><br />
| style="width:20%" | <span id="ndgrid">[http://itp.tugraz.at/matlab/techdoc/ref/ndgrid.html ndgrid]</span><br />
| style="width:20%" | <span id="ndims">[http://itp.tugraz.at/matlab/techdoc/ref/ndims.html ndims]</span><br />
|-<br />
| style="width:20%" | <span id="ne">[http://itp.tugraz.at/matlab/techdoc/ref/ne.html ne]</span><br />
| style="width:20%" | <span id="nemexception">[http://itp.tugraz.at/matlab/techdoc/ref/nemexception.html nemexception]</span><br />
| style="width:20%" | <span id="newplot">[http://itp.tugraz.at/matlab/techdoc/ref/newplot.html newplot]</span><br />
| style="width:20%" | <span id="nextpow2">[http://itp.tugraz.at/matlab/techdoc/ref/nextpow2.html nextpow2]</span><br />
| style="width:20%" | <span id="nnz">[http://itp.tugraz.at/matlab/techdoc/ref/nnz.html nnz]</span><br />
|-<br />
| style="width:20%" | <span id="noanimate">[http://itp.tugraz.at/matlab/techdoc/ref/noanimate.html noanimate]</span><br />
| style="width:20%" | <span id="nonzeros">[http://itp.tugraz.at/matlab/techdoc/ref/nonzeros.html nonzeros]</span><br />
| style="width:20%" | <span id="norm">[http://itp.tugraz.at/matlab/techdoc/ref/norm.html norm]</span><br />
| style="width:20%" | <span id="normest">[http://itp.tugraz.at/matlab/techdoc/ref/normest.html normest]</span><br />
| style="width:20%" | <span id="not">[http://itp.tugraz.at/matlab/techdoc/ref/not.html not]</span><br />
|-<br />
| style="width:20%" | <span id="notebook">[http://itp.tugraz.at/matlab/techdoc/ref/notebook.html notebook]</span><br />
| style="width:20%" | <span id="now">[http://itp.tugraz.at/matlab/techdoc/ref/now.html now]</span><br />
| style="width:20%" | <span id="nthroot">[http://itp.tugraz.at/matlab/techdoc/ref/nthroot.html nthroot]</span><br />
| style="width:20%" | <span id="null">[http://itp.tugraz.at/matlab/techdoc/ref/null.html null]</span><br />
| style="width:20%" | <span id="num2cell">[http://itp.tugraz.at/matlab/techdoc/ref/num2cell.html num2cell]</span><br />
|-<br />
| style="width:20%" | <span id="num2hex">[http://itp.tugraz.at/matlab/techdoc/ref/num2hex.html num2hex]</span><br />
| style="width:20%" | <span id="num2str">[http://itp.tugraz.at/matlab/techdoc/ref/num2str.html num2str]</span><br />
| style="width:20%" | <span id="numel">[http://itp.tugraz.at/matlab/techdoc/ref/numel.html numel]</span><br />
| style="width:20%" | <span id="nzmax">[http://itp.tugraz.at/matlab/techdoc/ref/nzmax.html nzmax]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= o =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="ode15i">[http://itp.tugraz.at/matlab/techdoc/ref/ode15i.html ode15i]</span><br />
| style="width:20%" | <span id="ode23">[http://itp.tugraz.at/matlab/techdoc/ref/ode23.html ode23]</span><br />
| style="width:20%" | <span id="ode45">[http://itp.tugraz.at/matlab/techdoc/ref/ode45.html ode45]</span><br />
| style="width:20%" | <span id="ode113">[http://itp.tugraz.at/matlab/techdoc/ref/ode113.html ode113]</span><br />
| style="width:20%" | <span id="ode15s">[http://itp.tugraz.at/matlab/techdoc/ref/ode15s.html ode15s]</span><br />
|-<br />
| style="width:20%" | <span id="ode23s">[http://itp.tugraz.at/matlab/techdoc/ref/ode23s.html ode23s]</span><br />
| style="width:20%" | <span id="ode23t">[http://itp.tugraz.at/matlab/techdoc/ref/ode23t.html ode23t]</span><br />
| style="width:20%" | <span id="ode23tb">[http://itp.tugraz.at/matlab/techdoc/ref/ode23tb.html ode23tb]</span><br />
| style="width:20%" | <span id="odefile">[http://itp.tugraz.at/matlab/techdoc/ref/odefile.html odefile]</span><br />
| style="width:20%" | <span id="odeget">[http://itp.tugraz.at/matlab/techdoc/ref/odeget.html odeget]</span><br />
|-<br />
| style="width:20%" | <span id="odeset">[http://itp.tugraz.at/matlab/techdoc/ref/odeset.html odeset]</span><br />
| style="width:20%" | <span id="odextend">[http://itp.tugraz.at/matlab/techdoc/ref/odextend.html odextend]</span><br />
| style="width:20%" | <span id="ones">[http://itp.tugraz.at/matlab/techdoc/ref/ones.html ones]</span><br />
| style="width:20%" | <span id="open">[http://itp.tugraz.at/matlab/techdoc/ref/open.html open]</span><br />
| style="width:20%" | <span id="openfig">[http://itp.tugraz.at/matlab/techdoc/ref/openfig.html openfig]</span><br />
|-<br />
| style="width:20%" | <span id="opengl">[http://itp.tugraz.at/matlab/techdoc/ref/opengl.html opengl]</span><br />
| style="width:20%" | <span id="openvar">[http://itp.tugraz.at/matlab/techdoc/ref/openvar.html openvar]</span><br />
| style="width:20%" | <span id="optimget">[http://itp.tugraz.at/matlab/techdoc/ref/optimget.html optimget]</span><br />
| style="width:20%" | <span id="optimset">[http://itp.tugraz.at/matlab/techdoc/ref/optimset.html optimset]</span><br />
| style="width:20%" | <span id="or">[http://itp.tugraz.at/matlab/techdoc/ref/or.html or]</span><br />
|-<br />
| style="width:20%" | <span id="ordeig">[http://itp.tugraz.at/matlab/techdoc/ref/ordeig.html ordeig]</span><br />
| style="width:20%" | <span id="orderfields">[http://itp.tugraz.at/matlab/techdoc/ref/orderfields.html orderfields]</span><br />
| style="width:20%" | <span id="ordqz">[http://itp.tugraz.at/matlab/techdoc/ref/ordqz.html ordqz]</span><br />
| style="width:20%" | <span id="ordschur">[http://itp.tugraz.at/matlab/techdoc/ref/ordschur.html ordschur]</span><br />
| style="width:20%" | <span id="orient">[http://itp.tugraz.at/matlab/techdoc/ref/orient.html orient]</span><br />
|-<br />
| style="width:20%" | <span id="orth">[http://itp.tugraz.at/matlab/techdoc/ref/orth.html orth]</span><br />
| style="width:20%" | <span id="otherwise">[http://itp.tugraz.at/matlab/techdoc/ref/otherwise.html otherwise]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= p =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="pack">[http://itp.tugraz.at/matlab/techdoc/ref/pack.html pack]</span><br />
| style="width:20%" | <span id="padecoef">[http://itp.tugraz.at/matlab/techdoc/ref/padecoef.html padecoef]</span><br />
| style="width:20%" | <span id="pagesetupdlg">[http://itp.tugraz.at/matlab/techdoc/ref/pagesetupdlg.html pagesetupdlg]</span><br />
| style="width:20%" | <span id="pan">[http://itp.tugraz.at/matlab/techdoc/ref/pan.html pan]</span><br />
| style="width:20%" | <span id="pareto">[http://itp.tugraz.at/matlab/techdoc/ref/pareto.html pareto]</span><br />
|-<br />
| style="width:20%" | <span id="parseinputparser">[http://itp.tugraz.at/matlab/techdoc/ref/parseinputparser.html parseinputparser]</span><br />
| style="width:20%" | <span id="parsesoapresponse">[http://itp.tugraz.at/matlab/techdoc/ref/parsesoapresponse.html parsesoapresponse]</span><br />
| style="width:20%" | <span id="partialpath">[http://itp.tugraz.at/matlab/techdoc/ref/partialpath.html partialpath]</span><br />
| style="width:20%" | <span id="pascal">[http://itp.tugraz.at/matlab/techdoc/ref/pascal.html pascal]</span><br />
| style="width:20%" | <span id="patch">[http://itp.tugraz.at/matlab/techdoc/ref/patch.html patch]</span><br />
|-<br />
| style="width:20%" | <span id="patch_props">[http://itp.tugraz.at/matlab/techdoc/ref/patch_props.html patch_props]</span><br />
| style="width:20%" | <span id="path">[http://itp.tugraz.at/matlab/techdoc/ref/path.html path]</span><br />
| style="width:20%" | <span id="path2rc">[http://itp.tugraz.at/matlab/techdoc/ref/path2rc.html path2rc]</span><br />
| style="width:20%" | <span id="pathdef">[http://itp.tugraz.at/matlab/techdoc/ref/pathdef.html pathdef]</span><br />
| style="width:20%" | <span id="pathsep">[http://itp.tugraz.at/matlab/techdoc/ref/pathsep.html pathsep]</span><br />
|-<br />
| style="width:20%" | <span id="pathtool">[http://itp.tugraz.at/matlab/techdoc/ref/pathtool.html pathtool]</span><br />
| style="width:20%" | <span id="pause">[http://itp.tugraz.at/matlab/techdoc/ref/pause.html pause]</span><br />
| style="width:20%" | <span id="pbaspect">[http://itp.tugraz.at/matlab/techdoc/ref/pbaspect.html pbaspect]</span><br />
| style="width:20%" | <span id="pcg">[http://itp.tugraz.at/matlab/techdoc/ref/pcg.html pcg]</span><br />
| style="width:20%" | <span id="pchip">[http://itp.tugraz.at/matlab/techdoc/ref/pchip.html pchip]</span><br />
|-<br />
| style="width:20%" | <span id="pcode">[http://itp.tugraz.at/matlab/techdoc/ref/pcode.html pcode]</span><br />
| style="width:20%" | <span id="pcolor">[http://itp.tugraz.at/matlab/techdoc/ref/pcolor.html pcolor]</span><br />
| style="width:20%" | <span id="pdepe">[http://itp.tugraz.at/matlab/techdoc/ref/pdepe.html pdepe]</span><br />
| style="width:20%" | <span id="pdeval">[http://itp.tugraz.at/matlab/techdoc/ref/pdeval.html pdeval]</span><br />
| style="width:20%" | <span id="peaks">[http://itp.tugraz.at/matlab/techdoc/ref/peaks.html peaks]</span><br />
|-<br />
| style="width:20%" | <span id="perl">[http://itp.tugraz.at/matlab/techdoc/ref/perl.html perl]</span><br />
| style="width:20%" | <span id="perms">[http://itp.tugraz.at/matlab/techdoc/ref/perms.html perms]</span><br />
| style="width:20%" | <span id="permute">[http://itp.tugraz.at/matlab/techdoc/ref/permute.html permute]</span><br />
| style="width:20%" | <span id="persistent">[http://itp.tugraz.at/matlab/techdoc/ref/persistent.html persistent]</span><br />
| style="width:20%" | <span id="pi">[http://itp.tugraz.at/matlab/techdoc/ref/pi.html pi]</span><br />
|-<br />
| style="width:20%" | <span id="pie">[http://itp.tugraz.at/matlab/techdoc/ref/pie.html pie]</span><br />
| style="width:20%" | <span id="pie3">[http://itp.tugraz.at/matlab/techdoc/ref/pie3.html pie3]</span><br />
| style="width:20%" | <span id="pinv">[http://itp.tugraz.at/matlab/techdoc/ref/pinv.html pinv]</span><br />
| style="width:20%" | <span id="planerot">[http://itp.tugraz.at/matlab/techdoc/ref/planerot.html planerot]</span><br />
| style="width:20%" | <span id="playshow">[http://itp.tugraz.at/matlab/techdoc/ref/playshow.html playshow]</span><br />
|-<br />
| style="width:20%" | <span id="plot">[http://itp.tugraz.at/matlab/techdoc/ref/plot.html plot]</span><br />
| style="width:20%" | <span id="plottimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/plottimeseries.html plottimeseries]</span><br />
| style="width:20%" | <span id="plot3">[http://itp.tugraz.at/matlab/techdoc/ref/plot3.html plot3]</span><br />
| style="width:20%" | <span id="plotbrowser">[http://itp.tugraz.at/matlab/techdoc/ref/plotbrowser.html plotbrowser]</span><br />
| style="width:20%" | <span id="plotedit">[http://itp.tugraz.at/matlab/techdoc/ref/plotedit.html plotedit]</span><br />
|-<br />
| style="width:20%" | <span id="plotmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/plotmatrix.html plotmatrix]</span><br />
| style="width:20%" | <span id="plottools">[http://itp.tugraz.at/matlab/techdoc/ref/plottools.html plottools]</span><br />
| style="width:20%" | <span id="plotyy">[http://itp.tugraz.at/matlab/techdoc/ref/plotyy.html plotyy]</span><br />
| style="width:20%" | <span id="pol2cart">[http://itp.tugraz.at/matlab/techdoc/ref/pol2cart.html pol2cart]</span><br />
| style="width:20%" | <span id="polar">[http://itp.tugraz.at/matlab/techdoc/ref/polar.html polar]</span><br />
|-<br />
| style="width:20%" | <span id="poly">[http://itp.tugraz.at/matlab/techdoc/ref/poly.html poly]</span><br />
| style="width:20%" | <span id="polyarea">[http://itp.tugraz.at/matlab/techdoc/ref/polyarea.html polyarea]</span><br />
| style="width:20%" | <span id="polyder">[http://itp.tugraz.at/matlab/techdoc/ref/polyder.html polyder]</span><br />
| style="width:20%" | <span id="polyeig">[http://itp.tugraz.at/matlab/techdoc/ref/polyeig.html polyeig]</span><br />
| style="width:20%" | <span id="polyfit">[http://itp.tugraz.at/matlab/techdoc/ref/polyfit.html polyfit]</span><br />
|-<br />
| style="width:20%" | <span id="polyint">[http://itp.tugraz.at/matlab/techdoc/ref/polyint.html polyint]</span><br />
| style="width:20%" | <span id="polyval">[http://itp.tugraz.at/matlab/techdoc/ref/polyval.html polyval]</span><br />
| style="width:20%" | <span id="polyvalm">[http://itp.tugraz.at/matlab/techdoc/ref/polyvalm.html polyvalm]</span><br />
| style="width:20%" | <span id="pow2">[http://itp.tugraz.at/matlab/techdoc/ref/pow2.html pow2]</span><br />
| style="width:20%" | <span id="power">[http://itp.tugraz.at/matlab/techdoc/ref/power.html power]</span><br />
|-<br />
| style="width:20%" | <span id="ppval">[http://itp.tugraz.at/matlab/techdoc/ref/ppval.html ppval]</span><br />
| style="width:20%" | <span id="prefdir">[http://itp.tugraz.at/matlab/techdoc/ref/prefdir.html prefdir]</span><br />
| style="width:20%" | <span id="preferences">[http://itp.tugraz.at/matlab/techdoc/ref/preferences.html preferences]</span><br />
| style="width:20%" | <span id="primes">[http://itp.tugraz.at/matlab/techdoc/ref/primes.html primes]</span><br />
| style="width:20%" | <span id="print">[http://itp.tugraz.at/matlab/techdoc/ref/print.html print]</span><br />
|-<br />
| style="width:20%" | <span id="printopt">[http://itp.tugraz.at/matlab/techdoc/ref/printopt.html printopt]</span><br />
| style="width:20%" | <span id="printdlg">[http://itp.tugraz.at/matlab/techdoc/ref/printdlg.html printdlg]</span><br />
| style="width:20%" | <span id="printpreview">[http://itp.tugraz.at/matlab/techdoc/ref/printpreview.html printpreview]</span><br />
| style="width:20%" | <span id="prod">[http://itp.tugraz.at/matlab/techdoc/ref/prod.html prod]</span><br />
| style="width:20%" | <span id="profile">[http://itp.tugraz.at/matlab/techdoc/ref/profile.html profile]</span><br />
|-<br />
| style="width:20%" | <span id="profsave">[http://itp.tugraz.at/matlab/techdoc/ref/profsave.html profsave]</span><br />
| style="width:20%" | <span id="propedit">[http://itp.tugraz.at/matlab/techdoc/ref/propedit.html propedit]</span><br />
| style="width:20%" | <span id="propertyeditor">[http://itp.tugraz.at/matlab/techdoc/ref/propertyeditor.html propertyeditor]</span><br />
| style="width:20%" | <span id="psi">[http://itp.tugraz.at/matlab/techdoc/ref/psi.html psi]</span><br />
| style="width:20%" | <span id="publish">[http://itp.tugraz.at/matlab/techdoc/ref/publish.html publish]</span><br />
|-<br />
| style="width:20%" | <span id="putchararray">[http://itp.tugraz.at/matlab/techdoc/ref/putchararray.html putchararray]</span><br />
| style="width:20%" | <span id="putfullmatrix">[http://itp.tugraz.at/matlab/techdoc/ref/putfullmatrix.html putfullmatrix]</span><br />
| style="width:20%" | <span id="putworkspacedata">[http://itp.tugraz.at/matlab/techdoc/ref/putworkspacedata.html putworkspacedata]</span><br />
| style="width:20%" | <span id="pwd">[http://itp.tugraz.at/matlab/techdoc/ref/pwd.html pwd]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= q =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="qmr">[http://itp.tugraz.at/matlab/techdoc/ref/qmr.html qmr]</span><br />
| style="width:20%" | <span id="qr">[http://itp.tugraz.at/matlab/techdoc/ref/qr.html qr]</span><br />
| style="width:20%" | <span id="qrdelete">[http://itp.tugraz.at/matlab/techdoc/ref/qrdelete.html qrdelete]</span><br />
| style="width:20%" | <span id="qrinsert">[http://itp.tugraz.at/matlab/techdoc/ref/qrinsert.html qrinsert]</span><br />
| style="width:20%" | <span id="qrupdate">[http://itp.tugraz.at/matlab/techdoc/ref/qrupdate.html qrupdate]</span><br />
|-<br />
| style="width:20%" | <span id="quad">[http://itp.tugraz.at/matlab/techdoc/ref/quad.html quad]</span><br />
| style="width:20%" | <span id="quadgk">[http://itp.tugraz.at/matlab/techdoc/ref/quadgk.html quadgk]</span><br />
| style="width:20%" | <span id="quadl">[http://itp.tugraz.at/matlab/techdoc/ref/quadl.html quadl]</span><br />
| style="width:20%" | <span id="quadv">[http://itp.tugraz.at/matlab/techdoc/ref/quadv.html quadv]</span><br />
| style="width:20%" | <span id="questdlg">[http://itp.tugraz.at/matlab/techdoc/ref/questdlg.html questdlg]</span><br />
|-<br />
| style="width:20%" | <span id="quit">[http://itp.tugraz.at/matlab/techdoc/ref/quit.html quit]</span><br />
| style="width:20%" | <span id="quiver">[http://itp.tugraz.at/matlab/techdoc/ref/quiver.html quiver]</span><br />
| style="width:20%" | <span id="quiver3">[http://itp.tugraz.at/matlab/techdoc/ref/quiver3.html quiver3]</span><br />
| style="width:20%" | <span id="quivergroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/quivergroupproperties.html quivergroupproperties]</span><br />
| style="width:20%" | <span id="qz">[http://itp.tugraz.at/matlab/techdoc/ref/qz.html qz]</span><br />
|-<br />
|}<br />
<br />
= r =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="relationaloperators">[http://itp.tugraz.at/matlab/techdoc/ref/relationaloperators.html relationaloperators]</span><br />
| style="width:20%" | <span id="rdivide">[http://itp.tugraz.at/matlab/techdoc/ref/rdivide.html rdivide]</span><br />
| style="width:20%" | <span id="rand">[http://itp.tugraz.at/matlab/techdoc/ref/rand.html rand]</span><br />
| style="width:20%" | <span id="randn">[http://itp.tugraz.at/matlab/techdoc/ref/randn.html randn]</span><br />
| style="width:20%" | <span id="randperm">[http://itp.tugraz.at/matlab/techdoc/ref/randperm.html randperm]</span><br />
|-<br />
| style="width:20%" | <span id="rank">[http://itp.tugraz.at/matlab/techdoc/ref/rank.html rank]</span><br />
| style="width:20%" | <span id="rat">[http://itp.tugraz.at/matlab/techdoc/ref/rat.html rat]</span><br />
| style="width:20%" | <span id="rats">[http://itp.tugraz.at/matlab/techdoc/ref/rats.html rats]</span><br />
| style="width:20%" | <span id="rbbox">[http://itp.tugraz.at/matlab/techdoc/ref/rbbox.html rbbox]</span><br />
| style="width:20%" | <span id="rcond">[http://itp.tugraz.at/matlab/techdoc/ref/rcond.html rcond]</span><br />
|-<br />
| style="width:20%" | <span id="read">[http://itp.tugraz.at/matlab/techdoc/ref/read.html read]</span><br />
| style="width:20%" | <span id="readasync">[http://itp.tugraz.at/matlab/techdoc/ref/readasync.html readasync]</span><br />
| style="width:20%" | <span id="real">[http://itp.tugraz.at/matlab/techdoc/ref/real.html real]</span><br />
| style="width:20%" | <span id="reallog">[http://itp.tugraz.at/matlab/techdoc/ref/reallog.html reallog]</span><br />
| style="width:20%" | <span id="realmax">[http://itp.tugraz.at/matlab/techdoc/ref/realmax.html realmax]</span><br />
|-<br />
| style="width:20%" | <span id="realmin">[http://itp.tugraz.at/matlab/techdoc/ref/realmin.html realmin]</span><br />
| style="width:20%" | <span id="realpow">[http://itp.tugraz.at/matlab/techdoc/ref/realpow.html realpow]</span><br />
| style="width:20%" | <span id="realsqrt">[http://itp.tugraz.at/matlab/techdoc/ref/realsqrt.html realsqrt]</span><br />
| style="width:20%" | <span id="record">[http://itp.tugraz.at/matlab/techdoc/ref/record.html record]</span><br />
| style="width:20%" | <span id="rectangle">[http://itp.tugraz.at/matlab/techdoc/ref/rectangle.html rectangle]</span><br />
|-<br />
| style="width:20%" | <span id="rectangle_props">[http://itp.tugraz.at/matlab/techdoc/ref/rectangle_props.html rectangle_props]</span><br />
| style="width:20%" | <span id="rectint">[http://itp.tugraz.at/matlab/techdoc/ref/rectint.html rectint]</span><br />
| style="width:20%" | <span id="recycle">[http://itp.tugraz.at/matlab/techdoc/ref/recycle.html recycle]</span><br />
| style="width:20%" | <span id="reducepatch">[http://itp.tugraz.at/matlab/techdoc/ref/reducepatch.html reducepatch]</span><br />
| style="width:20%" | <span id="reducevolume">[http://itp.tugraz.at/matlab/techdoc/ref/reducevolume.html reducevolume]</span><br />
|-<br />
| style="width:20%" | <span id="refresh">[http://itp.tugraz.at/matlab/techdoc/ref/refresh.html refresh]</span><br />
| style="width:20%" | <span id="refreshdata">[http://itp.tugraz.at/matlab/techdoc/ref/refreshdata.html refreshdata]</span><br />
| style="width:20%" | <span id="regexpi">[http://itp.tugraz.at/matlab/techdoc/ref/regexpi.html regexpi]</span><br />
| style="width:20%" | <span id="regexp">[http://itp.tugraz.at/matlab/techdoc/ref/regexp.html regexp]</span><br />
| style="width:20%" | <span id="regexprep">[http://itp.tugraz.at/matlab/techdoc/ref/regexprep.html regexprep]</span><br />
|-<br />
| style="width:20%" | <span id="regexptranslate">[http://itp.tugraz.at/matlab/techdoc/ref/regexptranslate.html regexptranslate]</span><br />
| style="width:20%" | <span id="registerevent">[http://itp.tugraz.at/matlab/techdoc/ref/registerevent.html registerevent]</span><br />
| style="width:20%" | <span id="rehash">[http://itp.tugraz.at/matlab/techdoc/ref/rehash.html rehash]</span><br />
| style="width:20%" | <span id="release">[http://itp.tugraz.at/matlab/techdoc/ref/release.html release]</span><br />
| style="width:20%" | <span id="rem">[http://itp.tugraz.at/matlab/techdoc/ref/rem.html rem]</span><br />
|-<br />
| style="width:20%" | <span id="removets">[http://itp.tugraz.at/matlab/techdoc/ref/removets.html removets]</span><br />
| style="width:20%" | <span id="rename">[http://itp.tugraz.at/matlab/techdoc/ref/rename.html rename]</span><br />
| style="width:20%" | <span id="repmat">[http://itp.tugraz.at/matlab/techdoc/ref/repmat.html repmat]</span><br />
| style="width:20%" | <span id="resampletimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/resampletimeseries.html resampletimeseries]</span><br />
| style="width:20%" | <span id="resampletscollection">[http://itp.tugraz.at/matlab/techdoc/ref/resampletscollection.html resampletscollection]</span><br />
|-<br />
| style="width:20%" | <span id="reset">[http://itp.tugraz.at/matlab/techdoc/ref/reset.html reset]</span><br />
| style="width:20%" | <span id="reshape">[http://itp.tugraz.at/matlab/techdoc/ref/reshape.html reshape]</span><br />
| style="width:20%" | <span id="residue">[http://itp.tugraz.at/matlab/techdoc/ref/residue.html residue]</span><br />
| style="width:20%" | <span id="restoredefaultpath">[http://itp.tugraz.at/matlab/techdoc/ref/restoredefaultpath.html restoredefaultpath]</span><br />
| style="width:20%" | <span id="rethrow">[http://itp.tugraz.at/matlab/techdoc/ref/rethrow.html rethrow]</span><br />
|-<br />
| style="width:20%" | <span id="rethrowmexception">[http://itp.tugraz.at/matlab/techdoc/ref/rethrowmexception.html rethrowmexception]</span><br />
| style="width:20%" | <span id="return">[http://itp.tugraz.at/matlab/techdoc/ref/return.html return]</span><br />
| style="width:20%" | <span id="rgb2hsv">[http://itp.tugraz.at/matlab/techdoc/ref/rgb2hsv.html rgb2hsv]</span><br />
| style="width:20%" | <span id="rgbplot">[http://itp.tugraz.at/matlab/techdoc/ref/rgbplot.html rgbplot]</span><br />
| style="width:20%" | <span id="ribbon">[http://itp.tugraz.at/matlab/techdoc/ref/ribbon.html ribbon]</span><br />
|-<br />
| style="width:20%" | <span id="rmappdata">[http://itp.tugraz.at/matlab/techdoc/ref/rmappdata.html rmappdata]</span><br />
| style="width:20%" | <span id="rmdir">[http://itp.tugraz.at/matlab/techdoc/ref/rmdir.html rmdir]</span><br />
| style="width:20%" | <span id="rmfield">[http://itp.tugraz.at/matlab/techdoc/ref/rmfield.html rmfield]</span><br />
| style="width:20%" | <span id="rmpath">[http://itp.tugraz.at/matlab/techdoc/ref/rmpath.html rmpath]</span><br />
| style="width:20%" | <span id="rmpref">[http://itp.tugraz.at/matlab/techdoc/ref/rmpref.html rmpref]</span><br />
|-<br />
| style="width:20%" | <span id="rootobject">[http://itp.tugraz.at/matlab/techdoc/ref/rootobject.html rootobject]</span><br />
| style="width:20%" | <span id="rootobject_props">[http://itp.tugraz.at/matlab/techdoc/ref/rootobject_props.html rootobject_props]</span><br />
| style="width:20%" | <span id="roots">[http://itp.tugraz.at/matlab/techdoc/ref/roots.html roots]</span><br />
| style="width:20%" | <span id="rose">[http://itp.tugraz.at/matlab/techdoc/ref/rose.html rose]</span><br />
| style="width:20%" | <span id="rosser">[http://itp.tugraz.at/matlab/techdoc/ref/rosser.html rosser]</span><br />
|-<br />
| style="width:20%" | <span id="rot90">[http://itp.tugraz.at/matlab/techdoc/ref/rot90.html rot90]</span><br />
| style="width:20%" | <span id="rotate">[http://itp.tugraz.at/matlab/techdoc/ref/rotate.html rotate]</span><br />
| style="width:20%" | <span id="rotate3d">[http://itp.tugraz.at/matlab/techdoc/ref/rotate3d.html rotate3d]</span><br />
| style="width:20%" | <span id="round">[http://itp.tugraz.at/matlab/techdoc/ref/round.html round]</span><br />
| style="width:20%" | <span id="rref">[http://itp.tugraz.at/matlab/techdoc/ref/rref.html rref]</span><br />
|-<br />
| style="width:20%" | <span id="rsf2csf">[http://itp.tugraz.at/matlab/techdoc/ref/rsf2csf.html rsf2csf]</span><br />
| style="width:20%" | <span id="run">[http://itp.tugraz.at/matlab/techdoc/ref/run.html run]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= s =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="specialcharacters">[http://itp.tugraz.at/matlab/techdoc/ref/specialcharacters.html specialcharacters]</span><br />
| style="width:20%" | <span id="serial.clear">[http://itp.tugraz.at/matlab/techdoc/ref/serial.clear.html serial.clear]</span><br />
| style="width:20%" | <span id="serial.delete">[http://itp.tugraz.at/matlab/techdoc/ref/serial.delete.html serial.delete]</span><br />
| style="width:20%" | <span id="serial.disp">[http://itp.tugraz.at/matlab/techdoc/ref/serial.disp.html serial.disp]</span><br />
| style="width:20%" | <span id="serial.fclose">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fclose.html serial.fclose]</span><br />
|-<br />
| style="width:20%" | <span id="serial.fgetl">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fgetl.html serial.fgetl]</span><br />
| style="width:20%" | <span id="serial.fgets">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fgets.html serial.fgets]</span><br />
| style="width:20%" | <span id="serial.fopen">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fopen.html serial.fopen]</span><br />
| style="width:20%" | <span id="serial.fprintf">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fprintf.html serial.fprintf]</span><br />
| style="width:20%" | <span id="serial.fread">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fread.html serial.fread]</span><br />
|-<br />
| style="width:20%" | <span id="serial.fscanf">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fscanf.html serial.fscanf]</span><br />
| style="width:20%" | <span id="serial.fwrite">[http://itp.tugraz.at/matlab/techdoc/ref/serial.fwrite.html serial.fwrite]</span><br />
| style="width:20%" | <span id="serial.get">[http://itp.tugraz.at/matlab/techdoc/ref/serial.get.html serial.get]</span><br />
| style="width:20%" | <span id="serial.isvalid">[http://itp.tugraz.at/matlab/techdoc/ref/serial.isvalid.html serial.isvalid]</span><br />
| style="width:20%" | <span id="serial.length">[http://itp.tugraz.at/matlab/techdoc/ref/serial.length.html serial.length]</span><br />
|-<br />
| style="width:20%" | <span id="serial.load">[http://itp.tugraz.at/matlab/techdoc/ref/serial.load.html serial.load]</span><br />
| style="width:20%" | <span id="save">[http://itp.tugraz.at/matlab/techdoc/ref/save.html save]</span><br />
| style="width:20%" | <span id="serial.save">[http://itp.tugraz.at/matlab/techdoc/ref/serial.save.html serial.save]</span><br />
| style="width:20%" | <span id="saveas">[http://itp.tugraz.at/matlab/techdoc/ref/saveas.html saveas]</span><br />
| style="width:20%" | <span id="saveobj">[http://itp.tugraz.at/matlab/techdoc/ref/saveobj.html saveobj]</span><br />
|-<br />
| style="width:20%" | <span id="savepath">[http://itp.tugraz.at/matlab/techdoc/ref/savepath.html savepath]</span><br />
| style="width:20%" | <span id="scatter">[http://itp.tugraz.at/matlab/techdoc/ref/scatter.html scatter]</span><br />
| style="width:20%" | <span id="scatter3">[http://itp.tugraz.at/matlab/techdoc/ref/scatter3.html scatter3]</span><br />
| style="width:20%" | <span id="scattergroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/scattergroupproperties.html scattergroupproperties]</span><br />
| style="width:20%" | <span id="schur">[http://itp.tugraz.at/matlab/techdoc/ref/schur.html schur]</span><br />
|-<br />
| style="width:20%" | <span id="script">[http://itp.tugraz.at/matlab/techdoc/ref/script.html script]</span><br />
| style="width:20%" | <span id="sec">[http://itp.tugraz.at/matlab/techdoc/ref/sec.html sec]</span><br />
| style="width:20%" | <span id="secd">[http://itp.tugraz.at/matlab/techdoc/ref/secd.html secd]</span><br />
| style="width:20%" | <span id="sech">[http://itp.tugraz.at/matlab/techdoc/ref/sech.html sech]</span><br />
| style="width:20%" | <span id="selectmoveresize">[http://itp.tugraz.at/matlab/techdoc/ref/selectmoveresize.html selectmoveresize]</span><br />
|-<br />
| style="width:20%" | <span id="semilogx">[http://itp.tugraz.at/matlab/techdoc/ref/semilogx.html semilogx]</span><br />
| style="width:20%" | <span id="semilogy">[http://itp.tugraz.at/matlab/techdoc/ref/semilogy.html semilogy]</span><br />
| style="width:20%" | <span id="sendmail">[http://itp.tugraz.at/matlab/techdoc/ref/sendmail.html sendmail]</span><br />
| style="width:20%" | <span id="serial">[http://itp.tugraz.at/matlab/techdoc/ref/serial.html serial]</span><br />
| style="width:20%" | <span id="serialbreak">[http://itp.tugraz.at/matlab/techdoc/ref/serialbreak.html serialbreak]</span><br />
|-<br />
| style="width:20%" | <span id="set">[http://itp.tugraz.at/matlab/techdoc/ref/set.html set]</span><br />
| style="width:20%" | <span id="serial.set">[http://itp.tugraz.at/matlab/techdoc/ref/serial.set.html serial.set]</span><br />
| style="width:20%" | <span id="settimer">[http://itp.tugraz.at/matlab/techdoc/ref/settimer.html settimer]</span><br />
| style="width:20%" | <span id="settimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/settimeseries.html settimeseries]</span><br />
| style="width:20%" | <span id="settscollection">[http://itp.tugraz.at/matlab/techdoc/ref/settscollection.html settscollection]</span><br />
|-<br />
| style="width:20%" | <span id="setabstimetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/setabstimetimeseries.html setabstimetimeseries]</span><br />
| style="width:20%" | <span id="setabstimetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/setabstimetscollection.html setabstimetscollection]</span><br />
| style="width:20%" | <span id="setappdata">[http://itp.tugraz.at/matlab/techdoc/ref/setappdata.html setappdata]</span><br />
| style="width:20%" | <span id="setdiff">[http://itp.tugraz.at/matlab/techdoc/ref/setdiff.html setdiff]</span><br />
| style="width:20%" | <span id="setenv">[http://itp.tugraz.at/matlab/techdoc/ref/setenv.html setenv]</span><br />
|-<br />
| style="width:20%" | <span id="setfield">[http://itp.tugraz.at/matlab/techdoc/ref/setfield.html setfield]</span><br />
| style="width:20%" | <span id="setinterpmethod">[http://itp.tugraz.at/matlab/techdoc/ref/setinterpmethod.html setinterpmethod]</span><br />
| style="width:20%" | <span id="setpixelposition">[http://itp.tugraz.at/matlab/techdoc/ref/setpixelposition.html setpixelposition]</span><br />
| style="width:20%" | <span id="setpref">[http://itp.tugraz.at/matlab/techdoc/ref/setpref.html setpref]</span><br />
| style="width:20%" | <span id="setstr">[http://itp.tugraz.at/matlab/techdoc/ref/setstr.html setstr]</span><br />
|-<br />
| style="width:20%" | <span id="settimeseriesnames">[http://itp.tugraz.at/matlab/techdoc/ref/settimeseriesnames.html settimeseriesnames]</span><br />
| style="width:20%" | <span id="setxor">[http://itp.tugraz.at/matlab/techdoc/ref/setxor.html setxor]</span><br />
| style="width:20%" | <span id="shading">[http://itp.tugraz.at/matlab/techdoc/ref/shading.html shading]</span><br />
| style="width:20%" | <span id="shiftdim">[http://itp.tugraz.at/matlab/techdoc/ref/shiftdim.html shiftdim]</span><br />
| style="width:20%" | <span id="showplottool">[http://itp.tugraz.at/matlab/techdoc/ref/showplottool.html showplottool]</span><br />
|-<br />
| style="width:20%" | <span id="shrinkfaces">[http://itp.tugraz.at/matlab/techdoc/ref/shrinkfaces.html shrinkfaces]</span><br />
| style="width:20%" | <span id="sign">[http://itp.tugraz.at/matlab/techdoc/ref/sign.html sign]</span><br />
| style="width:20%" | <span id="sin">[http://itp.tugraz.at/matlab/techdoc/ref/sin.html sin]</span><br />
| style="width:20%" | <span id="sind">[http://itp.tugraz.at/matlab/techdoc/ref/sind.html sind]</span><br />
| style="width:20%" | <span id="single">[http://itp.tugraz.at/matlab/techdoc/ref/single.html single]</span><br />
|-<br />
| style="width:20%" | <span id="sinh">[http://itp.tugraz.at/matlab/techdoc/ref/sinh.html sinh]</span><br />
| style="width:20%" | <span id="size">[http://itp.tugraz.at/matlab/techdoc/ref/size.html size]</span><br />
| style="width:20%" | <span id="serial.size">[http://itp.tugraz.at/matlab/techdoc/ref/serial.size.html serial.size]</span><br />
| style="width:20%" | <span id="sizetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/sizetimeseries.html sizetimeseries]</span><br />
| style="width:20%" | <span id="sizetscollection">[http://itp.tugraz.at/matlab/techdoc/ref/sizetscollection.html sizetscollection]</span><br />
|-<br />
| style="width:20%" | <span id="slice">[http://itp.tugraz.at/matlab/techdoc/ref/slice.html slice]</span><br />
| style="width:20%" | <span id="smooth3">[http://itp.tugraz.at/matlab/techdoc/ref/smooth3.html smooth3]</span><br />
| style="width:20%" | <span id="sort">[http://itp.tugraz.at/matlab/techdoc/ref/sort.html sort]</span><br />
| style="width:20%" | <span id="sortrows">[http://itp.tugraz.at/matlab/techdoc/ref/sortrows.html sortrows]</span><br />
| style="width:20%" | <span id="sound">[http://itp.tugraz.at/matlab/techdoc/ref/sound.html sound]</span><br />
|-<br />
| style="width:20%" | <span id="soundsc">[http://itp.tugraz.at/matlab/techdoc/ref/soundsc.html soundsc]</span><br />
| style="width:20%" | <span id="spalloc">[http://itp.tugraz.at/matlab/techdoc/ref/spalloc.html spalloc]</span><br />
| style="width:20%" | <span id="sparse">[http://itp.tugraz.at/matlab/techdoc/ref/sparse.html sparse]</span><br />
| style="width:20%" | <span id="spaugment">[http://itp.tugraz.at/matlab/techdoc/ref/spaugment.html spaugment]</span><br />
| style="width:20%" | <span id="spconvert">[http://itp.tugraz.at/matlab/techdoc/ref/spconvert.html spconvert]</span><br />
|-<br />
| style="width:20%" | <span id="spdiags">[http://itp.tugraz.at/matlab/techdoc/ref/spdiags.html spdiags]</span><br />
| style="width:20%" | <span id="specular">[http://itp.tugraz.at/matlab/techdoc/ref/specular.html specular]</span><br />
| style="width:20%" | <span id="speye">[http://itp.tugraz.at/matlab/techdoc/ref/speye.html speye]</span><br />
| style="width:20%" | <span id="spfun">[http://itp.tugraz.at/matlab/techdoc/ref/spfun.html spfun]</span><br />
| style="width:20%" | <span id="sph2cart">[http://itp.tugraz.at/matlab/techdoc/ref/sph2cart.html sph2cart]</span><br />
|-<br />
| style="width:20%" | <span id="sphere">[http://itp.tugraz.at/matlab/techdoc/ref/sphere.html sphere]</span><br />
| style="width:20%" | <span id="spinmap">[http://itp.tugraz.at/matlab/techdoc/ref/spinmap.html spinmap]</span><br />
| style="width:20%" | <span id="spline">[http://itp.tugraz.at/matlab/techdoc/ref/spline.html spline]</span><br />
| style="width:20%" | <span id="spones">[http://itp.tugraz.at/matlab/techdoc/ref/spones.html spones]</span><br />
| style="width:20%" | <span id="spparms">[http://itp.tugraz.at/matlab/techdoc/ref/spparms.html spparms]</span><br />
|-<br />
| style="width:20%" | <span id="sprand">[http://itp.tugraz.at/matlab/techdoc/ref/sprand.html sprand]</span><br />
| style="width:20%" | <span id="sprandn">[http://itp.tugraz.at/matlab/techdoc/ref/sprandn.html sprandn]</span><br />
| style="width:20%" | <span id="sprandsym">[http://itp.tugraz.at/matlab/techdoc/ref/sprandsym.html sprandsym]</span><br />
| style="width:20%" | <span id="sprank">[http://itp.tugraz.at/matlab/techdoc/ref/sprank.html sprank]</span><br />
| style="width:20%" | <span id="sprintf">[http://itp.tugraz.at/matlab/techdoc/ref/sprintf.html sprintf]</span><br />
|-<br />
| style="width:20%" | <span id="spy">[http://itp.tugraz.at/matlab/techdoc/ref/spy.html spy]</span><br />
| style="width:20%" | <span id="sqrt">[http://itp.tugraz.at/matlab/techdoc/ref/sqrt.html sqrt]</span><br />
| style="width:20%" | <span id="sqrtm">[http://itp.tugraz.at/matlab/techdoc/ref/sqrtm.html sqrtm]</span><br />
| style="width:20%" | <span id="squeeze">[http://itp.tugraz.at/matlab/techdoc/ref/squeeze.html squeeze]</span><br />
| style="width:20%" | <span id="ss2tf">[http://itp.tugraz.at/matlab/techdoc/ref/ss2tf.html ss2tf]</span><br />
|-<br />
| style="width:20%" | <span id="sscanf">[http://itp.tugraz.at/matlab/techdoc/ref/sscanf.html sscanf]</span><br />
| style="width:20%" | <span id="stairs">[http://itp.tugraz.at/matlab/techdoc/ref/stairs.html stairs]</span><br />
| style="width:20%" | <span id="stairseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/stairseriesproperties.html stairseriesproperties]</span><br />
| style="width:20%" | <span id="start">[http://itp.tugraz.at/matlab/techdoc/ref/start.html start]</span><br />
| style="width:20%" | <span id="startat">[http://itp.tugraz.at/matlab/techdoc/ref/startat.html startat]</span><br />
|-<br />
| style="width:20%" | <span id="startup">[http://itp.tugraz.at/matlab/techdoc/ref/startup.html startup]</span><br />
| style="width:20%" | <span id="std">[http://itp.tugraz.at/matlab/techdoc/ref/std.html std]</span><br />
| style="width:20%" | <span id="stdtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/stdtimeseries.html stdtimeseries]</span><br />
| style="width:20%" | <span id="stem">[http://itp.tugraz.at/matlab/techdoc/ref/stem.html stem]</span><br />
| style="width:20%" | <span id="stem3">[http://itp.tugraz.at/matlab/techdoc/ref/stem3.html stem3]</span><br />
|-<br />
| style="width:20%" | <span id="stemseriesproperties">[http://itp.tugraz.at/matlab/techdoc/ref/stemseriesproperties.html stemseriesproperties]</span><br />
| style="width:20%" | <span id="stop">[http://itp.tugraz.at/matlab/techdoc/ref/stop.html stop]</span><br />
| style="width:20%" | <span id="stopasync">[http://itp.tugraz.at/matlab/techdoc/ref/stopasync.html stopasync]</span><br />
| style="width:20%" | <span id="str2double">[http://itp.tugraz.at/matlab/techdoc/ref/str2double.html str2double]</span><br />
| style="width:20%" | <span id="str2func">[http://itp.tugraz.at/matlab/techdoc/ref/str2func.html str2func]</span><br />
|-<br />
| style="width:20%" | <span id="str2mat">[http://itp.tugraz.at/matlab/techdoc/ref/str2mat.html str2mat]</span><br />
| style="width:20%" | <span id="str2num">[http://itp.tugraz.at/matlab/techdoc/ref/str2num.html str2num]</span><br />
| style="width:20%" | <span id="strcat">[http://itp.tugraz.at/matlab/techdoc/ref/strcat.html strcat]</span><br />
| style="width:20%" | <span id="strcmp">[http://itp.tugraz.at/matlab/techdoc/ref/strcmp.html strcmp]</span><br />
| style="width:20%" | <span id="strcmpi">[http://itp.tugraz.at/matlab/techdoc/ref/strcmpi.html strcmpi]</span><br />
|-<br />
| style="width:20%" | <span id="stream2">[http://itp.tugraz.at/matlab/techdoc/ref/stream2.html stream2]</span><br />
| style="width:20%" | <span id="stream3">[http://itp.tugraz.at/matlab/techdoc/ref/stream3.html stream3]</span><br />
| style="width:20%" | <span id="streamline">[http://itp.tugraz.at/matlab/techdoc/ref/streamline.html streamline]</span><br />
| style="width:20%" | <span id="streamparticles">[http://itp.tugraz.at/matlab/techdoc/ref/streamparticles.html streamparticles]</span><br />
| style="width:20%" | <span id="streamribbon">[http://itp.tugraz.at/matlab/techdoc/ref/streamribbon.html streamribbon]</span><br />
|-<br />
| style="width:20%" | <span id="streamslice">[http://itp.tugraz.at/matlab/techdoc/ref/streamslice.html streamslice]</span><br />
| style="width:20%" | <span id="streamtube">[http://itp.tugraz.at/matlab/techdoc/ref/streamtube.html streamtube]</span><br />
| style="width:20%" | <span id="strfind">[http://itp.tugraz.at/matlab/techdoc/ref/strfind.html strfind]</span><br />
| style="width:20%" | <span id="strings">[http://itp.tugraz.at/matlab/techdoc/ref/strings.html strings]</span><br />
| style="width:20%" | <span id="strjust">[http://itp.tugraz.at/matlab/techdoc/ref/strjust.html strjust]</span><br />
|-<br />
| style="width:20%" | <span id="strmatch">[http://itp.tugraz.at/matlab/techdoc/ref/strmatch.html strmatch]</span><br />
| style="width:20%" | <span id="strncmpi">[http://itp.tugraz.at/matlab/techdoc/ref/strncmpi.html strncmpi]</span><br />
| style="width:20%" | <span id="strncmp">[http://itp.tugraz.at/matlab/techdoc/ref/strncmp.html strncmp]</span><br />
| style="width:20%" | <span id="strread">[http://itp.tugraz.at/matlab/techdoc/ref/strread.html strread]</span><br />
| style="width:20%" | <span id="strrep">[http://itp.tugraz.at/matlab/techdoc/ref/strrep.html strrep]</span><br />
|-<br />
| style="width:20%" | <span id="strtok">[http://itp.tugraz.at/matlab/techdoc/ref/strtok.html strtok]</span><br />
| style="width:20%" | <span id="strtrim">[http://itp.tugraz.at/matlab/techdoc/ref/strtrim.html strtrim]</span><br />
| style="width:20%" | <span id="struct">[http://itp.tugraz.at/matlab/techdoc/ref/struct.html struct]</span><br />
| style="width:20%" | <span id="struct2cell">[http://itp.tugraz.at/matlab/techdoc/ref/struct2cell.html struct2cell]</span><br />
| style="width:20%" | <span id="structfun">[http://itp.tugraz.at/matlab/techdoc/ref/structfun.html structfun]</span><br />
|-<br />
| style="width:20%" | <span id="strvcat">[http://itp.tugraz.at/matlab/techdoc/ref/strvcat.html strvcat]</span><br />
| style="width:20%" | <span id="sub2ind">[http://itp.tugraz.at/matlab/techdoc/ref/sub2ind.html sub2ind]</span><br />
| style="width:20%" | <span id="subplot">[http://itp.tugraz.at/matlab/techdoc/ref/subplot.html subplot]</span><br />
| style="width:20%" | <span id="subsasgn">[http://itp.tugraz.at/matlab/techdoc/ref/subsasgn.html subsasgn]</span><br />
| style="width:20%" | <span id="subsindex">[http://itp.tugraz.at/matlab/techdoc/ref/subsindex.html subsindex]</span><br />
|-<br />
| style="width:20%" | <span id="subspace">[http://itp.tugraz.at/matlab/techdoc/ref/subspace.html subspace]</span><br />
| style="width:20%" | <span id="subsref">[http://itp.tugraz.at/matlab/techdoc/ref/subsref.html subsref]</span><br />
| style="width:20%" | <span id="substruct">[http://itp.tugraz.at/matlab/techdoc/ref/substruct.html substruct]</span><br />
| style="width:20%" | <span id="subvolume">[http://itp.tugraz.at/matlab/techdoc/ref/subvolume.html subvolume]</span><br />
| style="width:20%" | <span id="sum">[http://itp.tugraz.at/matlab/techdoc/ref/sum.html sum]</span><br />
|-<br />
| style="width:20%" | <span id="sumtimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/sumtimeseries.html sumtimeseries]</span><br />
| style="width:20%" | <span id="superiorto">[http://itp.tugraz.at/matlab/techdoc/ref/superiorto.html superiorto]</span><br />
| style="width:20%" | <span id="support">[http://itp.tugraz.at/matlab/techdoc/ref/support.html support]</span><br />
| style="width:20%" | <span id="surf">[http://itp.tugraz.at/matlab/techdoc/ref/surf.html surf]</span><br />
| style="width:20%" | <span id="surfc">[http://itp.tugraz.at/matlab/techdoc/ref/surfc.html surfc]</span><br />
|-<br />
| style="width:20%" | <span id="surf2patch">[http://itp.tugraz.at/matlab/techdoc/ref/surf2patch.html surf2patch]</span><br />
| style="width:20%" | <span id="surface">[http://itp.tugraz.at/matlab/techdoc/ref/surface.html surface]</span><br />
| style="width:20%" | <span id="surface_props">[http://itp.tugraz.at/matlab/techdoc/ref/surface_props.html surface_props]</span><br />
| style="width:20%" | <span id="surfaceplotproperties">[http://itp.tugraz.at/matlab/techdoc/ref/surfaceplotproperties.html surfaceplotproperties]</span><br />
| style="width:20%" | <span id="surfl">[http://itp.tugraz.at/matlab/techdoc/ref/surfl.html surfl]</span><br />
|-<br />
| style="width:20%" | <span id="surfnorm">[http://itp.tugraz.at/matlab/techdoc/ref/surfnorm.html surfnorm]</span><br />
| style="width:20%" | <span id="svd">[http://itp.tugraz.at/matlab/techdoc/ref/svd.html svd]</span><br />
| style="width:20%" | <span id="svds">[http://itp.tugraz.at/matlab/techdoc/ref/svds.html svds]</span><br />
| style="width:20%" | <span id="swapbytes">[http://itp.tugraz.at/matlab/techdoc/ref/swapbytes.html swapbytes]</span><br />
| style="width:20%" | <span id="switch">[http://itp.tugraz.at/matlab/techdoc/ref/switch.html switch]</span><br />
|-<br />
| style="width:20%" | <span id="symamd">[http://itp.tugraz.at/matlab/techdoc/ref/symamd.html symamd]</span><br />
| style="width:20%" | <span id="symbfact">[http://itp.tugraz.at/matlab/techdoc/ref/symbfact.html symbfact]</span><br />
| style="width:20%" | <span id="symmlq">[http://itp.tugraz.at/matlab/techdoc/ref/symmlq.html symmlq]</span><br />
| style="width:20%" | <span id="symmmd">[http://itp.tugraz.at/matlab/techdoc/ref/symmmd.html symmmd]</span><br />
| style="width:20%" | <span id="symrcm">[http://itp.tugraz.at/matlab/techdoc/ref/symrcm.html symrcm]</span><br />
|-<br />
| style="width:20%" | <span id="symvar">[http://itp.tugraz.at/matlab/techdoc/ref/symvar.html symvar]</span><br />
| style="width:20%" | <span id="synchronize">[http://itp.tugraz.at/matlab/techdoc/ref/synchronize.html synchronize]</span><br />
| style="width:20%" | <span id="syntax">[http://itp.tugraz.at/matlab/techdoc/ref/syntax.html syntax]</span><br />
| style="width:20%" | <span id="system">[http://itp.tugraz.at/matlab/techdoc/ref/system.html system]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= t =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="tan">[http://itp.tugraz.at/matlab/techdoc/ref/tan.html tan]</span><br />
| style="width:20%" | <span id="tand">[http://itp.tugraz.at/matlab/techdoc/ref/tand.html tand]</span><br />
| style="width:20%" | <span id="tanh">[http://itp.tugraz.at/matlab/techdoc/ref/tanh.html tanh]</span><br />
| style="width:20%" | <span id="tar">[http://itp.tugraz.at/matlab/techdoc/ref/tar.html tar]</span><br />
| style="width:20%" | <span id="tempdir">[http://itp.tugraz.at/matlab/techdoc/ref/tempdir.html tempdir]</span><br />
|-<br />
| style="width:20%" | <span id="tempname">[http://itp.tugraz.at/matlab/techdoc/ref/tempname.html tempname]</span><br />
| style="width:20%" | <span id="tetramesh">[http://itp.tugraz.at/matlab/techdoc/ref/tetramesh.html tetramesh]</span><br />
| style="width:20%" | <span id="texlabel">[http://itp.tugraz.at/matlab/techdoc/ref/texlabel.html texlabel]</span><br />
| style="width:20%" | <span id="text">[http://itp.tugraz.at/matlab/techdoc/ref/text.html text]</span><br />
| style="width:20%" | <span id="text_props">[http://itp.tugraz.at/matlab/techdoc/ref/text_props.html text_props]</span><br />
|-<br />
| style="width:20%" | <span id="textread">[http://itp.tugraz.at/matlab/techdoc/ref/textread.html textread]</span><br />
| style="width:20%" | <span id="textscan">[http://itp.tugraz.at/matlab/techdoc/ref/textscan.html textscan]</span><br />
| style="width:20%" | <span id="textwrap">[http://itp.tugraz.at/matlab/techdoc/ref/textwrap.html textwrap]</span><br />
| style="width:20%" | <span id="throwmexception">[http://itp.tugraz.at/matlab/techdoc/ref/throwmexception.html throwmexception]</span><br />
| style="width:20%" | <span id="throwascallermexception">[http://itp.tugraz.at/matlab/techdoc/ref/throwascallermexception.html throwascallermexception]</span><br />
|-<br />
| style="width:20%" | <span id="tic">[http://itp.tugraz.at/matlab/techdoc/ref/tic.html tic]</span><br />
| style="width:20%" | <span id="toc">[http://itp.tugraz.at/matlab/techdoc/ref/toc.html toc]</span><br />
| style="width:20%" | <span id="timer">[http://itp.tugraz.at/matlab/techdoc/ref/timer.html timer]</span><br />
| style="width:20%" | <span id="timerfind">[http://itp.tugraz.at/matlab/techdoc/ref/timerfind.html timerfind]</span><br />
| style="width:20%" | <span id="timerfindall">[http://itp.tugraz.at/matlab/techdoc/ref/timerfindall.html timerfindall]</span><br />
|-<br />
| style="width:20%" | <span id="timeseries">[http://itp.tugraz.at/matlab/techdoc/ref/timeseries.html timeseries]</span><br />
| style="width:20%" | <span id="title">[http://itp.tugraz.at/matlab/techdoc/ref/title.html title]</span><br />
| style="width:20%" | <span id="todatenum">[http://itp.tugraz.at/matlab/techdoc/ref/todatenum.html todatenum]</span><br />
| style="width:20%" | <span id="toeplitz">[http://itp.tugraz.at/matlab/techdoc/ref/toeplitz.html toeplitz]</span><br />
| style="width:20%" | <span id="toolboxdir">[http://itp.tugraz.at/matlab/techdoc/ref/toolboxdir.html toolboxdir]</span><br />
|-<br />
| style="width:20%" | <span id="trace">[http://itp.tugraz.at/matlab/techdoc/ref/trace.html trace]</span><br />
| style="width:20%" | <span id="transposetimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/transposetimeseries.html transposetimeseries]</span><br />
| style="width:20%" | <span id="trapz">[http://itp.tugraz.at/matlab/techdoc/ref/trapz.html trapz]</span><br />
| style="width:20%" | <span id="treelayout">[http://itp.tugraz.at/matlab/techdoc/ref/treelayout.html treelayout]</span><br />
| style="width:20%" | <span id="treeplot">[http://itp.tugraz.at/matlab/techdoc/ref/treeplot.html treeplot]</span><br />
|-<br />
| style="width:20%" | <span id="tril">[http://itp.tugraz.at/matlab/techdoc/ref/tril.html tril]</span><br />
| style="width:20%" | <span id="trimesh">[http://itp.tugraz.at/matlab/techdoc/ref/trimesh.html trimesh]</span><br />
| style="width:20%" | <span id="triplequad">[http://itp.tugraz.at/matlab/techdoc/ref/triplequad.html triplequad]</span><br />
| style="width:20%" | <span id="triplot">[http://itp.tugraz.at/matlab/techdoc/ref/triplot.html triplot]</span><br />
| style="width:20%" | <span id="trisurf">[http://itp.tugraz.at/matlab/techdoc/ref/trisurf.html trisurf]</span><br />
|-<br />
| style="width:20%" | <span id="triu">[http://itp.tugraz.at/matlab/techdoc/ref/triu.html triu]</span><br />
| style="width:20%" | <span id="true">[http://itp.tugraz.at/matlab/techdoc/ref/true.html true]</span><br />
| style="width:20%" | <span id="try">[http://itp.tugraz.at/matlab/techdoc/ref/try.html try]</span><br />
| style="width:20%" | <span id="tscollection">[http://itp.tugraz.at/matlab/techdoc/ref/tscollection.html tscollection]</span><br />
| style="width:20%" | <span id="tsdata.event">[http://itp.tugraz.at/matlab/techdoc/ref/tsdata.event.html tsdata.event]</span><br />
|-<br />
| style="width:20%" | <span id="tsearch">[http://itp.tugraz.at/matlab/techdoc/ref/tsearch.html tsearch]</span><br />
| style="width:20%" | <span id="tsearchn">[http://itp.tugraz.at/matlab/techdoc/ref/tsearchn.html tsearchn]</span><br />
| style="width:20%" | <span id="tsprops">[http://itp.tugraz.at/matlab/techdoc/ref/tsprops.html tsprops]</span><br />
| style="width:20%" | <span id="tstool">[http://itp.tugraz.at/matlab/techdoc/ref/tstool.html tstool]</span><br />
| style="width:20%" | <span id="type">[http://itp.tugraz.at/matlab/techdoc/ref/type.html type]</span><br />
|-<br />
| style="width:20%" | <span id="typecast">[http://itp.tugraz.at/matlab/techdoc/ref/typecast.html typecast]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= u =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="uibuttongroup">[http://itp.tugraz.at/matlab/techdoc/ref/uibuttongroup.html uibuttongroup]</span><br />
| style="width:20%" | <span id="uibuttongroupproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uibuttongroupproperties.html uibuttongroupproperties]</span><br />
| style="width:20%" | <span id="uicontextmenu">[http://itp.tugraz.at/matlab/techdoc/ref/uicontextmenu.html uicontextmenu]</span><br />
| style="width:20%" | <span id="uicontextmenu_props">[http://itp.tugraz.at/matlab/techdoc/ref/uicontextmenu_props.html uicontextmenu_props]</span><br />
| style="width:20%" | <span id="uicontrol">[http://itp.tugraz.at/matlab/techdoc/ref/uicontrol.html uicontrol]</span><br />
|-<br />
| style="width:20%" | <span id="uicontrol_props">[http://itp.tugraz.at/matlab/techdoc/ref/uicontrol_props.html uicontrol_props]</span><br />
| style="width:20%" | <span id="uigetdir">[http://itp.tugraz.at/matlab/techdoc/ref/uigetdir.html uigetdir]</span><br />
| style="width:20%" | <span id="uigetfile">[http://itp.tugraz.at/matlab/techdoc/ref/uigetfile.html uigetfile]</span><br />
| style="width:20%" | <span id="uigetpref">[http://itp.tugraz.at/matlab/techdoc/ref/uigetpref.html uigetpref]</span><br />
| style="width:20%" | <span id="uiimport">[http://itp.tugraz.at/matlab/techdoc/ref/uiimport.html uiimport]</span><br />
|-<br />
| style="width:20%" | <span id="uimenu">[http://itp.tugraz.at/matlab/techdoc/ref/uimenu.html uimenu]</span><br />
| style="width:20%" | <span id="uimenu_props">[http://itp.tugraz.at/matlab/techdoc/ref/uimenu_props.html uimenu_props]</span><br />
| style="width:20%" | <span id="uint8">[http://itp.tugraz.at/matlab/techdoc/ref/uint8.html uint8]</span><br />
| style="width:20%" | <span id="uint16">[http://itp.tugraz.at/matlab/techdoc/ref/uint16.html uint16]</span><br />
| style="width:20%" | <span id="uint32">[http://itp.tugraz.at/matlab/techdoc/ref/uint32.html uint32]</span><br />
|-<br />
| style="width:20%" | <span id="uint64">[http://itp.tugraz.at/matlab/techdoc/ref/uint64.html uint64]</span><br />
| style="width:20%" | <span id="uiopen">[http://itp.tugraz.at/matlab/techdoc/ref/uiopen.html uiopen]</span><br />
| style="width:20%" | <span id="uipanel">[http://itp.tugraz.at/matlab/techdoc/ref/uipanel.html uipanel]</span><br />
| style="width:20%" | <span id="uipanelproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uipanelproperties.html uipanelproperties]</span><br />
| style="width:20%" | <span id="uipushtool">[http://itp.tugraz.at/matlab/techdoc/ref/uipushtool.html uipushtool]</span><br />
|-<br />
| style="width:20%" | <span id="uipushtool_props">[http://itp.tugraz.at/matlab/techdoc/ref/uipushtool_props.html uipushtool_props]</span><br />
| style="width:20%" | <span id="uiputfile">[http://itp.tugraz.at/matlab/techdoc/ref/uiputfile.html uiputfile]</span><br />
| style="width:20%" | <span id="uiresume">[http://itp.tugraz.at/matlab/techdoc/ref/uiresume.html uiresume]</span><br />
| style="width:20%" | <span id="uiwait">[http://itp.tugraz.at/matlab/techdoc/ref/uiwait.html uiwait]</span><br />
| style="width:20%" | <span id="uisave">[http://itp.tugraz.at/matlab/techdoc/ref/uisave.html uisave]</span><br />
|-<br />
| style="width:20%" | <span id="uisetcolor">[http://itp.tugraz.at/matlab/techdoc/ref/uisetcolor.html uisetcolor]</span><br />
| style="width:20%" | <span id="uisetfont">[http://itp.tugraz.at/matlab/techdoc/ref/uisetfont.html uisetfont]</span><br />
| style="width:20%" | <span id="uisetpref">[http://itp.tugraz.at/matlab/techdoc/ref/uisetpref.html uisetpref]</span><br />
| style="width:20%" | <span id="uistack">[http://itp.tugraz.at/matlab/techdoc/ref/uistack.html uistack]</span><br />
| style="width:20%" | <span id="uitoggletool">[http://itp.tugraz.at/matlab/techdoc/ref/uitoggletool.html uitoggletool]</span><br />
|-<br />
| style="width:20%" | <span id="uitoggletool_props">[http://itp.tugraz.at/matlab/techdoc/ref/uitoggletool_props.html uitoggletool_props]</span><br />
| style="width:20%" | <span id="uitoolbar">[http://itp.tugraz.at/matlab/techdoc/ref/uitoolbar.html uitoolbar]</span><br />
| style="width:20%" | <span id="uitoolbarproperties">[http://itp.tugraz.at/matlab/techdoc/ref/uitoolbarproperties.html uitoolbarproperties]</span><br />
| style="width:20%" | <span id="undocheckout">[http://itp.tugraz.at/matlab/techdoc/ref/undocheckout.html undocheckout]</span><br />
| style="width:20%" | <span id="unicode2native">[http://itp.tugraz.at/matlab/techdoc/ref/unicode2native.html unicode2native]</span><br />
|-<br />
| style="width:20%" | <span id="union">[http://itp.tugraz.at/matlab/techdoc/ref/union.html union]</span><br />
| style="width:20%" | <span id="unique">[http://itp.tugraz.at/matlab/techdoc/ref/unique.html unique]</span><br />
| style="width:20%" | <span id="unix">[http://itp.tugraz.at/matlab/techdoc/ref/unix.html unix]</span><br />
| style="width:20%" | <span id="unloadlibrary">[http://itp.tugraz.at/matlab/techdoc/ref/unloadlibrary.html unloadlibrary]</span><br />
| style="width:20%" | <span id="unmkpp">[http://itp.tugraz.at/matlab/techdoc/ref/unmkpp.html unmkpp]</span><br />
|-<br />
| style="width:20%" | <span id="unregisterallevents">[http://itp.tugraz.at/matlab/techdoc/ref/unregisterallevents.html unregisterallevents]</span><br />
| style="width:20%" | <span id="unregisterevent">[http://itp.tugraz.at/matlab/techdoc/ref/unregisterevent.html unregisterevent]</span><br />
| style="width:20%" | <span id="untar">[http://itp.tugraz.at/matlab/techdoc/ref/untar.html untar]</span><br />
| style="width:20%" | <span id="unwrap">[http://itp.tugraz.at/matlab/techdoc/ref/unwrap.html unwrap]</span><br />
| style="width:20%" | <span id="unzip">[http://itp.tugraz.at/matlab/techdoc/ref/unzip.html unzip]</span><br />
|-<br />
| style="width:20%" | <span id="upper">[http://itp.tugraz.at/matlab/techdoc/ref/upper.html upper]</span><br />
| style="width:20%" | <span id="urlread">[http://itp.tugraz.at/matlab/techdoc/ref/urlread.html urlread]</span><br />
| style="width:20%" | <span id="urlwrite">[http://itp.tugraz.at/matlab/techdoc/ref/urlwrite.html urlwrite]</span><br />
| style="width:20%" | <span id="usejava">[http://itp.tugraz.at/matlab/techdoc/ref/usejava.html usejava]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= v =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="validateattributes">[http://itp.tugraz.at/matlab/techdoc/ref/validateattributes.html validateattributes]</span><br />
| style="width:20%" | <span id="validatestring">[http://itp.tugraz.at/matlab/techdoc/ref/validatestring.html validatestring]</span><br />
| style="width:20%" | <span id="vander">[http://itp.tugraz.at/matlab/techdoc/ref/vander.html vander]</span><br />
| style="width:20%" | <span id="var">[http://itp.tugraz.at/matlab/techdoc/ref/var.html var]</span><br />
| style="width:20%" | <span id="vartimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/vartimeseries.html vartimeseries]</span><br />
|-<br />
| style="width:20%" | <span id="varargin">[http://itp.tugraz.at/matlab/techdoc/ref/varargin.html varargin]</span><br />
| style="width:20%" | <span id="varargout">[http://itp.tugraz.at/matlab/techdoc/ref/varargout.html varargout]</span><br />
| style="width:20%" | <span id="vectorize">[http://itp.tugraz.at/matlab/techdoc/ref/vectorize.html vectorize]</span><br />
| style="width:20%" | <span id="ver">[http://itp.tugraz.at/matlab/techdoc/ref/ver.html ver]</span><br />
| style="width:20%" | <span id="verctrl">[http://itp.tugraz.at/matlab/techdoc/ref/verctrl.html verctrl]</span><br />
|-<br />
| style="width:20%" | <span id="verlessthan">[http://itp.tugraz.at/matlab/techdoc/ref/verlessthan.html verlessthan]</span><br />
| style="width:20%" | <span id="version">[http://itp.tugraz.at/matlab/techdoc/ref/version.html version]</span><br />
| style="width:20%" | <span id="vertcat">[http://itp.tugraz.at/matlab/techdoc/ref/vertcat.html vertcat]</span><br />
| style="width:20%" | <span id="vertcattimeseries">[http://itp.tugraz.at/matlab/techdoc/ref/vertcattimeseries.html vertcattimeseries]</span><br />
| style="width:20%" | <span id="vertcattscollection">[http://itp.tugraz.at/matlab/techdoc/ref/vertcattscollection.html vertcattscollection]</span><br />
|-<br />
| style="width:20%" | <span id="view">[http://itp.tugraz.at/matlab/techdoc/ref/view.html view]</span><br />
| style="width:20%" | <span id="viewmtx">[http://itp.tugraz.at/matlab/techdoc/ref/viewmtx.html viewmtx]</span><br />
| style="width:20%" | <span id="volumebounds">[http://itp.tugraz.at/matlab/techdoc/ref/volumebounds.html volumebounds]</span><br />
| style="width:20%" | <span id="voronoi">[http://itp.tugraz.at/matlab/techdoc/ref/voronoi.html voronoi]</span><br />
| style="width:20%" | <span id="voronoin">[http://itp.tugraz.at/matlab/techdoc/ref/voronoin.html voronoin]</span><br />
|-<br />
|}<br />
<br />
= w =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="wait">[http://itp.tugraz.at/matlab/techdoc/ref/wait.html wait]</span><br />
| style="width:20%" | <span id="waitbar">[http://itp.tugraz.at/matlab/techdoc/ref/waitbar.html waitbar]</span><br />
| style="width:20%" | <span id="waitfor">[http://itp.tugraz.at/matlab/techdoc/ref/waitfor.html waitfor]</span><br />
| style="width:20%" | <span id="waitforbuttonpress">[http://itp.tugraz.at/matlab/techdoc/ref/waitforbuttonpress.html waitforbuttonpress]</span><br />
| style="width:20%" | <span id="warndlg">[http://itp.tugraz.at/matlab/techdoc/ref/warndlg.html warndlg]</span><br />
|-<br />
| style="width:20%" | <span id="warning">[http://itp.tugraz.at/matlab/techdoc/ref/warning.html warning]</span><br />
| style="width:20%" | <span id="waterfall">[http://itp.tugraz.at/matlab/techdoc/ref/waterfall.html waterfall]</span><br />
| style="width:20%" | <span id="wavfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/wavfinfo.html wavfinfo]</span><br />
| style="width:20%" | <span id="wavplay">[http://itp.tugraz.at/matlab/techdoc/ref/wavplay.html wavplay]</span><br />
| style="width:20%" | <span id="wavread">[http://itp.tugraz.at/matlab/techdoc/ref/wavread.html wavread]</span><br />
|-<br />
| style="width:20%" | <span id="wavrecord">[http://itp.tugraz.at/matlab/techdoc/ref/wavrecord.html wavrecord]</span><br />
| style="width:20%" | <span id="wavwrite">[http://itp.tugraz.at/matlab/techdoc/ref/wavwrite.html wavwrite]</span><br />
| style="width:20%" | <span id="web">[http://itp.tugraz.at/matlab/techdoc/ref/web.html web]</span><br />
| style="width:20%" | <span id="weekday">[http://itp.tugraz.at/matlab/techdoc/ref/weekday.html weekday]</span><br />
| style="width:20%" | <span id="what">[http://itp.tugraz.at/matlab/techdoc/ref/what.html what]</span><br />
|-<br />
| style="width:20%" | <span id="whatsnew">[http://itp.tugraz.at/matlab/techdoc/ref/whatsnew.html whatsnew]</span><br />
| style="width:20%" | <span id="which">[http://itp.tugraz.at/matlab/techdoc/ref/which.html which]</span><br />
| style="width:20%" | <span id="while">[http://itp.tugraz.at/matlab/techdoc/ref/while.html while]</span><br />
| style="width:20%" | <span id="whitebg">[http://itp.tugraz.at/matlab/techdoc/ref/whitebg.html whitebg]</span><br />
| style="width:20%" | <span id="who">[http://itp.tugraz.at/matlab/techdoc/ref/who.html who]</span><br />
|-<br />
| style="width:20%" | <span id="whos">[http://itp.tugraz.at/matlab/techdoc/ref/whos.html whos]</span><br />
| style="width:20%" | <span id="wilkinson">[http://itp.tugraz.at/matlab/techdoc/ref/wilkinson.html wilkinson]</span><br />
| style="width:20%" | <span id="winopen">[http://itp.tugraz.at/matlab/techdoc/ref/winopen.html winopen]</span><br />
| style="width:20%" | <span id="winqueryreg">[http://itp.tugraz.at/matlab/techdoc/ref/winqueryreg.html winqueryreg]</span><br />
| style="width:20%" | <span id="wk1finfo">[http://itp.tugraz.at/matlab/techdoc/ref/wk1finfo.html wk1finfo]</span><br />
|-<br />
| style="width:20%" | <span id="wk1read">[http://itp.tugraz.at/matlab/techdoc/ref/wk1read.html wk1read]</span><br />
| style="width:20%" | <span id="wk1write">[http://itp.tugraz.at/matlab/techdoc/ref/wk1write.html wk1write]</span><br />
| style="width:20%" | <span id="workspace">[http://itp.tugraz.at/matlab/techdoc/ref/workspace.html workspace]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= x =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="xlabel">[http://itp.tugraz.at/matlab/techdoc/ref/xlabel.html xlabel]</span><br />
| style="width:20%" | <span id="xlim">[http://itp.tugraz.at/matlab/techdoc/ref/xlim.html xlim]</span><br />
| style="width:20%" | <span id="xlsfinfo">[http://itp.tugraz.at/matlab/techdoc/ref/xlsfinfo.html xlsfinfo]</span><br />
| style="width:20%" | <span id="xlsread">[http://itp.tugraz.at/matlab/techdoc/ref/xlsread.html xlsread]</span><br />
| style="width:20%" | <span id="xlswrite">[http://itp.tugraz.at/matlab/techdoc/ref/xlswrite.html xlswrite]</span><br />
|-<br />
| style="width:20%" | <span id="xmlread">[http://itp.tugraz.at/matlab/techdoc/ref/xmlread.html xmlread]</span><br />
| style="width:20%" | <span id="xmlwrite">[http://itp.tugraz.at/matlab/techdoc/ref/xmlwrite.html xmlwrite]</span><br />
| style="width:20%" | <span id="xor">[http://itp.tugraz.at/matlab/techdoc/ref/xor.html xor]</span><br />
| style="width:20%" | <span id="xslt">[http://itp.tugraz.at/matlab/techdoc/ref/xslt.html xslt]</span><br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= y =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="ylabel">[http://itp.tugraz.at/matlab/techdoc/ref/ylabel.html ylabel]</span><br />
| style="width:20%" | <span id="ylim">[http://itp.tugraz.at/matlab/techdoc/ref/ylim.html ylim]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}<br />
<br />
= z =<br />
{| style="background:#efefef; width:100%" border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e37999_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e37999_508longdesc.html zmw57dd0e37999_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38251_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38251_508longdesc.html zmw57dd0e38251_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38258_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38258_508longdesc.html zmw57dd0e38258_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38265_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38265_508longdesc.html zmw57dd0e38265_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38349_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38349_508longdesc.html zmw57dd0e38349_508longdesc]</span><br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e38384_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38384_508longdesc.html zmw57dd0e38384_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38397_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38397_508longdesc.html zmw57dd0e38397_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38404_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38404_508longdesc.html zmw57dd0e38404_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38411_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38411_508longdesc.html zmw57dd0e38411_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38421_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38421_508longdesc.html zmw57dd0e38421_508longdesc]</span><br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e38463_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38463_508longdesc.html zmw57dd0e38463_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38470_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38470_508longdesc.html zmw57dd0e38470_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38483_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38483_508longdesc.html zmw57dd0e38483_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38490_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38490_508longdesc.html zmw57dd0e38490_508longdesc]</span><br />
| style="width:20%" | <span id="zmw57dd0e38537_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38537_508longdesc.html zmw57dd0e38537_508longdesc]</span><br />
|-<br />
| style="width:20%" | <span id="zmw57dd0e38552_508longdesc">[http://itp.tugraz.at/matlab/techdoc/ref/zmw57dd0e38552_508longdesc.html zmw57dd0e38552_508longdesc]</span><br />
| style="width:20%" | <span id="zlabel">[http://itp.tugraz.at/matlab/techdoc/ref/zlabel.html zlabel]</span><br />
| style="width:20%" | <span id="zlim">[http://itp.tugraz.at/matlab/techdoc/ref/zlim.html zlim]</span><br />
| style="width:20%" | <span id="zeros">[http://itp.tugraz.at/matlab/techdoc/ref/zeros.html zeros]</span><br />
| style="width:20%" | <span id="zip">[http://itp.tugraz.at/matlab/techdoc/ref/zip.html zip]</span><br />
|-<br />
| style="width:20%" | <span id="zoom">[http://itp.tugraz.at/matlab/techdoc/ref/zoom.html zoom]</span><br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
| style="width:20%" | &nbsp;<br />
|}</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5300Filetools2007-11-05T12:46:34Z<p>Osiris: /* Matlab Update */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt.<br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird.<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5299Filetools2007-11-05T12:45:55Z<p>Osiris: /* Wiki-Hilfe generieren */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt.<br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird.<br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5298Filetools2007-11-05T12:45:28Z<p>Osiris: /* Verwendung als Anwendung */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filegenerators/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt.<br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5297Filetools2007-11-05T12:40:16Z<p>Osiris: /* Datenbank updaten */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
Sollte die library zum Verbinden mit der Datenbank nicht im Classpath sein, so ist diese noch hinzuzufügen:<br />
$ java -cp ./:./mysql-connector-java-3.1.12-bin.jar filetools/.......<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5296Meditor2007-11-05T12:37:39Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference<br />
* Partitionierung<br />
** Toolbox-Funktionen von Matlab-Funktionen unterscheiden<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5295Meditor2007-11-05T12:35:56Z<p>Osiris: /* ToDos bis zur Veröffentlichung */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen <span style="color:#00AA00">'''Erledigt'''</span><br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=5294Meditor2007-11-05T12:34:48Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>[[Category:MLTutor]]<br />
In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* HTML Help base als Preference<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5293Filetools2007-11-05T11:21:59Z<p>Osiris: /* Datenbank updaten */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
Falls noch nicht geschehen muss das File help.jar entpackt werden, da ansonsten keine Files zum Indizieren gefunden werden. <br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5292Filetools2007-11-05T11:05:37Z<p>Osiris: /* Datenbank updaten */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
<br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5291Filetools2007-11-05T11:01:09Z<p>Osiris: /* Datenbank updaten */</p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
<br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref <br />
--propertyfile<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=5290Filetools2007-11-05T10:27:53Z<p>Osiris: </p>
<hr />
<div>Die Filetools beinhalten Werkzuge zur Indizierung und Konvertierung von Matlab Hilfefiles im Umfeld des MLTutor. Hier eine Übersicht über die entwickelten Tools:<br />
{|<br />
| <tt>MatlabFunctionFileSearch</tt><br />
| Erzeugt Files mit Funktionslisten, die von der MLTutor- (genauer Meditor)-Hilfe benötigt werden.<br />
|-<br />
| <tt>MatlabHelpfileIndexer</tt><br />
| Durchforstet die Matlab-Hilfe und speichert Daten in einer Datenbank. Diese ist die Basis zur Erzeugung der Matlab-Hilfe für das Wiki. <br />
|-<br />
| <tt>HelpFileWikiIndexGenerator</tt><br />
| Generiert aus den Informationen in der Datenbank Textfiles, deren Inhalt ins Wiki kopiert wird um die Wiki-Matlab-Hilfe zu erhalten. <br />
|-<br />
| <tt>MatlabHelpfileConverter</tt><br />
| Ersetzt unbrauchbare Links in den Matlab-Hilfeseiten (html-Hilfe) durch brauchbare. <br />
|}<br />
<br />
Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
<br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. Die Datenbank selbst befindet sich auf dem Rechner faeppc14. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref --propertyfile<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Cpp_Programmierung&diff=5202Cpp Programmierung2007-06-28T07:56:19Z<p>Osiris: /* Links */</p>
<hr />
<div>==[[Compiler und IDEs]]==<br />
<br />
== [[Qt]] ==<br />
Eine Klassenbibliothek und Entwicklungsumgebung für Programmierung graphischer Benutzeroberflächen.<br />
<br />
== [[gtkmm]] ==<br />
C++ Interface zu GTK+<br />
<br />
== Debuggen von C/C++ Programmen ==<br />
Besonders die Speicherzugriffsfehler (Segmentation Faults) können schwer zu finden sein. Es gibt aber Tools mit denen die Fehlersuche wesentlich schneller und weniger frustrierend verläuft.<br><br />
=== valgrind ===<br />
Valgrind ist ein Programm, das die ganze CPU emuliert, es verfolgt jeden einzelnen Zugriff auf den Speicher, den das zu testende Programm macht. Ungültige Speicherzugriffe (z.B. über das ende eines Arrays hinausschreiben) werden auf der Konsole ausgegeben und können im Quellcode sofort ausgebessert werden. <br />
Die Verwendung ist ganz einfach:<br />
<br />
$ valgrind <das_zu_testende_programm><br />
<br />
Die Meldungen von valgrind sind etwas kryptisch, es wird aber alles klar, wenn man sich das kurze [http://www.tldp.org/HOWTO/Valgrind-HOWTO/closerview.html#usage howto] durchliest. (hier ist noch ein [http://www.linuxjournal.com/article/7930 howto]) Das zu testende Programm muss natürlich mit dem flag -g (fürs debuggen) kompiliert sein. Da die cpu emuliert wird, läuft das programm ungefähr 20 mal langsammer. Sollte für das testen aber kein Problem sein. Valgrind ist im Computerraum natürlich installiert.<br />
<br />
=== core dump ===<br />
Nach einem Speicherzugriffsfehler kann man linux dazu veranlassen einen sogenannten "core dump" abzuspeichern. Es ist eine Datei die einfach 'core' heisst. In diesem File das dann in dem Verzeichniss abgespeichert wird, von wo das Programm gestartet wurde, befindet sich der vom Programm verwendete Arbeitsspeicher, so wie er zum Zeitpunkt des Programmfehlers gerade gesetzt war. Man kann sich also den Variableninhalt zum Zeitpunkt des Fehlers anschauen. Außerdem bekommt man auch die Programmzeile, in der der Fehler aufgetreten ist. <br><br />
Der core dump wird standartmäsig nicht abgespeichert, es muss erst eine [[Konsole]] aufgemacht werden, und dort mit dem Befehl ulimit die maximale Grösse des core dump festgelegt werden. Diese Einstellung gilt dann aber nur für die eine Konsole! Nach dem Schliessen der Konsole ist alles wieder auf standarteinstellung!<br><br />
Der Befehl<br />
<br />
$ ulimit -c 20000<br />
<br />
stellt die maximale core dump grösse auf 20MB.<br><br />
Nun führt man (in der gleichen Konsole!) das fehlerhafte Programm aus, das mit einem Speicherzugriffsfehler beendet. Es wird automatisch ein core file angelegt.<br><br />
<br />
Jetzt braucht man nur ein Debugger Programm, dort die Sourcefiles angeben, und den core dump laden, und kann sie den Zustand des Programms zum Zeitpunkt des "Programmabsturzes" ansehen. Das weitverbreitetste Debugger ist "ddd". Lässt sich einfach in der Konsole mit dem Befehl<br />
<br />
$ ddd<br />
<br />
starten. Alternativ kann man auch mit der Entwicklungsumgebung <br />
$ kdevelop<br />
arbeiten. Auch dort kann man den core dump laden und das Programm debugen.<br />
Wie bei valgrind, sollte das Programm mit dem -g flag (für Debuginformationen) kompiliert sein.<br />
<br />
== Profiling von C/C++ Programmen ==<br />
Mit Hilfe des Profiling lässt sich herausfinden an welchen Stellen/Funktionen das C/C++ Programm wieviel Zeit verbraucht. Die Engpässe können leicht erkannt und eventuell im Quellcode optimiert werden, damit die Anwendung schneller läuft. <br />
Führen Sie zuerst ihre binary im callgrind aus:<br />
<br />
$ callgrind <Ihre_Anwendung><br />
<br />
Im callgrind wird genau wie im valgrind die CPU und sämtliche Speicherzugriffe nachsimuliert, weshalb die Anwenung bei dieser Analyse viel langsamer laufen wird. Callgrind erzeugt eine Datei mit den Profiligergebnissen callgrind.out.eine_zahl:<br />
<br />
Diese können im kcachegrind visualisiert werden:<br />
<br />
$ kcachegrind callgrind.out.eine_zahl<br />
<br />
Weitere Informationen gibt es im Internet: [http://kcachegrind.sourceforge.net/ kcachegrind]<br />
<br />
<br />
<br />
<br />
== [[Plotten von Daten aus C]] (oder C++)==<br />
<br />
== Quellcode Formatierung ==<br />
Mit dem Tool indent lässt sich der "Coding Standart" von C/C++ (anzahl der Leerzeichen für Tabulator Einrückungen, Automatische einrückungen in Funktionen usw.) <br />
automatisch an die üblichen Standarts anpassen. Man braucht nur<br />
<br />
$ indent <quellcode_datei.c><br />
<br />
oder<br />
<br />
$ indent *.c<br />
<br />
ausführen. In der Standardeinstellung wandelt indent dabei den C-Sourcecode gemäß der "GNU Coding Standards". Ein anderer schöner Style wäre z.B. <br />
<br />
$ indent -gnu -bli0 -i8 <quellcode_datei.c><br />
<br />
Da verschiedene Entwickler, Projekte oder Unternehmen oft unterschiedliche Formatierungsarten aufgrund ihrer Gewöhnung als besser lesbar einschätzen, kann dies sehr nützlich sein.<br />
<br />
== [[Numerische_Methoden#C.2FC.2B.2B_-_Spezifisches|Grundlegende Themen]] ==<br />
<br />
== [[C Fehler - Bugs - Probleme]] ==<br />
<br />
== Links ==<br />
<br />
*[http://www.cpp-tutor.de/cpp/index.html Online C++ Kurs] für Einsteiger<br />
*[http://de.wikibooks.org/wiki/C++-Programmierung Wikibook C++-Programmierung] gut zum Einsteigen geeignet.<br />
*[http://www.ba-stuttgart.de/~boehm/NoBugs/www/NoBugs/ recht umfangreiche Linksammlung]<br><br />
*[http://www.lysator.liu.se/c/ten-commandments.html 10 Gebote des C Programmierens]<br><br />
*[http://courses.iicm.edu/index.html Vorlesungen am IICM]<br />
*[http://courses.mbi.tugraz.at/ Unterlagen vom Maschinenbau- und Betriebsinformatikinstitut] (wo Klaus Schmaranz jetzt arbeitet) <br> Leider derzeit nicht mehr zugänglich, vielleicht kommt's ja wieder: <br> Unterlagen zu C und C++ Einführungsvorlesungen:<br />
**[http://courses.mbi.tugraz.at/ElektronischeLiteratur/SoftwareentwicklungInC.pdf Skriptum zu Einführung in die strukturierte Programmierung (früher Programmieren0)] '''C'''<br>Dies ist das Buch "Softwareentwicklung in C" von Klaus Schmaranz!<br />
**[http://courses.mbi.tugraz.at/ElektronischeLiteratur/SoftwareentwicklungInCplusplus.pdf Skriptum zu Softwareentwicklung - Praktikum (früher Programmierpraktikum)] '''C++'''<br>Dies ist das Buch "Softwareentwicklung in C++" von Klaus Schmaranz!<br />
*[http://www.parashift.com/c++-faq-lite/ C++ FAQ LITE von Marshall Cline] Für Fortgeschrittenere Benutzer mit speziellen Fragen</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=4970Filetools2007-03-25T15:29:31Z<p>Osiris: /* Datenbank updaten */</p>
<hr />
<div>Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
<br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen (in einer MySQL-Console) geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref --propertyfile<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=4969Filetools2007-03-25T15:25:19Z<p>Osiris: /* Matlab Update */</p>
<hr />
<div>Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
Wichtig: Dies ist nur eine Kurzanleitung, die die notwendigen Schritte angeben soll. Die meisten Tools besitzen noch weitere Einstellmöglichkeiten. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
<br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc/ref --propertyfile<br />
<br />
==Wiki-Hilfe generieren==<br />
Dabei handelt es sich um den Inhalt der Seite [[Matlab_-_Reference]]<br />
<br />
Mit<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator wikitext<br />
wird das File <tt>wikitext</tt> erzeugt, dessen Inhalt als Seiteninhalt im Wiki verwendet wird. <br />
<br />
==Hilfeseiten konvertieren==<br />
Sollten die Hilfeseiten Links der Form <tt><a href="file:xxxxxxxx</tt> enthalten, so können diese mit<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory><br />
in ein für Webbrowsern brauchbares Format konvertiert werden.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=4968Filetools2007-03-25T15:09:52Z<p>Osiris: /* Datenbank updaten */</p>
<hr />
<div>Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
<br />
Sollte die Tabelle für den Helpfileindex noch nicht in der Datenbank angelegt sein, so kann dies folgendermaßen geschehen:<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
Weiters sollte ein Konfigurationsfile <tt>dbproperties.xml</tt> mit den Einstellungen zur DB-Verbindung vorhanden sein. <br />
<br />
Der Befehl zum Indizieren lautet dann:<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> --propertyfile<br />
<br />
==Wiki-Hilfe generieren==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=4967Filetools2007-03-25T14:59:59Z<p>Osiris: /* Matlab Update */</p>
<hr />
<div>Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Matlab-Hilfe im Wiki auf den neuesten Stand zu bringen.<br />
<br />
Für die Konsolenbefehle wird davon ausgegangen, dass man sich im Stammverzeichnis der Filetools befindet. <br />
Weiters wird ein laufender MySQL Server (samt angelegter, verwendbarer Datenbank) vorausgesetzt. <br />
<br />
Die hier angegebenen Pfade beziehen sich auf die Matlab Version R14 SP3 und müssen bei einem Matlab Update natürlich sinngemäß angepasst werden. <br />
<br />
==MLTutor aktualisieren==<br />
Der Befehl<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab <br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
erzeugt die Files <tt>matlab_funcs</tt> und <tt>matlab_funcs_sync</tt>. Ersteres muss ins <tt>config</tt> Verzeichnis des Meditor Plugins kopiert werden, letzteres dient zur Information darüber, zu welchen Matlab-Funktionen keine Hilfefiles gefunden wurden. <br><br />
Sollen auch alle Toolbox-Funktionen in die Funktionenliste aufgenommen werden, so ist folgender Befehl zu verwenden: <br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch <br />
-d /afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/techdoc<br />
-ds /afs/itp.tugraz.at/opt/matlab/R14.sp3/help/toolbox<br />
<br />
Eventuell müssen noch folgende config-Files des Meditors angepasst werden:<br />
* <tt>helpproperties.xml</tt> (Beinhaltet die Basis-URLs zu den Hilfeseiten)<br />
* <tt>helpfileexceptions.xml</tt> (Ausnahmeregelungen für Hilfeseiten, z.B. wenn der Filename nicht gleich der Funktion ist, wie bei Operatoren)<br />
<br />
==Datenbank updaten==<br />
==Wiki-Hilfe generieren==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Filetools&diff=4966Filetools2007-03-25T14:22:37Z<p>Osiris: </p>
<hr />
<div>Die grundlegende Idee hinter diesen Tools ist, Klassen zur Verfügung zu stellen, die sowohl eigenständig (konkrete Klassen mit <tt>main(...)</tt> Methode) als auch von anderen Modulen aus verwendet werden können. Für letztere Variante wird in jedem Paket ein allgemeines Interface definiert, sodass die Klassen möglichst allgemein benutzt weden kann (z.B. in einer Strategy).<br />
<br />
=Package filesearchtools=<br />
Beinhaltet Klassen zum Durchsuchen von Verzeichnisstrukturen.<br />
<br />
==Interface==<br />
public interface IFileSearch {<br />
abstract public int searchDir(File searchDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileSearch implements IFileSearch {<br />
public SimpleFileSearch(File outputFile){}<br />
public int searchDir(File searchdir){}<br />
abstract protected boolean isDirToSearch(String dir);<br />
abstract protected boolean isSearchedFileName(String filename);<br />
abstract protected void processFile(File file);<br />
}<br />
Kapselt Funktionalität zum Durchsuchen einer Verzeichnisstruktur. <br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Files in welchen Verzeichnissen gesucht werden. In <tt>processFile(File)</tt> wird definiert wie mit einem "gefundenen" File umgegangen wird. <br />
<br />
==Konkrete Klasse <tt>MatlabfunctionFileSearch</tt>== <br />
public class MatlabfunctionFileSearch extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabfunctionFileSearch(File outputFile, File syncFile, Vector<String> syncDirs, boolean syncMode){}<br />
...<br />
}<br />
Sucht Files, die Matlab-Funktionen beinhalten und speichert den Namen jedes Files (und somit der Funktion) als primitives ASCII File, wobei in jeder Zeile ein Name steht. Zeilentrennung erfolgt mit "<tt>\n</tt>". Es ist auch möglich eine Synchronisierung mit der Matlab-Hilfe durchzuführen, wobei in diesem Falle ein weiteres File gleicher Struktur erzeugt wird, in welchem alle Funktionen, für die (k)ein Hilfefile direkt gefunden wurde, aufgelistet sind. <br />
<br />
Es werden <tt>.m</tt> Files gesucht, deren Name nicht mit einem Großbuchstaben anfängt. Dabei werden alle Verzeichnisse, die nicht mit "<tt>@</tt>" anfangen, durchsucht.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabfunctionFileSearch -d <directory> <br />
[-o <outputfile>] [-ds <sync_directory>] [-os <sync_outputfile>] [-sm <syncmode>]<br />
<br />
{|<br />
| valign="top" width="30px" | <tt>-d</tt> <br />
| gibt ein Verzeichnis an, in welchem (rekursiv) gesucht werden soll. Es können beliebig viele Verzeichnisse angegeben werden (jedes mit <tt>-d</tt> vorher!)<br />
|- valign="top"<br />
| <tt>-o</tt> <br />
| Name des Ausgabefiles für die Liste der Funktionen. Wird keiner angegeben, so wird das File <tt>matlab_funcs</tt> verwendet. <br><br />
|- valign="top"<br />
| <tt>-ds</tt> || Verzeichnis in dem nach den Hilfefiles gesucht wird, jedoch nicht in dessen Unterverzeichnissen. Es können mehrere Verzeichnisse angegeben werden, um die Synchronisierung durchzuführen muss jedoch mindestens eines genannt werden. <br />
|- valign="top" <br />
| <tt>-os</tt> || Name des Ausgabefiles für die Liste der Funktionen ohne Hilfefile. Wird keiner angegeben, so wird das File <tt>matlab_funcs_sync</tt> verwendet. <br />
|- valign="top" <br />
| <tt>-sm</tt> || Modus für die Synchronisierung. Wenn '0' angegeben wird, dann werden jene Files, für die es ein Hifefile gibt, gespeichert, bei jedem anderen Wert (keine Angabe ist unzulässig!) jene, für die kein Hilfefile existiert, was auch der Fall ist wenn dieser Parameter nicht gesetzt wird,<br />
|}<br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileIndexer</tt>== <br />
public class MatlabHelpfileIndexer extends SimpleFileSearch{<br />
public static void main(String[] args) {}<br />
public MatlabHelpfileIndexer(){}<br />
public static boolean writeDefaultProperties(String filename){}<br />
...<br />
}<br />
Sucht Matlab Hilfefiles (.htm und .html), analysiert diese und speichert die Ergebnisse in einer mySQL Datenbank. Informationen werden gewonnen aus dem Dateinamen, aus den Informationen, die in den meisten Files als Kommentar im <tt>head</tt> enthalten sind, aus dem <tt>title</tt> und aus weiteren Tags im File (derzeit nur <tt>frameset</tt>).<br />
<br />
===Datenbankschema===<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
| ID | int(11) | | PRI | NULL | auto_increment |<br />
| filename | tinytext | | | | |<br />
| abspath | text | | | | |<br />
| docname | text | YES | MUL | NULL | |<br />
| chunkname | text | YES | | NULL | |<br />
| chapname | text | YES | | NULL | |<br />
| pagetype | enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') | | | REGULAR | |<br />
| title | text | YES | MUL | NULL | |<br />
| specialdata | text | YES | MUL | NULL | |<br />
+-------------+-------------------------------------------------------------+------+-----+---------+----------------+<br />
<br />
===Erzeugen der Tabelle===<br />
CREATE TABLE `helpfiletable` (<br />
`ID` int(11) NOT NULL auto_increment,<br />
`filename` tinytext NOT NULL,<br />
`abspath` text NOT NULL,<br />
`docname` text,<br />
`chunkname` text,<br />
`chapname` text,<br />
`pagetype` enum('REGULAR','FRAMEPAGE','INDEXPAGE','NAVPAGE','TOCPAGE') NOT NULL default 'REGULAR',<br />
`title` text,<br />
`specialdata` text,<br />
PRIMARY KEY (`ID`),<br />
FULLTEXT KEY `title` (`title`),<br />
FULLTEXT KEY `docname` (`docname`,`chunkname`,`chapname`),<br />
FULLTEXT KEY `specialdata` (`specialdata`)<br />
) TYPE=MyISAM AUTO_INCREMENT=1284 ;<br />
<br />
===Konfigurationsfile===<br />
Die Daten für die Datenbankverbindung können in einem Konfigurationsfile abgelegt werden. Derzeit ist dessen Name auf <tt>dbproperties.xml</tt> festgelegt (d.h. es muss im aktuellen Verzeichnis liegen). Es ist ein zur <tt>java.util.Properties</tt> Klasse kompatibles XML-File, dessen Struktur folgendermaßen aussieht: <br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HOSTNAME">xyz</entry><br />
<entry key="USERPWD">xyz</entry><br />
<entry key="DBNAME">xyz</entry><br />
<entry key="USERNAME">xyz</entry><br />
</properties><br />
wobei <tt>xyz</tt> durch passende Parameter zu ersetzen sind.<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/MatlabHelpfileIndexer <directories> [--propertyfile]<br />
wobei <tt><directories></tt> eine Liste von Verzeichnissen ist, die als Ausgangspunkt für die Suche verwendet werden. Die einzelnen Verzeichnisse werden durch Leerzeichen getrennt und es muss mindestens eines angegeben werden, sofern nicht der optionale Parameter verwendet wird. Wird dieser angegeben, so wird das File <tt>dbproperties.xml</tt> erzeugt, in welchem die Defaultwerte für die Verbindungseinstellungen zur Datenbank abgelegt werden.<br />
<br />
<br />
=Package filegenerators=<br />
Beinhaltet Klassen zum Erzeugen von Files.<br />
<br />
==Interface==<br />
public interface IFileGenerator {<br />
public boolean generateFile(String filename);<br />
public void setProperties(Properties properties);<br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class HelpFileIndexDBCompendiumGenerator implements IFileGenerator {<br />
private Statement dbStatement = null;<br />
protected FileWriter outputFileWriter = null;<br />
protected Properties properties = null;<br />
<br />
public void setProperties(Properties properties){}<br />
public static Properties readPropertiesFromFile(String filename){}<br />
public boolean generateFile(String filename) {}<br />
protected boolean connectToDB(){}<br />
protected void sendAndProcessQuery(String query) <br />
throws SQLException, IOException{}<br />
protected void includeFile(String filename) <br />
throws IOException {}<br />
protected abstract void processTask();<br />
protected abstract void processRow(ResultSet row) <br />
throws SQLException, IOException;<br />
protected void startProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
protected void endProcessQuery(ResultSet resultSet) <br />
throws SQLException, IOException{<br />
}<br />
}<br />
Stellt ein Rohgerüst zum Erzeugen von Files mit Daten aus der Matlab-Helpfile Datenbank zur Verfügung. Die Verbindung zur Datenbank ist hier gekapselt, weiters sind generelle Abläufe und Tools implementiert.<br />
<br />
Konkrete Klassen müssen Funktionen überschreiben, in denen spezifiziert wird, welche Daten aus der DB geholt werden und wie diese ins File geschrieben werden. <br />
<br />
==Konkrete Klasse <tt>HelpFileWikiIndexGenerator</tt>== <br />
public class HelpFileWikiIndexGenerator extends HelpFileIndexDBCompendiumGenerator {<br />
public HelpFileWikiIndexGenerator(){}<br />
public void setSingleline(boolean singleline){}<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Es werden alle Hilfefiles zu Matlab-Funktionen aus der Matlab-Reference in Wiki-Syntax in ein File geschrieben. Die Funktionen sind alphabetisch sortiert und werden nach Anfangsbuchstaben in Kapitel eingeteilt. Dabei sind zwei verschiedene Formate für die Auflistung der Funktionen möglich:<br />
* Eine Tabelle mit 4 (ist einstellbar, 4 passt aber sehr gut) Spalten, wobei in jeder Zelle der Name der Funktion als Link zur Hilfeseite angeführt wird. <br />
* Eine Tabelle wobei pro Zeile eine Funktion (gleich wie oben) angeführt wird. Zusätzlich wird zu jeder eine kurze Beschreibung angegeben. (singleline-mode)<br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/filesearchtools/HelpFileWikiIndexGenerator <filename> [--singleline]<br />
Dabei ist <tt><filename></tt> der Name des zu erzeugenden Files. Wird der optionale Parameter angegeben, so wird die zweite Ausgabe-Variante gewählt. <br />
<br />
===Datenbank und Konfiguration===<br />
Gleich wie bei <tt>MatlabHelpfileIndexer</tt>, allerdings wird hier für die DB lediglich Lesezugriff benötigt.<br />
<br />
<br />
=Package fileconverttools=<br />
<br />
==Interface==<br />
public interface IFileConverter {<br />
abstract public int convertInDir(File inputRootDir, File outputDir); <br />
}<br />
<br />
==Einfache Basisklasse==<br />
public abstract class SimpleFileConverter implements IFileConverter {<br />
public SimpleFileConverter(){}<br />
public int convertInDir(File inputDir, File outputDir){}<br />
protected void copyFile(File inputFile, File outputFile);<br />
abstract protected void convertFile(File inputFile, File outputFile);<br />
abstract protected boolean isDirToConvert(String dir);<br />
abstract protected boolean isFileToConvert(String filename);<br />
abstract protected boolean isFileToCopy(String filename);<br />
}<br />
Kapselt Funktionalität zum Kopieren einer Verzeichnisstruktur, wobei gewisse Files konvertiert werden. Eine einfache Kopierfunktion wird zur Verfügung gestellt. In dieser wird ein File über Streams blockweise (1k) kopiert. <br />
<br />
Von ihr müssen konkrete Klassen abgeleitet werden, welche die durchzuführenden Operationen implementieren. <br />
<br />
==Konkrete Klasse <tt>MatlabHelpfileConverter</tt>== <br />
public class MatlabHelpfileConverter extends SimpleFileConverter{<br />
public static void main(String[] args) {}<br />
...<br />
}<br />
Mit dieser Klasse kann eine Kopie des Inhalts eines Verzeichnisses erstellt werden, wobei .htm und .html Files konvertiert werden. Die Konvertierung besteht darin, dass Links der Form <tt><a href="file:xxxxxxxx</tt> durch <tt><a href="xxxxxxxx</tt> ausgetauscht werden. Dies erfolgt indem jedes Vorkommen der regex '<tt>href\s*=\s*"file:</tt>' ersetzt wird durch '<tt>href="</tt>'. <br />
<br />
===Verwendung als Anwendung===<br />
$ java filetools/fileconverttools/MatlabHelpfileConverter -i <input-directory> [-o <output-directory>]<br />
Wird kein output-directory angegeben, so wird innerhalb des input-directories konvertiert (und man erspart sich das Kopieren der restlichen Dateien).<br />
<br />
<br />
=[http://itp.tugraz.at/Proj/MLTutor/filetools_doc/ Javadoc]=<br />
<br />
=Matlab Update=<br />
Hier werden jene Schritte beschrieben, die bei einem Matlab-Update notwendig sind, um den MLTutor und die Datenbank auf den neuesten Stand zu bringen.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Osiris-Testseite&diff=4963Osiris-Testseite2007-03-20T08:36:35Z<p>Osiris: /* Eclipse ITP Edition */</p>
<hr />
<div>==C - C++ Vergleich==<br />
===C-Version:===<br />
<br />
char point_style[GP_CMD_SIZE];<br />
char * token_pointer = strchr(plot_style, ' ');<br />
int style_str_len;<br />
if (token_pointer != NULL)<br />
{<br />
style_str_len = token_pointer - plot_style;<br />
}<br />
else<br />
{<br />
style_str_len = strlen(plot_style);<br />
}<br />
strncpy(point_style, plot_style, style_str_len);<br />
point_style[style_str_len] = 0;<br />
<br />
if (strcmp(point_style, "lines") &&<br />
strcmp(point_style, "points") &&<br />
strcmp(point_style, "linespoints") &&<br />
strcmp(point_style, "impulses") &&<br />
strcmp(point_style, "dots") &&<br />
strcmp(point_style, "steps") &&<br />
strcmp(point_style, "errorbars") &&<br />
strcmp(point_style, "boxes") &&<br />
strcmp(point_style, "boxerrorbars")) <br />
{<br />
fprintf(stderr, "warning: unknown requested style: using points\n") ;<br />
strcpy(h->pstyle, "points") ;<br />
} else {<br />
strcpy(h->pstyle, plot_style) ;<br />
}<br />
<br />
===C++ Version===<br />
string linestylestr = stylestr.substr(0, stylestr.find(" "));<br />
<br />
if (linestylestr != "lines" &&<br />
linestylestr != "points" &&<br />
linestylestr != "linespoints" &&<br />
linestylestr != "impulses" &&<br />
linestylestr != "dots" &&<br />
linestylestr != "steps" &&<br />
linestylestr != "errorbars" &&<br />
linestylestr != "boxes" &&<br />
linestylestr != "boxerrorbars")<br />
this->pstyle = string("points");<br />
else<br />
this->pstyle = stylestr;</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Verwendung_von_gnuplot_i&diff=4962Verwendung von gnuplot i2007-03-20T08:15:35Z<p>Osiris: /* Download */</p>
<hr />
<div>==Grundlagen==<br />
<nowiki>Gnuplot_i</nowiki> ist ein C-Interface für das konsolenbasierte Programmpaket gnuplot. Letzteres ist ein verbreitetes und mächtiges Werkzeug um Zeichnen von Diagrammen (siehe http://www.gnuplot.info). <br> Gnuplot selbst ist für viele Platformen erhältlich, jedoch funktioniert <nowiki>Gnuplot_i</nowiki> nicht so ohne weiters unter Windows, da es POSIX-Pipes verwendet.<br />
<br />
Das Interface stellt einige Funtionen zur Verfügung, denen einfach (z.B. x,y-) Daten übergeben werden woraus ein Diagramm generiert wird. Um dem Programmierer weiters die volle Gnuplot-Funktionalität zur Verfügung zu stellen ist die Möglichkeit gegeben Befehle direkt an Gnuplot zu "senden".<br />
<br />
Weiters existiert eine am ITP erweiterte Version des Interfaces, mit der u.A. auch 3D Plots erzeugt werden können. <br />
<br />
'''Angenehme Eigenschaften'''<br />
* Einfache Handhabung, man braucht nur wenige, gut dokumentierte Befehle zu kennen um wissenschaftlich korrekte Diagramme zu zeichnen. <br />
* Die Syntax der Befehle erinnert sehr an Matlab<br />
* Es handelt sich um ein sehr kleines, leicht einzubindendes Paket (ein c und ein h File)<br />
<br />
'''Gnuplot und Windows'''<br />
Leider funktioniert dieses Interface nicht unter Windows. Jedoch existiert dafür eine [http://users.ox.ac.uk/~mert1408/gnuplot/ erweiterte Version]. Notwendig ist natürlich auch eine vorhandene Gnuplot-Installation. Allerdings reicht ein Aufnehmen des Gnuplot-Verzeichnisses in die <tt>PATH</tt>-Umgebungsvariable nicht, sondern folgende Files müssen noch in jenen Ordner, in welchem die (eigene) Executable liegt, kopiert werden: <br />
:<tt>wgnuplot.exe</tt><br><tt>pgnuplot.exe</tt><br />
<br />
==Download==<br />
* [[Image:Gnuplot_i-2.10.tar.gz|<nowiki>Gnuplot_i-2.10.tar.gz</nowiki>]]<br />
** In dem Archiv befinden sich der Sourcecode, zwei Testbeispiele und eine HTML-Dokumentation mit ausführlichen Beschreibungen der Funktionen.<br />
* [http://ndevilla.free.fr/gnuplot/ Projektseite]<br />
** Hier kann die aktuellste Version heruntergeladen und die Doku online eingesehen werden. Weiters sind Links zu anderen Gnuplot Interfaces angegeben. <br />
* [http://users.ox.ac.uk/~mert1408/gnuplot/ Homepage] der Windows-tauglichen, erweiterten Version<br />
* [[Image:Gnuplot_i-ext-1.3.zip|<nowiki>Gnuplot_i-ext-1.3.zip</nowiki>]] <!--<span style="color:#FF0088">'''UPDATED''' - nochmals erweiterte Version</span>--><br />
** Erweiterte Version (von [[User:Camhy|David Camhy]] und [[User:Osiris|Georg Huhs]])<br />
** Wichtigste Erweiterungen:<br />
*** Titel kann direkt gesetzt werden<br />
*** Setzen des Plotranges<br />
*** Farbangaben beim Plotstil möglich<br />
*** Befehl zum Ausschalten der Legende<br />
*** 3D Plots (noch nicht ganz ausgereift)<br />
*** 2D Plots mit Fehlerbalken<br />
* [[Image:Gnuplot_demo.zip|<nowiki>Gnuplot_demo.zip</nowiki>]]<br />
** Das weiter unten vorgestellte Demoprogramm<br />
** Vorbereitet für die Verwendung mit Make, also zum Builden einfach im Verzeichnis <tt>make</tt> ausführen.<br />
<br />
==Programmierung==<br />
<br />
===Einbinden der Library===<br />
Allgemeines zu diesem Thema gibt's [[Numerische_Methoden#Compilierung_und_Projektaufbau|hier]] nachzulesen.<br />
<br />
Verwendet man <nowiki>Gnuplot_i</nowiki> so muss man mehrere c-Files und mindestens ein h-File managen. Die einfachste Variante ist, einfach die Datei <tt>gnuplot_i.c</tt> im Sourcefile zu inkludieren:<br />
#include "gnuplot_i.c"<br />
Diese inkludiert in weiterer Folge das h-File, so dass alle nötigen Deklarationen bereits eingebunden sind. <br />
<br />
Wenn man berüchsichtigt, dass man eigentlich keine c-Files inkludieren soll, muss man etwas anders vorgehen, was hier allerdings zu ein wenig Mehraufwand führt. Da man die Gnuplot-Library selbst kaum ändern wird, reicht es aus sie einmal zu compilieren und dann stets mitzulinken. Weiters wird statt des c-Files das h-File eingebunden. <br />
$ g++ -c gnuplot_i.c<br />
erzeugt das File <tt>gnuplot_i.o</tt>. Das Erzeugen der ausführbaren Datei erfolgt nun in zwei Schritten. Zuerst muss die Hauptdatei compiliert werden, dann werden die beiden Object(*.o)-Files gelinkt. <br />
$ g++ -c <name_quellcode_file.c><br />
$ g++ -o <name_executable> <name_quellcode_file.o> gnuplot_i.o<br />
<br />
Diesen Vorgang kann man automatisieren indem man make verwendet. Ein sehr einfaches Makefile für das weiter unten angeführte Beispielprogramm würde so aussehen:<br />
<pre><br />
gnuplot_demo: gnuplot_i.o gnuplot_demo.o<br />
g++ -o gnuplot_demo gnuplot_i.o gnuplot_demo.o<br />
<br />
gnuplot_demo.o: gnuplot_demo.c \<br />
gnuplot_i.h<br />
g++ -c gnuplot_demo.c<br />
<br />
gnuplot_i.o: gnuplot_i.c \<br />
gnuplot_i.h<br />
g++ -c gnuplot_i.c<br />
<br />
all: gnuplot_demo<br />
<br />
clean:<br />
rm gnuplot_i.o gnuplot_demo.o gnuplot_demo<br />
</pre><br />
Die ausführbare Datei <tt>gnuplot_demo</tt> wird erzeugt, indem man einfach <tt>make</tt> in der Konsole eintippt (wenn das Makefile "<tt>Makefile</tt>" heißt). Zusätzlich kann man noch mit <tt>make clean</tt> alle unnötigen Dateien löschen lassen.<br />
<br />
===Prinzipieller Ablauf===<br />
* Starten einer Gnuplot-Session<br />
* Einstellungen festlegen<br />
* Daten plotten<br />
* Beenden der Session (WICHTIG!)<br />
<br />
<br />
===Beispielprogramm===<br />
Der folgende Code ist ein Minimalstprogramm um eine korrekt beschriftetes Diagramm mit Titel und Legende zu generieren. Da die Funktion <tt>gnuplot_set_title()</tt> verwendet wird, funktioniert es allerdings nur mit der erweiterten Version von <nowiki>Gnuplot_i</nowiki>.<br />
<br />
<pre><br />
#include <math.h><br />
#include "gnuplot_i.c"<br />
<br />
#define VECT_SIZE 100<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
double x_vect[VECT_SIZE];<br />
double y1_vect[VECT_SIZE];<br />
double y2_vect[VECT_SIZE];<br />
int vect_index;<br />
<br />
// Plotsession anlegen <br />
gnuplot_ctrl* gnp_handle;<br />
gnp_handle = gnuplot_init();<br />
<br />
// Berechnung der Daten <br />
for (vect_index = 0; vect_index < VECT_SIZE; vect_index++)<br />
{<br />
x_vect[vect_index] = (double)vect_index/10.0;<br />
y1_vect[vect_index] = sin(x_vect[vect_index]);<br />
y2_vect[vect_index] = cos(x_vect[vect_index]);<br />
}<br />
<br />
// Voreinstellungen<br />
gnuplot_set_xlabel(gnp_handle, "x-Beschriftung");<br />
gnuplot_set_ylabel(gnp_handle, "y-Beschriftung");<br />
gnuplot_set_title(gnp_handle, "Kleines Gnuplot-Demo");<br />
gnuplot_setstyle(gnp_handle, "lines");<br />
<br />
// Plotten der Daten<br />
gnuplot_plot_xy(gnp_handle, x_vect, y1_vect, VECT_SIZE, "sin(x)");<br />
gnuplot_plot_xy(gnp_handle, x_vect, y2_vect, VECT_SIZE, "cos(x)");<br />
<br />
// Kurz warten <br />
sleep(10);<br />
<br />
// Session beenden<br />
gnuplot_close(gnp_handle);<br />
<br />
return 0;<br />
}<br />
</pre><br />
<br />
===Erklärung der Funktionen===<br />
Die Funktionen sind durch ihre Benennung selbsterklärend. Jede Funktion erwartet einen Handle zu einer Gnuplot-Session. Damit können mehrere Sessions (Plotfenster) gleichzeitig bedient werden.<br />
<br />
Mögliche Stile für die Funktion <tt>gnuplot_setstyle()</tt><br />
* lines<br />
* points<br />
* linespoints<br />
* impulses<br />
* dots<br />
* steps<br />
* errorbars<br />
* boxes<br />
* boxeserrorbars<br />
Mit der letzten überarbeiteten Version können auch Farben mit dem Style angegeben werden. Dazu wird einfach hinter dem Style eine Farbangabe (die Gnuplot versteht) angehängt. Zum Beispiel <tt>lines 3</tt> für rote Linien. <br />
<br />
<br />
Neben den hier angeführten sind noch ein paar weitere Funktionen besonders erwähnenswert:<br />
* <tt>void '''gnuplot_cmd'''(gnuplot_ctrl *handle, char *cmd, ...)</tt> <br> Damit kann ein beliebiger Befehl an Gnuplot gesendet werden. Somit stehen dem Programmierer alle Möglichkeiten von Gnuplot zur Verfügung.<br />
* <tt>void '''gnuplot_resetplot'''(gnuplot_ctrl *h)</tt> <br> Versetzt die Gnuplot-Session in den Startzustand zurück. ABER der Inhalt des Plotfensters wird damit nicht gelöscht, sondern erst beim nächsten Plotbefehl. <br />
* Weitere Plotfunktionen:<br />
** <tt>'''void gnuplot_plot_x'''(gnuplot_ctrl *handle, double *d, int n, char *title)</tt> <br> 2D Graph, wobei die x-Achse von 0 bis n-1 läuft<br />
** <tt>void '''gnuplot_plot_slope'''(gnuplot_ctrl *handle, double a, double b, char *title)</tt> <br> Zeichnet die Gerade <math>y = a \cdot x + b</math><br />
** <tt>void '''gnuplot_plot_equation'''(gnuplot_ctrl *h, char *equation, char *title)</tt> <br> Zeichnet eine Gleichung y = f(x), wobei im cString <tt>equation</tt> nur f(x) angegeben werden muss<br />
<br />
===Verwendung mit nrutil===<br />
Wenn man für die Specherallozierung nrutil verwendet und 0 nicht der Startindex ist, kann man nicht einfach den von den nrutil-Funktionen gelieferten Pointer den Plotfunktionen übergeben. Es bieten sich mehrere Lösungsstrategien an:<br />
# '''Pointerarithmetik''' <br> Es muss lediglich der Startindex zum Pointer dazugezählt werden<br />
# Verwenden der <tt>'''gnuplot_set_xrange()'''</tt> Funktion (und dem Analogon für y) - ist aber nur bei der erweiterten Gnuplot-Version verfügbar<br />
# Errechnen des '''korrekten Pointers''': <br> <tt> double *korrekt_ptr = &(data_array[startindex]);</tt> <br > wobei auf die runden Klammern auch verzichtet werden kann</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Cpp_Programmierung&diff=4954Cpp Programmierung2007-03-12T08:16:09Z<p>Osiris: /* Links */</p>
<hr />
<div>==[[Compiler und IDEs]]==<br />
<br />
== [[Qt]] ==<br />
Eine Klassenbibliothek und Entwicklungsumgebung für Programmierung graphischer Benutzeroberflächen.<br />
<br />
== [[gtkmm]] ==<br />
C++ Interface zu GTK+<br />
<br />
== Debuggen von C/C++ Programmen ==<br />
Besonders die Speicherzugriffsfehler (Segmentation Faults) können schwer zu finden sein. Es gibt aber Tools mit denen die Fehlersuche wesentlich schneller und weniger frustrierend verläuft.<br><br />
=== valgrind ===<br />
Valgrind ist ein Programm, das die ganze CPU emuliert, es verfolgt jeden einzelnen Zugriff auf den Speicher, den das zu testende Programm macht. Ungültige Speicherzugriffe (z.B. über das ende eines Arrays hinausschreiben) werden auf der Konsole ausgegeben und können im Quellcode sofort ausgebessert werden. <br />
Die Verwendung ist ganz einfach:<br />
<br />
$ valgrind <das_zu_testende_programm><br />
<br />
Die Meldungen von valgrind sind etwas kryptisch, es wird aber alles klar, wenn man sich das kurze [http://www.tldp.org/HOWTO/Valgrind-HOWTO/closerview.html#usage howto] durchliest. (hier ist noch ein [http://www.linuxjournal.com/article/7930 howto]) Das zu testende Programm muss natürlich mit dem flag -g (fürs debuggen) kompiliert sein. Da die cpu emuliert wird, läuft das programm ungefähr 20 mal langsammer. Sollte für das testen aber kein Problem sein. Valgrind ist im Computerraum natürlich installiert.<br />
<br />
=== core dump ===<br />
Nach einem Speicherzugriffsfehler kann man linux dazu veranlassen einen sogenannten "core dump" abzuspeichern. Es ist eine Datei die einfach 'core' heisst. In diesem File das dann in dem Verzeichniss abgespeichert wird, von wo das Programm gestartet wurde, befindet sich der vom Programm verwendete Arbeitsspeicher, so wie er zum Zeitpunkt des Programmfehlers gerade gesetzt war. Man kann sich also den Variableninhalt zum Zeitpunkt des Fehlers anschauen. Außerdem bekommt man auch die Programmzeile, in der der Fehler aufgetreten ist. <br><br />
Der core dump wird standartmäsig nicht abgespeichert, es muss erst eine [[Konsole]] aufgemacht werden, und dort mit dem Befehl ulimit die maximale Grösse des core dump festgelegt werden. Diese Einstellung gilt dann aber nur für die eine Konsole! Nach dem Schliessen der Konsole ist alles wieder auf standarteinstellung!<br><br />
Der Befehl<br />
<br />
$ ulimit -c 20000<br />
<br />
stellt die maximale core dump grösse auf 20MB.<br><br />
Nun führt man (in der gleichen Konsole!) das fehlerhafte Programm aus, das mit einem Speicherzugriffsfehler beendet. Es wird automatisch ein core file angelegt.<br><br />
<br />
Jetzt braucht man nur ein Debugger Programm, dort die Sourcefiles angeben, und den core dump laden, und kann sie den Zustand des Programms zum Zeitpunkt des "Programmabsturzes" ansehen. Das weitverbreitetste Debugger ist "ddd". Lässt sich einfach in der Konsole mit dem Befehl<br />
<br />
$ ddd<br />
<br />
starten. Alternativ kann man auch mit der Entwicklungsumgebung <br />
$ kdevelop<br />
arbeiten. Auch dort kann man den core dump laden und das Programm debugen.<br />
Wie bei valgrind, sollte das Programm mit dem -g flag (für Debuginformationen) kompiliert sein.<br />
<br />
== Profiling von C/C++ Programmen ==<br />
Mit Hilfe des Profiling lässt sich herausfinden an welchen Stellen/Funktionen das C/C++ Programm wieviel Zeit verbraucht. Die Engpässe können leicht erkannt und eventuell im Quellcode optimiert werden, damit die Anwendung schneller läuft. <br />
Führen Sie zuerst ihre binary im callgrind aus:<br />
<br />
$ callgrind <Ihre_Anwendung><br />
<br />
Im callgrind wird genau wie im valgrind die CPU und sämtliche Speicherzugriffe nachsimuliert, weshalb die Anwenung bei dieser Analyse viel langsamer laufen wird. Callgrind erzeugt eine Datei mit den Profiligergebnissen callgrind.out.eine_zahl:<br />
<br />
Diese können im kcachegrind visualisiert werden:<br />
<br />
$ kcachegrind callgrind.out.eine_zahl<br />
<br />
Weitere Informationen gibt es im Internet: [http://kcachegrind.sourceforge.net/ kcachegrind]<br />
<br />
<br />
<br />
<br />
== [[Plotten von Daten aus C]] (oder C++)==<br />
<br />
== Quellcode Formatierung ==<br />
Mit dem Tool indent lässt sich der "Coding Standart" von C/C++ (anzahl der Leerzeichen für Tabulator Einrückungen, Automatische einrückungen in Funktionen usw.) <br />
automatisch an die üblichen Standarts anpassen. Man braucht nur<br />
<br />
$ indent <quellcode_datei.c><br />
<br />
oder<br />
<br />
$ indent *.c<br />
<br />
ausführen. In der Standardeinstellung wandelt indent dabei den C-Sourcecode gemäß der "GNU Coding Standards". Ein anderer schöner Style wäre z.B. <br />
<br />
$ indent -gnu -bli0 -i8 <quellcode_datei.c><br />
<br />
Da verschiedene Entwickler, Projekte oder Unternehmen oft unterschiedliche Formatierungsarten aufgrund ihrer Gewöhnung als besser lesbar einschätzen, kann dies sehr nützlich sein.<br />
<br />
== [[Numerische_Methoden#C.2FC.2B.2B_-_Spezifisches|Grundlegende Themen]] ==<br />
<br />
== [[C Fehler - Bugs - Probleme]] ==<br />
<br />
== Links ==<br />
<br />
*[http://de.wikibooks.org/wiki/C++-Programmierung Wikibook C++-Programmierung] gut zum Einsteigen geeignet.<br />
*[http://www.ba-stuttgart.de/~boehm/NoBugs/www/NoBugs/ recht umfangreiche Linksammlung]<br><br />
*[http://www.lysator.liu.se/c/ten-commandments.html 10 Gebote des C Programmierens]<br><br />
*[http://courses.iicm.edu/index.html Vorlesungen am IICM]<br />
*[http://courses.mbi.tugraz.at/ Unterlagen vom Maschinenbau- und Betriebsinformatikinstitut] (wo Klaus Schmaranz jetzt arbeitet) <br> Leider derzeit nicht mehr zugänglich, vielleicht kommt's ja wieder: <br> Unterlagen zu C und C++ Einführungsvorlesungen:<br />
**[http://courses.mbi.tugraz.at/ElektronischeLiteratur/SoftwareentwicklungInC.pdf Skriptum zu Einführung in die strukturierte Programmierung (früher Programmieren0)] '''C'''<br>Dies ist das Buch "Softwareentwicklung in C" von Klaus Schmaranz!<br />
**[http://courses.mbi.tugraz.at/ElektronischeLiteratur/SoftwareentwicklungInCplusplus.pdf Skriptum zu Softwareentwicklung - Praktikum (früher Programmierpraktikum)] '''C++'''<br>Dies ist das Buch "Softwareentwicklung in C++" von Klaus Schmaranz!<br />
*[http://www.parashift.com/c++-faq-lite/ C++ FAQ LITE von Marshall Cline] Für Fortgeschrittenere Benutzer mit speziellen Fragen</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Cpp_Programmierung&diff=4953Cpp Programmierung2007-03-12T07:25:24Z<p>Osiris: /* Links */</p>
<hr />
<div>==[[Compiler und IDEs]]==<br />
<br />
== [[Qt]] ==<br />
Eine Klassenbibliothek und Entwicklungsumgebung für Programmierung graphischer Benutzeroberflächen.<br />
<br />
== [[gtkmm]] ==<br />
C++ Interface zu GTK+<br />
<br />
== Debuggen von C/C++ Programmen ==<br />
Besonders die Speicherzugriffsfehler (Segmentation Faults) können schwer zu finden sein. Es gibt aber Tools mit denen die Fehlersuche wesentlich schneller und weniger frustrierend verläuft.<br><br />
=== valgrind ===<br />
Valgrind ist ein Programm, das die ganze CPU emuliert, es verfolgt jeden einzelnen Zugriff auf den Speicher, den das zu testende Programm macht. Ungültige Speicherzugriffe (z.B. über das ende eines Arrays hinausschreiben) werden auf der Konsole ausgegeben und können im Quellcode sofort ausgebessert werden. <br />
Die Verwendung ist ganz einfach:<br />
<br />
$ valgrind <das_zu_testende_programm><br />
<br />
Die Meldungen von valgrind sind etwas kryptisch, es wird aber alles klar, wenn man sich das kurze [http://www.tldp.org/HOWTO/Valgrind-HOWTO/closerview.html#usage howto] durchliest. (hier ist noch ein [http://www.linuxjournal.com/article/7930 howto]) Das zu testende Programm muss natürlich mit dem flag -g (fürs debuggen) kompiliert sein. Da die cpu emuliert wird, läuft das programm ungefähr 20 mal langsammer. Sollte für das testen aber kein Problem sein. Valgrind ist im Computerraum natürlich installiert.<br />
<br />
=== core dump ===<br />
Nach einem Speicherzugriffsfehler kann man linux dazu veranlassen einen sogenannten "core dump" abzuspeichern. Es ist eine Datei die einfach 'core' heisst. In diesem File das dann in dem Verzeichniss abgespeichert wird, von wo das Programm gestartet wurde, befindet sich der vom Programm verwendete Arbeitsspeicher, so wie er zum Zeitpunkt des Programmfehlers gerade gesetzt war. Man kann sich also den Variableninhalt zum Zeitpunkt des Fehlers anschauen. Außerdem bekommt man auch die Programmzeile, in der der Fehler aufgetreten ist. <br><br />
Der core dump wird standartmäsig nicht abgespeichert, es muss erst eine [[Konsole]] aufgemacht werden, und dort mit dem Befehl ulimit die maximale Grösse des core dump festgelegt werden. Diese Einstellung gilt dann aber nur für die eine Konsole! Nach dem Schliessen der Konsole ist alles wieder auf standarteinstellung!<br><br />
Der Befehl<br />
<br />
$ ulimit -c 20000<br />
<br />
stellt die maximale core dump grösse auf 20MB.<br><br />
Nun führt man (in der gleichen Konsole!) das fehlerhafte Programm aus, das mit einem Speicherzugriffsfehler beendet. Es wird automatisch ein core file angelegt.<br><br />
<br />
Jetzt braucht man nur ein Debugger Programm, dort die Sourcefiles angeben, und den core dump laden, und kann sie den Zustand des Programms zum Zeitpunkt des "Programmabsturzes" ansehen. Das weitverbreitetste Debugger ist "ddd". Lässt sich einfach in der Konsole mit dem Befehl<br />
<br />
$ ddd<br />
<br />
starten. Alternativ kann man auch mit der Entwicklungsumgebung <br />
$ kdevelop<br />
arbeiten. Auch dort kann man den core dump laden und das Programm debugen.<br />
Wie bei valgrind, sollte das Programm mit dem -g flag (für Debuginformationen) kompiliert sein.<br />
<br />
== Profiling von C/C++ Programmen ==<br />
Mit Hilfe des Profiling lässt sich herausfinden an welchen Stellen/Funktionen das C/C++ Programm wieviel Zeit verbraucht. Die Engpässe können leicht erkannt und eventuell im Quellcode optimiert werden, damit die Anwendung schneller läuft. <br />
Führen Sie zuerst ihre binary im callgrind aus:<br />
<br />
$ callgrind <Ihre_Anwendung><br />
<br />
Im callgrind wird genau wie im valgrind die CPU und sämtliche Speicherzugriffe nachsimuliert, weshalb die Anwenung bei dieser Analyse viel langsamer laufen wird. Callgrind erzeugt eine Datei mit den Profiligergebnissen callgrind.out.eine_zahl:<br />
<br />
Diese können im kcachegrind visualisiert werden:<br />
<br />
$ kcachegrind callgrind.out.eine_zahl<br />
<br />
Weitere Informationen gibt es im Internet: [http://kcachegrind.sourceforge.net/ kcachegrind]<br />
<br />
<br />
<br />
<br />
== [[Plotten von Daten aus C]] (oder C++)==<br />
<br />
== Quellcode Formatierung ==<br />
Mit dem Tool indent lässt sich der "Coding Standart" von C/C++ (anzahl der Leerzeichen für Tabulator Einrückungen, Automatische einrückungen in Funktionen usw.) <br />
automatisch an die üblichen Standarts anpassen. Man braucht nur<br />
<br />
$ indent <quellcode_datei.c><br />
<br />
oder<br />
<br />
$ indent *.c<br />
<br />
ausführen. In der Standardeinstellung wandelt indent dabei den C-Sourcecode gemäß der "GNU Coding Standards". Ein anderer schöner Style wäre z.B. <br />
<br />
$ indent -gnu -bli0 -i8 <quellcode_datei.c><br />
<br />
Da verschiedene Entwickler, Projekte oder Unternehmen oft unterschiedliche Formatierungsarten aufgrund ihrer Gewöhnung als besser lesbar einschätzen, kann dies sehr nützlich sein.<br />
<br />
== [[Numerische_Methoden#C.2FC.2B.2B_-_Spezifisches|Grundlegende Themen]] ==<br />
<br />
== [[C Fehler - Bugs - Probleme]] ==<br />
<br />
== Links ==<br />
<br />
*[http://www.ba-stuttgart.de/~boehm/NoBugs/www/NoBugs/ recht umfangreiche Linksammlung]<br><br />
*[http://www.lysator.liu.se/c/ten-commandments.html 10 Gebote des C Programmierens]<br><br />
*[http://courses.iicm.edu/index.html Vorlesungen am IICM]<br />
*[http://courses.mbi.tugraz.at/ Unterlagen vom Maschinenbau- und Betriebsinformatikinstitut] (wo Klaus Schmaranz jetzt arbeitet) <br> Leider derzeit nicht mehr zugänglich, vielleicht kommt's ja wieder: <br> Unterlagen zu C und C++ Einführungsvorlesungen:<br />
**[http://courses.mbi.tugraz.at/ElektronischeLiteratur/SoftwareentwicklungInC.pdf Skriptum zu Einführung in die strukturierte Programmierung (früher Programmieren0)] '''C'''<br>Dies ist das Buch "Softwareentwicklung in C" von Klaus Schmaranz!<br />
**[http://courses.mbi.tugraz.at/ElektronischeLiteratur/SoftwareentwicklungInCplusplus.pdf Skriptum zu Softwareentwicklung - Praktikum (früher Programmierpraktikum)] '''C++'''<br>Dies ist das Buch "Softwareentwicklung in C++" von Klaus Schmaranz!<br />
*[http://www.parashift.com/c++-faq-lite/ C++ FAQ LITE von Marshall Cline] Für Fortgeschrittenere Benutzer mit speziellen Fragen</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Benutzer:Osiris&diff=4951Benutzer:Osiris2007-03-09T10:27:50Z<p>Osiris: </p>
<hr />
<div>'''Name: ''' Georg Huhs<br />
<br />
'''Studium: ''' F810 Technische Physik<br />
<br />
'''Email: ''' [mailto:osiris@sbox.tugraz.at osiris@sbox.tugraz.at]<br />
<br />
<br />
== Seiten in Arbeit ==<br />
<br />
[[Meditor]]<br />
: [[Meditor_Benutzerseite]]<br />
: [[Filetools]]<br />
: [[Meditor_XML-Export]]<br />
<br />
[[Buchempfehlungen]]<br />
<br />
[[Tschernobyl]]<br />
<br />
[[User-Login_Absicherung]]<br />
<br />
[[Numerische_Methoden]]<br />
: [[Verwendung_von_gnuplot_i]]<br />
<br />
'''Weitere Ideen für [[Numerische_Methoden]]:'''<br />
* Variablenübergabe bei Funktionsaufrufen<br />
* mehrdimensionale Arrays<br />
* Angabe der Ressourcen die von Prof. Sormann zur Verfügung gestellt werden<br />
<br />
<br />
auf folgende bitte nicht verweisen - Danke<br />
<br />
[[Osiris-Testseite]]<br />
[[Osiris Diploma Thesis]]</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4950Meditor2007-03-06T20:10:25Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages <span style="color:#00AA00">'''Funktioniert'''</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4946Meditor2007-03-04T16:13:15Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** generierte Files gleich anzeigen lassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4945Meditor2007-03-04T08:33:16Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
* Codeorganisation<br />
** Bessere Einteilung in Packages<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4944Meditor2007-03-04T08:31:55Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
* Doku<br />
** Schreiben und ins Eclipse-Hilfesystem einbauen <span style="color:#00AA00">implementiert, muss aber noch getestet werden</span><br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4943Meditor2007-03-04T08:28:51Z<p>Osiris: /* License */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden. Für jene CPL Module, die wir veränderten, haben wir die Erlaubnis der jeweiligen Entwickler den Code unter der EPL zu veröffentlichen. <br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4942Meditor2007-03-04T08:25:45Z<p>Osiris: /* ToDos bis zur Veröffentlichung */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <span style="color:#00AA00">'''Erledigt'''</span><br />
* Lizenzen abklären <span style="color:#00AA00">'''Erledigt'''</span><br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden.<br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor_XML-Export&diff=4902Meditor XML-Export2007-02-11T12:12:39Z<p>Osiris: /* Was fehlt / Ideen */</p>
<hr />
<div>Es soll möglich sein "von außen" dem MLTutor ein Matlab-File zu übergeben, woraufhin er dieses partitioniert und diese Information in einem XML-File speichert. <br />
<br />
Für dieses File sind Transformationen für html und tex zu schreiben. <br />
<br />
Zielsetzung für html: z.B. http://itp.tugraz.at/LV/kernbich/AppSoft-1/MatlabPublish/<br />
<br />
== Was geht==<br />
* Aufruf von außen für ein File<br />
* Export des aktuellen Files aus dem MLTutor heraus<br />
** Menüpunkt "Export as..." mit "Speichern unter" Dialog<br />
** Menüpunkt "Export" welcher die Einstellungen aus der Preference Page nimmt<br />
** Export-Dialog mit jenen Daten, die sich am ehesten von File zu File ändern. <br />
*** Speichern der getroffenen Einstellungen, sodass beim Export eines Files die Einstellungen vom letzten Export dieses Files geladen werden. <br />
* Konfiguration über XML-File<br />
* Erzeugen eines XML-Files <br> enthält:<br />
** Metadaten<br />
** Partitionierung<br />
** Den Originalcode<br />
** Auszeichnungselemente<br />
* Urform eines Schemas existiert - muss aktualisiert werden<br />
* Transformation allgemein<br />
** Java-Funktionalität zum Transformieren (in beliebiges Format)<br />
* Transformation in HTML<br />
** XSL File<br />
** php-Skript für serverseitige Transformation<br />
** Java-Funktion um gleich ein html-File zu exportieren<br />
* Transformation in LaTeX<br />
** XSL File und LaTeX Template<br />
** Java-Funktionalität um gleich ein tex-File zu exportieren<br />
** Nur LaTeX Kern ausgeben möglich (alles was sonst innerhalb der <tt>document</tt> Umgebung steht)<br />
* Transformation in PDF (aus tex-File)<br />
* Preference Page für den Export<br />
** Einstellungen für:<br />
*** Speicherort<br />
*** Ausgabeformate (XML, HTML, LaTeX (nur Kern oder alles), PDF)<br />
*** Metadaten<br />
*** Export-Dialog anzeigen<br />
*** Zu verwendende XSLT Files<br />
* Nur Variablen liefern<br />
* Nur Funktionen liefern<br />
<br />
=== Beispieldokument ===<br />
Den XML-Output gibt's '''[http://itp.tugraz.at/Proj/MLTutor/xml_export/short.xml hier]'''. <br />
<br />
Folgende Transformationsergebnisse kann man sich anschauen:<br />
{| style="border-spacing: 0.5em;"<br />
|- <br />
| &nbsp; || HTML || LaTeX || PDF<br />
|-<br />
| Mit Zeilennummern<br />
| [http://itp.tugraz.at/Proj/MLTutor/xml_export/short_lines.html Link]<br />
| [http://itp.tugraz.at/Proj/MLTutor/xml_export/short_lines.tex Link]<br />
| [http://itp.tugraz.at/Proj/MLTutor/xml_export/short_lines.pdf Link]<br />
|-<br />
| Ohne Zeilennummern<br />
| [http://itp.tugraz.at/Proj/MLTutor/xml_export/short_nolines.html Link]<br />
| [http://itp.tugraz.at/Proj/MLTutor/xml_export/short_nolines.tex Link]<br />
| [http://itp.tugraz.at/Proj/MLTutor/xml_export/short_nolines.pdf Link]<br />
|}<br />
(Alle weiteren nötigen Files sind auch dort zu finden)<br />
<br />
'''<tt>short.m</tt>''':<br />
% ==Einfaches Testbeispiel==<br />
% ===Der Code=== <br />
ex = [0:5] % dies ist der laufindex <br />
for ind=1:10<br />
sin(ind)<br />
erg(ind,:)=ind.^ex<br />
end<br />
disp('fertig');<br />
<br />
% === Doppelbedeutung von 'end' ===<br />
for ind=1:10<br />
disp(num2str(erg(ind:end,1)));<br />
end<br />
<br />
% ===Latex Problemzeichen===<br />
str_arr = {'knock knock', 'who is it'};<br />
eqsys = [1,4;2,3];<br />
y = [5;6];<br />
x = eqsys \ y<br />
eqsys = 0; y=0;<br />
<br />
% ===Formatierungstests=== <br />
%% jetzt ein bissi text<br />
%% und noch etwas<br />
%% <br />
%% neue zeile<br />
%%<br />
%% <nowiki>und auch <tt>variablen</tt> gibts hier</nowiki><br />
%%<br />
%% <nowiki>genauso wie [http://links.da]</nowiki><br />
%% und Formeln:<br />
%% $$a=\int_0^1 x^2 dx$$<br />
%%<br />
%* hallo Echo!<br />
%* hallo Listeneintrag!<br />
%# ich kann mehr, <br />
%# ich bin eine Aufzaehlung<br />
%# und was fuer eine!<br />
%%<br />
%# ich bin auch eine, aber noch klein<br />
<br />
dies = eine; %% unangenehme Sache!<br />
<br />
% ====verschiedene Leerzeilen====<br />
<br />
%%<br />
<br />
%%<br />
%%<br />
<br />
oben = 1 % Leerzeile<br />
unten = 2 % Leerzeilen<br />
<br />
<br />
%%<br />
%% Text nach Markup-Leerzeile<br />
<br />
%% Text nach codebox<br />
<br />
'''Änderungen:'''<br />
:Beispieldokument und XML-Format umfassend geändert (Zeilennummern, Listen) --[[User:Osiris|Osiris]] 14:47, 26 December 2006 (CET)<br />
:Beispieldokument erweitert (Doppelbedeutung von <tt>end</tt>), XML-Format erweitert (Metadaten) --[[User:Osiris|Osiris]] 10:02, 30 October 2006 (CET)<br />
:Beispieldokument erweitert und den Rest aktualisiert --[[User:Osiris|Osiris]] 13:48, 4 June 2006 (CEST)<br />
:Änderung des XML-Formats und Erweiterung (Metadaten - Autor) --[[User:Osiris|Osiris]] 12:32, 4 June 2006 (CEST)<br />
:Kleine Änderung bei den Gleichungen und der Formatierung des XML-Files --[[User:Osiris|Osiris]] 18:32, 16 May 2006 (CEST)<br />
<br />
== Was fehlt / Ideen==<br />
* Allgemein:<br />
** Welche Metadaten kommen ins HTML & PDF<br />
* Markupsprache<br />
** verborgener Text<br />
** Platzhalter in Links<br />
* Im XML-Format:<br />
** Tags für Metadaten: so lassen oder alles dcmi (siehe weiter unten)<br />
* Im erzeugten HTML-File:<br />
** Link zum .m-File<br />
* LaTeX Ausgabe:<br />
** In <tt>shorts.tex</tt> stehen Daten zum Autor und so drinnen, dies vernünftig managen. <br />
* Preference Page für den Export fertigstellen<br />
** Einstellungen für:<br />
*** Was kommt in den Header<br />
* Verbindung mit der Matlab-Konsole<br />
** Matlab-Ausgaben sollen angezeigt werden können<br />
*** Dafür den Code Zeile für Zeile an Matlab übergeben und die Antwort auswerten (Variante 2)<br />
*** oder nur bei Anforderung etwas an Matlab schicken (Variante 1)<br />
<br />
==Auszeichnungssprache==<br />
Es soll möglich sein, in Kommentaren Text auszeichnen zu können. Dieser wird nun nicht als Matlab-Kommentar sondern entsprechend seiner Bestimmung formatiert ausgegeben. Ziel ist es, damit bereits im .m File eine schön formatierte Seite zu definieren, um Code einfach und ansehnlich zu dokumentieren.<br />
<br />
Als Basis wird die Wiki-Syntax verwendet.<br />
<br />
===Elemente===<br />
'''Überschriften''' mit <br />
%==Überschrift 1==<br />
%===Überschrift 2===<br />
Wobei auch die Erstellung von Inhaltsverzeichnissen möglich sein soll. <br />
<br />
<span style="color: green;">Überschriften funktionieren</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
Gewöhnlicher '''Text''' in Proportionalschrift, wobei Absätze durch "Leerzeilen" erzeugt werden. <br />
%% blabla blablabla<br />
%%<br />
%% Hier startet ein neuer Absatz, und blabla<br />
<br />
<span style="color: green;">Funktioniert</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
Hervorhebung von '''Variablen''' im Text:<br />
%% bla <nowiki><tt>variable</tt></nowiki><br />
<br />
<span style="color: green;">Funktioniert</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''Links''' und vordefinierte Platzhalter<br />
<br />
%% <nowiki>[http://something.somedomain Links]</nowiki> wie im Wiki, <br />
%% und Kurzformen: [matref://sin]<br />
<br />
<span style="color: green;">Links funktionieren, müssen aber in [] angegeben werden</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''Verborgener Text'''<br />
% <nowiki><!-- Dies kommt zwar ins XML, wird aber in den entgültigen Seiten nicht mehr</nowiki> <br />
% <nowiki>dargestellt --></nowiki><br />
<br />
% <nowiki><!-- Auch enthaltener Matlab Code </nowiki><br />
testi = sin(input) > 0; <br />
% <nowiki>wird ausgeblendet --></nowiki><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''Formeln'''<br />
Sowohl inline<br />
%% Hier steht eine Formel $l = a \cdot tex$ im Text<br />
Als auch zentriert in einer eigenen Zeile<br />
%% $$ l = a \cdot tex $$<br />
<br />
<span style="color: green;">Letzteres funktioniert (in html mit png-Bildchen)</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''Listen''' (nicht nummeriert) und '''Aufzählungen''' (nummerierte Listen)<br />
<br />
Definition einer Liste:<br />
%* Der erste Punkt<br />
%* Ein weiterer<br />
%* usw.<br />
<br />
Definition einer Aufzählung:<br />
%# Der erste Punkt<br />
%# Ein weiterer<br />
%# usw.<br />
<br />
Bei beiden ist eine tiefere Verschachtelung nicht möglich. Bei den Aufzählungen erfolgt eine durchgehende Nummerierung nur innerhalb eines Blocks direkt aufeinanderfolgender Elemente. (Auch ein eingestreutes Listenelement oder eine Leerzeile sind eine Unterbrechung!)<br />
<br />
<span style="color: green;">Funktioniert</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''Matlab-Ausgaben''' <br />
<br />
1. Variante: Den Wert von <tt>x</tt> ausgeben lassen:<br />
%var x cols=4 rows=4 format=%4.2f novarname<br />
Dabei muss nach dem <tt>%var</tt> der Variablenname angeführt werden, die weiteren Parameter sind optional und ihre Reihenfolge ist irrelevant. Die <tt>=</tt> dürfen nicht von Leerzeichen gesäumt sein!<br><br />
<tt>cols</tt> und <tt>rows</tt> geben die maximale Anzahl der dargestellten Spalten bzw. Zeilen einer Matrix an. <br><br />
<tt>format</tt> bestimmt das Ausgabeformat für jedes Element. Erlaubt ist jeder in Matlab gültige Formatstring, mit Ausnahme des Specifiers <tt>%u</tt>, und hat auch die selbe Bedeutung wie in Matlab. Gedacht ist dies zwar nur für die Angabe eines Zahlenformats, jedoch ist es auch möglich komplexeres zu definieren (z.B.: format=num:%f). Da aber gewisse Ersetzungen im Formatstring durchgeführt werden, können evtl. unvorhergesehene Ergebnisse resultieren. <br><br />
<tt>novarname</tt> bewirkt, dass die Ausgabe des Variablennamens vor dem Inhalt der Variable unterdrückt wird und kann nach Belieben angegeben oder weggelassen werden. <br><br />
Sei <tt>x</tt> eine NxN Einheitsmatrix mit N>4, so ergibt obiger Befehl im Prinzip folgede Ausgabe:<br />
1.00 0.00 ... 0.00<br />
0.00 1.00 ... 0.00<br />
... ... ... ...<br />
0.00 0.00 ... 1.00<br />
<br />
<br />
2.Variante: überall wo Matlab etwas ausgeben würde dieses auch anzeigen<br />
<br />
Weiters sollen von Matlab generierte Bilder auch angezeigt werden (können). <br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''LaTeX Befehle:'''<br />
<br />
Mit<br />
%\befehl<br />
können einfache Latex Befehle angegeben werden. Diese haben nur auf die LaTeX- und PDF-Ausgaben Auswirkungen und werden für andere Ausgabeformate ignoriert. Dabei ist zu beachten, dass die gesamte Zeile als Befehl gesehen wird. Ein wichtiges Beispiel wäre:<br />
%\newline <br />
<br />
<span style="color: green;">Funktioniert</span><br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
'''Weiteres:'''<br />
* ...<br />
<br />
<hr style="width:90%; background-color:black; height:2px; margin-left:5%; margin-bottom:20px;"><br />
<br />
===Formeln===<br />
* schreiben in Latex-Syntax<br />
** Für HTML werden Bilder generiert und ins html-File eingebaut.<br />
*** Problematisch, wenn am Rechner kein Latex vorhanden ist (weit entfernter Traum: Webservice).<br />
*** Wenn das Bild nicht generiert werden konnte, wird eine Fehlermeldung ausgegeben, aber der Export nicht unterbrochen (der Rest kann ja höchstwahrscheinlich erstellt werden).<br />
<br />
===Anmerkung zur Entwicklung===<br />
* Vordefinierte Platzhalter <br />
** konfigurierbar machen -> Property Page<br />
** speichern in Properties-File<br />
** brauchen nicht mehr im XML-File stehen<br />
* Für Matlab-Ausgaben den Code Zeile für Zeile an die ML-Konsole schicken<br />
* Variablenerkennung: Was links von einem = steht ist eine Variable<br />
** Diese Erkennung ist nicht für die Partitionierung geeignet!!<br />
<br />
==Metadaten==<br />
Tags nach: [http://dublincore.org/documents/dcmi-terms/ http://dublincore.org/documents/dcmi-terms/]<br />
<br />
'''Problem damit:''' Für den Autor gibt es nur den Tag: <tt>creator</tt>, toll wäre etwas mehr Information, weshalb hier nicht dcmi-terms verwendet werden. <br />
<br />
Implementierte Tags: <br />
* author<br />
** name<br />
** email<br />
** homepage<br />
* file<br />
** title<br />
** date<br />
** content<br />
** type<br />
<br />
Weiteres '''Problem''': Es macht nicht viel Sinn filespezifische Daten in den Preferences zu speichern. Lösungsideen:<br />
* Preferences bei jedem File-Öffnen löschen (wäre z.B. beim Feld <tt>date</tt> nicht nötig. <br />
* Beim Export Dialogfeld anstelle der Preferences<br />
<br />
==Struktur==<br />
<br />
===Die Klasse <tt><span style="color:#00CC44">XMLExporter</span></tt>===<br />
public class <span style="color:#00CC44">XMLExporter</span> {<br />
/** keys and default values for the properties */<br />
private final static String PROPERTYFILE = "XML_export_properties.xml";<br />
public final static String CONFIGFILEDIR_KEY = "CONFIGFILEDIR";<br />
private final static String CONFIGFILEDIR_DEF = "./";<br />
public final static String OUTPUTDIR_KEY = "OUTPUTDIR";<br />
private final static String OUTPUTDIR_DEF = "./";<br />
public final static String SCHEMAFILE_KEY = "SCHEMAFILE";<br />
private final static String SCHEMAFILE_DEF = "schema.xsd";<br />
<br />
// Definitionen der XML-Tags<br />
...<br />
<br />
public static void main(String[] args) {}<br />
public static void writeToFile(String content, IPath outputFilePath) <br />
throws FileNotFoundException, UnsupportedEncodingException, IOException {}<br />
public String export(IDocument document, Properties properties, Properties metadata, IPath XMLOutputFilePath) {}<br />
public String export(Properties properties, Properties metadata, IPath XMLOutputFilePath) {}<br />
public String exportOnlyVars(IDocument document, Properties metadata, IPath XMLOutputFilePath) {}<br />
public String exportOnlyVars(Properties metadata, IPath XMLOutputFilePath) {}<br />
public String exportOnlyFuncs(IDocument document, Properties metadata, IPath XMLOutputFilePath) {}<br />
public String exportOnlyFuncs(Properties metadata, IPath XMLOutputFilePath) {}<br />
public void exportPics(IPath outputDir, String filetitle) {}<br />
public void transformToHTML(String filetitle) {}<br />
public static void transform(String xmlFile, String xslFile, String outputFile) <br />
throws FileNotFoundException, TransformerException {}<br />
public static String genSingleLineTag(String tag, String args, String content) {}<br />
public static String genSingleLineTag(String tag, String args, String content, boolean newline) {}<br />
...<br />
}<br />
Der Funktion <tt>export(...)</tt> kann man über das <tt>Properties</tt> Objekt den Namen des Schema-Files mitteilen (mehr wird nicht verwendet). Passt dessen Default-Wert, so kann <tt>null</tt> übergeben werden. Der Titel des zu exportierenden Files wird im XML-File festgehalten, falls er übergeben wird. <br />
<br />
Mit '''<tt>exportOnlyVars(...)</tt>''' kann eine Liste (im XML-Format) der im File verwendeten Variablen geholt werden. Da der Partitioner keine Variablen markiert, müssen sie in dieser Funktion erkannt werden. Dazu wird das Dokument in Zeilen zerlegt, welche wiederum mit <tt>';'</tt> als Token in Befehle zerteilt werden. Ist nun ein Befehl in der Form "<tt> var = .... </tt>" aufgebaut, so ist <tt>var</tt> eine Variable. Die dabei verwendete Regex ist:<br />
\s*([a-zA-Z][\w_]*)(\(.*\))?\s*=.*<br />
wobei der Inhalt der ersten capturing group der Name der Variable ist. Im Ausgabefile wird jede Variable nur ein Mal angeführt. <br />
<br />
Die Funktionen '''<tt>exportOnlyFuncs(...)</tt>''' leisten im Prinzip das Gleiche, wobei hier alle verwendeten Matlab-Funktionen geliefert werden. Die Suche nach Funktionen basiert hier auf der Partitionierung des Dokuments. <br />
<br />
====Verwendung als Anwendung====<br />
java at.tugraz.itp.mltutor.tools.XMLExporter <inputfile> [-o <outputfile>] [--xml] [--html] [--latex] [--pdf] [--varonly] [--funconly] [-m <metadatafile>]<br />
<br />
Als Parameter ist dem Programm der Filename des zu exportierenden .m Files anzugeben. Als optionalen Parameter kann man den Namen des XML-Output-Files angeben. Wenn das nicht geschieht, wird der Name des Matlab-Files verwendet, wobei die Dateiendung von .m auf .xml geändert wird. Bei Angabe von Pfaden beim Ausgabefile ist zu beachten, dass diese relativ zum (evtl. im Konfigurationsfile angegebenen) Ausgabeverzeichnis liegen. Mit den Optionen <tt>--xml</tt>, <tt>--html</tt>, <tt>--latex</tt> und <tt>--pdf</tt> wird angegeben, welche Files generiert werden sollen. Deren Namen entspricht (bis auf die Endung) dem des Ausgabefiles. Wichtig: sollte die Option <tt>--xml</tt> nicht angegeben werden, so wird das xml-File nach dem Durchführen der Transformationen wieder gelöscht!<br><br />
Ist <tt>--varonly</tt> (<tt>--funconly</tt>) gesetzt, so werden nur die im Matlab-File vorhandenen Variablen (Matlab-Funktionen) ausgegeben. In diesem Fall ist derzeit nur eine Ausgabe in XML möglich. <br><br />
Weiters kann ein File, welches Metadaten (Autor, Email, ...) enthält angegeben werden. Dessen Format muss kompatibel zur <tt>Properties</tt> Klasse sein. <br />
<br />
Es sollte an der durch <tt>PROPERTYFILE</tt> spezifizierten Stelle ein Properties-XML File befinden, falls von den Default-Werten abweichende Einstellungen vorgenommen werden sollen.<br />
<br />
Und natürlich müssen die benötigten Eclipse Klassen irgendwie zugänglich gemacht werden (Package <tt>org.eclipse.jface.text</tt>)<br />
<br />
====Konfiguration====<br />
Die Konfiguration wird über ein zur Klasse <tt>java.util.Properties</tt> kompatibles XML-File durchgeführt. Die Keys sind in der oben angeführten Beschreibung der Klasse enthalten. <br />
* <tt>CONFIGFILEDIR</tt> - Verzeichnis in welchem die Konfigurationsfiles für den Partitioner liegen. <br />
* <tt>OUTPUTDIR</tt> - Verzeichnis in welches das erzeugte File gespeichert wird.<br />
* <tt>SCHEMAFILE</tt> - Pfad und Name des XML-Schema Files (wird wie angegeben in das XML-File eingetragen)<br />
<br />
===Entwicklungsnotizen===<br />
====Nomenklatur====<br />
Benennung von Variablen, die Filenamen und Verzeichnisse speichern:<br><br />
{|<br />
| width="100pt" | <tt>*Dir</tt><br />
| Verzeichnis<br />
|-<br />
| <tt>*FileName</tt><br />
| Name des Files, ohne Pfad/Verzeichnis - Angaben<br />
|-<br />
| <tt>*FilePath</tt><br />
| Komplette Pfadangabe eines Files<br />
|}<br />
<br />
====Hinzufügen eines Markup-Elements====<br />
Diese Beschreibung funktioniert, wenn das Element sich über eine Zeile erstreckt und von einer RegEx erkannt werden kann. Das Hinzufügen einer nicht numerierten Liste in Wiki-Syntax wird hier als Beispiel verwendet. <br />
* Definieren der nötigen Tags als static member<br />
private final static String XML_M_LISTITEMTAG = "listitem";<br />
* Hinzufügen der RegEx im Konstruktor<br />
this.regexList.add(new MarkupRegex("(%\\*\\s*(.*))", XML_M_LISTITEMTAG));<br />
* Erweitern der XSL-Files<br />
<br />
===Export aus dem MLTutor heraus===<br />
Dafür sind in gewohnter Manier die Klassen<br />
public class <span style="color:#00CC44">MatlabExportAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate{<br />
...<br />
}<br />
public class <span style="color:#00CC44">MatlabExportAsAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate{<br />
...<br />
}<br />
zuständig. Diese sind mit den Menüpunkten File->Export bzw. File->Export as... verbunden. <br />
<br />
Beide verwenden zum Exportieren die Klasse <span style="color:#00CC44">XMLExporterThread</span>, welche eine Art Mini-Facade für <span style="color:#00CC44">XMLExporter</span> darstellt. <br />
public class <span style="color:#00CC44">XMLExporterThread</span> implements Runnable {<br />
public XMLExporterThread(IDocument document, Properties metadata, IPath XMLFilePath, <br />
boolean xmlOutput, boolean htmlOutput, boolean latexOutput, boolean pdfOutput) {}<br />
public void run() {}<br />
public void doExportOperations() throws FileNotFoundException, TransformerException {}<br />
}<br />
Eine Initialisierung entfällt hier, da es ja schon einen Partitioner zum Dokument gibt. Dadurch ist das <tt>CONFIGFILEDIR</tt> ohne Bedeutung. <br><br />
<tt><span style="color:#00CC44">MatlabExportAsAction</span></tt> verwendet direkt <tt>doExportOperations()</tt>, <tt><span style="color:#00CC44">MatlabExportAction</span></tt> hingegen startet einen neuen Thread.<br />
<br />
===Scripts===<br />
<tt>'''tex2png.sh'''</tt> transformiert ein Latex-File in ein schönes Bildchen. Dies wird für die Umwandlung von Formeln in Bilder (für HTML) in der Funktion <tt><span style="color:#00CC44">XMLExporter</span>.latexToPic(...)</tt> benötigt. <br><br />
Aufruf:<br />
$ tex2png.sh <outputdir> <picname><br />
wobei <tt><outputdir></tt> das jenen Ort, an dem das zu transformierende .tex-File liegt, bezeichnet und <tt><picname></tt> den vollen Pfad des zu erzeugenden Bildes beinhaltet.<br />
<hr><br />
<br />
<tt>'''tex2pdf.sh'''</tt> macht aus dem tex-File ein PDF und löscht alle nebenbei anfallenden Dateien. <br><br />
Aufruf:<br />
$ tex2pdf.sh <outputdir> <texfilename><br />
wobei <tt><outputdir></tt> das jenen Ort, an dem das zu transformierende .tex-File liegt, bezeichnet und <tt><texfilename></tt> den Pfad zum tex-File absolut oder relativ zu <tt><outputdir></tt> beinhaltet.<br />
<hr><br />
<br />
==Bedienung und Konfiguration im MLTutor==<br />
===Menüpunkte===<br />
* File->'''Export as...''' <br> Erzeugt "Speichern Unter"-Dialog, wobei das Ausgabeformat durch die angegebene Dateiendung bestimmt wird. <br> Das gewählte Verzeichnis und die Dateiendung werden gespeichert und beim nächsten Aufruf des Dialogs vorgeschlagen. Der vorgeschlagene Filename entspricht (bis auf die Endung) dem des Matlab Files. Als Quelle für die Daten dient der im Editor angezeigte Text, nicht das gespeicherte File.<br />
* File->'''Export''' <br> Führt alle Exporte wie in der zugehörigen Preference Page angegeben durch. Sofern in den Preferences angegeben wird der Export Dialog angezeigt.<br />
<br />
===Die Preferencepage===<br />
====implementierte Konfigurationsmöglichkeiten====<br />
* Autor<br />
** Name<br />
** Email<br />
** Homepage<br />
* Filespezifische Daten<br />
** Titel<br />
** Datum<br />
** Inhalt<br />
** Typ (Script oder Function)<br />
* Export-Dialog vor jedem Export anzeigen <br />
* Ausgabeverzeichnis<br />
* Ausgabeformate<br />
** Auswahl ob nur LaTeX-Kern erzeugt werden soll<br />
* Auswahl ob Zeilennummern erzeugt werden sollen<br />
* Auswahl der zu verwendenden XSLT-Files<br />
<br />
====gewünschte Konfigurationsmöglichkeiten====<br />
* Namen der erzeugten Files<br />
* für HTML:<br />
** Auswahl aus mehreren Styles<br />
* für LaTeX:<br />
** Angabe einer eigenen Präambel<br />
<br />
===Der Export-Dialog===<br />
[[image:Export_dialog.png|thumb|Der Export-Dialog]]<br />
Wenn gewünscht wird vor jedem Export (mit dem Menüpunkt Export) ein Dialog angezeigt, in welchem filespezifische Daten und die wichtigsten Ausgabeoptionen geändert werden können. Die getroffenen Einstellungen werden in den Preferences gespeichert, jedoch nur wenn der Dialog mit OK beendet wird.<br />
<br />
===Speichern von filespezifischen Daten===<br />
Nach einem Export wird im Verzeichnis des Matlab-Files ein verstecktes File erzeugt, in welchem die Einstellungen des Export-Dialogs gespeichert werden. Bei einem weiteren Export dieses Files werden diese Daten in den Export-Dialog geladen. Auf die Preferences hat dies erst dann Auswirkungen, wenn der Dialog positiv beendet wird. Sollte also der Export-Dialog gar nicht angezeigt werden, so ist dieses File irrelevant.</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4884Meditor2007-01-19T15:01:41Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Lizenzen abklären<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden.<br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü <span style="color:#00AA00">'''Funktioniert''', im Prinzip</span><br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4883Meditor2007-01-16T11:23:30Z<p>Osiris: /* Was fehlt - Schritte bis zur nächsten Version */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Lizenzen abklären<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden.<br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü<br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren <span style="color:#00AA00">'''Funktioniert'''</span><br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4882Meditor2007-01-16T11:22:26Z<p>Osiris: /* ToDos bis zur Veröffentlichung */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling <span style="color:#00AA00">'''Erledigt'''</span><br />
* Preferences durchgehen <span style="color:#00AA00">'''Erledigt'''</span><br />
* Plugin machen und eine Zeit lang verwenden<br />
* Lizenzen abklären<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden.<br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü<br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren<br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osirishttps://itp.tugraz.at/wiki/index.php?title=Meditor&diff=4881Meditor2007-01-16T11:16:16Z<p>Osiris: /* Verbindung mit Matlab-Konsole / Verbindungen nach außen */</p>
<hr />
<div>In <span style="color:#00CC44">grün</span> geschriebene Klassen sind die selbst entwickelten.<br />
<br />
=Ziel=<br />
<br />
Ein professioneller Editor für Matlab<br />
<br />
Features:<br />
* Syntax-Highlighting <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Automatische Einrückung <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Matching Brackets <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfefunktionen<br />
** Für Matlab - Funktionen wird die passende Matlab-Hilfeseite aufgerufen (Browser) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export von Matlab-Files in verschiedene Formate <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Direkter Export in XML<br />
** Umwandlung in verschiedene Zielformate<br />
*** HTML<br />
*** LaTeX, PDF<br />
* Code editing actions<br />
** Comment / Uncomment <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Passend einrücken <span style="color:#00AA00">'''Funktioniert'''</span><br />
** ???<br />
* Interaktion mit weiteren Plugins (Konsole und Workspace-Viewer) wodurch eine umfassende Matlab-IDE gebildet wird. <br />
* Code Folding (vielleicht später)<br />
* Templates?<br />
<br />
==Veröffentlichung==<br />
Es ist geplant den Editor zusammen mit der Matlab-Console und dem Workspace View zu veröffentlichen. Die Lizenz wird die EPL sein.<br />
<br />
===ToDos bis zur Veröffentlichung===<br />
* Quellen für alle Files herausfinden, feststellen welche geändert wurden. <br />
* Gemeinsamen Header <span style="color:#00AA00">'''Erledigt'''</span><br />
** entwickeln<br />
** überall einfügen<br />
* XML Export<br />
** Metainfo-Tags festlegen und implementieren <span style="color:#00AA00">'''Erledigt'''</span><br />
** Markup Language erweitern (Listen, Aufzählungen) <span style="color:#00AA00">'''Erledigt'''</span><br />
** Zeilennummern <span style="color:#00AA00">'''Erledigt'''</span><br />
* System für gemeinsam verwendete Klassen ausdenken<br />
* Exception Handling!!!<br />
* Preferences durchgehen<br />
* Plugin machen und eine Zeit lang verwenden<br />
* Lizenzen abklären<br />
* Doku: klären was zu schreiben ist und dieses verfassen<br />
<br />
=== License ===<br />
Die für Eclipse Plugins wohl üblichste Licence ist die EPL. Deshalb, und weil wir einige EPL-lizenzierte und von uns veränderte Files verwenden, wird auch die EPL für die Veröffentlichung verwendet werden. Wir verwenden auch ein paar Module, welche unter der CPL stehen, was jedoch kein Problem darstellt, solange sie nicht verändert wurden.<br />
<br />
Links:<br />
* [http://www.eclipse.org Eclipse]<br />
** [http://www.eclipse.org/legal/legalfaq.php Eclipse Foundation Legal FAQ]<br />
* [http://www.eclipse.org/org/documents/epl-v10.html EPL]<br />
** [http://www.eclipse.org/legal/eplfaq.php EPL FAQ]<br />
* [http://www-128.ibm.com/developerworks/library/os-cpl.html CPL]<br />
** [http://www-128.ibm.com/developerworks/library/os-cplfaq.html CPL FAQ]<br />
<br />
=Versionen=<br />
(Milestones wär wohl übertrieben ;-)<br />
<br />
==Version 1.0.1==<br />
===Was geht===<br />
* '''Partitionierung''' als Basis für Syntax-Highlighting und Operationen im Dokument <br> Partitionstypen: <br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_MULTILINE_COMMENT,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE<br />
* '''Syntax-Highlighting''' verfeinert<br />
** Arbeitet nur mehr mit Partitionen (generiert von <span style="color:#00CC44">MatlabPartitionScanner</span>)<br />
** Hervorgehoben werden: <br />
*** Kommentare<br />
*** Strings<br />
*** Keywords<br />
*** Matlab-Funktionen<br />
*** Zahlen<br />
* '''Automatische Einrückung'''<br />
** Wenn man eine neue Zeile anfängt <br />
*** die beendete Zeile wird passend eingerückt<br />
*** in der neuen Zeile beginnt man mit passender Einrücktiefe <br />
** Wenn man ein Keyword fertiggetippt hat (und danach ein Whitespace einfügt)<br />
*** die aktuelle Zeile wird passend eingerückt<br />
** Bei Eingabe eines Tabs am Zeilenanfang oder im Whitespacebereich am Beginn einer Zeile<br />
*** die aktuelle Zeile wird passend eingerückt<br />
*** Cursor springt an das Ende der Einrückung<br />
** Vom User einstellbare Sachen:<br />
*** ob die Einrückung mit Tabs oder mit Leerzeichen erfolgen soll<br />
*** Einrücktiefe<br />
<br />
===Archiv===<br />
[[Meditor_101|Diese Seite bei Fertigstellung der Version 1.0.1]]<br />
<br />
==Version 1.0.2 ==<br />
===Was geht (zusätzlich zur Version 1.0.1)===<br />
* '''Partitionierung''' <br />
** neue Partition <tt>MATLAB_CONTINUATION</tt><br />
** unsinige Partition <tt>MATLAB_MULTILINE_COMMENT</tt> entfernt<br />
** Unterscheidung zwischen Strings und dem <tt>'</tt> Zeichen als Operator funktioniert<br />
* '''Automatische Einrückung'''<br />
** Fortsetzungszeilen werden behandelt<br />
** Einrücken von ausgewählten Bereichen (über Menüpunkt)<br />
* '''Preferences'''<br />
** Änderungen zeigen sofort Wirkung<br />
* einige '''Refactorings''' im Code<br />
* '''Syntax-Highlighting'''<br />
** Fortsetzungsoperator (<tt>...</tt>) wird mit allem was nach ihm in einer Zeile steht als Kommentar hervorgehoben<br />
* '''Textoperationen''' <br />
** Beim Löschen/Einfügen von Passagen (auch von mehreren Zeilen) werden Partitionierung, Einrückung und Darstellung aktualisiert<br />
<br />
===Archiv===<br />
[[Meditor_102|Diese Seite bei Fertigstellung der Version 1.0.2]]<br />
<br />
==Version 1.0.3 (läuft derzeit im MLTutor) ==<br />
===Was geht (zusätzlich zur Version 1.0.2)===<br />
* Keybindings<br />
* Hilfe für Funktionen, Keywords und Operatoren<br />
* Operatoren werden gehighlightet<br />
* Konfiguration, Funktionenlisten und "die Ausnahmen" für die Hilfe werden in Files gespeichert<br />
<br />
===Was fehlt - Schritte bis zur nächsten Version===<br />
* Partitionierung<br />
** FEHLER: ' Operator wird nicht als Operator erkannt, wenn er hinter einer MATLAB_NUMBER Partition steht. <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zahlen über Regex erkennen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Überarbeitung der greedy-Funktionalität der <span style="color:#00CC44">RegExRule</span> nötig <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** <span style="color:#00CC44">RegExRule</span> um Lookahead-Funktionalität erweitern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** FEHLER: beim ' Operator, diverses seltsames Verhalten ausbessern <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Strings hinter Keywords erkennen, z.B.: <tt>case'a'</tt><span style="color:#00AA00">'''Funktioniert'''</span><br />
** Beim Einfügen von Text inmitten einer Zeile die Zeile neu partitionieren lassen. <span style="color:#00AA00">'''Funktioniert''' im Prinzip, wird jedoch nicht jedes Mal aufgerufen</span><br />
** Die zwei Bedeutungen von <tt>end</tt> trennen (wenn es als Array Index verwendet wird, soll es bei der Berechnung der Zeileneinzüge ignoriert werden) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Hilfesystem<br />
** Internen Browser verwenden <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Export eines Matlab-Files als XML <span style="color:#00AA00">wird noch erweitert</span><br />
** von außen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** aus dem MLTutor <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen<br />
*** HTML <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** LaTeX <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** PDF <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Transformationen gleich vom MLTutor durchführen lassen (damit direkt "Export as..." ...) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Zeilennummern <br />
*** XML Format ändern <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Transformationen anpassen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Auswahl (ob Zeilennummern angezeigt werden oder nicht) <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Markup Language erweitern:<br />
*** Listen <span style="color:#00AA00">'''Funktioniert'''</span><br />
*** Aufzählungen <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Meldung in der Statuszeile während des Exports<br />
* Wenn mehrere Zeilen markiert sind: Verhalten von TAB und Ctrl+I aufeinander abstimmen<br />
* Actions:<br />
** Befehl zum Einrücken des gesamten Dokuments <span style="color:#00AA00">'''Funktioniert'''</span><br />
** Comment / Uncomment (markierten Block bzw. aktuelle Zeile) <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Actions auch im Kontextmenü<br />
* Zeilennummern standardmäßig anzeigen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Code Folding rauswerfen <span style="color:#00AA00">'''Funktioniert'''</span><br />
* Exception Handling: Stragegie überlegen und implementieren<br />
* <tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt><br />
** Funktionalität anschauen und gegebenenfalls erweitern<br />
<br />
=Anfänglich vorhandene Strukturen=<br />
<br />
==Editor==<br />
...<br />
|- org.eclipse.ui.texteditor.AbstractTextEditor<br />
|- org.eclipse.ui.texteditor.StatusTextEditor<br />
|- org.eclipse.ui.texteditor.AbstractDecoratedTextEditor<br />
|- org.eclipse.ui.editors.text.TextEditor<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditProjection</span><br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabEditor</span><br />
<br />
==Viewer==<br />
...<br />
|- org.eclipse.jface.text.source.projection.ProjectionViewer<br />
|- at.tugraz.itp.mltutor.meditor.editors.<span style="color:#00CC44">MatlabSourceViewer</span><br />
Problem: von <tt>ProjectionViewer</tt> soll eigentlich nicht abgeleitet werden.<br />
<br />
<br />
=Neue Strukturen=<br />
==Ersetzte deprecated Klassen==<br />
* <tt>DefaultPartitioner</tt> durch <tt>FastPartitioner</tt><br />
** <tt>FastPartitioner</tt> implementiert alle benötigten Funktionalitäten, somit keine weiteren Änderungen<br />
<br />
* <tt>org.eclipse.ui.help.WorkbenchHelp</tt> soll ersetzt werden durch <tt>org.eclipse.ui.help.IWorkbenchHelpSystem</tt><br />
** zumindest laut Eclipse-Hilfe, was aber nicht direkt geht (ist ja auch ein Interface)<br />
** Ein neues Hilfesystem, welches aber weniger kann als <tt>org.eclipse.ui.help.WorkbenchHelp</tt>, ist <tt>org.eclipse.help.HelpSystem</tt><br />
** Mit <tt>IWorkbenchHelpSystem IWorkbench.getHelpSystem()</tt> kann eine Instanz des passenden Interfaces geholt werden.<br />
*** Ein <tt>IWorkbench</tt> Objekt wiederum bekommt man mit <tt>static IWorkbench PlatformUI.getWorkbench()</tt><br />
** Ein Beispiel: <br> Statt <tt>WorkbenchHelp.setHelp(...);</tt> <br> Wird jetzt <tt>PlatformUI.getWorkbench().getHelpSystem().setHelp(...)</tt> verwendet.<br />
<br />
* Indent Strategy<br />
** <tt>IAutoIndentStrategy</tt> ist durch <tt>IAutoEditStrategy</tt> zu ersetzen<br />
** damit auch die Funktion <tt>getAutoIndentStrategy(...)</tt> durch <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabAutoIndentStrategy</tt></span> (von <tt>DefaultAutoIndentStrategy</tt> abgeleitet) wurde ersetzt durch <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> (von <tt>IAutoEditStrategy</tt> abgeleitet)<br />
<br />
* <tt>DefaultUndoManager</tt> durch <tt>TextViewerUndoManager</tt><br />
** macht das Gleiche, keine weiteren Änderungen nötig<br />
<br />
==Partitionierung des Dokuments==<br />
===Partitionstypen===<br />
IDocument.DEFAULT_CONTENT_TYPE,<br />
MATLAB_COMMENT,<br />
MATLAB_SINGLELINE_STRING,<br />
MATLAB_KEYWORD, <br />
MATLAB_FUNCTION, <br />
MATLAB_OPERATOR,<br />
MATLAB_CODE, <br />
MATLAB_NUMBER, <br />
MATLAB_WHITESPACE, <br />
MATLAB_NEWLINE, <br />
MATLAB_CONTINUATION<br />
<br />
===Partitionscanner und neue Rules===<br />
<span style="color:#00CC44"><tt>MatlabScanner</tt></span> wurde entfernt. Die darin enthaltenen Funktionalitäten wurden in <span style="color:#00CC44"><tt>MatlabPartitionScanner</tt></span> eingebaut. Da dieser nicht mit <tt>WordRule</tt> umgehen kann, wurde eine neue innere Klasse für das Detektieren der Keywörter eingeführt:<br />
static class <span style="color:#00CC44">WordPredicateRule</span> extends WordRule implements IPredicateRule{<br />
public WordPredicateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
...<br />
}<br />
Anwendung des Adapter (genauer Klassenadapter) Patterns.<br />
<br />
Das selbe Spiel wurde für <span style="color:#00CC44">WhitespacePredicateRule</span> gespielt. <br><br />
Für letztere wird noch eine neue Klasse <span style="color:#00CC44">WhitespaceDetector</span> gebraucht:<br />
private class <span style="color:#00CC44">WhitespaceDetector</span> implements IWhitespaceDetector {<br />
WhitespaceDetector(char[] whitespaces){}<br />
public boolean isWhitespace(char c) {}<br />
}<br />
<br />
Um Regular Expressions verwenden zu können gibt es die Klasse <span style="color:#00CC44"><tt>RegExRule</tt></span><br />
public class <span style="color:#00CC44">RegExRule</span> implements IPredicateRule {<br />
public RegExRule(IToken token, Pattern pattern, Pattern completePattern, boolean greedy) {}<br />
public void setLookback(Pattern lookbackPattern, int lookbackLen){}<br />
public void setLookahead(Pattern lookaheadPattern, int lookaheadMaxLen){}<br />
...<br />
}<br />
<br />
Weiters wird die <tt>EndOfLineRule</tt> benötigt (Kommentare und Fortsetzungszeilen). Da jedoch der Zeilenumbruch von dieser Partition ebenfalls geschluckt wird, und somit nicht als eigene Partition auftaucht, wurde diese Klasse minimalst erweitert um dies zu unterbinden:<br />
public class <span style="color:#00CC44">MatlabEndOfLineRule</span> extends EndOfLineRule {<br />
public MatlabEndOfLineRule(String startSequence, IToken token) {}<br />
public IToken evaluate(ICharacterScanner scanner, boolean resume) {<br />
// super.evaluate ausführen und scanner im Erfolgsfalle um ein Zeichen zurückdrehen<br />
}<br />
}<br />
<br />
===Unterscheidung Funktionen - Keywords===<br />
Leider ist es etwas schwierig mehrere Rules für verschiedene Wortlisten zu implementieren (es funktioniert auf die naheliegende Weise nicht). Deshalb wurde eine (innere) Hilfsklasse <span style="color:#00CC44"><tt>WordListRuleGenerator</tt></span> eingeführt, die eine <span style="color:#00CC44"><tt>WordPredicateRule</tt></span> aus mehreren Wortlisten erzeugt. Dabei gehört zu jeder Wortliste ein Token, sodass verschiedene Partitionen für verschiedene Wortlisten erzeugt werden, wobei bisher lediglich zwischen den Matlab-Funktionen und Keywords unterschieden wird. Als Keywords wird der Output der Matlab-Funktion <tt>iskeyword</tt> verwendet: <br> <br />
<tt>'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'</tt> <br> <br />
(entnommen aus der Matlab Hilfe: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/iskeyword.html)<br />
class <span style="color:#00CC44">WordListRuleGenerator</span> {<br />
public WordListRuleGenerator();<br />
public void addWordList(String[] words, IToken token);<br />
public IPredicateRule generateRule(IWordDetector detector, IToken successToken, IToken defaultToken);<br />
}<br />
<br />
===Operatoren===<br />
werden mit einer Regex erkannt. Die Regex ist: <br />
\.?(\+|\-|\*|/|\\|\^)|:|<|<=|>|>=|!=|==|&|\||~|&&|\|\|<br />
Man könnte diese zwar noch hübscher gestalten (z.B. <tt><|<=</tt> durch <tt><=?</tt> ersetzen), aber dies würde zu unübersichtlicherem Code bei der Erstellung der Regex führen. <br />
<br />
Diese Erstellung wird von folgender Klasse erledigt:<br />
private static class <span style="color:#00CC44">OperatorList</span> {<br />
private final static String[] DOT_OPERATORS = {<br />
"+", "-", "*", "/", "\\", "^"<br />
};<br />
private final static String[] OPERATORS = {<br />
":", "<", "<=", ">", ">=", "!=", "==", <br />
"&", "|", "~", <br />
"&&", "||"<br />
};<br />
...<br />
<br />
public static String getRegexString(){}<br />
...<br />
}<br />
<br />
===Zahlen===<br />
Zahlen werden über eine Regex erkannt. Die Basisregex ist:<br />
(\d+\.|\d*\.\d+|\d+)([eEdD][\-\+]?\d+)?<br />
wobei diese auf insgesamt 4 Rules (deren Reihenfolge sehr wichtig ist!) aufgeteilt wurde, da eine besondere Behandlung einer Zahl vor einem DotOperator nötig ist. Zu diesem Zweck wurde die <tt><span style="color:#00CC44">RegExRule</span></tt> um die Möglichkeit eines Lookaheads erweitert. <br />
<br />
Um z.B. den Fall <tt>2.^[0:10]</tt> richtig zu verarbeiten (der Punkt gehört zum Operator, nicht zur Zahl) wird die Zahl mit der Regex <tt>\d+\.</tt> und dem Lookahead <tt>[^\+\-\*/\\\^']</tt> erkannt. Der Lookahead sorgt dafür, dass im Falle eines auf eine Zahl folgenen DotOperators die Regex nicht anpricht, sondern die nächste Rule mit der Regex <tt>\d+</tt> zum Tragen kommt. <br />
<br />
===Funktionsliste aus File einlesen===<br />
Das File wird vom Tool <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabFunctionFileSearch</span></tt> generiert. Falls es vom <span style="color:#00CC44">MatlabPartitionScanner</span> nicht gefunden werden kann, wird die bisher verwendete hardcoded Liste verwendet.<br />
<br />
Für das Tool siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|dessen Doku im Wiki]]<br />
<br />
==Automatische Einrückung==<br />
===Anforderungen===<br />
Funktionalität:<br />
* Beim Wechsel in eine neue Zeile (Enter)<br />
** Übernehmen der Einrücktiefe <br />
** Automatisches Ein- und Ausrücken nach bestimmten Keywords (for, ...)<br />
*** Dies kann die aktuelle Zeile oder eine nach einem Umbruch neu erzeugte betreffen<br />
* laufende Aktualisierung der Einrücktiefe (wenn z.B. ein Teil eines Keywords gelöscht wird)<br />
** korrekte Einrückung für mit copy and paste eingefügte Bereiche<br />
* Verhalten der Tab-Taste wie im Emacs<br />
* korrekte Einrückung für einen ganzen Abschnitt (das ganze Dokument)<br />
<br />
===Stragegie===<br />
<tt>char command</tt> enthält das zuletzt eingetippte "Zeichen". <br />
<br />
'''Beim Sprung in eine neue Zeile'''<br />
# vorhergehende Zeile holen, Einrücktiefe feststellen<br />
# vorhergehende Zeile analysieren, dabei mit Partitionen arbeiten (damit können Kommentare leicht ignoriert werden)<br />
#* für jedes Keyword für mehr Einrückung (<tt>for</tt>, <tt>if</tt>, <tt>else</tt>, <tt>elseif</tt>, ...) <br> => Einrücken<br />
#* für jedes Keyword für weniger Einrückung (<tt>end</tt>, ...) <br> => Ausrücken<br />
#* bei Fortsetzungszeilen um einen Fixbetrag gegenüber der ersten fortgesetzten Zeile einrücken<br />
# tatsächliche Einrückung für die vorhergehende und die neue Zeile herstellen (passende Whitespaces)<br />
# falls der Umbruch mitten in einer Zeile erzeugt wurde, so soll der Textcursor an das Ende des Whitespacebereichs am Anfang der neuen Zeile positioniert werden<br />
<br />
'''Nach dem Fertigtippen eines Keywords'''<br />
# Zeile holen<br />
# Vorherige Partition holen<br />
# Wenn diese ein Keyword war<br />
## Einrücktiefe der vorherigen Zeile feststellen<br />
## Einrücktiefe der aktuellen Zeile korrigieren<br />
<br />
'''Drücken von Tab'''<br />
# vorhergehende Zeile analysieren<br />
# Einrücktiefe der aktuellen Zeile korrigieren<br />
# Textcursor an das Ende des Whitespacebereichs setzen<br />
<br />
'''Löschen und Einfügen von Textteilen'''<br />
# Feststellen welche Zeilen betroffen sind<br />
# Diese passend einrücken<br />
<br />
===Struktur===<br />
Neue Singleton Klasse:<br />
public class <span style="color:#00CC44">MatlabAutoEditStrategy</span> implements IAutoEditStrategy {<br />
public static MatlabAutoEditStrategy getInstance(){}<br />
public void setSourceViewer(ISourceViewer sourceViewer){<br />
public void setupStrategy(){}<br />
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {}<br />
...<br />
}<br />
Diese wird explizit ansonsten möglichst nirgends verwendet!<br><br />
:Jedoch wird sie für Reinitialisierungsarbeiten nach Änderungen in der Preferences Page benötigt werden, was meiner Meinung nach OK ist, da die speziellen Einstellungen und unsere spezielle Klasse zusammengehören. (--[[User:Osiris|Osiris]] 12:43, 9 December 2005 (CET))<br />
<br />
Für das korrekte Einrücken eines markierten Bereichs gibt es die Klasse<br />
<span style="color:#00CC44">MatlabIndentationAction</span> extends <span style="color:#00CC44">MatlabAction</span> implements IEditorActionDelegate {<br />
public MatlabIndentationAction(String text) {}<br />
public MatlabIndentationAction() {}<br />
public void run(IAction action) {}<br />
public void setActiveEditor(IAction action, IEditorPart targetEditor) {}<br />
}<br />
welche haupstächlich das Verhalten von <span style="color:#00CC44"><tt>MatlabAction</tt></span> übernimmt.<br />
<br />
:Leider ist mir noch kein Weg untergekommen um aus der Klasse heraus (über <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span>) an die vom Framework verwendete Instanz von <span style="color:#00CC44"><tt>MatlabAutoEditStrategy</tt></span> heranzukommen, weshalb ich mich dazu entschloss letztere als Singleton auszuführen. Ich wählte die einfachste Thread-save Implementierung die mir bekannt ist. --[[User:Osiris|Osiris]] 14:48, 4 January 2006 (CET)<br />
<br />
Die Action ist nur über die plugin.xml hinzugefügt und über den Menüpunkt '''Edit -> Correct Indentation''' erreichbar.<br />
<br />
'''Querverbindungen:'''<br />
* Folgende Klassen wissen was von der konkreten Indent Strategy<br />
** <span style="color:#00CC44"><tt>MatlabConfiguration</tt></span> <br> nur innerhalb der Funktion <tt>getAutoEditStrategies(...)</tt><br />
** <span style="color:#00CC44"><tt>MatlabEditor</tt></span> <br> nur für die Initialisierung des <tt>IPropertyChangeListener</tt> (um auf Änderungen in der PropertyPage reagieren zu können)<br />
** <span style="color:#00CC44"><tt>MatlabIndentationAction</tt></span><br />
* Damit die Indent Strategy die Aktualisierung der Ausgabe erzwingen kann, muss ihr der Source Viewer bekannt gegeben werden, was in der Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getAutoEditStrategies(ISourceViewer sourceViewer, ...)</tt> leicht erledigt werden kann.<br />
:Offensichtlich ist es auch so gedacht, dass die Indent Strategie "ihren" Source Viewer kennt - klingt ja auch plausibel. --[[User:Osiris|Osiris]] 15:37, 5 January 2006 (CET)<br />
<br />
== Änderungen in der PropertyPage sofort übernehmen ==<br />
=== Grundstruktur===<br />
In <tt><span style="color:#00CC44">MatlabEditor</span>.init(...)</tt> wird ein <tt>Preferences.IPropertyChangeListener()</tt> angelegt, welcher bei Änderung einer Textfarbe <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(...)</tt></span> und bei Änderungen an den Einstellungen für die Einrückung <span style="color:#00CC44"><tt>MatlabAutoEditStrategy.setupStrategy()</tt></span> aufruft. <br><br />
In der ersten Funktion wird der passende <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer</tt></span> geholt und dessen <tt>TextAttribute</tt> durch ein neues ersetzt. <br />
<br />
===Hinzugefügte Strukturen===<br />
* <span style="color:#00CC44"><tt>NonRuleBasedDamagerRepairer.setTextAttribute(TextAttribute textAttribute)</tt></span> <br> ist lediglich ein Setter für die bereits vorhanden gewesene Membervariable. <br />
* <span style="color:#00CC44"><tt>MatlabConfiguration.updateSyntaxColor(String name)</tt></span> <br> die DamagerRepairer aller zu der angegebenen Farbe gehörenden Partitionstypen werden aktualisiert.<br />
Im Zuge dessen wurde das Initialisieren des <tt>PresentationReconciler</tt> (Funktion <tt><span style="color:#00CC44">MatlabConfiguration</span>.getPresentationReconciler(...)</tt> refactored.<br />
<br />
==Hilfesystem==<br />
Die Implementierung als Action entspricht der der automatischen Einrückung. <br />
public class <span style="color:#00CC44">MatlabHelpAction</span> extends MatlabAction implements IEditorActionDelegate{<br />
private final static String PROPERTYFILE = "helpproperties.xml";<br />
private final static String EXCEPTIONFILE = "helpfileexceptions.xml";<br />
private final static String HELPFILEFUNCFILE = "help_funcs";<br />
<br />
// weitere Definitionen für Defaultwerte der Parameter<br />
<br />
// Keys der Parameter (für das propertyfile):<br />
private final static String HELP_HTML_BASE_KEY = "HELP_HTML_BASE"; <br />
private final static String REFERENCE_HTML_BASE_KEY = "REFERENCE_HTML_BASE";<br />
<br />
public MatlabHelpAction(String text) {}<br />
public MatlabHelpAction() {}<br />
public void run(IAction action) {}<br />
private void launchBrowser(String urlToOpen){}<br />
...<br />
}<br />
<br />
===Vorgehen===<br />
# Es wird überprüft, ob der Cursor in einer Partition steht, für die Hilfe angeboten werden kann und der zu suchende Text extrahiert. Dies trifft für die Partitionstypen <tt>MATLAB_FUNCTION</tt>, <tt>MATLAB_KEYWORD</tt> und <tt>MATLAB_OPERATOR</tt> zu. Dabei darf der Cursor sowohl direkt vor dem ersten als auch direkt nach dem letzten Zeichen der Partition stehen. <br />
# Es wird nachgesehen, ob die gesuchte Funktion in der Liste der Funktionen mit Hilfeseite enthalten ist und '''falls ja''' wird eine URL zur Hilfeseite generiert. <br />
# '''Falls nein''' wird in der Liste der Ausnahmen nach dem Text gesucht und die dort angegebene URL verwendet. <br />
# Anschließend wird, sofern eine Hilfeseite gefunden wurde, ein externer Browser mit dieser als Inhalt gestartet, wofur <tt>launchBrowser(...)</tt> zuständig ist. <br />
<br />
===Konfiguration===<br />
Für die eigentliche Konfiguration wird ein XML-File (helpproperties.xml), welches für die Klasse <tt>java.util.Properties</tt> verwendet werden kann, verwendet. Dabei sind die Keys <tt>HELP_HTML_BASE</tt> und <tt>REFERENCE_HTML_BASE</tt> zu verwenden. <br><br />
Ein Beispielfile:<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><br />
<properties><br />
<comment></comment><br />
<entry key="HELP_HTML_BASE">http://itp.tugraz.at/matlab/</entry><br />
<entry key="REFERENCE_HTML_BASE">http://itp.tugraz.at/matlab/techdoc/ref/</entry><br />
</properties><br />
<br />
Weiters sind noch zwei Files nötig, um zu Funktionen die passenden Hilfeseiten zu finden. <br />
# '''help_funcs''' enthält alle Matlab-Funktionen, zu denen es eine Hilfeseite gibt und kann mit <tt><span style="color:#00CC44">filetools.filesearchtools.MatlabfunctionFileSearch</span></tt> erzeugt werden (siehe [[Filetools#Konkrete_Klasse_MatlabfunctionFileSearch|hier]])<br />
# '''helpfileexceptions.xml''' enthält die Ausnahmen, also Funktionen, für die eine spezielle Hilfeseite angegeben wird. Genaueres zum File im nächsten Abschnitt.<br />
<br />
===Die Ausnahmen===<br />
werden in einem XML-Format gespeichert, welches zwar selbst definiert ist, sich aber an das Java-Property - Format anlehnt. Wird keine Datei gefunden, so wird eine hart codierte Liste, welche die Operatoren beinhaltet, verwendet. <br><br />
Dieses File liegt in <tt>/afs/itp.tugraz.at/proj/mml/MLTutor/mltutor/plugins/at.tugraz.itp.mltutor.meditor_1.0.3/config/</tt> und kann jederzeit editiert werden, um neue Ausnahmen hinzuzufügen.<br />
<br />
Eine Beispieldatei:<br />
<?xml version = '1.0' encoding = 'UTF-8'?><br />
<!DOCTYPE helpexceptions SYSTEM "helpfileexceptions.dtd"><br />
<helpexceptions><br />
<exception word="+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word=".+" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
<exception word="-" >techdoc/matlab_prog/ch12_nd9.html</exception><br />
...<br />
</helpexceptions><br />
<br />
Zur Verarbeitung des XML-Files wird ein SAX-Parser, verpackt in folgende Klasse verwendet:<br />
public class <span style="color:#00CC44">HelpExceptionFileReader</span> extends DefaultHandler {<br />
public HelpExceptionFileReader(){}<br />
public static Hashtable<String, String> readHelpFile(String directory, String filename){}<br />
...<br />
}<br />
<br />
==[[Meditor_XML-Export|XML-Export]]==<br />
<br />
==Preference Pages==<br />
<br />
===Struktur===<br />
<tt><span style="color:#00CC44">AbstractMatlabenginePrefsPage</span></tt> dient als Basisklasse für die einzelnen Preference Pages und stellt Grundfunktionen zum Hinzufügen von Elementen und für die Speicherung der Einstellungen zur Verfügung. Diese und die zu überschreibenden Funktionen (unterer Block) sind folgend angegeben:<br />
<br />
public abstract class AbstractMatlabenginePrefsPage extends PreferencePage <br />
implements IWorkbenchPreferencePage {<br />
<br />
public AbstractMatlabenginePrefsPage(String description){}<br />
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {}<br />
protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {}<br />
protected Control addComboField(Composite parent, String label, String key, String[] entries, int indentation, boolean isNumber) {}<br />
protected Group addGroup(Composite parent, String title) {}<br />
protected Composite addRadioButtonField(Composite parent, String title, String[][] buttonInfo, int verticalIndent, int hSpan, int radioButtonIndent) {}<br />
protected Label addLabel(Composite parent, String text, int verticalIndent, int hSpan) {}<br />
protected void createDependency(final Button master, String masterKey, final Control slave) {}<br />
protected static void indent(Control control) {}<br />
<br />
protected static void initializeDefaultPreferences(Preferences prefs) {}<br />
protected abstract Control createAppearancePage(Composite parent);<br />
protected abstract OverlayPreferenceStore createOverlayStore();<br />
...<br />
}<br />
<br />
Zum Speichern der Einstellungen wird die Klasse <tt><span style="color:#00CC44">OverlayPreferenceStore</span></tt> verwendet.<br />
<br />
public class <span style="color:#00CC44">OverlayPreferenceStore</span> implements IPreferenceStore {<br />
...<br />
}<br />
<br />
===Vorhandene Preference Pages===<br />
Es sind folgende Preference Pages implementiert:<br />
{|<br />
| width="200px" | <tt><span style="color:#00CC44">MatlabenginePrefsPage</span></tt><br />
| Grundlegende Editor-Einstellungen<br />
|-<br />
| <tt><span style="color:#00CC44">MatlabengineExportPrefsPage</span></tt><br />
| Einstellungen für den Export (Menüpunkt File->Export)<br />
|-<br />
| <tt><span style="color:#00CC44">BrowserPreferencePage</span></tt><br />
| Konfiguration des zu verwendenden Browsers für die Hilfe-Funktionen<br />
|}<br />
<br />
==Exception Handling==<br />
===Struktur===<br />
Es verursachen fast alle Exceptions eine Fehlerausgabe in einem Dialogfenster. Dafür ist die eine Member-Funktion der Klasse <tt><span style="color:#00CC44">Activator</span></tt> zuständig:<br />
public static void <span style="color:#00CC44">errorDialog</span>(final String message, final Throwable t) {...}<br />
<br />
Sollten Exceptions auftreten, welche keine wirklichen Fehlfunktionen verursachen, so kann auch nach dem selben Prinzip eine Warnung ausgegeben werden:<br />
public static void <span style="color:#00CC44">warningDialog</span>(final String message, final Throwable t) {...}<br />
<br />
===Der Error-Dialog===<br />
[[Image:Errordialog1.png|thumb|Beispiel für einen Error Dialog]]<br />
Im erzeugten Dialogfenster werden neben der Fehlermitteilung auch Details zur Exception und die Stack Trace ausgegeben. Sollte eine abgefangene Exception durch eine andere verursacht worden sein, so wird die Stack Trace des Verursachers zur Ausgabe herangezogen.<br />
<br />
=Weitere Schritte=<br />
==Automatische Einrückung==<br />
'''Verfeinerung''': "schließende" '''Keywords''' suchen sich ihre "öffnenden" Partner. <br />
* Damit wird z.B. der Fehler, dass das Konstrukt <tt>for bla end</tt> ausgerückt wird, unterbunden. <br />
** Generell können damit vom User verrücktere Konstrukte eingegeben und passend eingerückt werden.<br />
* Einrückverhalten könnte vom User frei konfigurierbar gemacht werden<br />
* <tt>switch - case - end</tt> wird schöner machbar<br />
<br />
'''Vervollständigung''': '''Einrücken von ganzen Bereichen''' auch vom Kontextmeü aus zugänglich machen <br><br />
Schön wär's, wenn der Menüpunkt "Indent whole document" heißen würde, wenn nichts markiert ist (ansonsten "Correct Indentation"), und auch genau das gemacht werden würde.<br />
<br />
==Hilfesystem==<br />
* Wenn keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.<br />
* Preference Page? <br> mögliche Einstellungen:<br />
** Basis-URL (für uns interessant: Mathworks-Seiten oder ITP-Spiegelung)<br />
** Angeben der config-Files<br />
** ?<br />
<br />
==Verbindung mit Matlab-Konsole / Verbindungen nach außen==<br />
* Text an Matlab senden und Matlab-Output zurückbekommen (oder holen)<br />
* Befehl für "Run matlab command"<br />
* Befehl "isfunction" implementieren und zugänglich machen<br />
<br />
==Anstehende Refactorings / Verbesserungen==<br />
* '''<tt><span style="color:#00CC44">MatlabEditor</span></tt>'''<br />
** Folgende Felder werden nie verwendet:<br />
*** TEMPLATE_PROPOSALS_ID<br />
*** CONTENTASSIST_PROPOSALS_ID<br />
*** CORRECTIONASSIST_PROPOSALS_ID<br />
* '''<tt><span style="color:#00CC44">RegExRule</span>.evaluate(...)</tt>''' <br> Code besser strukturieren<br />
* '''<tt><span style="color:#00CC44">MatlabPartitionScanner</span></tt>''' <br> braucht vom <tt>Activator</tt> gar nix mehr wissen (configfileDir dem Konstruktor übergeben und "leeren" Konstruktor rausschmeißen)<br />
* '''<tt><span style="color:#00CC44">MatlabEnginePrefsPage</span></tt>'''<br />
** Auf generic types umstellen, und zwar vollständig<br />
** Maps verwenden als Keys Objekte wie <tt>Button</tt> oder <tt>Text</tt> und als Value einen <tt>String</tt> namens <tt>key</tt>?!!!!! <br> in was Sinnvolles umschreiben, insbesondere da die speziellen Eigenschaften/Vorteile assoziativer Arrays nicht genutzt werden.<br />
* '''<tt><span style="color:#00CC44">MatlabConvertTabToSpace</span></tt>''' <br />
** ist von <tt><span style="color:#00CC44">MatlabConvertSpaceToTab</span></tt> abgeleitet, weil es eine Funktion braucht. Andere Klassenstruktur einführen, sodass beide gleichwertig behandelt werden.<br />
* '''<tt><span style="color:#00CC44">beep(Exception e)</span></tt>'''<br />
** ist in den Klassen <tt><span style="color:#00CC44">MatlabAction</span></tt> und <tt><span style="color:#00CC44">MatlabSelection enthalten</span></tt><br />
* '''<tt><span style="color:#00CC44">MatlabDoubleClickStrategy</span></tt>'''<br />
** die <tt>return</tt>s mitten im Code raushauen<br />
** <tt><span style="color:#00CC44">selectComment</span></tt> überarbeiten (returns und klarere Strukturierung)<br />
<br />
=Diverses=<br />
<br />
==Weitere Seiten==<br />
* [[Meditor_Archiv|'''Archiv''']]: Hier werden für die aktuelle Entwicklung nicht mehr relevante Texte archiviert.<br />
* [[Meditor_Benutzerseite|'''Benutzerseite''']]: Fehlerberichte und Verbesserungsvorschläge<br />
* '''[[Filetools]]''': Diverse selbst programmierte, eigenständige Tools die rund um den MLTutor entwickelt wurden.<br />
* [[Meditor_XML-Export|'''XML-Export''']]: Seite für den Exporter.<br />
<br />
==Anmerkungen zur Entwicklung==<br />
<br />
Folgende '''Plugins''' werden vom Meditor-Plugin benötigt (einzutragen bei Dependencies)<br />
* org.eclipse.core.runtime<br />
* org.eclipse.core.resources<br />
* org.eclipse.jdt.ui<br />
* org.eclipse.jface.text<br />
* org.eclipse.ui<br />
* org.eclipse.ui.browser<br />
* org.eclipse.ui.editors<br />
* org.eclipse.ui.ide<br />
* org.eclipse.ui.views<br />
* org.eclipse.ui.workbench.texteditor<br />
<br />
'''Patterns''' <br><br />
Einer der Vorteile von Patterns ist die sehr gute Kommunizierbarkeit. Damit dieser jedoch überhaupt zum Tragen kommen kann müssen verwendete Patterns auch genannt werden. Deshalb werden im Zuge des Ausbaus des Editors neue Anwendungen von Patterns entsprechend gekennzeichnet.<br />
<br />
==Erstellen eines eigenen Editors (nur Anmerkungen)==<br />
<br />
# Klasse von <tt>AbstractTextEditor</tt> ableiten<br />
# Klasse von <tt>SourceViewerConfiguration</tt> ableiten <br> Dies ist der Ausgangspunkt für das Hinzufügen von eigenen Funktionalitäten<br />
# Einen <tt>DocumentProvider</tt> erweitern um ein <tt>IDocument</tt> Objekt, welches die Datenrepräsentation darstellt, zu erhalten. Dies ist auch der Ausgangspunkt für Notifacations. <br />
# Actions werden in der Funktion <tt>createActions()</tt> (Memberfunktion des erzeugten Editors) hinzugefügt.<br />
<br />
==Hinzufügen von Keybindings==<br />
Für Extension Points in denen <tt><Action ... ></tt> verwendet wird, wie z.B. <tt>org.eclipse.ui.editorActions</tt> oder <tt>org.eclipse.ui.actionSets</tt>: <br />
<br />
# In der Action wird das Attribut <tt>definitionId</tt> gesetzt. <br />
# Dann wird über den Extension Point <tt>org.eclipse.ui.commands</tt> ein Command definiert.<br />
#* In diesem wird die zuvor vergebene ID im Attribut <tt>id</tt> wieder verwendet.<br />
#* Weiters wird eine Category benötigt<br />
# Die Verknüpfung mit einer Tastenkombination erfolgt mit Hilfe des Extension Points <tt>org.eclipse.ui.bindings</tt> durch die Definition eines Keys, in welchem die ID im Attribut <tt>commandId</tt> angegeben wird.<br />
<br />
Ein Beispiel:<br />
<extension<br />
point="org.eclipse.ui.editorActions"><br />
<editorContribution<br />
id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
targetID= "at.tugraz.itp.mltutor.meditor.editors.MatlabEditor"><br />
<menu id= "Help"<br />
label="&amp;Help Menu" ><br />
<separator name= "group1" /><br />
</menu><br />
<action id= "at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
label= "Matlab help"<br />
menubarPath="Help/group1"<br />
class="at.tugraz.itp.mltutor.meditor.editors.MatlabHelpAction"<br />
'''definitionId="at.tugraz.itp.mltutor.actions.helpaction"'''><br />
<selection class="org.eclipse.core.resources.IFile"<br />
name="*.m"/><br />
</action><br />
</editorContribution><br />
... <br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.commands"><br />
<command<br />
name="Matlab help"<br />
description="Get matlab help for a function/keyword"<br />
categoryId="at.tugraz.itp.mltutor.actions"<br />
'''id="at.tugraz.itp.mltutor.actions.helpaction'''"><br />
</command><br />
...<br />
<category<br />
name="Matlab actions"<br />
description="Matlab actions"<br />
id="at.tugraz.itp.mltutor.actions"><br />
</category><br />
</extension><br />
...<br />
<extension<br />
point="org.eclipse.ui.bindings"><br />
<key<br />
sequence="F1"<br />
'''commandId="at.tugraz.itp.mltutor.actions.helpaction'''"<br />
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"><br />
</key><br />
...<br />
</extension><br />
<br />
=Fragen=<br />
<br />
==Offene==<br />
* Soll das Syntax-Highlighting noch verfeinert werden? Derzeit wird folgendes hervorgehoben: <br> Kommentare, Zahlen, Strings, Matlab-Funktionen, Keywords, Operatoren<br />
* Weiß wer wie man in einer <tt>Action</tt> an die verwendete <tt>SourceviewerConfiguration</tt> rankommt?<br />
* Die im Punkt "Anstehende Refactorings / Verbesserungen" geschilderten Probleme betreffend:<br />
** Wozu waren die diversen Felder und werden sie evtl. noch irgendwann verwendet?<br />
** Einwände gegen das Entfernen dieser?<br />
* Nachdem jetzt auf Java 5 umgestellt wurde, auch ÜBERALL generic types verwenden?<br />
<br />
==Erledigte==</div>Osiris