\section{Fortran Text Editors}

There are \textbf{two} different text editors in Photran. This is necessary to
support both the fixed-form Fortran 77 standard and the free-form Fortran 90 \&
95 standard.

Fortran 77 is known as fixed-form Fortran because it requires certain constructs
to be \emph{fixed} to particular columns. For instance, Fortran statements can
only appear between columns 7 - 72; anything beyond column 72 is ignored
completely. This requirement is an artifact of the days when punched cards were
used for Fortran programming. However, Fortran 77 compilers still enforce this
requirement. The fixed-form editor in Photran helps the programmer remember this
requirement by displaying visual cues to denote the column partitions.

Fortran 90/95 adopted the free-form format that most programmers today are
accustomed to. Nonetheless, because Fortran 77 is still considered a subset of
Fortran 90/95, it is possible to write programs following the fixed-form format.
As such, the free-form editor maintains some visual cues on column numbering
(although using a more subtle UI).

The UML class diagram in Figure~\ref{fig:images_editor_class_hierarchy} shows
the hierarchy of the editors in Photran.

\begin{image}
	\centering
			\includegraphics[height=3in]{images/editor_hierarchy.png}
			\caption{Photran editor class hierarchy}
		\label{fig:images_editor_class_hierarchy}
\end{image}

Both the \texttt{FixedFormFortranEditor} and \texttt{FreeFormFortranEditor}
concrete classes inherit from \texttt{AbstractFortranEditor}. Most of the actual
work is done inside \texttt{AbstractFortranEditor}; its subclasses just specify
how to decorate the UI.

In general, the implementation of \texttt{AbstractFortranEditor} closely follows
the standard implementation of text editors in Eclipse. The following section
highlights some of the Photran-specific mechanisms of the text editor. For more
information on how text editors work in Eclipse, please consult the Eclipse
references mentioned in Chapter~\ref{cha:introduction}.

\section{Contributed \texttt{SourceViewerConfiguration}}

Text editors in Eclipse rely on a \texttt{SourceViewerConfiguration} to enhance
the current editor with features such as auto indenting, syntax highlighting and
formatting. By default, most of these features are already provided by the
concrete \texttt{SourceViewerConfiguration} class. However, it is possible to
provide a custom implementation of a \texttt{SourceViewerConfiguration}. This is
done by calling the
\texttt{setSourceViewerConfiguration(SourceViewerConfiguration
sourceViewerConfiguration)} method in an Eclipse text editor.

Photran provides an additional layer of flexibility by allowing its
\texttt{SourceViewerConfiguration} to be contributed from other plug-ins. A
plug-in that is interested in contributing a \texttt{SourceViewerConfiguration}
to the Photran editors must extend the
\\\texttt{org.eclipse.photran.ui.sourceViewerConfig} extension point defined in
the \\\texttt{org.eclipse.photran.ui.vpg} plug-in.

At run-time, Photran \emph{dynamically} instantiates a suitable
\texttt{SourceViewerConfiguration} by searching through the list of plug-ins
that extend the \texttt{org.eclipse.photran.ui.sourceViewerConfig} extension.

Currently, there are \textbf{two} \texttt{SourceViewerConfiguration}s in
Photran: the contributed \texttt{FortranVPGSourceViewerConfigurationFactory} and
the default (but less feature-full)
\texttt{FortranModelReconcilingSourceViewerConfiguration}.

\section{Fortran Editor Tasks: VPG \& AST Tasks}

Many actions that a user can invoke actually depend on the current text in the
text editor. For instance, auto-completion depends on the text that has been
entered so far to provide feasible completion choices. A good auto-completion
strategy constantly augments and updates its database of feasible completion
choices as the user enters or modifies text; it does not have to wait until the
user saves the current file.

Another important feature of the text editor that requires constant updates is
syntax highlighting. Syntax highlighting has to work almost instantaneously
based on what the user has entered. It is not acceptable for the user to
experience lengthy delays between typing a character and waiting for it to
syntax highlight correctly.

Eclipse utilizes a \emph{reconciler} to correctly and instantly perform syntax
highlighting. The reconciler runs in a background thread in Eclipse, constantly
monitoring the text that the user enters and updating the syntax highlighting as
necessary. Every text editor in Eclipse -- including Photran's -- has a
corresponding reconciler.

Photran takes advantage of its existing reconciler
(\texttt{FortranVPGReconcilingStrategy}) and adds additional Fortran editor
tasks that should run each time its reconciler runs. The list of tasks to run is
stored in the singleton \texttt{FortranEditorTasks} object.

Currently, there are two kinds of tasks that can be run: Abstract Syntax Tree
(AST) editor tasks and Virtual Program Graph(VPG) editor tasks. AST editor tasks
depend on information from the AST of the current source file; and VPG editor
tasks depend on information from the VPG of the current source file.
\texttt{FortranEditorTasks} automatically schedules the VPG editor tasks using
an instance of \texttt{VPGSchedulingRule} to synchronize access to the
\texttt{PhotranVPG} singleton object. The AST of the current file is computed
on-the-fly as the user modifies the source file. The VPG of the current file is
based off its previous saved version (so it is less up-to-date). For more
information about the AST and VPG, see Chapter~\ref{cha:parsing}.

AST editor tasks must implement the \texttt{IFortranEditorASTTask} interface and
VPG editor tasks must implement the \texttt{IFortranEditorVPGTask} interface.
Additionally, each task has to register itself with the
\texttt{FortranEditorTasks} object. A task that no longer needs to run should
also be unregistered. Since these tasks run asynchronously, it is important to
use proper Java concurrency practices i.e. \textbf{synchronized} methods and statements.

\pagebreak

Below is the API of the \texttt{FortranEditorTasks} class:

\begin{code}
\begin{lstlisting}
public class FortranEditorTasks
{
	public static FortranEditorTasks instance(AbstractFortranEditor editor)

	public synchronized void addASTTask(IFortranEditorASTTask task)

	public synchronized void addVPGTask(IFortranEditorVPGTask task)

	public synchronized void removeASTTask(IFortranEditorASTTask task)

	public synchronized void removeVPGTask(IFortranEditorVPGTask task)

	public Runner getRunner()
	
	...
} 
\end{lstlisting}
\caption{API of \texttt{FortranEditorTasks} (see FortranEditorTasks.java)}  
\end{code}

It is possible for a class to implement both the \texttt{IFortranEditorASTTask}
and \texttt{IFortranEditorVPGTask} interfaces. For example, the
\texttt{DeclarationView} class registers itself for both kinds of editor tasks
and makes use of the information from both as it attempts to present the
declaration for the currently selected token of the text editor.

For more information on implementation details, please refer to the following
classes:

\begin{itemize}
	\item \texttt{DeclarationView}
	\item \texttt{FortranCompletionProcessorASTTask}
	\item \texttt{FortranCompletionProcessorVPGTask}
	\item \texttt{OpenDeclarationASTTask}
\end{itemize}
