blob: ed0d076ac80fd682183711a40df1d9f3a9d99251 [file] [log] [blame]
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.1.5">
<title>Eugenia - Epsilon</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.bde7dde4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ef6f36e2.min.css">
<meta name="theme-color" content="#000000">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
<style>:root{--md-text-font-family:"Roboto";--md-code-font-family:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/stylesheets/mermaid.css">
<link rel="stylesheet" href="../../assets/javascript/google-code-prettify/prettify.css">
<link rel="stylesheet" href="https://unpkg.com/mermaid@8.5.1/dist/mermaid.css">
<link rel="stylesheet" href="../../assets/stylesheets/slick.css">
<link rel="stylesheet" href="../../assets/stylesheets/slick-theme.css">
<link rel="stylesheet" href="../../assets/stylesheets/extra.css">
<script>
window.ga = window.ga || function() {
(ga.q = ga.q || []).push(arguments)
}
ga.l = +new Date
/* Setup integration and send page view */
ga("create", "UA-184785655-1", "auto")
ga("set", "anonymizeIp", true)
ga("send", "pageview")
/* Register handler to log search on blur */
document.addEventListener("DOMContentLoaded", () => {
if (document.forms.search) {
var query = document.forms.search.query
query.addEventListener("blur", function() {
if (this.value) {
var path = document.location.pathname;
ga("send", "pageview", path + "?q=" + this.value)
}
})
}
})
</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="black" data-md-color-accent="orange">
<script>function __prefix(e){return new URL("../..",location).pathname+"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}</script>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#graphical-model-editor-development-with-eugeniagmf" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Epsilon" class="md-header__button md-logo" aria-label="Epsilon" data-md-component="logo">
<img src="../../assets/images/epsilon-white-background.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Epsilon
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Eugenia
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</label>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
</div>
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Epsilon" class="md-nav__button md-logo" aria-label="Epsilon" data-md-component="logo">
<img src="../../assets/images/epsilon-white-background.png" alt="logo">
</a>
Epsilon
</label>
<div class="md-nav__source">
<a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
</div>
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item">
<a href="../../download/" class="md-nav__link">
Download
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../live" class="md-nav__link">
Playground
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5">
Documentation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Documentation" data-md-level="1">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../emc/" class="md-nav__link">
Model Connectivity
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_3" type="checkbox" id="__nav_5_3" >
<label class="md-nav__link" for="__nav_5_3">
Languages
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Languages" data-md-level="2">
<label class="md-nav__title" for="__nav_5_3">
<span class="md-nav__icon md-icon"></span>
Languages
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../eol/" class="md-nav__link">
Object Language (EOL)
</a>
</li>
<li class="md-nav__item">
<a href="../egl/" class="md-nav__link">
Code Generation (EGL)
</a>
</li>
<li class="md-nav__item">
<a href="../evl/" class="md-nav__link">
Model Validation (EVL)
</a>
</li>
<li class="md-nav__item">
<a href="../etl/" class="md-nav__link">
Model Transformation (ETL)
</a>
</li>
<li class="md-nav__item">
<a href="../ecl/" class="md-nav__link">
Model Comparison (ECL)
</a>
</li>
<li class="md-nav__item">
<a href="../eml/" class="md-nav__link">
Model Merging (EML)
</a>
</li>
<li class="md-nav__item">
<a href="../epl/" class="md-nav__link">
Pattern Matching (EPL)
</a>
</li>
<li class="md-nav__item">
<a href="../flock/" class="md-nav__link">
Model Migration (Flock)
</a>
</li>
<li class="md-nav__item">
<a href="../emg/" class="md-nav__link">
Model Generation (EMG)
</a>
</li>
<li class="md-nav__item">
<a href="../eunit/" class="md-nav__link">
Unit Testing (EUnit)
</a>
</li>
<li class="md-nav__item">
<a href="../pinset/" class="md-nav__link">
Dataset Extraction (Pinset)
</a>
</li>
<li class="md-nav__item">
<a href="../ewl/" class="md-nav__link">
Wizard Language (EWL)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_4" type="checkbox" id="__nav_5_4" checked>
<label class="md-nav__link" for="__nav_5_4">
Tools
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Tools" data-md-level="2">
<label class="md-nav__title" for="__nav_5_4">
<span class="md-nav__icon md-icon"></span>
Tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../picto/" class="md-nav__link">
Picto
</a>
</li>
<li class="md-nav__item">
<a href="../flexmi/" class="md-nav__link">
Flexmi
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Eugenia
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Eugenia
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-filesystem-metamodel" class="md-nav__link">
The Filesystem metamodel
</a>
</li>
<li class="md-nav__item">
<a href="#the-generated-editor" class="md-nav__link">
The generated editor
</a>
</li>
<li class="md-nav__item">
<a href="#supported-annotations" class="md-nav__link">
Supported Annotations
</a>
<nav class="md-nav" aria-label="Supported Annotations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#gmf" class="md-nav__link">
gmf
</a>
</li>
<li class="md-nav__item">
<a href="#gmfdiagram" class="md-nav__link">
gmf.diagram
</a>
</li>
<li class="md-nav__item">
<a href="#gmfnode" class="md-nav__link">
gmf.node
</a>
</li>
<li class="md-nav__item">
<a href="#gmflink" class="md-nav__link">
gmf.link
</a>
</li>
<li class="md-nav__item">
<a href="#gmflink-for-eclass" class="md-nav__link">
gmf.link (for EClass)
</a>
</li>
<li class="md-nav__item">
<a href="#gmflink-for-non-containment-ereference" class="md-nav__link">
gmf.link (for non-containment EReference)
</a>
</li>
<li class="md-nav__item">
<a href="#gmfcompartment-for-containment-ereference" class="md-nav__link">
gmf.compartment (for containment EReference)
</a>
</li>
<li class="md-nav__item">
<a href="#gmfaffixed-for-containment-ereference" class="md-nav__link">
gmf.affixed (for containment EReference)
</a>
</li>
<li class="md-nav__item">
<a href="#gmflabel-for-eattribute" class="md-nav__link">
gmf.label (for EAttribute)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#running-eugenia" class="md-nav__link">
Running Eugenia
</a>
</li>
<li class="md-nav__item">
<a href="#re-running-eugenia" class="md-nav__link">
Re-running Eugenia
</a>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
Troubleshooting
</a>
</li>
<li class="md-nav__item">
<a href="#recipes" class="md-nav__link">
Recipes
</a>
</li>
<li class="md-nav__item">
<a href="#customizing-your-editor" class="md-nav__link">
Customizing your editor
</a>
</li>
<li class="md-nav__item">
<a href="#adding-copyright" class="md-nav__link">
Adding Copyright
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
Next Steps
</a>
</li>
<li class="md-nav__item">
<a href="#eugenia-and-gmf-tooling" class="md-nav__link">
Eugenia and GMF Tooling
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../exeed/" class="md-nav__link">
Exeed
</a>
</li>
<li class="md-nav__item">
<a href="../modelink/" class="md-nav__link">
Modelink
</a>
</li>
<li class="md-nav__item">
<a href="../hutn/" class="md-nav__link">
HUTN
</a>
</li>
<li class="md-nav__item">
<a href="../workflow/" class="md-nav__link">
Workflow (Ant tasks)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../articles/" class="md-nav__link">
Articles
</a>
</li>
<li class="md-nav__item">
<a href="../../examples/" class="md-nav__link">
Examples
</a>
</li>
<li class="md-nav__item">
<a href="https://www.youtube.com/epsilondevs" class="md-nav__link">
Screencasts
</a>
</li>
<li class="md-nav__item">
<a href="https://www.youtube.com/playlist?list=PLRwHao6Ue0YUecg7vEUQTrtySIWwrd_mI" class="md-nav__link">
Lectures
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_9" type="checkbox" id="__nav_5_9" >
<label class="md-nav__link" for="__nav_5_9">
Javadoc
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Javadoc" data-md-level="2">
<label class="md-nav__title" for="__nav_5_9">
<span class="md-nav__icon md-icon"></span>
Javadoc
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://download.eclipse.org/epsilon/stable-javadoc/" class="md-nav__link">
Stable
</a>
</li>
<li class="md-nav__item">
<a href="https://download.eclipse.org/epsilon/interim-javadoc/" class="md-nav__link">
Interim
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6">
Issues
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Issues" data-md-level="1">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Issues
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=epsilon" class="md-nav__link">
Report a new issue
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?product=epsilon&cmdtype=doit&order=Reuse+same+sort+as+last+time&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=blocker&bug_severity=critical&bug_severity=major&bug_severity=normal&bug_severity=minor&bug_severity=trivial" class="md-nav__link">
View open bugs
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?product=epsilon&cmdtype=doit&order=Reuse+same+sort+as+last+time&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=enhancement" class="md-nav__link">
View enhancement requests
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&list_id=17694438&product=epsilon&query_format=advanced" class="md-nav__link">
View issues resolved since the last stable release
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?product=epsilon&cmdtype=doit&order=Reuse+same+sort+as+last+time" class="md-nav__link">
View all issues
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7">
Community
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Community" data-md-level="1">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Community
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
<label class="md-nav__link" for="__nav_7_1">
Who is using Epsilon?
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Who is using Epsilon?" data-md-level="2">
<label class="md-nav__title" for="__nav_7_1">
<span class="md-nav__icon md-icon"></span>
Who is using Epsilon?
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../users/" class="md-nav__link">
Industry
</a>
</li>
<li class="md-nav__item">
<a href="../../users/education/" class="md-nav__link">
Education
</a>
</li>
<li class="md-nav__item">
<a href="../../users/open-source/" class="md-nav__link">
Open-source Projects
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="https://projects.eclipse.org/projects/modeling.epsilon/who" class="md-nav__link">
Who is developing Epsilon?
</a>
</li>
<li class="md-nav__item">
<a href="https://www.eclipse.org/forums/index.php/f/22/" class="md-nav__link">
Forum
</a>
</li>
<li class="md-nav__item">
<a href="../../professional-services" class="md-nav__link">
Professional Services
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_5" type="checkbox" id="__nav_7_5" >
<label class="md-nav__link" for="__nav_7_5">
Social Media
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Social Media" data-md-level="2">
<label class="md-nav__title" for="__nav_7_5">
<span class="md-nav__icon md-icon"></span>
Social Media
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://twitter.com/eclipseepsilon" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="https://youtube.com/epsilondevs" class="md-nav__link">
YouTube
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../labs/" class="md-nav__link">
Epsilon Labs
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" class="md-nav__link">
Frequently Asked Questions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../branding/" class="md-nav__link">
Branding
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-filesystem-metamodel" class="md-nav__link">
The Filesystem metamodel
</a>
</li>
<li class="md-nav__item">
<a href="#the-generated-editor" class="md-nav__link">
The generated editor
</a>
</li>
<li class="md-nav__item">
<a href="#supported-annotations" class="md-nav__link">
Supported Annotations
</a>
<nav class="md-nav" aria-label="Supported Annotations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#gmf" class="md-nav__link">
gmf
</a>
</li>
<li class="md-nav__item">
<a href="#gmfdiagram" class="md-nav__link">
gmf.diagram
</a>
</li>
<li class="md-nav__item">
<a href="#gmfnode" class="md-nav__link">
gmf.node
</a>
</li>
<li class="md-nav__item">
<a href="#gmflink" class="md-nav__link">
gmf.link
</a>
</li>
<li class="md-nav__item">
<a href="#gmflink-for-eclass" class="md-nav__link">
gmf.link (for EClass)
</a>
</li>
<li class="md-nav__item">
<a href="#gmflink-for-non-containment-ereference" class="md-nav__link">
gmf.link (for non-containment EReference)
</a>
</li>
<li class="md-nav__item">
<a href="#gmfcompartment-for-containment-ereference" class="md-nav__link">
gmf.compartment (for containment EReference)
</a>
</li>
<li class="md-nav__item">
<a href="#gmfaffixed-for-containment-ereference" class="md-nav__link">
gmf.affixed (for containment EReference)
</a>
</li>
<li class="md-nav__item">
<a href="#gmflabel-for-eattribute" class="md-nav__link">
gmf.label (for EAttribute)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#running-eugenia" class="md-nav__link">
Running Eugenia
</a>
</li>
<li class="md-nav__item">
<a href="#re-running-eugenia" class="md-nav__link">
Re-running Eugenia
</a>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
Troubleshooting
</a>
</li>
<li class="md-nav__item">
<a href="#recipes" class="md-nav__link">
Recipes
</a>
</li>
<li class="md-nav__item">
<a href="#customizing-your-editor" class="md-nav__link">
Customizing your editor
</a>
</li>
<li class="md-nav__item">
<a href="#adding-copyright" class="md-nav__link">
Adding Copyright
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
Next Steps
</a>
</li>
<li class="md-nav__item">
<a href="#eugenia-and-gmf-tooling" class="md-nav__link">
Eugenia and GMF Tooling
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="graphical-model-editor-development-with-eugeniagmf">Graphical Model Editor development with Eugenia/GMF<a class="headerlink" href="#graphical-model-editor-development-with-eugeniagmf" title="Permanent link">&para;</a></h1>
<p>Eugenia is a tool that simplifies the development of GMF-based graphical model editors by automatically generating the <code>.gmfgraph</code>, <code>.gmftool</code> and <code>.gmfmap</code> models needed by GMF editor from a single annotated Ecore metamodel. For example, from the following annotated EMF metamodel (expressed using Emfatic; an Ecore version is available <a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/tree/examples/org.eclipse.epsilon.eugenia.examples.filesystem/model/filesystem.ecore">here</a>) it can generate a fully functional GMF editor, a screenshot of which is displayed below.</p>
<h2 id="the-filesystem-metamodel">The Filesystem metamodel<a class="headerlink" href="#the-filesystem-metamodel" title="Permanent link">&para;</a></h2>
<pre class="prettyprint lang-emf"><code>@namespace(uri="filesystem", prefix="filesystem")
@gmf
package filesystem;
@gmf.diagram
class Filesystem {
val Drive[*] drives;
val Sync[*] syncs;
}
class Drive extends Folder {
}
class Folder extends File {
@gmf.compartment
val File[*] contents;
}
class Shortcut extends File {
@gmf.link(target.decoration="arrow", style="dash")
ref File target;
}
@gmf.link(source="source", target="target", style="dot", width="2")
class Sync {
ref File source;
ref File target;
}
@gmf.node(label = "name")
class File {
attr String name;
}</code></pre>
<h2 id="the-generated-editor">The generated editor<a class="headerlink" href="#the-generated-editor" title="Permanent link">&para;</a></h2>
<p><img alt="" src="Filesystemscreenshot2.png" /></p>
<h2 id="supported-annotations">Supported Annotations<a class="headerlink" href="#supported-annotations" title="Permanent link">&para;</a></h2>
<p>Eugenia supports the following annotations on Ecore elements.</p>
<h3 id="gmf">gmf<a class="headerlink" href="#gmf" title="Permanent link">&para;</a></h3>
<p>Applies to the top <code>EPackage</code> only and denotes that GMF-related annotations are expected in its elements. This doesn't affect the forthcoming model transformations, only the Ecore validation process.</p>
<h3 id="gmfdiagram">gmf.diagram<a class="headerlink" href="#gmfdiagram" title="Permanent link">&para;</a></h3>
<p>Denotes the root object of the metamodel. Only one (non-abstract) <code>EClass</code> must be annotated as <code>gmf.diagram</code>. Accepts the following details:</p>
<ul>
<li><code>diagram.extension</code> (optional) : the file extension for the diagram file</li>
<li><code>model.extension</code> (optional) : the file extension for the domain model. To make the generated tree-based editor work with the same extension, you need to add an <code>@emf.gen(fileExtensions="model-file-extension")</code> annotation <code>to the root package</code> of your metamodel.</li>
<li><code>onefile</code> (optional) : a value of <code>true</code> specifies that the domain model and the diagram should be stored in the same file</li>
<li><code>rcp</code> (optional) : a value of <code>true</code> specifies that the editor is intended to be part of a RCP product (printing is disabled)</li>
<li><code>units</code> (optional) : the units for the diagram (e.g. <code>Pixels</code>)</li>
</ul>
<h3 id="gmfnode">gmf.node<a class="headerlink" href="#gmfnode" title="Permanent link">&para;</a></h3>
<p>Applies to an <code>EClass</code> and denotes that it should appear on the diagram as a node. Accepts the following details:</p>
<ul>
<li><code>border.color</code> (optional) : an RGB color that will be set as the node's border color.</li>
<li><code>border.style</code> (optional) : the style of the node's border. Can be set to <code>solid</code> (default), <code>dash</code> or <code>dot</code>.</li>
<li><code>border.width</code> (optional) : an integer that specifies the width of the node's border.</li>
<li><code>color</code> (optional) : an RGB color that will be set as the node's background color (e.g. <code>255,0,0</code>).</li>
<li><code>figure</code> (optional) : the figure that will represent the node. Can be set to <code>rectangle</code>, <code>ellipse</code>, <code>rounded</code> (default), <code>svg</code> (see <code>svg.uri</code>), <code>polygon</code> (see <code>polygon.x</code> and <code>polygon.y</code>) or the fully qualified name of a Java class that implements Figure.</li>
<li><code>label</code>: the name(s) of the <code>EAttribute</code>(s) of the <code>EClass</code>, the value(s) of which will be displayed as the label of the node. If <code>label.placement</code> is set to <code>none</code>, this detail is not required.</li>
<li><code>label.color</code> (optional, since 1.5.0) : an RGB color that will be set as the node's foreground color. Labels will have a fixed font of this color.</li>
<li><code>label.icon</code> (optional) : if set to <code>true</code> (default) a small icon appears on the left of the label.</li>
<li><code>label.parser</code> (optional) : indicates the unqualified name of the class that will parse the text entered by the user into the label. By default, a <a href="http://download.oracle.com/javase/6/docs/api/java/text/MessageFormat.html">MessageFormat</a>-based parser is generated, but it can be manually customized after generation.</li>
<li><code>label.edit.pattern</code> (optional) : like <code>label.pattern</code>, but only for editing the label.</li>
<li><code>label.pattern</code> (optional) : if more than one attributes are specified in the label, the format detail is necessary to show how their values will be rendered in the label. The format follows the Java Message Format style (e.g. <code>{0} : {1}</code>). The same pattern is used for editing and viewing the label.</li>
<li><code>label.view.pattern</code> (optional) : like <code>label.pattern</code>, but only for viewing the label.</li>
<li><code>label.placement</code> (optional) : defines the placement of the label in relation to the node. Can be set to <code>internal</code>, <code>external</code> or <code>none</code> (no label will be shown). ''(The default distance of an external label in GMF is 20pt which is a bit too far away for my taste. <a href="../articles/eugenia-affixed-nodes">Read more</a> about fixing this without changing the generated code every time)''.</li>
<li><code>label.text</code> (optional) : defines the default text to be used when the <code>EAttribute</code>(s) in <code>label</code> are not set. By default, it is set to the name of the <code>EClass</code>.</li>
<li><code>label.readOnly</code> (optional) : a value of <code>true</code> denotes that the label cannot be changed in the generated diagram editor.</li>
<li><code>margin</code> (optional) : inset margin (5 units by default) for the node.</li>
<li><code>phantom</code> (optional) : defines if the node is phantom (<code>true</code>/<code>false</code>). Phantom nodes are particularly useful in order to visualize containment references using links instead of spatial containment (<a href="../articles/eugenia-phantom-nodes">read more...</a>).</li>
<li><code>polygon.x</code> (when <code>figure</code> is set to <code>polygon</code>) : list of space-separated integers with the X coordinates of the polygon used as figure.</li>
<li><code>polygon.y</code> (when <code>figure</code> is set to <code>polygon</code>) : list of space-separated integers with the Y coordinates of the polygon used as figure.</li>
<li><code>resizable</code> (optional) : a value of <code>false</code> disables all the resize handles for the node</li>
<li><code>size</code> (optional) : a GMF dimension that will be used as the node's preferred size (e.g. <code>10,5</code>). Width is specified before height.</li>
<li><code>svg.uri</code> (when <code>figure</code> is set to <code>svg</code>) : URI of the <code>.svg</code> file to be used as figure for the node. For instance, <code>platform:/plugin/my.plugin/my.svg</code> will access the <code>my.svg</code> file in the <code>my.plugin</code> plugin. Note: until Kepler, using SVG figures required the GMF Tooling Experimental SDK (available from <a href="http://download.eclipse.org/modeling/gmp/gmf-tooling/updates/releases/">this update site</a>). Remember to add the <code>.svg</code> file to the binary builds of your plugin.</li>
<li><code>tool.description</code> (optional) : the description of the creation tool.</li>
<li><code>tool.large.bundle</code> (optional) : the bundle of the large icon of the creation tool.</li>
<li><code>tool.large.path</code> (optional) : the path of the large icon of the creation tool.</li>
<li><code>tool.name</code> (optional) : the name of the creation tool.</li>
<li><code>tool.small.bundle</code> (optional) : the bundle of the small icon of the creation tool.</li>
<li><code>tool.small.path</code> (optional) : the path of the small icon of the creation tool.</li>
</ul>
<h3 id="gmflink">gmf.link<a class="headerlink" href="#gmflink" title="Permanent link">&para;</a></h3>
<p>Applies to <code>EClass</code>es that should appear on the diagram as links and to non-containment <code>EReference</code>s.</p>
<h3 id="gmflink-for-eclass">gmf.link (for EClass)<a class="headerlink" href="#gmflink-for-eclass" title="Permanent link">&para;</a></h3>
<p>It accepts the following details:</p>
<ul>
<li><code>color</code> (optional) : the RGB color of the link.</li>
<li><code>incoming</code> (optional) : Boolean value which specifies whether the generated editor should allow links to be created from target to source. Defaults to <code>false</code>.</li>
<li><code>label</code> (optional) : the names of the <code>EAttribute</code>s of the <code>EClass</code> the value of which will be displayed as the label of the link.</li>
<li><code>label.parser</code> (optional) : indicates the unqualified name of the class that will parse the text entered by the user into the label. By default, a <a href="http://download.oracle.com/javase/6/docs/api/java/text/MessageFormat.html">MessageFormat</a>-based parser is generated, but it can be manually customized after generation.</li>
</ul>
<!--* `label.text` (optional) : defines the default text to be used when the `EAttribute`(s) in `label` are not set. By default, it is set to the name of the `EClass`.-->
<ul>
<li><code>source</code> : the source non-containment <code>EReference</code> of the link.</li>
<li><code>source.constraint</code> (optional) : OCL assertion that should be checked by the graphical editor when creating a link. For instance, <code>self &lt;&gt; oppositeEnd</code> would forbid users for creating a link from a node to itself (a self-loop): <code>self</code> is the source of the link, and <code>oppositeEnd</code> is the target of the link.</li>
<li><code>source.decoration</code> (optional) : the decoration of the source end of the link. Can be set to <code>none</code>, <code>arrow</code>, <code>rhomb</code>, <code>filledrhomb</code>, <code>square</code>, <code>filledsquare</code>, <code>closedarrow</code>, <code>filledclosedarrow</code>, or the fully qualified name of a Java class that implements the <code>org.eclipse.draw2d.RotatableDecoration</code> interface</li>
<li><code>style</code> (optional) : the style of the link (see <code>border.style</code> above).</li>
<li><code>target</code> : the target non-containment <code>EReference</code> of the link.</li>
<li><code>target.constraint</code> (optional) : OCL assertion that should be checked by the graphical editor when creating a link. For instance, <code>self &lt;&gt; oppositeEnd</code> would forbid users for creating a link from a node to itself (a self-loop): <code>self</code> is the target of the link, and <code>oppositeEnd</code> is the source of the link.</li>
<li><code>target.decoration</code> (optional) : See <code>source.decoration</code>.</li>
<li><code>tool.description</code> (optional) : the description of the creation tool.</li>
<li><code>tool.large.bundle</code> (optional) : the bundle of the large icon of the creation tool.</li>
<li><code>tool.large.path</code> (optional) : the path of the large icon of the creation tool.</li>
<li><code>tool.name</code> (optional) : the name of the creation tool.</li>
<li><code>tool.small.bundle</code> (optional) : the bundle of the small icon of the creation tool.</li>
<li><code>tool.small.path</code> (optional) : the path of the small icon of the creation tool.</li>
<li><code>width</code> (optional) : the width of the link.</li>
</ul>
<p>For an example see the <code>Sync</code> class in the <code>filesystem</code> metamodel</p>
<h3 id="gmflink-for-non-containment-ereference">gmf.link (for non-containment EReference)<a class="headerlink" href="#gmflink-for-non-containment-ereference" title="Permanent link">&para;</a></h3>
<p>It accepts the following details:</p>
<ul>
<li><code>color</code> (optional) : the RGB color of the link</li>
<li><code>label</code> (optional) : The static text that will be displayed as the label of the link. If no label is specified, the name of the reference is displayed instead.</li>
<li><code>label.text</code> (optional) : equivalent to <code>label</code> in this case.</li>
<li><code>source.decoration</code> (optional) : The decoration of the source end of the link. Can be set to <code>none</code>, <code>arrow</code>, <code>rhomb</code>, <code>filledrhomb</code>, <code>square</code>, <code>filledsquare</code>, <code>closedarrow</code>, <code>filledclosedarrow</code>, or the fully qualified name of a Java class that implements an appropriate interface</li>
<li><code>style</code> (optional) : the style of the link (see <code>border.style</code> above)</li>
<li><code>target.decoration</code> (optional) : As above.</li>
<li><code>tool.description</code> (optional) : the description of the creation tool</li>
<li><code>tool.large.bundle</code> (optional) : The bundle of the large icon of the creation tool</li>
<li><code>tool.large.path</code> (optional) : The path of the large icon of the creation tool</li>
<li><code>tool.name</code> (optional) : the name of the creation tool</li>
<li><code>tool.small.bundle</code> (optional) : The bundle of the small icon of the creation tool</li>
<li><code>tool.small.path</code> (optional) : The path of the small icon of the creation tool</li>
<li><code>width</code> (optional) : the width of the link</li>
</ul>
<h3 id="gmfcompartment-for-containment-ereference">gmf.compartment (for containment EReference)<a class="headerlink" href="#gmfcompartment-for-containment-ereference" title="Permanent link">&para;</a></h3>
<p>Defines that the containment reference will create a compartment where model elements that conform to the type of the reference can be placed. It accepts the following details:</p>
<ul>
<li><code>collapsible</code> (optional) : Set to <code>false</code> to prevent the compartment from collapsing (default is <code>true</code>)</li>
<li><code>layout</code> (optional) : The layout of the compartment. Can be set to free (default) or list</li>
</ul>
<h3 id="gmfaffixed-for-containment-ereference">gmf.affixed (for containment EReference)<a class="headerlink" href="#gmfaffixed-for-containment-ereference" title="Permanent link">&para;</a></h3>
<p>Defines that the containment reference will create nodes which are affixed to the edges of the containing node. <a href="../articles/eugenia-affixed-nodes">See an example</a>.</p>
<h3 id="gmflabel-for-eattribute">gmf.label (for EAttribute)<a class="headerlink" href="#gmflabel-for-eattribute" title="Permanent link">&para;</a></h3>
<p>Defines additional labels for the containing <code>EClass</code>. These labels will be displayed underneath the default label for the containing <code>EClass</code>. It accepts the following details:</p>
<ul>
<li><code>label.edit.pattern</code> (optional) : like <code>label.pattern</code>, but only for editing the label.</li>
<li><code>label.parser</code> (optional) : indicates the unqualified name of the class that will parse the text entered by the user into the label. By default, a <a href="http://download.oracle.com/javase/6/docs/api/java/text/MessageFormat.html">MessageFormat</a>-based parser is generated, but it can be manually customized after generation.</li>
<li><code>label.pattern</code> (optional) : if more than one attributes are specified in the label, the format detail is necessary to show how their values will be rendered in the label. The format follows the Java Message Format style (e.g. <code>{0} : {1}</code>). The same pattern is used for editing and viewing the label.</li>
<li><code>label.readOnly</code> (optional) : A value of <code>true</code> denotes that the label cannot be changed in the generated diagram editor.</li>
<li><code>label.text</code> (optional) : defines the default text to be used when the attribute is not set.</li>
<li><code>label.view.pattern</code> (optional) : like <code>label.pattern</code>, but only for viewing the label.</li>
</ul>
<p>==Installing Eugenia ''(New Instructions!)''==
Eugenia is a part of the main Epsilon distribution. The update site of Epsilon is <code>http://download.eclipse.org/epsilon/updates</code>, and detailed instructions for installing it are available <a href="http://www.eclipse.org/gmt/epsilon/download">here</a>.</p>
<p>Although not necessary, you should also install the Emfatic toolkit mentioned above through the following update site: <code>http://download.eclipse.org/emfatic/update/</code></p>
<h2 id="running-eugenia">Running Eugenia<a class="headerlink" href="#running-eugenia" title="Permanent link">&para;</a></h2>
<p>To run Eugenia you need to do the following:</p>
<ul>
<li>Create a new general project</li>
<li>Create and annotate your Emfatic (or Ecore) metamodel in the root of your project</li>
<li>Right-click your Emfatic (or Ecore) metamodel and select Eugenia-&gt;Generate GMF editor</li>
<li>Launch a new Eclipse instance from the <code>Run</code> &rarr; <code>Eclipse Application</code> right-click menu of the project that contains your metamodel</li>
<li>In the new Eclipse instance create a new General Project and in it create a new Filesystem diagram through the <code>File</code> &rarr; <code>New</code> &rarr; <code>Other...</code> dialog</li>
</ul>
<h2 id="re-running-eugenia">Re-running Eugenia<a class="headerlink" href="#re-running-eugenia" title="Permanent link">&para;</a></h2>
<p>If you now change your metamodel you'll have to rerun Eugenia to generate your updated editor:</p>
<ul>
<li>Right-click your Ecore metamodel (or Emfatic file) and select <code>Eugenia</code> &rarr; <code>Generate GMF editor</code></li>
<li>Run a new instance of Eclipse</li>
</ul>
<p>(Please note that any changes you have made manually to the editor's <code>.gmfgraph</code>, <code>.gmftool</code> and <code>.gmfmap</code> models will be <strong>overwritten</strong>. Have a look <a href="../articles/eugenia-polishing">here</a> for an alternative way to customize these models)</p>
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<ul>
<li>Certain versions of Emfatic do not support annotations without details (e.g. <code>@gmf</code> or <code>@gmf.diagram</code>). You can use dummy details as a workaround (e.g. <code>@gmf(foo="bar")</code>)</li>
<li>Should you run across the "Node is referenced from multiple containers with different 'List Layout' values" message during validation please ignore it and proceed with the editor code generation.</li>
<li>Eugenia does not work with Ecore metamodels that span across multiple files/sub-packages</li>
<li>Ensure that the name of your package is different to the names of the classes it contains (i.e. a package Foo should not contain a Foo class)</li>
</ul>
<h2 id="recipes">Recipes<a class="headerlink" href="#recipes" title="Permanent link">&para;</a></h2>
<ul>
<li><a href="../articles/eugenia-nodes-with-images">Nodes with user defined images</a> (e.g. jpg, png, gif)</li>
<li><a href="../articles/eugenia-nodes-with-runtime-images">Nodes with user defined images at runtime</a></li>
</ul>
<h2 id="customizing-your-editor">Customizing your editor<a class="headerlink" href="#customizing-your-editor" title="Permanent link">&para;</a></h2>
<p><a href="../articles/eugenia-polishing">Click here</a> to find out how you can further customize the generated <code>.gmfgraph</code>, <code>.gmfmap</code> and <code>.gmftool</code> models in ways that are not supported by the annotations provided by Eugenia, and still preserve the customizations when Eugenia is re-invoked.</p>
<h2 id="adding-copyright">Adding Copyright<a class="headerlink" href="#adding-copyright" title="Permanent link">&para;</a></h2>
<p>To add copyright information to your generated .gmfgen model, simply create a file named copyright.txt next to it. Next time you invoke <code>Eugenia</code> &rarr; <code>Synchronize GMF gen model</code>, Eugenia will pick it up and place its contents in the root GenDiagramEditor of your .gmfgen model. If you have added the copyright.txt file, you can also inject its contents to your .genmodel model (EMF generator model) by right-clicking it and invoking <code>Eugenia</code> &rarr; <code>Synchronize EMF gen model</code>.</p>
<h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
<p>Now that you've learned how to generate a GMF-based editor using Eugenia, you may also want to add some constraints to your editor, which you can then evaluate (explicitly or on-save) to <a href="../articles/evl-gmf-integration">check the correctness/consistency of your models</a>:</p>
<p><img alt="" src="Filesystemwitherrorshighlighted.png" /></p>
<h2 id="eugenia-and-gmf-tooling">Eugenia and GMF Tooling<a class="headerlink" href="#eugenia-and-gmf-tooling" title="Permanent link">&para;</a></h2>
<p>Eugenia builds on top of the <a href="https://www.eclipse.org/gmf-tooling/">GMF Tooling</a> framework, which is no longer actively maintained. While you can still use Eugenia/GMF to develop fully-functional editors, you may want to consider more actively-maintained tools such as <a href="https://eclipse.org/sirius">Eclipse Sirius</a> if you need to develop a graphical editor, or <a href="../picto">Picto</a> if you are only interested in producing read-only views from models.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../flexmi/" title="Flexmi" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Flexmi
</span>
</div>
</a>
<a href="../exeed/" title="Exeed" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Exeed
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright © Eclipse Foundation, Inc. All Rights Reserved.
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs</a>
</div>
<div class="md-footer-copyright epsilon-eclipse-links">
<ul>
<li><a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
</ul>
</div>
<div class="md-footer-social">
<a href="https://twitter.com/eclipseepsilon" target="_blank" rel="noopener" title="twitter.com" class="md-footer-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
</a>
<a href="https://youtube.com/epsilondevs" target="_blank" rel="noopener" title="youtube.com" class="md-footer-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../assets/javascripts/workers/search.d351de03.min.js", "version": null}</script>
<script src="../../assets/javascripts/bundle.a1609d9a.min.js"></script>
<script src="https://unpkg.com/mermaid@8.5.1/dist/mermaid.min.js"></script>
<script src="../../assets/javascript/mermaid.js"></script>
<script src="../../assets/javascript/jquery.js"></script>
<script src="../../assets/javascript/slick.min.js"></script>
<script src="../../assets/javascript/google-code-prettify/prettify.js"></script>
<script src="../../assets/javascript/google-code-prettify/lang-emfatic.js"></script>
<script src="../../assets/javascript/google-code-prettify/lang-epsilon.js"></script>
<script src="../../assets/javascript/google-code-prettify/prettyprint.js"></script>
<script src="../../assets/javascript/extra.js"></script>
<script src="https://w.appzi.io/w.js?token=jlv6W"></script>
</body>
</html>