Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLorenzo Bettini2016-03-21 20:15:30 +0000
committerLorenzo Bettini2016-03-21 20:16:53 +0000
commit3fd892727ded71ed3f73a75975b6c85132cafca8 (patch)
treea7e412b9938e81dcce5da41fa272aadadfdf488a
parent844aa45625dbc3ca6a009fe63e448b70c3f97c40 (diff)
downloadorg.eclipse.emf-parsley-3fd892727ded71ed3f73a75975b6c85132cafca8.tar.gz
org.eclipse.emf-parsley-3fd892727ded71ed3f73a75975b6c85132cafca8.tar.xz
org.eclipse.emf-parsley-3fd892727ded71ed3f73a75975b6c85132cafca8.zip
Fixed generated documentation inclusion and ignore
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/.gitignore2
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/contents/.gitignore4
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources.html15
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources_1.html64
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/contents/toc.xml5
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/website/.gitignore2
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/website/_index.html13
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/website/include.php22
-rw-r--r--doc/org.eclipse.emf.parsley.dev.doc/website/index.php70
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/.gitignore6
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/documentation.html3877
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/download.html399
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/index.html364
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/sources.html386
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/support.html383
-rw-r--r--doc/org.eclipse.emf.parsley.doc.websitegen/website/userReviews.html367
16 files changed, 14 insertions, 5965 deletions
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/.gitignore b/doc/org.eclipse.emf.parsley.dev.doc/.gitignore
new file mode 100644
index 000000000..7f175412f
--- /dev/null
+++ b/doc/org.eclipse.emf.parsley.dev.doc/.gitignore
@@ -0,0 +1,2 @@
+manual
+/images
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/contents/.gitignore b/doc/org.eclipse.emf.parsley.dev.doc/contents/.gitignore
new file mode 100644
index 000000000..d265afd7b
--- /dev/null
+++ b/doc/org.eclipse.emf.parsley.dev.doc/contents/.gitignore
@@ -0,0 +1,4 @@
+*
+!.gitignore
+!book.css
+!code.css
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources.html b/doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources.html
deleted file mode 100644
index 9c3bd2bcd..000000000
--- a/doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >
-<title>Emf Parsley Sources</title>
-
-<link href="book.css" rel="stylesheet" type="text/css">
-<link href="code.css" rel="stylesheet" type="text/css">
-<link rel="home" href="GettingSources.html" title="">
-</head>
-<body>
-<h1>Emf Parsley Sources</h1>
-<ol><li><a href="GettingSources_1.html#GettingSources">Getting Sources</a>
-</li>
-</ol></body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources_1.html b/doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources_1.html
deleted file mode 100644
index b2da68bc7..000000000
--- a/doc/org.eclipse.emf.parsley.dev.doc/contents/GettingSources_1.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >
-<title>Getting Sources</title>
-
-<link href="book.css" rel="stylesheet" type="text/css">
-<link href="code.css" rel="stylesheet" type="text/css">
-<link rel="home" href="GettingSources.html" title="">
-</head>
-<body>
-<a name="GettingSources"></a>
-<h1>Getting Sources</h1>
-<p>
-If you want to get the sources of EMF Parsley,
-for instance, to contribute new features and patches, you can get them
-via Git and setup the workspace manually. However, we strongly reccomend to
-use the automatic procedure detailed below.
-</p>
-<p>
-If you want to develop also the <a href="http://eclipse.org/rap/">RAP</a>
-version of Emf Parsley, you will need a different workspace (and a different target platform).
-</p>
-<p>
-We use <a href="https://wiki.eclipse.org/Eclipse_Oomph_Installer">Oomph</a> for provisioning
-a full Eclipse IDE and workspace setup for Parsley.
-</p>
-<p>
-<ul>
- <li>
- Download and start Oomph: <a href="https://wiki.eclipse.org/Eclipse_Oomph_Installer">https://wiki.eclipse.org/Eclipse_Oomph_Installer</a>
- </li>
- <li>
- On the initial page, click on the Switch to advanced mode button in the top right
- </li>
- <li>
- On the Product page, select Eclipse IDE for Eclipse Committers.
- </li>
- <li>
- On the Projects page, expand the "EMF Parsley" node.
- </li>
- <li>
- either double-click on "RCP" or "RAP" for setting up the workspace for either the RCP version of
- Parsley or the RAP version (it is likely that you choose the former).
- </li>
- <li>
- Choose your preferred installation settings on the Variables page:
- If you plan to contribute patches using Gerrit, check "Show all variables"
- and make sure you select ("SSH (read-write Gerrit)") in the Git or Gerrit repository
- </li>
- <li>
- Then specify your Bugzilla/Hudson password and Git/Gerrit user ID
- (you can also specify the password and check that your credential are correct using the "Authenticate..." button).
- </li>
-</ul>
-</p>
-<p>
-Press next and finish.
-This will first create an Eclipse installation with all the needed plug-ins for developing EMF Parsley
-and then will start the new installed Eclipse (press Finish to close the first installation dialog).
-The new installed Eclipse will automatically setup the workspace and you will have to wait for this procedure
-to end (you can click on the animated arrow icon on the status bar to show the progress).
-</p>
-</body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/contents/toc.xml b/doc/org.eclipse.emf.parsley.dev.doc/contents/toc.xml
deleted file mode 100644
index fc3721bb9..000000000
--- a/doc/org.eclipse.emf.parsley.dev.doc/contents/toc.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<toc topic="contents/GettingSources.html" label="Emf Parsley Sources" >
- <topic href="contents/GettingSources_1.html#GettingSources" label="Getting Sources" >
- </topic>
-</toc>
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/website/.gitignore b/doc/org.eclipse.emf.parsley.dev.doc/website/.gitignore
new file mode 100644
index 000000000..d6b7ef32c
--- /dev/null
+++ b/doc/org.eclipse.emf.parsley.dev.doc/website/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/website/_index.html b/doc/org.eclipse.emf.parsley.dev.doc/website/_index.html
deleted file mode 100644
index d4961dd08..000000000
--- a/doc/org.eclipse.emf.parsley.dev.doc/website/_index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<br style="clear:both;height:1em;">
-<div id="leftcol">
-<div class="nav-logo">
- <a href="index.php"><img src="logo.png" style="margin-left:10px; width:155px"/></a>
-</div>
-<ul id="leftnav">
-<li class="separator"><div class="separator">
-<img src="triangle.gif" style="height:12px; margin-right: 2px; display:none" /><img src="triangle-90.gif" style="display:none; margin-right: 2px" height="12px" />
-<a href="GettingSources_1.php">Getting Sources</a></div>
-</li>
-</ul>
-</div>
-<br style="clear:both;height:1em;">
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/website/include.php b/doc/org.eclipse.emf.parsley.dev.doc/website/include.php
deleted file mode 100644
index 726444b40..000000000
--- a/doc/org.eclipse.emf.parsley.dev.doc/website/include.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-
- # Set the theme for your project's web pages.
- # See the Committer Tools "How Do I" for list of themes
- # https://dev.eclipse.org/committers/
- # Optional: defaults to system theme
- $theme = "Nova";
-
- # Define your project-wide Nav bars here.
- # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
- # these are optional
- # $Nav->setLinkList(array());
-
- $pageTitle = "Emf Parsley Sources";
-
- $App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="code.css"/>' . "\n\t");
- $App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="book.css"/>' . "\n\t");
- $App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="novaAddon.css"/>' . "\n\t");
-
- $App->Promotion = TRUE;
- ?>
diff --git a/doc/org.eclipse.emf.parsley.dev.doc/website/index.php b/doc/org.eclipse.emf.parsley.dev.doc/website/index.php
deleted file mode 100644
index cbb927a8e..000000000
--- a/doc/org.eclipse.emf.parsley.dev.doc/website/index.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
- include("include.php");
-
- $App->AddExtraHtmlHeader('
- <script type="text/javascript">
- function init() {
- var docName = "GettingSources.html";
- initTocMenu(docName);
- highlightCurrentSection(docName);
- }
-
- function initTocMenu(ActiveSubTocElementId){
- var menu = document.getElementById("leftnav");
-
- var chapters = menu.children;
- addHideSubsectionFunction(chapters);
- var subToc = document.getElementById(\'subToc_\' + ActiveSubTocElementId);
- if(subToc) {
- subToc.style.display = "block";
- subToc.previousElementSibling.children[0].style.display = "none"
- subToc.previousElementSibling.children[1].style.display = "inline"
- }
- }
-
- function switchImages(chap) {
-
- }
-
- function addHideSubsectionFunction(items){
- for (var i = 0; i < items.length; i++) {
- if (items[i].firstElementChild != null && items[i].className == "separator"){
- if(items[i].firstElementChild.firstElementChild != null){
- items[i].firstElementChild.firstElementChild.onclick = function(){this.nextElementSibling.style.display="inline";this.style.display = "none"; toc_toggle_subsections(this.parentNode.parentNode);};
- items[i].firstElementChild.firstElementChild.nextElementSibling.onclick = function(){this.previousElementSibling.style.display="inline";this.style.display = "none"; toc_toggle_subsections(this.parentNode.parentNode);};
- }
- items[i].firstElementChild.style.cursor = "pointer";
- }
- }
- }
-
- function toc_toggle_subsections(chap){
- if ( chap.children[1].style.display != "none" ) {
- chap.children[1].style.display = "none"
- } else {
- chap.children[1].style.display = "block"
- }
- }
-
- function highlightCurrentSection(sec) {
- document.getElementById(sec).style.backgroundColor= "#D0D0D0"
- }
-
- if ( window.addEventListener ) {
- window.addEventListener( "load", init, false );
- }
- else if ( window.attachEvent ) {
- window.attachEvent( "onload", init );
- } else
- if ( window.onLoad ) {
- window.onload = init;
- }
- </script>');
-
- $pageTitle = "Emf Parsley Sources";
-
- $html .= file_get_contents('_index.html');
-
- # Generate the web page
- $App->generatePage("Nova", $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
-?>
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/.gitignore b/doc/org.eclipse.emf.parsley.doc.websitegen/website/.gitignore
new file mode 100644
index 000000000..8c54c9048
--- /dev/null
+++ b/doc/org.eclipse.emf.parsley.doc.websitegen/website/.gitignore
@@ -0,0 +1,6 @@
+/documentation.html
+/download.html
+/index.html
+/sources.html
+/support.html
+/userReviews.html
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/documentation.html b/doc/org.eclipse.emf.parsley.doc.websitegen/website/documentation.html
deleted file mode 100644
index 30de9d375..000000000
--- a/doc/org.eclipse.emf.parsley.doc.websitegen/website/documentation.html
+++ /dev/null
@@ -1,3877 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="The website of Eclipse EMF Parsley, an open-source framework for development User Interfaces upon EMF models">
- <meta name="author" content="Francesco Guidieri, Paolo Bachini">
- <link rel="icon" href="/favicon.ico">
-
- <title>EMF Parsley - Play with your UI and EMF!</title>
- <link rel="SHORTCUT ICON" href="img/logo_nw.gif" />
- <!-- styles -->
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
-
- <!-- Bootstrap core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <link href="css/main.css" rel="stylesheet">
- <!-- Animate CSS -->
- <link href="css/animate.css" rel="stylesheet">
-
- <!--[if lt IE 9]>
- <link href="css/iebugs.css" rel="stylesheet" type='text/css'>
- <![endif]-->
-
- <!-- Custom styles for this template -->
- <link href="carousel.css" rel="stylesheet">
-
- <!-- Bootstrap Lightbox -->
- <link href="bootstrap-lightbox/bootstrap-lightbox.min.css" rel="stylesheet">
- <!--<script src="js/twitter.js" type="text/javascript"></script>-->
- <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
- <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
- <script src="assets/js/ie-emulation-modes-warning.js"></script>
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="assets/js/ie10-viewport-bug-workaround.js"></script>
-
- <!-- Run Prettify -->
- <script src="prettify/run_prettify.js"></script>
-
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
- ga('create', 'UA-58549052-1', 'auto');
- ga('send', 'pageview');
-
- </script>
-</head>
-<body>
- <!-- ====== NAVBAR ====== -->
- <body style="overflow-y: scroll; padding-top:185px;">
- <div class="navbar-fixed-top" style="background:url(img/bg-100x100.jpg)">
- <div class="container" style="width:1150px;">
- <div class="navbar-header">
- <a href="index.html"><img class="img-responsive" alt="" src="img/logo.gif"/></a>
- </div>
- </div>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-31px 0px 3px 0px;min-height: 36px;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" style="margin-bottom:2px;">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav pull-right mioli">
- <li><a href="support.html">Contact Us</a></li>
- <li><a href="http://www.eclipse.org">Eclipse.org</a></li>
- <li style="border-right: 0 none;"><a target="_blank" href="https://twitter.com/EmfParsley" id="twitterli"><img style="width:25px;float:left;margin-top: 5px; margin-right:1px;" alt="" src="img/twitter.png"/>@EmfParsley</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <div style="background:url(img/bg1-100x100.jpg);">
- <nav class="navbar navbar-default miomenubar" role="navigation" style="border-radius:0px; background: url('img/menu.jpg') no-repeat; border: 0 none; -webkit-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);margin-bottom:0;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
- <ul class="nav navbar-nav pull-left miomenu">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- </div>
- </div>
- <!-- NAVBAR End -->
-<!-- Marketing messaging and featurettes
-================================================== -->
-<!-- Wrap the rest of the page in another container to center all the content. -->
-<style>
- .row {
- -webkit-animation: fadeInRightBig 1.5s;
- -moz-animation: fadeInRightBig 1.5s;
- -ms-animation: fadeInRightBig 1.5s;
- -o-animation: fadeInRightBig 1.5s;
- animation: fadeInRightBig 1.5s;
- }
-
- .dropdown-menu {
- -webkit-animation: fadeInDownBig 1.5s;
- -moz-animation: fadeInDownBig 1.5s;
- -ms-animation: fadeInDownBig 1.5s;
- -o-animation: fadeInDownBig 1.5s;
- animation: fadeInDownBig 1.5s;
- }
-
- .scrollup {
- background: url(img/up.png) no-repeat scroll 0 0 rgba(0, 0, 0, 0);
- bottom: 6%;
- display: none;
- opacity: 0.35; /* modifica anche in mouseout */
- position: fixed;
- right: 4%;
- z-index: 900;
- width: 45px;
- height: 45px;
- }
-</style>
-<div class="containerdoc marketing">
- <!-- SIDEBAR -->
- <div style="position: fixed;" class="col-md-2">
- <ul class="dropdown-menu" style="margin: 0px; max-width: 250px; display: block;box-shadow: 0 0px 7px rgba(0,0,0,.175);">
- <li class="activemenu" ><a tabindex="-1" href="#par">Overview</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Parsley Components</a></li>
- <li class="divider"></li>
- <li><a tabindex="-1" href="#par">First Example</a></li>
- <li class="divider"></li>
- <li><a tabindex="-1" href="#par">Components</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Form Component</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Tree Component</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Tree Form Component</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Table Component</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Tree With Columns Component</a></li>
- <li class="divider"></li>
- <li><a tabindex="-1" href="#par">Customizations</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Dependency Injection With</br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Google Guice</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Providers</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Contextual Menu</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Drag and Drop</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Factories</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Editing Domain</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Resources</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Configurator</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Validation</a></li>
- <li class="divider"></li>
- <li><a tabindex="-1" href="#par">Advanced Features</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Testing Framework</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">Eclipse 4.x</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">RAP</a></li>
- <li class="divider"></li>
- <li><a tabindex="-1" href="#par">Migration Guide</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">From 0.6.0 to 0.7.0</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">From 0.5.0 to 0.6.0</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">From 0.4 to 0.5</a></li>
- <li><a class="submenu" tabindex="-1" href="#par">From 0.3 to 0.4</a></li>
- <li class="divider"></li>
- </ul>
- </div>
-
- <!-- START THE FEATURETTES -->
- </br>
- <!-- scrollup ICON -->
- <a class="scrollup" href="#top"></a>
- <!-- scrollup ICON -->
- <div class="row featurette">
- <div class="col-md-8 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">Overview</h1>
- <p>
- <strong>EMF Parsley</strong> is a lightweight framework that allows easy and quick UI development based
- upon EMF. <strong>EMF Parsley</strong> is built on top of the EMF Edit framework and it implements features like Trees, Forms and Table builders with
- standard JFace databinding, providing a complete component-based toolset.
- EMF Parsley can be configured to use all kinds of EMF persistence
- implementations (XMI, Teneo, CDO)
- Moreover a DSL allows to easily customize several behaviors in each component.
- </p>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Parsley Components</h2>
- <p>
- <strong>EMF Parsley</strong> aims to provide a complete set of components to visualize your model with the introspective EMF capabilities
- and can be used to easily build forms, viewers or editors.
- </p>
- <p>
- There are some components that can be used out-of-the-box and can be considered as a reference implementation
- of the mechanisms that are the basis of <strong>EMF Parsley</strong> itslef.
- </p>
- <p>
- </p>
- <ul>
- <li><strong>Trees</strong></li>
- <li><strong>Forms</strong></li>
- <li><strong>Tables</strong></li>
- <li><strong>Editors</strong></li>
- <li><strong>Search boxes</strong> (coming soon)</li>
- </ul>
- <p>
- </p>
- <p>
- </p>
- <img src="images/01-components.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Customize<a id="Customize"></a></h3>
- <p>
- The main feature of <strong>EMF Parsley</strong> is that you can customize all basic UI behaviours of the components with <strong>Dependency Injection</strong>
- mechanisms (based on <a href="https://github.com/google/guice">Google Guice</a>).
- You can get more info in the <a href="#addref" rel="Customizations">Customizations Section</a>, but you don't have to know all details
- about the internal implementation to inject your own customization because
- <strong>EMF Parsley</strong> provides a DSL to easy customize your UI, as explained in the next section.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Customize with the DSL<a id="Customizations_DSL"></a></h3>
- <p>
- You can use the DSL by creating a new project with the wizard "Create a new project" -&gt; "EMF Parsley DSL Based project"
- </p>
- <p>
- </p>
- <img src="images/01-new-project-dsl-wizard.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- Clicking the "Finish" button the wizard will open directly the DSL editor. You can use the content assistant
- to discover all features.
- </p>
- <p>
- </p>
- <img src="images/01-dsl-content-assistant.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- The DSL allows to customize the most relevant behaviors. Here we list only a few of them:
- </p>
- <p>
- </p>
- <ul>
- <li><strong>parts</strong> lets you define your View Parts: this will correspond to the standard Eclipse extension
- points for the parts (see <a href="#PluginXml">How the DSL handles the plugin.xml</a>)</li>
- <li><strong>bindings</strong> section lets you define which implementation will be used with Injection</li>
- <li><strong>menu</strong> section lets you define the contextual menu for all viewers (<strong>trees</strong> and <strong>tables</strong>)</li>
- <li><strong>features provider</strong> is used to retrieve the list of feature for a given EClass to build <strong>tables</strong>
- and <strong>forms</strong></li>
- <li><strong>viewer content provider</strong> mediates between the viewer's model and the viewer, to provide the
- contents to be shown</li>
- <li><strong>Label Provider</strong> is used to retrieve the image and text rapresentation of the objects of a
- tree viewer</li>
- <li><strong>Caption Provider</strong> provides captions for each feature (namely, EStructuredFeature) of the object shown in a form,
- in a dialog or in a table row.
- Different implementations can be defined for <strong>dialogs</strong>, <strong>forms</strong> and <strong>tables</strong>.</li>
- <li><strong>Control Factory</strong> provides a custom implementation of the Controls for each feature shown in a form or a dialog.
- Different implementations can be defined forfor <strong>dialogs</strong> and <strong>forms</strong></li>
- </ul>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">The structure of an EMF Parsley project<a id="DslProjectStructure"></a></h3>
- <p>
- An EMF Parsley project, as created by the wizard, is an Eclipse plug-in project with a few
- additional builders.
- </p>
- <p>
- The <strong>emfparsley-gen</strong> source folder will contain all the Java files generated by the DSL
- compiler. The contents of this folder should never be modified manually, since their contents
- will be overwritten by the DSL compiler.
- </p>
- <p>
- The <strong>src</strong> source folder will contain an <abbr title="org.eclipse.ui.plugin.AbstractUIPlugin">AbstractUIPlugin</abbr>
- generated
- by the wizard. This is generated only during the creation of the project and it can be safely modified
- if you need to put other mechanisms in the activator.
- </p>
- <p>
- IMPORTANT: it is crucial that the activator has the static method <strong>getDefault</strong>, so you must not remove
- that method.
- </p>
- <p>
- If you choose one of the templates provided by the wizard, the <strong>src</strong> folder will also contain
- a Java class for the view, which extends the corresponding view of Parsley. This can be safely modified
- if you need to add some additional mechanisms or contents to the view.
- </p>
- <p>
- You can then create additional <strong>.parsley</strong> files in the same project.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">How the DSL handles the plugin.xml<a id="PluginXml"></a></h3>
- <p>
- If you specify any <strong>part</strong> in the DSL file, then
- the Parsley DSL will generate a <strong>plugin.xml_emfparsley_gen</strong> in the <strong>emfparsley-gen</strong> folder,
- in a directory named after the containing module. Then, the <strong>EMF Parsley builder</strong> will take
- care of merging the generated content with the <strong>plugin.xml</strong> in the root folder of the current project.
- If the <strong>plugin.xml</strong> does not exist it will create it. Subsequent changes to the DSL file
- will regenerate <strong>plugin.xml_emfparsley_gen</strong> and the builder will merge it with <strong>plugin.xml</strong>.
- The merging will overwrite in the <strong>plugin.xml</strong> only the elements that are specified in the DSL.
- Any other elements in the <strong>plugin.xml</strong> will not be touched, so you can also add other extension points
- manually in the <strong>plugin.xml</strong>.
- </p>
- <p>
- This merging takes place ONLY if your project has the <strong>EMF Parsley builder nature</strong>.
- Since version 0.6.1 this nature is automatically applied to the projects created with our wizard.
- In existing projects, you have to enable the nature yourself by right-clicking on the project,
- then "Configure" and then "Enable EMF Parsley builder.
- </p>
- <p>
- Note that this merging will not consider possible removed <strong>part</strong> sections in the DSL file.
- The merging relies on the <strong>id</strong>, so if you change the <strong>id</strong>, e.g., the <strong>viewid</strong>, in the DSL file, then you will end up
- with two extension points in the <strong>plugin.xml</strong>. Thus, in general, if you removed a <strong>part</strong> section from
- the DSL file, or if you rename an <strong>id</strong> in a <strong>part</strong> section, please make sure you manually modify
- the <strong>plugin.xml</strong> accordingly. The easiest way is to select to the files,
- and use the context menu "Compare With" =&gt; "Each Other". This way, you will soon detect the
- changes that have to be manually applied.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Obtaining the Injector<a id="InjectorProvider"></a></h3>
- <p>
- Since we also generate the <strong>plugin.xml</strong> starting from the DSL file, we already make sure that the
- views will be created via Google Guice injection mechanisms, using a generated
- <strong>executable extension factory</strong>.
- </p>
- <p>
- If you need to obtain an injector corresponding to a specific DSL file, you can use the
- corresponding generated class <strong>injector provider</strong>. This is prefixed with the name of the module
- (first letter capitalized). For example, given this DSL module
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- module org.eclipse.emf.parsley.examples.firstexample {
- ...
- }
- </pre>
- <p>
- </p>
- <p>
- The Java class for the injector provider will be <strong>org.eclipse.emf.parsley.examples.firstexample.FirstexampleInjectorProvider</strong>.
- </p>
- <p>
- These injector providers have a static method <strong>getInjector()</strong> that will return the <strong>singleton</strong> injector
- corresponding to that module:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- Injector injector = FirstexampleInjectorProvider.getInjector();
- </pre>
- <p>
- </p>
- <p>
- The returned injector is <strong>singleton</strong> in the sense that it is the same injector used
- to create instances of the view parts specified as extension points in the <strong>plugin.xml</strong>.
- </p>
- <p>
- Obtaining the injector this way is useful, for example, when you develop a pure e4 application,
- where you do not define views in the <strong>plugin.xml</strong>. See <a href="#addref" rel="Eclipse 4.x">Eclipse 4.x</a>.
- </p>
- </div>
- </div>
- </div>
- <hr style="width:64.6%;margin-bottom:28px;margin-top:30px;" class="col-md-8 col-md-offset-3">
- <div class="row featurette">
- <div class="col-md-8 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">First Example</h1>
- <p>
- The purpose of this first example is to make use of the classical EMF Library Model example and
- create a view for editing such models using an EMF Parsley enabled plug-in. We will use
- one of the saveable views shipped with Parsley: a Tree Form View.
- </p>
- <p>
- So let's start by creating the model plug-in with
- </p>
- <p>
- </p>
- <ol>
- <li>File -&gt; New... -&gt; Example...</li>
- <li>from Category "Eclipse Modeling Framework", select "Extended Library Model Example"</li>
- <li>press Next and Finish</li>
- </ol>
- <p>
- </p>
- <p>
- You will end up with three plug-ins:
- </p>
- <p>
- </p>
- <ul>
- <li>org.eclipse.emf.examples.library (the model plug-in)</li>
- <li>org.eclipse.emf.examples.library.edit (the edit plug-in)</li>
- <li>org.eclipse.emf.examples.library.editor (the editor plug-in)</li>
- </ul>
- <p>
- </p>
- <p>
- The editor plug-in project can be removed.
- </p>
- <p>
- Please consider that here we are starting from this well known EMF model taken out-of-the-box from Eclipse,
- but you can start from your EMF model (in that case you may probably omit the ".edit" and ".editor" plugins, depending on your model).
- </p>
- <p>
- Now you can create your first example with the appropriate wizard.
- </p>
- <p>
- </p>
- <ol>
- <li>select "File" -&gt; "New" -&gt; "Project..."</li>
- <li>from the "Emf Parsley" category select "Emf Parsley Dsl based Project"
-
- <img src="images/01-new-project-dsl-wizard.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;"></li>
- <li>click "Next"</li>
- <li>give a name to the project (e.g. "org.eclipse.emf.parsley.examples.firstexample")
- and make sure the checkbox about using one of the templates is checked
-
- <img src="images/01-new-project-dsl-wizard2.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;"></li>
- <li>click "Next"</li>
- <li>Select "Saveable Tree Form View"
-
- <img src="images/01-new-project-dsl-wizard3.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;"></li>
- <li>click "Finish"</li>
- </ol>
- <p>
-
-
- The generated project has some classes and a <strong>module.parlsey</strong> file, which opens automatically:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- import org.eclipse.emf.parsley.examples.firstexample.FirstexampleSaveableTreeFormView
-
- /* org.eclipse.emf.parsley.examples.firstexample Emf Parsley Dsl Module file */
- module org.eclipse.emf.parsley.examples.firstexample {
-
- parts {
- viewpart org.eclipse.emf.parsley.examples.firstexample {
- viewname "Firstexample"
- viewclass FirstexampleSaveableTreeFormView
- }
- }
-
- configurator {
- resourceURI {
- FirstexampleSaveableTreeFormView -&gt; {
- // TODO create and return a org.eclipse.emf.common.util.URI
- return null;
- }
- }
- }
-
- resourceManager {
- initializeResource {
- // Optional: initialize an empty Resource
- // 'it' is of type Resource
- // e.g., it.getContents += myFactory.createMyClass
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- The <strong>viewpart</strong> corresponds to the standard Eclipse view part extension point; the Parsley
- DSL will handle the generation and update of the <strong>plugin.xml</strong> file.
- Please have a look at <a href="#PluginXml">How the DSL handles the plugin.xml</a> for further
- details.
- </p>
- <p>
- The wizard will also generate a view part class into the project
- (in this example, <strong>FirstexampleSaveableTreeFormView</strong>); you can add other controls
- into that view, or customize other behaviors. Note that the Parsley DSL will never
- touch the files into the <strong>src</strong> source folder. On the contrary, files generated into
- <strong>emfparsley-gen</strong> source folder must never be manually modified, since its contents will
- be regenerated each time you modify the <strong>module.parsley</strong> file.
- </p>
- <p>
- For example, let's change the view name into "My Library Tree Form":
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- module org.eclipse.emf.parsley.examples.firstexample {
-
- parts {
- viewpart org.eclipse.emf.parsley.examples.firstexample {
- viewname "My Library Tree Form"
- ...
- </pre>
- <p>
- </p>
- <p>
- Let's save the file, wait for Eclipse to rebuild, and update the
- <strong>plugin.xml</strong> with the new <strong>plugin.xml_emfparsley_gen</strong>.
- </p>
- <p>
- (Other <strong>viewpart</strong> sections can be created; content assist is available for that).
- </p>
- <p>
- In the generated <strong>module.parsley</strong>, there is a <strong>configurator</strong> section, with
- a <strong>TODO</strong> comment (The <strong>Configurator</strong> is detailed in the section <a href="#addref" rel="Configurator">Configurator</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- configurator {
- resourceURI {
- FirstexampleSaveableTreeFormView -&gt; {
- // TODO create and return a org.eclipse.emf.common.util.URI
- return null;
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Let's focus on the above <strong>resourceURI</strong>: our goal is allowing to manage
- a library model instance which persists on a EMF <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
- .
- So we must specify the <abbr title="org.eclipse.emf.common.util.URI">URI</abbr>
- of the resource
- that will be edited by our tree form view.
- In this example we choose to use the EMF default persistence (XMI), but you can provide any URI
- (e.g. using Teneo, CDO or any other EMF Resource Persistence implementation)
- In particular here we choose to persist the Resource in a XMI file named <strong>"MyLibrary.library"</strong>
- into the user home folder (you might want to change it with any other path).
- To achieve this, we just need to create such a URI (recall that content assist is available
- when typing Xbase expressions):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- configurator {
- resourceURI {
- FirstexampleSaveableTreeFormView -&gt; {
- return URI.createFileURI( System.getProperty("user.home") + "/MyLibrary.library" );
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- If you simply copy and paste the above return statement, you'll get an error about
- unresolvable Java type URI; "Organize Imports" context menu (or its shortcut "Ctrl+Shift+O")
- can be used to automatically add the missing import (make sure you select
- <abbr title="org.eclipse.emf.common.util.URI">URI</abbr>
- ).
- </p>
- <p>
- Note that the specified URI, will be used for loading the resource only for our specific
- view (the resource will be automatically created if it does not exist).
- </p>
- <p>
- In the <strong>module.parsley</strong> there is another section that has been generated by the wizard:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- resourceManager {
- initializeResource {
- // Optional: initialize an empty Resource
- // 'it' is of type Resource
- // e.g., it.getContents += myFactory.createMyClass
- }
- }
- </pre>
- <p>
- </p>
- <p>
- We can use this section to initialize our resource when it is empty
- (i.e., the first time the resource is created); (The <strong>resourceManager</strong>
- is detailed in section <a href="#ResourceManager">Resource Manager</a>).
- </p>
- <p>
- In this example, we want to initialize an empty resource with a
- <strong>Library</strong> object; so
- we first need a <strong>Dependency</strong> from the model plug-in: so open <strong>MANIFEST.MF</strong> file, go to <strong>Dependencies</strong>
- tab, press <strong>"Add..."</strong> button in <strong>"Required Plug-ins"</strong> section and insert <strong>"org.eclipse.emf.examples.library"</strong>
- among dependencies.
- </p>
- <p>
- Now we can implement the <strong>initializeResource</strong> method
- (as described in the comment, the <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
-
- to initialized is available through the parameter <strong>it</strong>); the Library object
- is created using the standard EMF API: we need the factory of the library model:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- resourceManager {
- initializeResource {
- it.getContents += EXTLibraryFactory.eINSTANCE.createLibrary
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Again, use the content assist while typing, e.g., for automatically importing the
- type <strong>EXTLibraryFactory</strong>, or use the "Organize Imports" functionality.
- </p>
- <p>
- Now, we are ready to execute this example:
- let's get back to the <strong>MANIFEST.MF</strong> and run the example
- </p>
- <p>
- </p>
- <img src="images/first-example-launch.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- As an Eclipse RCP developer you know, of course, that this will start another Eclipse instance (unless
- you add an Application plug-in to the launch or define an Application in the current plug-in).
- </p>
- <p>
- In this second Eclipse instance you can show the View in this way:
- </p>
- <ol>
- <li><strong>Window -&gt; Show View -&gt; Other...</strong></li>
- <li>from Category "Other", select "My Library Tree Form"</li>
- <li>press <strong>OK</strong></li>
- </ol>
- <p>
- </p>
- <p>
- </p>
- <img src="images/first-example-run.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- With this simple view you can start editing the model instance. For example you can set the <strong>"name"</strong>
- field; as soon as you start typing characters into this field you will notice that:
- </p>
- <ol>
- <li>the View turns to a <strong>"dirty"</strong> state (an asterisk symbol appears on the view tab)</li>
- <li>the <strong>"Save"</strong> toolbar button is enabled</li>
- <li>the typed characters are reflected into the label correspondent to the Library icon</li>
- </ol>
- <p>
- </p>
- <p>
- if you now perform a <strong>"Save"</strong> action the persistence mechanism will trigger and you will see that file
- </p>
- &lt;user.home&gt;/MyLibrary.library
- <p>
-
- is being created on the file system. From now on, this file will keep the state of the model object whenever
- you change and save it.
- </p>
- <p>
- To create a Writer into the Library just right-click on the Library object and select <strong>New Child -&gt; Writer</strong>
- </p>
- <p>
- </p>
- <img src="images/createWriter.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- Please note that you might see a slightly different content in the above context-menu in case you deleted
- the .edit plugin when creating the model (e.g. <strong>"Writers Writer"</strong> instead of <strong>"Writer"</strong>, <strong>"Stock Book"</strong> instead of <strong>"Book"</strong> and
- similar (this is because with EMF it is possible to customize labels also via .edit plugin).
- </p>
- <p>
- Now set for instance the writer <strong>"name"</strong> field and save.
- Now just play around creating Books, associating them to Writers and so on.
- As you can see you can entirely manage the EMF model instance: creating, modifying and deleting elements.
- </p>
- <p>
- Whenever the current selection on the upper side of the view changes, then the lower side shows the detail
- of this selection.
- </p>
- <p>
- </p>
- <img src="images/first-example-default.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- However, up to this point, you have no control over the field to be shown and its order; for example
- you may want just the <strong>"name"</strong> attribute for the Library and <strong>"name", "address" and "books"</strong> attributes
- for Writers and maybe <strong>"title", "authors" and "category"</strong> for Books.
- </p>
- <p>
- Well, it's indeed very easy to obtain this: just edit the <strong>module.parsley</strong> file,
- adding the following import (without ending line with ";")
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- import org.eclipse.emf.examples.extlibrary.*
- </pre>
- <p>
- </p>
- <p>
- and then defining the features to show (the <strong>featuresProvider</strong> is detailed
- in section <a href="#FeaturesProvider">Features Provider</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- module ... {
-
- ...
- featuresProvider {
- features {
- Library -&gt; name
- Writer -&gt; name, address, books
- Book -&gt; author, title, category
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Remeber that code completion is available, just exploit it since it helps a lot.
- </p>
- <p>
- If you restart now the application you will see that, when selecting an object, only the features
- specified in the above section will be shown for each specified classes.
- Furthermore, they are shown in the specified order.
- </p>
- <p>
- NOTE: Did you run the application in Debug mode? Well, then you can change fields and order, save and see the
- changes without even restarting the application.
- </p>
- <p>
- Do you want to change text used for attribute captions in the form for a specific
- class? Just add the following
- (<strong>featureCaptionProvider</strong> is detailed in section <a href="#FeatureCaptionProvider">Feature Caption Provider</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- featureCaptionProvider {
- text {
- Book : author -&gt; "Written by:"
- Writer : name -&gt; "Name:"
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Or do you want to change the label shown on the tree nodes on the upper side and as detail title?
- Maybe want to format the book label like this?
- (<strong>labelProvider</strong> is detailed in section <a href="#ViewerLabelProvider">Viewer Label Provider</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- labelProvider {
- text {
- Book b -&gt; { '"' + b.title + '"' }
- Writer w -&gt; { w.name }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- The result of all the above customizations is shown in the following screenshot
- (compare it with the previous screenshot):
- </p>
- <p>
- </p>
- <img src="images/first-example-customized.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- Now, let's customize the context menus; by default,
- Parsley will generate context menus using EMF.Edit:
- </p>
- <p>
- </p>
- <img src="images/first-example-default-menus.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- We will now customize the context menu for books and writers, using
- the <strong>menuBuilder</strong> in the DSL (context menu customization is detailed
- in section <a href="#addref" rel="Contextual Menu">Contextual Menu</a>).
- </p>
- <p>
- What we want to achieve is to have a context menu for a <strong>Writer</strong>
- to add a new book in the library, and set its author to the
- selected writer (similarly, we want a context menu for a <strong>Book</strong>
- to add a new writer in the library, and set the selected book as
- one of the new writer's books):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- menuBuilder {
- val factory = EXTLibraryFactory.eINSTANCE
-
- emfMenus {
- Writer w -&gt; #[
- actionChange("New book", w.eContainer as Library,
- [
- library |
- val book = factory.createBook
- library.books += book
- book.title = "A new book"
- book.author = w
- ]
- ),
- ]
- Book b -&gt; #[
- actionChange("New writer", b.eContainer as Library,
- [
- library |
- val writer = factory.createWriter
- library.writers += writer
- writer.name = "A new writer"
- writer.books += b
- ]
- )
- ]
- }
- }
- </pre>
- <p>
- </p>
- <p>
- In this code we use Xbase features like list literals (<strong>#[...]</strong>) and
- lambda expressions.
- We use <strong>actionChange</strong> that allows to specify a menu performing some actions
- on the model's elements, keeping track of such changes so that they can be
- undone -- redo will work as well. The implementation of the menu is specified
- in the lambda expression passed as the last argument of actionChange; this lambda
- will receive as argument the model's element specified as the second argument.
- Only those modifications performed in the lambda concerning such specified model's element
- will be recorded for undo/redo.
- </p>
- <p>
- If you now restart the application, you see that the new
- context menu appears on writer elements:
- </p>
- <p>
- </p>
- <img src="images/first-example-custom-menus1.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- And selecting such a menu on a writer will add a new book, with
- a title, and whose author is the selected writer:
- </p>
- <p>
- </p>
- <img src="images/first-example-custom-menus2.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- You may want to try the new context menu on a book as well.
- </p>
- <p>
- We also add another context menu for books, using <strong>actionAdd</strong>:
- specifying the label for the menu,
- the containment list in the model, the object to add in such list
- and a lambda expression that will be executed ONLY after the menu
- has been selected. In this example, this menu available for
- a book object will add a new book to the library with the same
- name of the selected book:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- menuBuilder {
- val factory = EXTLibraryFactory.eINSTANCE
-
- emfMenus {
- // ... as above
- Book b -&gt; #[
- actionChange(
- // ... as above
- ),
- actionAdd("New book (same title)",
- (b.eContainer as Library).books,
- factory.createBook,
- [title = b.title]
- )
- ]
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Now, let's customize the contents shown in the tree view: by default,
- as you can see from the previous screenshots, the tree will show all
- the contents of the library. If we want to show only the writers and
- the books we can specify this section in the DSL
- (the customization of the content provider is detailed in
- section <a href="#ViewerContentProvider">Viewer Content Provider</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- viewerContentProvider {
- children {
- Library -&gt; {
- writers + books
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- and the result can be seen in the following screenshot:
- </p>
- <p>
- </p>
- <img src="images/first-example-custom-contents1.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- By default, double-clicking on a tree viewer of a saveable view will
- show a dialog to edit that object (if you customized the
- <strong>featuresProvider</strong>, the dialog will use your customized version);
- by default, if you edit a field in such dialog, the modifications will
- be applied immediately to the resource: this can be seen in the
- labels of the tree which are automatically updated and in the dirty state of
- the view:
- </p>
- <p>
- </p>
- <img src="images/first-example-default-dialog.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- Such a strategy for editing is delegated to an injected
- <abbr title="org.eclipse.emf.parsley.edit.IEditingStrategy">IEditingStrategy</abbr>
- , which is
- implemented by default by <abbr title="org.eclipse.emf.parsley.edit.OnTheFlyEditingStrategy">OnTheFlyEditingStrategy</abbr>
- .
- </p>
- <p>
- One may want to avoid this automatic update of the resource, and
- have the changes applied only when the "OK" dialog button is pressed
- (if "Cancel" is pressed, no changes should be applied at all).
- To achieve this behavior, it is enough to bind the alternative implementation
- <abbr title="org.eclipse.emf.parsley.edit.UndoableEditingStrategy">UndoableEditingStrategy</abbr>
- , in the Guice module.
- This can be achieved in the DSL using the <strong>binding</strong> section
- (Guice bindings are detailed in section <a href="#addref" rel="Dependency Injection With</br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Google Guice">Guice Bindings</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- bindings {
- type IEditingStrategy -&gt; UndoableEditingStrategy
- }
- </pre>
- <p>
- </p>
- <p>
- We strongly suggest you use the content assist to discover default
- bindings, since they also show Javadoc for each default binding:
- </p>
- <p>
- </p>
- <img src="images/first-example-custom-binding1.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- Besides types, you can also bind (i.e., inject) specific values
- that are used in the framework; for example, you can change the
- orientation of the tree form sash as follows
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- ...
- bindings {
- type IEditingStrategy -&gt; UndoableEditingStrategy
- value int TreeFormSashStyle -&gt; SWT.HORIZONTAL
- }
- </pre>
- <p>
- </p>
- <p>
- and see the result:
- </p>
- <p>
- </p>
- <img src="images/first-example-custom-orientation.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- This ends the first tutorial.
- </p>
- </div>
- </div>
- <hr style="width:64.6%;margin-bottom:28px;margin-top:30px;" class="col-md-8 col-md-offset-3">
- <div class="row featurette">
- <div class="col-md-8 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">Components</h1>
- <p>
- This section describes the components that are provided to be used out-of-the-box, that are the foundations for all parts built upon <strong>EMF Parsley</strong>.
- Afetr a brief description, for each component we present a set of customizations, just to give an idea of how it works. You can refer
- to <a href="#addref" rel="Customizations">Customizations Section</a> for a complete list.
- </p>
- <p>
- Components and viewers have to be created using the factories we provide
- (e.g., for viewers we provide <abbr title="org.eclipse.emf.parsley.viewers.ViewerFactory">ViewerFactory</abbr>
- );
- such factories provide specific <strong>create</strong> methods that require all the needed parameters.
- These factories must be injected.
- </p>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Form Component</h2>
- <p>
- The <strong>Form Component</strong> can be used to rapresent an <abbr title="org.eclipse.emf.ecore.EObject">EObject</abbr>
- in a form,
- like in the image above.
- </p>
- <p>
- </p>
- <img src="images/03-components-form.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- <strong>EMF Parsley</strong> provides a factory that can be used to create such a component, like in the code below.
- Here you can see that a form can be configured in 2 lines, the constructor phase and the build&amp;fill phase.
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject FormFactory formFactory;
-
- (...)
-
- formComposite = formFactory.createFormDetailComposite(parent, SWT.NONE);
- formComposite.init(eObject);
- </pre>
- <p>
- </p>
- <p>
- Most of the job is done by the second line of code, which gets the list of <abbr title="org.eclipse.emf.ecore.EStructuralFeature">EStructuralFeature</abbr>
- defined
- for the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
-
- (that is the type of the object to represent) and builds a row for each of them. Each row is composed
- by a <strong>caption</strong> which defaults to the name of the feature and a <strong>control</strong> to access the data.
- </p>
- <p>
- All these aspects can be customized in many ways, for example you can customize the feature list, the captions and the controls.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Feature List Customization<a id="FormComponent_features"></a></h3>
- <p>
- The <strong>list of features</strong> displayed on the form can be customized via the <a href="#FeaturesProvider">Feature Provider</a>
- that returns the list of the features (in a given order).
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Caption Customization<a id="FormComponent_captions"></a></h3>
- <p>
- The captions of the features shown in the form can be customizzed via the <a href="#FormFeatureCaptionProvider">Form Feature Caption Provider</a>.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Control Customization<a id="FormComponent_controls"></a></h3>
- <p>
- The Controls in the form can be customized via the <a href="#FormControlFactory">Form Control Factory</a>.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Proposal Provider<a id="FormComponent_proposals"></a></h3>
- <p>
- Depending on the feature types, some fields can have predefined values (e.g. combo).
- You can provide the exact proposal list via the <a href="#ProposalProvider">Proposal Provider</a>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Tree Component</h2>
- <p>
- The <strong>Tree Component</strong> provides a tree representation of data that can be fed with an EResource, a
- Resource URI, and a simple EObject. This component uses the EMF Meta-Model information to display objects in the tree.
- </p>
- <p>
- </p>
- <img src="images/03-components-tree.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- <strong>EMF Parsley</strong> provides a factory that can be used to create such a component, like in the code below:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject ViewerFactory viewerFactory;
-
- (...)
-
- treeViewer = new TreeViewer(parent);
- viewerFactory.initialize(treeViewer, element);
- </pre>
- <p>
- </p>
- <p>
- The <strong>Tree Component</strong>can be customized in several way via the standard EMF Edit facilities or with the EMF Parsley
- codeinjection based mechanism. If you are familiar with Jface APIs, you can easily use the basic class with some facilties to define the specific implementation.
- See the corrisponding sections for more details.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Content Provider<a id="Tree_ContentProvider"></a></h3>
- <p>
- An IContentProvider is used in Jface to retrieve the list of <strong>elements</strong> and <strong>children</strong> to be showed
- in the tree viewer. The <a href="#ViewerContentProvider">Viewer Content Provider</a> is the <strong>EMF Parsley</strong> implementation of that interface,
- and by default uses the containment mechanisms to provide children as in EMF Edit framework, but it can
- be customized as weel.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">LabelProvider<a id="Tree_LabelProvider"></a></h3>
- <p>
- The <a href="#ViewerLabelProvider">Viewer Label Provider</a> is the implementation of an ILabelProvider interface
- and is responsible to provide the text and image representation for each EObject visualized.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Adding Menu<a id="Tree_MenuBuilder"></a></h3>
- <p>
- The contextual menu can be added to the viewer via an injected
- <abbr title="org.eclipse.emf.parsley.menus.ViewerContextMenuHelper">ViewerContextMenuHelper</abbr>
- , as explained in the <a href="#addref" rel="Contextual Menu">Menu section</a>.
- The <a href="#MenuBuilder">Menu Builder</a> allows to fully customize the menus.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Tree Form Component</h2>
- <p>
- The <strong>Tree Form Component</strong> contains a <a href="#addref" rel="Tree Component"></a> that provides a tree representation of data that can be fed with
- an EResource, a Resource URI, and a simple EObject. This component uses the EMF Meta-Model information to display objects in
- the tree. The component also combines a <a href="#addref" rel="Form Component"></a> detail that display the current selected object.
- </p>
- <p>
- </p>
- <img src="images/03-components-treeform.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- <strong>EMF Parsley</strong> provides a factory to create such a component.
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject TreeFormFactory treeFormFactory;
-
- (...)
-
- treeFormComposite = treeFormFactory.createTreeFormComposite(parent, SWT.BORDER);
- treeFormComposite.update(application);
- </pre>
- <p>
- </p>
- <p>
- Since <strong>Tree Form Component</strong> is a combination of <strong>Tree Component</strong> and <strong>Form Component</strong>, all their customizations
- are avaible for it.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Table Component</h2>
- <p>
- The <strong>Table Component</strong> can rapresent data in a grid, once you have specified the type of objects to represent.
- It uses metamodel information to build columns as needed, and a
- <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProvider">TableViewerContentProvider</abbr>
- to retrieve
- the contents of the specified type (see also <a href="#TableViewerContentProvider"></a>).
- </p>
- <p>
- </p>
- <img src="images/03-components-table.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject ViewerFactory viewerFactory;
-
- (...)
-
- tableViewer = viewerFactory.createTableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION, eClass);
- </pre>
- <p>
- </p>
- <p>
- The class <abbr title="org.eclipse.emf.parsley.viewers.TableViewerColumnBuilder">TableViewerColumnBuilder</abbr>
- has the responsibility to
- build the columns of the Table, by using the <a href="#FeaturesProvider">Features Provider</a> to get the list
- of features and the <a href="#FeatureCaptionProvider">Feature Caption Provider</a> for the column headers.
- The class <abbr title="org.eclipse.emf.parsley.ui.provider.TableColumnLabelProvider">TableColumnLabelProvider</abbr>
- can be used to specify
- an implementation of ILabelProvider for each cell in the table.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Feature List Customization<a id="Table_features"></a></h3>
- <p>
- The <strong>list fo features</strong> displayed on the table can be customized via the <a href="#TableFeaturesProvider">Table Feature Provider</a>.
- This list of features will be used for building the columns of the table.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Caption Customization<a id="Table_captions"></a></h3>
- <p>
- The headers of the table can be customizzed via the <a href="#FeatureCaptionProvider">Caption Provider</a>.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Column width Customization<a id="Table_columns_width"></a></h3>
- <p>
- All columns have the same size by default, but they can be customizzed via the <a href="#addref" rel="Configurator">Configurator</a>
- for instance in the DSL, like in the example below.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
-
- bindings{
- value List&lt;Integer&gt; TableColumnWeights -&gt; #[10,20,30,40]
- }
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Adding Menu<a id="Table_MenuBuilder"></a></h3>
- <p>
- The contextual menu can be added to the viewer via an injected
- <abbr title="org.eclipse.emf.parsley.menus.ViewerContextMenuHelper">ViewerContextMenuHelper</abbr>
- , as explained in the <a href="#addref" rel="Contextual Menu">Menu section</a>.
- The <a href="#MenuBuilder">Menu Builder</a> allows to fully customize the menus.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Tree With Columns Component</h2>
- <p>
- The <strong>Tree With Columns Component</strong> provides a tree representation just like <a href="#addref" rel="Tree Component">Tree Component</a>,
- but it also shows table columns representing the features of the specified <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- .
- </p>
- <p>
- IMPORTANT: the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- is used to retrieve the features to be shown, and
- NOT to filter elements to be shown (as opposite to the <a href="#addref" rel="Table Component">Table Component</a>). If a given
- row in the tree represents an object whose class does not have the feature for a given column, then the
- corresponding table cell for that object will be empty.
- </p>
- <p>
- For example, the following screenshot shows a tree with columns representing a library; the specified
- <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- is the <strong>Writer</strong> so the columns show the features of the
- <strong>Writer</strong>'s class. Some of these features, e.g., <strong>address</strong>, <strong>firstName</strong> and <strong>lastName</strong>, are defined
- in the superclasses of <strong>Writer</strong>. The objects of class <strong>Employee</strong> have these features as well, while
- they don't have features that are specific of <strong>Writer</strong>, e.g., <strong>name</strong> and <strong>books</strong>, thus the corresponding
- cells for employees will be empty.
- </p>
- <p>
- </p>
- <img src="images/03-components-treecolumns.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- <strong>EMF Parsley</strong> provides a factory that can be used to create such a component, like in the code below:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject ViewerFactory viewerFactory;
-
- (...)
-
- treeViewer = createTreeViewerWithColumns(parent, getEClass(), getContents());
- </pre>
- <p>
- </p>
- <p>
- Since this component mixes the features of a tree and a table, the customizations are basically the
- same shown in the subsections of <a href="#addref" rel="Tree Component"></a> and <a href="#addref" rel="Table Component"></a>.
- </p>
- </div>
- </div>
- </div>
- <hr style="width:64.6%;margin-bottom:28px;margin-top:30px;" class="col-md-8 col-md-offset-3">
- <div class="row featurette">
- <div class="col-md-8 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">Customizations</h1>
- <p>
- In this chapter we will describe how <strong>EMF Parsley</strong> lets you customize the standard behaviours.
- A DSL is provided to easily customize most common features, but you can also customize all aspects
- manually (i.e., in directly Java).
- As a matter of fact each customization is explained in a single section, with the details on how to do
- that with the DSL (if available) and in Java.
- </p>
- <p>
- If you want to provide a specific implementation in
- Java, you can use the Google Guice injection mechanism, by overriding the specific class with your own
- implementation. Note that in some cases an explicit constructor is needed, with the <strong>@Inject</strong> annotation to make Guice
- correctly works; when this is the case, the base class will already have such a constructor and you will only
- need to override it, but you will also need to add the <strong>@Inject</strong> annotation explicitly.
- </p>
- <p>
- Although one can specify any Guice <abbr title="com.google.inject.Module">Module</abbr>
- , <strong>EMF Parsley</strong> ships with
- some default base class modules that should be used for specifying custom
- Guice bindings. The default base class is
- <abbr title="org.eclipse.emf.parsley.EmfParsleyGuiceModule">EmfParsleyGuiceModule</abbr>
- that is suitable to be used
- in an OSGI environment, like Eclipse itself or RAP (see also <a href="#addref" rel="Advanced Features">Eclipse 4.x &amp; RAP</a>).
- Our project wizards will automatically use such module as the base class.
- For CDO we have a specialized base module.
- </p>
- <p>
- We also have a module to be used in a non OSGI environment, e.g., a pure Java environment:
- <abbr title="org.eclipse.emf.parsley.EmfParsleyJavaGuiceModule">EmfParsleyJavaGuiceModule</abbr>
- (this is the base class of
- <abbr title="org.eclipse.emf.parsley.EmfParsleyGuiceModule">EmfParsleyGuiceModule</abbr>
- ). This is useful also for
- testing purposes, for writing plain Junit tests (i.e., not Plug-in Junit tests).
- This is also used in our testing framework (see <a href="#addref" rel="Testing Framework">EMF Parsley Testing Framework</a>).
- </p>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Dependency Injection With Google Guice</h2>
- <p>
- All Parsley components are assembled by means of <strong>Dependency Injection (DI)</strong>.
- This means that whenever some code is in need for functionality (or state)
- from another component, one just declares the dependency rather then stating
- how to resolve it, i.e. obtaining that component.
- </p>
- <p>
- For example, when some code wants to use a label provider,
- it just declares a field (or method or constructor) and adds the
- <abbr title="com.google.inject.Inject">@Inject</abbr>
- annotation:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- class MyView extends ViewPart {
-
- @Inject
- private ILabelProvider labelProvider;
-
- }
- </pre>
- <p>
- </p>
- <p>
- It is not the duty of the client code to care about where the
- actual <abbr title="org.eclipse.jface.viewers.ILabelProvider">ILabelProvider</abbr>
- comes from or
- how it is created.
- When the above class is instantiated, Guice sees that it requires an instance
- of ILabelProvider and assigns it to the specified field or method parameter.
- This of course only works, if the object itself is created by Guice.
- In Parsley almost every instance is created that way and therefore the whole
- dependency net is controlled and configured by the means of Google Guice.
- </p>
- <p>
- Guice of course needs to know how to instantiate real objects for declared dependencies.
- This is done in so called Modules. A <abbr title="com.google.inject.Module">Module</abbr>
-
- defines a set of mappings from types to either existing instances,
- instance providers or concrete classes.
- Modules are implemented in Java. Here's an example:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public class MyGuiceModule extends AbstractGenericModule {
-
- @Override
- public void configure(Binder binder) {
- super.configure(binder);
- binder.bind(ILabelProvider.class).to(MyLabelProvider.class);
- binder.bind(...
- }
- </pre>
- <p>
- </p>
- <p>
- With plain Guice modules one implements a method called configure and gets a
- <abbr title="com.google.inject.Binder">Binder</abbr>
- passed in.
- That binder provides a fluent API to define the mentioned mappings.
- This was just a very brief and simplified description.
- We highly recommend to have a look at the <a href="https://github.com/google/guice">Google Guice</a>
- website to learn more.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Module API<a id="ModuleAPI"></a></h3>
- <p>
- Parsley comes with a slightly enhanced module API
- (this was inspired by Xtext, so, if you are already familiar with the
- enhnaced Guice module API of Xtext, you can use Parsley API right away).
- </p>
- <p>
- The enhancement we added to Guice's Module API is that we provide an abstract base class,
- which reflectively looks for certain methods in order to find declared bindings.
- The standard base class is <abbr title="org.eclipse.emf.parsley.EmfParsleyGuiceModule">EmfParsleyGuiceModule</abbr>
- ,
- which can be used in a standard Eclipse OSGI environment. If you are using
- CDO, it is better to use as base class <strong>CDOEmfParsleyModule</strong>, which has defaults
- that better fit a CDO environment. If you do not need OSGI, you can use
- <abbr title="org.eclipse.emf.parsley.EmfParsleyJavaGuiceModule">EmfParsleyJavaGuiceModule</abbr>
- (e.g., to run tests
- with plain Junit, see also <a href="#addref" rel="Testing Framework">Testing Framework</a>).
- </p>
- <p>
- The most common kind of method is
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public Class&lt;? extends ILabelProvider&gt; bindILabelProvider() {
- return MyLabelProvider.class;
- }
- </pre>
- <p>
- </p>
- <p>
- which would do the same as the code snippet above.
- It simply declares a binding from ILabelProvider to MyLabelProvider.
- That binding will make Guice instantiate and inject a new instance of
- MyLabelProviderProvider whenever a dependency to ILabelProvider is declared.
- </p>
- <p>
- There are two additional kinds of binding-methods supported.
- The first one allows to configure a provider.
- A <abbr title="com.google.inject.Provider">Provider</abbr>
- is an interface with just one method:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public interface Provider&lt;T&gt; extends javax.inject.Provider&lt;T&gt; {
-
- /**
- * Provides an instance of {@code T}. Must never return {@code null}.
- */
- T get();
- }
- </pre>
- <p>
- </p>
- <p>
- This one can be used if you need a hook whenever an instance of a certain type
- is created. For instance if you want to provide lazy access to a singleton
- or you need to do some computation each time an instance is created (i.e. factory).
- If you want to point to a provider rather than to a concrete class you can
- use the following binding method:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public Class&lt;? extends Provider&lt;ILabelProvider&gt;&gt; provideILabelProvider() {
- return MyLabelProviderFactory.class;
- }
- </pre>
- <p>
- </p>
- <p>
- The last kind of binding allows to inject values in Parsley components;
- here are some examples of such bindings implemented in the base class of
- Parsley Guice module:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- /**
- * The String constant for Content Assist Shortcut
- */
- public String valueContentAssistShortcut() {
- return "Ctrl+Space";
- }
-
- /**
- * The String constant used as a ellipses for Iterable string representation
- * when it is too long
- */
- public String valueIterableStringEllipses() {
- return "...";
- }
-
- /**
- * The list of Integer weights for a table's columns
- */
- public List&lt;Integer&gt; valueTableColumnWeights() {
- return Collections.&lt;Integer&gt;emptyList();
- }
-
- /**
- * The int constant defining the Sash style in a TreeFormComposite
- */
- public int valueTreeFormSashStyle() {
- return SWT.VERTICAL;
- }
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Specify Guice Bindings in the DSL<a id="BindingsInTheDSL"></a></h3>
- <p>
- Guice bindings can be specified directly in the DSL, in the
- <strong>bindings</strong> section.
- </p>
- <p>
- In this section you can specify bindings of all the three above kinds with
- <strong>type</strong>, <strong>provide</strong> and <strong>value</strong> respectively, e.g.,
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- bindings {
- type ILabelProvider -&gt; MyLabelProvider
- type ... -&gt; ...
- provide ProposalCreator -&gt; MyProposalCreatorProvider
- ...
- value int TreeFormSashStyle -&gt; SWT.HORIZONTAL
- }
- </pre>
- <p>
- </p>
- <p>
- We strongly suggest you use the content assist to discover default
- bindings, since they also show Javadoc for each default binding:
- </p>
- <p>
- </p>
- <img src="images/first-example-custom-binding1.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Providers</h2>
- </br>
- <h3 class="featurette-heading text-parsley2">Viewer Label Provider<a id="ViewerLabelProvider"></a></h3>
- <p>
- The Jface Label Provider allows to specify the representation of a given Object. <strong>EMF Parsley</strong>
- provides an implementation that uses the information provided via the DSL, as you can see in the snippet
- below. We allow customization for text, image, font, and foreground and background color.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- labelProvider{
- text {
- Book -&gt; "Book:"+title
- Borrower -&gt; "Borrower: "+firstName
- }
- image {
- Book -&gt; "book.png"
- }
- font {
- Book -&gt; // must return a org.eclipse.swt.graphics.Font
- }
- foreground {
- Book -&gt; // must return a org.eclipse.swt.graphics.Color
- }
- background {
- Book -&gt; // must return a org.eclipse.swt.graphics.Color
- }
- }
- </pre>
- <p>
- </p>
- <p>
- However if you want to customize the label provider in Java, you need to provide an implementation of <abbr title="org.eclipse.jface.viewers.ILabelProvider">ILabelProvider</abbr>
-
- and injecting it in the spefic module by overriding <strong>bindILabelProvider</strong>.
- </p>
- <p>
- <strong>EMF Parsley</strong> provides such a base implementation with the class <abbr title="org.eclipse.emf.parsley.ui.provider.ViewerLabelProvider">ViewerLabelProvider</abbr>
-
- that is meant to be subclassed by the programmer to provide specific implementations like in the example below.
- Our label provider also implements <abbr title="org.eclipse.jface.viewers.IFontProvider">IFontProvider</abbr>
- and
- <abbr title="org.eclipse.jface.viewers.IColorProvider">IColorProvider</abbr>
- , so that you can customize also the font, the foreground
- and the background color.
- </p>
- <p>
- This class, like many others in our framework, relies on the <strong>polymorphic dispatcher</strong> idiom to declaratively
- specify text and image representations for objects. It boils down to the fact that the only thing you need to do is
- to implement a method that matches a specific signature: <strong>text</strong> and <strong>image</strong> for the String representation and
- the image, respectively. These methods will need to specify as parameter the type of the object to represent.
- For the image, you can either specify an image filename or an Image object. File names for images are
- assumed to refer to files in the <strong>icons</strong> folder of the containing plug-in.
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public class CustomLibraryLabelProvider extends ViewerLabelProvider {
-
- @Inject
- public CustomLibraryLabelProvider(AdapterFactoryLabelProvider delegate) {
- super(delegate);
- }
-
- public String text(Book book) {
- return "Book: " + book.getTitle();
- }
-
- public String image(Book book) {
- return "book.png";
- }
-
- public Font font(Book book) {
- return // must return a org.eclipse.swt.graphics.Font
- }
-
- public Color foreground(Book book) {
- return // must return a org.eclipse.swt.graphics.Color
- }
-
- public Color background(Book book) {
- return // must return a org.eclipse.swt.graphics.Color
- }
-
- public String text(Borrower b) {
- return "Borrower: " + b.getFirstName();
- }
- }
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Viewer Content Provider<a id="ViewerContentProvider"></a></h3>
- <p>
- As in Jface, the Content Provider is used to get the elements to represent in a tree and their children
- (as detailed in <a href="#TableViewerContentProvider">Table Viewer Content Provider</a>, for tables
- we use a different content provider).
- <strong>EMF Parsley</strong> provides an implementation that uses the DSL as in the code below.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- viewerContentProvider{
- elements{
- Library -&gt; books
- }
- children{
- Library -&gt; books
- Book b-&gt; {
- new ArrayList()=&gt;[
- add(b.author)
- addAll(b.borrowers)
- ]
- }
- }
- }</pre>
- <p>
- </p>
- <p>
- The developer can also provide a specific implementation of <abbr title="org.eclipse.jface.viewers.IContentProvider">IContentProvider</abbr>
-
- by injecting it in the spefic module <strong>(TODO)</strong>. EMF Parsley provides a base implementation with the class
- <abbr title="org.eclipse.emf.parsley.edit.ui.provider.ViewerContentProvider">ViewerContentProvider</abbr>
- that can be easily used to
- specify the children of all object on the tree, like in the example below (again, this uses the polymorphic dispatch idiom).
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public class CustomLibraryViewerContentProvider extends ViewerContentProvider {
-
- @Inject
- public CustomLibraryViewerContentProvider(AdapterFactory adapterFactory) {
- super(adapterFactory);
- }
-
- public Object elements(Library library) {
- return library.getBooks();
- }
-
- public Object children(Library library) {
- return library.getBooks();
- }
-
- public Object children(Book book) {
- ArrayList&lt;Object&gt; children = new ArrayList&lt;Object&gt;();
- Writer author = book.getAuthor();
- if (author != null) {
- children.add(author);
- }
- children.addAll(book.getBorrowers());
- return children;
- }
- }
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Table Viewer Content Provider<a id="TableViewerContentProvider"></a></h3>
- <p>
- For table viewers we use a customized content provider, which inherits from
- the one described in <a href="#ViewerContentProvider">Viewer Content Provider</a>;
- for tables we only need to specify how the root <strong>elements</strong> are computed
- (no children are needed for tables).
- </p>
- <p>
- This content provider, <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProvider">TableViewerContentProvider</abbr>
- ,
- must be configured with the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- of the objects that
- will be shown in the table, so the <strong>setEClass</strong> must be called before this content provider is
- used. This setup is already automatically performed in views that are shipped with Parsley; in
- case you need to setup a table viewer yourself with this content provider, we strongly suggest
- you inject a <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProviderFactory">TableViewerContentProviderFactory</abbr>
-
- and use its method <strong>createTableViewerContentProvider(EClass type)</strong>.
- </p>
- <p>
- With the information about the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- this content provider
- is able to automatically retrieve all the contents of that type from a <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
-
- or any <abbr title="org.eclipse.emf.ecore.EObject">EObject</abbr>
- , by retrieving inspecting all the containment
- references of that type, recursively in the model.
- </p>
- <p>
- In case you want to optimize the retrieval of contents, or in case you want to
- show elements of the specified type which are not contained in an <abbr title="org.eclipse.emf.ecore.EObject">EObject</abbr>
-
- (because they are references with containment set to false), you can inject your own
- custom <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProvider">TableViewerContentProvider</abbr>
-
- and define <strong>elements</strong> methods (again, this uses the polymorphic dispatch idiom).
- </p>
- <p>
- In the DSL this can be done using the specific section.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- tableViewerContentProvider{
- elements{
- Library lib -&gt; {
- // this is just an optimization: since books are contained in the library
- // the default content provider will retrieve them automatically
- lib.books
- }
- Writer w {
- // writers' books would not be retrieved by the default content provider
- // since they are NOT 'contained' in a writer.
- w.books
- }
- }
- }</pre>
- <p>
- </p>
- <p>
- IMPORTANT: customizations specified in a <abbr title="org.eclipse.emf.parsley.edit.ui.provider.ViewerContentProvider">ViewerContentProvider</abbr>
-
- will NOT be reused by a <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProvider">TableViewerContentProvider</abbr>
- .
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Table Label Provider<a id="TableLabelProvider"></a></h3>
- <p>
- The Jface Table Label Provider allows to specify the representation of a given cell in a table. <strong>EMF Parsley</strong>
- provides an implementation that uses the information provided via the DSL, as you can see in the snippet
- below. We allow customization for text, image, font, foreground and background color for a given object's feature
- (which corresponds to a table cell), and also font, and foreground and background color for the entire row.
- </p>
- <p>
- Concerning fonts and colors, a customization for a single cell has the precedence over the customization of an entire row.
- </p>
- <p>
- Here's an example.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- tableLabelProvider {
- text {
- Library:name -&gt; 'Name' // constant
- Library:books -&gt; 'Books' // constant
- Writer:lastName -&gt; name.toFirstUpper // the implicit param is an EStructuralFeature
- }
-
- image {
- Book: author -&gt;
- if (author.name.nullOrEmpty)
- "noname.gif"
- else
- new ImageData("writer.jpeg")
- }
-
- font {
- Library : name -&gt; JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)
- }
-
- foreground {
- Library : books -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)
- }
-
- background {
- Library : address -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)
- }
-
- rowFont {
- Library -&gt; JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)
- }
-
- rowForeground {
- Library -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)
- }
-
- rowBackground {
- Library -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)
- }
- }
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Features Provider<a id="FeaturesProvider"></a></h3>
- <p>
- <strong>EMF Parsley</strong> uses this kind of provider wherever a list of features is requested for a certain EClass.
- The default is to return the list of all the features in the EClass, but the programmer can customize it (for instance,
- by returning only a superset, or in a different order) on an EClass-based strategy.
- Thus you can use the DSL to specify that list, as in the snipped below.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- featuresProvider{
- features{
- Book -&gt; title, author, category, pages
- }
- }
- </pre>
- <p>
-
-
- If you want to customize it in Java, there are more ways to customize this behaviour, but we need to go deep in some
- details of the <strong>Feature Provider</strong> implementation.
- </p>
- <p>
- When the framework builds components according to the
- <abbr title="org.eclipse.emf.ecore.EStructuralFeature">EStructuralFeature</abbr>
- s of a given
- <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- it relies on an injected
- <abbr title="org.eclipse.emf.parsley.ui.provider.FeaturesProvider">FeaturesProvider</abbr>
- .
- The default behavior is to simply return all the features of the a given EClass,
- in the order they are defined in the EClass, as implemented by the method <strong>defaultFeatures</strong> in
- <abbr title="org.eclipse.emf.parsley.ui.provider.FeaturesProvider">FeaturesProvider</abbr>
- .
- </p>
- <p>
- You can set the mappings, i.e., specify the structural
- features you want to be used given an EClass, by implementing
- the method <strong>buildMap</strong>, which receives the
- <abbr title="org.eclipse.emf.parsley.ui.provider.FeaturesProvider$EClassToEStructuralFeatureMap">FeaturesProvider.EClassToEStructuralFeatureMap</abbr>
-
- that can be filled with the method <strong>mapTo</strong>;
- for instance, using the EMF extended library
- example, this customization will return only the <strong>name</strong> and <strong>address</strong> features
- for <strong>Library</strong>, the <strong>firstName</strong>, <strong>lastName</strong> and <strong>address</strong> for
- <strong>Person</strong>, and the <strong>firstName</strong>, <strong>lastName</strong> and <strong>books</strong> (but
- not <strong>address</strong>) for <strong>Writer</strong> (which inherits from <strong>Person</strong>).
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- import static org.eclipse.emf.examples.extlibrary.EXTLibraryPackage.Literals.*;
- import org.eclipse.emf.parsley.ui.provider.EStructuralFeaturesProvider;
-
- public class LibraryEStructuralFeaturesProvider extends
- FeaturesProvider {
-
- @Override
- protected void buildMap(EClassToEStructuralFeatureMap map) {
- super.buildMap(map);
- map.mapTo(LIBRARY,
- LIBRARY__NAME, ADDRESSABLE__ADDRESS);
- map.mapTo(PERSON, PERSON__FIRST_NAME, PERSON__LAST_NAME, ADDRESSABLE__ADDRESS);
- map.mapTo(WRITER, PERSON__FIRST_NAME, PERSON__LAST_NAME, WRITER__BOOKS);
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Another possibility is to build a map which relies on Strings
- both for the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- and for
- the list of <abbr title="org.eclipse.emf.ecore.EStructuralFeature">EStructuralFeature</abbr>
- ;
- note that the name of the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- should
- be obtained by using <strong>getInstanceClassName()</strong>; you can also
- combine the two approaches.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Table Features Provider<a id="TableFeaturesProvider"></a></h3>
- <p>
- As an extension, you can use the <abbr title="org.eclipse.emf.parsley.ui.provider.TableFeaturesProvider">TableFeaturesProvider</abbr>
- :
- the customizations will be applied only to <a href="#addref" rel="Table Component">Tables</a>, not to <a href="#addref" rel="Form Component">Forms</a>.
- </p>
- <p>
- If there are no specific customization in the <abbr title="org.eclipse.emf.parsley.ui.provider.TableFeaturesProvider">TableFeaturesProvider</abbr>
- ,
- we fall back to <abbr title="org.eclipse.emf.parsley.ui.provider.FeaturesProvider">FeaturesProvider</abbr>
- .
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Feature Caption Provider<a id="FeatureCaptionProvider"></a></h3>
- <p>
- The <abbr title="org.eclipse.emf.parsley.ui.provider.FeatureCaptionProvider">FeatureCaptionProvider</abbr>
- provides captions for
- the features in <a href="#addref" rel="Table Component">Tables</a> and <a href="#addref" rel="Form Component">Forms</a>.
- Here you can see an example of the DSL.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- featureCaptionProvider{
- text{
- Book:author -&gt; "Written by:"
- Writer:name -&gt; "Name:"
- }
- }
- </pre>
- <p>
- </p>
- <p>
- If you want to customize it in Java, you need to derive from
- <abbr title="org.eclipse.emf.parsley.ui.provider.FeatureCaptionProvider">FeatureCaptionProvider</abbr>
- .
- It can be customized, with injection <a href="#addref" rel="Dependency Injection With</br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Google Guice"></a>: this
- way you can customize the caption label for controls in a form, dialog, and the headers in a table's column.
- The framework uses a polimorphic mechanism to find customizations: it searches for
- methods with a specific signature: the name is built by the string <strong>'text'</strong> followed by the EClass and the EStructuralFeature.
- All parts of the name are separated by an underscore character and the method must accept a parameter of type EStructuralFeature.
- </p>
- <p>
- In the following example we specify the caption text for the feature 'Author' of Book and the feature 'Name' for
- Writer.
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public String text_Book_author(final EStructuralFeature feature) {
- return "Written by:";
- }
-
- public String text_Writer_name(final EStructuralFeature feature) {
- return "Name:";
- }
- </pre>
- <p>
- </p>
- <p>
- If no customization is provided, the text will be computed using the feature's name.
- This will always be the default for table column headers (since no object is available
- when building the table); while for form and dialog captions we use a slightly different
- default strategy, as shown in <a href="#FormFeatureCaptionProvider">Form and Dialog Feature Caption Provider</a>.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Form and Dialog Feature Caption Provider<a id="FormFeatureCaptionProvider"></a></h3>
- <p>
- The <abbr title="org.eclipse.emf.parsley.ui.provider.FormFeatureCaptionProvider">FormFeatureCaptionProvider</abbr>
-
- (<abbr title="org.eclipse.emf.parsley.ui.provider.DialogFeatureCaptionProvider">DialogFeatureCaptionProvider</abbr>
- , respectively)
- can be used if you want to define the description only for forms (for dialogs, respectively).
- For example using the <a href="#addref" rel="Tree Form Component">Tree Form</a> your definition will not be used in the tree.
- </p>
- <p>
- In this case you can also define a method the returns directly the
- <abbr title="org.eclipse.swt.widgets.Label">Label</abbr>
- , like in the example
- below. In such methods there is another parameter that is the parent composite (that is automatically
- passed by the framework).
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public Label label_Writer_name(Composite parent, EStructuralFeature feature) {
- Label label = defaultLabel(parent, feature);
- label.setBackground(getFormToolkit().getColors().getColor(IFormColors.TITLE));
- return label;
- }
- </pre>
- <p>
- </p>
- <p>
- In the DSL you have the corresponding two sections available:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- formFeatureCaptionProvider{
- text{
- Book:author -&gt; "Written by:"
- }
- label{
- Writer:name -&gt; createLabel(parent, "Name")
- }
- }
-
- dialogFeatureCaptionProvider{
- text{
- Book:author -&gt; "Author:"
- }
- label{
- Writer:name -&gt; createLabel(parent, "Writer's name")
- }
- }
- </pre>
- <p>
- </p>
- <p>
- If there is no customization in the <abbr title="org.eclipse.emf.parsley.ui.provider.FormFeatureCaptionProvider">FormFeatureCaptionProvider</abbr>
-
- (<abbr title="org.eclipse.emf.parsley.ui.provider.DialogFeatureCaptionProvider">DialogFeatureCaptionProvider</abbr>
- , respectively),
- the following steps are executed to create the text for the label:
- </p>
- <p>
- </p>
- <ul>
- <li>we take possible customizations from <abbr title="org.eclipse.emf.parsley.ui.provider.FeatureCaptionProvider">FeatureCaptionProvider</abbr>
-
- if available, otherwise:</li>
- <li>we take the text from <abbr title="org.eclipse.emf.edit.provider.IItemPropertyDescriptor">IItemPropertyDescriptor</abbr>
- if
- the EObject provides it, otherwise:</li>
- <li>we take the feature name</li>
- </ul>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Proposal Provider<a id="ProposalProvider"></a></h3>
- <p>
- Some controls use a list of proposals to help the end user experince: for example a single value reference feature
- will be rendered by default with a combo box, automatically filled with all the possible targets for
- that reference; similarly for Enum features. You can customize the proposals, and you can specify proposals also
- for simple text fields (a content assist dialog will show up for text fields).
- </p>
- <p>
- For each feature you can specify a list of proposals via the DSL. In the example below, we first
- compute the default proposals for that feature and then we filter the proposals.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- proposals{
- Book:author -&gt; {
- defaultProposals(feature).
- filter(Writer).
- filter[name.startsWith("F")].toList
- }
- }
- </pre>
- <p>
-
-
- This customization can be done also in Java, by extending the class <abbr title="org.eclipse.emf.parsley.composite.ProposalCreator">ProposalCreator</abbr>
-
- and implementing the method </p>
- <pre class="prettyprint" skin="desert">public List&lt;?&gt; proposals_Book_author(Book book) {...}</pre>
- <p>
- . This
- method follows the same convention on the signature name as explained in <a href="#FeatureCaptionProvider">Feature
- Provider</a>.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Contextual Menu</h2>
- <p>
- A context menu can be added to any <abbr title="org.eclipse.jface.viewers.StructuredViewer">StructuredViewer</abbr>
- by using an
- injected <abbr title="org.eclipse.emf.parsley.menus.ViewerContextMenuHelper">ViewerContextMenuHelper</abbr>
- . This provides some
- methods for adding the context menu
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject ViewerContextMenuHelper contextMenuHelper;
- (...)
-
- // simplest form
- contextMenuHelper.addViewerContextMenu(viewer);
-
- // if you have an AdapterFactoryEditingDomain already
- contextMenuHelper.addViewerContextMenu(viewer, editingDomain);
-
- // if you're inside an IWorkbenchPart
- contextMenuHelper.addViewerContextMenu(viewer, editingDomain, part);
- </pre>
- <p>
- </p>
- <p>
- The contents of such menu are built automatically by the framework or customized by the programmer,
- as shown in the next section.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Menu Builder<a id="MenuBuilder"></a></h3>
- <p>
- <strong>EMF Parsley</strong> uses the standard EMF.Edit features to build the contextual menus of
- viewers (thus you will get by default the standard "New Child" and "New Sibling"
- sections in the context menu).
- </p>
- <p>
- You can customize context menus on a per class basis
- by extending the <abbr title="org.eclipse.emf.parsley.edit.action.EditingMenuBuilder">EditingMenuBuilder</abbr>
-
- (and injecting it in the Guice module). However, we suggest to use the
- DSL for this task, as detailed in the following.
- </p>
- <p>
- <strong>EMF Parsley</strong> logically separates the menu into 2 parts. The first section contains all common edit commands
- such as <strong>copy</strong> and <strong>paste</strong>. The second section contains EMF specific commands, such as for example <strong>new child</strong>.
- You can use the DSL to fully customize the menu, as in the example below.
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- menuBuilder{
- menus{
- Library-&gt; #[
- submenu("Edit",#[
- actionCopy,
- actionCut,
- separator,
- actionPaste
- ])
- ]
- }
- emfMenus{
- Library lib -&gt; #[
- actionAdd("Add a new book", lib.books,
- EXTLibraryFactory.eINSTANCE.createBook)
- ]
- }
- }
- </pre>
- <p>
- </p>
- <p>
- For each EClass of your meta-model you can specify a list of menu items
- (the #[] is the Xbase syntax for a list literal)
- Content assist is available to select the editing actions, the separator and
- also methods for EMF menu part.
- </p>
- <p>
- In the <strong>emfMenus</strong> section, you can use some methods of
- the <abbr title="org.eclipse.emf.parsley.edit.action.EditingMenuBuilder">EditingMenuBuilder</abbr>
- class,
- as detailed in the following.
- </p>
- <p>
- The method <strong>actionAdd</strong>, specifying the label for the menu,
- the containment list in the model, and the object to add in such list
- when the menu is selected (Note that it is up to you to specify a
- containment list); the DSL will issue an error if the object cannot be
- added to the list (because it is not of the right type).
- The object should be created using the standard EMF API (i.e., using
- the EMF factory for your model).
- </p>
- <p>
- If you want to specify further initialization instructions for the
- created object you can pass a lambda expression as another argument
- to <strong>actionAdd</strong>: that lambda will be executed ONLY after the menu
- has been selected, i.e., ONLY after the created
- object is part of the resource:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- emfMenus{
- Writer w -&gt; #[
- actionAdd("Add a new book for the writer",
- (w.eContainer as Library).books,
- EXTLibraryFactory.eINSTANCE.createBook,
- [ book | book.title = "A new book" ]
- )
- ]
- }
- </pre>
- <p>
- </p>
- <p>
- IMPORTANT: do not set any reference feature of the created EObject in the lambda,
- i.e., do not do something like the following
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- emfMenus{
- Writer w -&gt; #[
- actionAdd("Add a new book for the writer",
- (w.eContainer as Library).books,
- EXTLibraryFactory.eINSTANCE.createBook,
- // WRONG: don't do that
- [ book | book.author = w ]
- )
- ]
- }
- </pre>
- <p>
- </p>
- <p>
- This will not work if you undo the command: the writer that has been added
- to the library will be removed, and the book.author will be a dangling reference!
- as a consequence the resource cannot be saved.
- </p>
- <p>
- If you want to implement more complex menu commands that do not
- only add elements to a container, you can use the method
- <strong>actionChange</strong>, specifying the label for the menu, the model's element
- that will be affected by the changes specified as a lambda expression
- (the third argument). The lambda expression will also get the specified
- model's element as argument. The model's element can also be the whole
- resource itself (formally, it can be any EMF <abbr title="org.eclipse.emf.common.notify.Notifier">Notifier</abbr>
- ).
- </p>
- <p>
- It is crucial to specify the correct model's element to make undo/redo work
- correctly: all the modifications performed in the lambda expression that concern the
- specified element will be recorded, in order to implement undo/redo.
- </p>
- <p>
- For example, this command, that will add a new book to the library, and sets
- its author to the selected writer will work as expected, and selecting
- undo will effectively remove the book from the writer's list and from the library:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- emfMenus{
- Writer w -&gt; #[
- actionChange("New book", w.eContainer as Library,
- [
- library |
- val book = factory.createBook
- library.books += book
- book.title = "A new book"
- book.author = w
- ]
- )
- ]
- }
- </pre>
- <p>
- </p>
- <p>
- This works since we specify the containing library as the model's element, thus,
- all modifications that concern the library will be recorded.
- </p>
- <p>
- On the contrary, this variant, will perform exacty the same actions on the model, but selecting
- undo will only remove the book from the writer's list, and the book will still
- be present in the library:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- emfMenus{
- Writer w -&gt; #[
- // in this variant undo will only unset the book's author,
- // but it will not remove the added code from the library
- // since we record changes concerning the writer only
- actionChange("New book (variant)", w,
- [
- writer |
- val library = writer.eContainer as Library
- val book = factory.createBook
- library.books += book
- book.title = "A new book"
- book.author = w
- ]
- )
- ]
- }
- </pre>
- <p>
- </p>
- <p>
- This happens since we specified the writer as the model's element, thus only
- the changes that concern the writer will be undone.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Drag and Drop</h2>
- <p>
- Drag and drop can be added to any <abbr title="org.eclipse.jface.viewers.StructuredViewer">StructuredViewer</abbr>
- by using an
- injected <abbr title="org.eclipse.emf.parsley.edit.ui.dnd.ViewerDragAndDropHelper">ViewerDragAndDropHelper</abbr>
- ,
- using its methods <strong>addDragAndDrop</strong>.
- </p>
- <p>
- Currently, drag and drop is completely delegated to EMF.Edit.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Factories</h2>
- </br>
- <h3 class="featurette-heading text-parsley2">Widget Factory<a id="WidgetFactory"></a></h3>
- <p>
- The actual creation of text field, buttons, labels, etc. is delegated to an
- implementation of <abbr title="org.eclipse.emf.parsley.widgets.IWidgetFactory">IWidgetFactory</abbr>
- , which has several methods
- like <strong>createText</strong>, <strong>createLabel</strong>, etc. We provide two implementations of such interface
- </p>
- <p>
- </p>
- <ul>
- <li><abbr title="org.eclipse.emf.parsley.widgets.DialogWidgetFactory">DialogWidgetFactory</abbr></li>
- <li><abbr title="org.eclipse.emf.parsley.widgets.FormWidgetFactory">FormWidgetFactory</abbr>
- which is a specialization of the above,
- specific for forms.</li>
- </ul>
- <p>
- </p>
- <p>
- Usually, you do not need to customize such factories, which are used internally by the framework,
- like in <a href="#FormControlFactory"></a> and <a href="#DialogControFactory"></a>.
- </p>
- <p>
- You may want to customize such factories in case all your controls must have a specific style;
- in such case, just inherit from our base classes
- (there is no DSL section for such customizations, since they can be made in plain Java easily)
- and bind such custom implementations in the Guice module.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Form Control Factory<a id="FormControlFactory"></a></h3>
- <p>
- <strong>EMF Parsley</strong> lets you customize the <strong>form controls</strong> via the DSL as in the following example.
-
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- formControlFactory {
- control {
- Library : name -&gt; { }
- Writer : books -&gt;
- createLabel(
- books.map[title].join(", "))
- Writer : name -&gt; { createLabel(parent, "") }
- target { observeText }
- Writer : firstName -&gt;
- toolkit.createLabel(parent, "")
- target observeText(SWT::Modify)
- Borrower : firstName -&gt; {
- createText(firstName, SWT::MULTI, SWT::BORDER,
- SWT::WRAP, SWT::V_SCROLL)
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- For each pair EClass, EStructuralFeature you can either simply return a Control or specify also the target
- for the databinding (see some examples above).
-
- If you want to customize the controls in Java, you can extend the class <abbr title="org.eclipse.emf.parsley.composite.FormControlFactory">FormControlFactory</abbr>
- .
- Using the same polimorphic mechanism of the labels, the programmer can write a method with the keyword <strong>'control'</strong>
- followed by the EClass and EStructuralFeature undescore-character-separated. The method
- must accept as parameters the <strong>DataBinding Context</strong> and the <strong>Feature Observable</strong> that can be used for databinding.
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public Control control_Writer_name(DataBindingContext dbc,IObservableValue featureObservable) {
- //Creating the control
- Text text = getToolkit().createText(getParent(), "");
- text.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
- text.setBackground(getToolkit().getColors().getColor(IFormColors.TITLE));
- //Binding the control to the feature observable
- dbc.bindValue(SWTObservables.observeText(text, SWT.Modify), featureObservable);
- return text;
- }
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Dialog Control Factory<a id="DialogControFactory"></a></h3>
- <p>
- If you want to customize controls in Dialog, you can use the specific DSL section <strong>dialogControlFactory</strong>:
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- dialogControlFactory {
- control {
- ...
- }
- }
- </pre>
- <p>
- </p>
- <p>
- This customization is exactly as in the case of the form of the previous section.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Editing Domain</h2>
- <p>
- The concept of <abbr title="org.eclipse.emf.edit.domain.EditingDomain">EditingDomain</abbr>
- is crucial for editing
- EMF models; we refer to the <strong>EMF.Edit</strong> <a href="http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.emf.doc%2Freferences%2Foverview%2FEMF.Edit.html">documentation</a> for further details.
- In particular, the editing domain keeps track of commands executed on an EMF model,
- thus enabling undo/redo mechanisms and "dirty state" management for saveable parts.
- </p>
- <p>
- EMF Parsley aims at hiding the management of the editing domain, so that
- everything should work smoothly and as expected, in an automatic way. In particular,
- it is rare that you need to perform customizations on this mechanisms.
- However, there might be cases when you need to be aware of this concept, especially
- if you need to use one of our customizations. Moreover, you need to be aware of some
- of the assumptions that EMF Parsley automatic mechanisms rely on (we inherit these assumptions
- from EMF.Edit itself).
- </p>
- <p>
- First of all, all the EMF <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
- s that you want to edit with EMF Parsley must be
- contained in a <abbr title="org.eclipse.emf.ecore.resource.ResourceSet">ResourceSet</abbr>
- , which, in turn,
- must be contained in an <abbr title="org.eclipse.emf.edit.domain.EditingDomain">EditingDomain</abbr>
- .
- This is achieved automatically when using our <strong>ResourceLoader</strong>, <a href="#ResourceLoader">Resource Loader</a>.
- </p>
- <p>
- Two resources loaded with different resource loaders will be contained in two
- different editing domains. Two resources loaded with the same resource loader will
- be in the same resource set and use the same editing domain.
- </p>
- <p>
- Our default implementation of editing domain uses the EMF <abbr title="org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain">AdapterFactoryEditingDomain</abbr>
- ,
- so that all the EMF.Edit default mechanisms will work correctly. In particular,
- our customization uses Google Guice mechanisms (see <a href="#addref" rel="Dependency Injection With</br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Google Guice">Dependency Injection With Google
- Guice</a>), thus if you need an editing domain in your own views all you have to do is
- to inject it, e.g.,
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject
- private EditingDomain editingDomain;
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Editing Domain Provider<a id="EditingDomainProvider"></a></h3>
- <p>
- If you need to provide a custom implementation of the editing domain
- (for example, because you want to use a transactional editing domain), you need
- to implement a custom Google Guice <abbr title="com.google.inject.Provider">Provider</abbr>
- and
- in your Guice module override this method:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public Class&lt;? extends Provider&lt;EditingDomain&gt;&gt; provideEditingDomain() {
- return DefaultEditingDomainProvider.class;
- }
- </pre>
- <p>
- </p>
- <p>
- Such custom provider will then have to create an editing domain and return it.
- </p>
- <p>
- We have some custom editing domain providers that might be useful in some
- situations:
- </p>
- <p>
- </p>
- <ul>
- <li><strong>GlobalAdapterFactoryEditingDomainProvider</strong>: all the injected
- editing domains will be the same in the same JVM, thus all your
- components will share exactly the same editing domain instances, and
- all the resources will be contained in the same resource set of the same
- editing domain.</li>
- <li><strong>SingletonAdapterFactoryEditingDomainModule</strong>: similar to the previous
- one, but according to the semantics of Google Guice <abbr title="com.google.inject.Singleton">@Singleton</abbr>
- ,
- i.e., only those components injected with the same injector will share
- the same editing domain. This basically means that all the components
- created with the same Parsley Guice module will share the same editing domain.</li>
- </ul>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Editing Domain Finder<a id="EditingDomainFinder"></a></h3>
- <p>
- All the EMF Parsley saveable views and editors will have their own
- editing domain (modulo what we explained in <a href="#EditingDomainProvider">Editing Domain Provider</a>).
- </p>
- <p>
- The EMF Parsley views that react on selection do NOT have a preset
- editing domain, since they will represent (and possibly edit) EMF objects
- selected in some other views, i.e., such objects can be contained in resources
- of different resource sets (and different editing domains).
- Thus, the editing domain of the currently shown object is dynamically
- retrieved through an injected <strong>EditingDomainFinder</strong>. This default
- implementation basically delegates to the standard EMF.Edit mechanisms
- for retrieving the editing domain. In cases where the editing domain cannot
- be found (e.g., because the object is not contained in a resource, or its resource
- is not contained in a resource set, or its resource set is not contained in an
- editing domain), then editing will not be possible (i.e., context menus <a href="#addref" rel="Contextual Menu"></a> and drag
- and drop <a href="#addref" rel="Drag and Drop">Drag and Drop</a> will not work).
- </p>
- <p>
- You can provide and bind a custom implementation of the <strong>EditingDomainFinder</strong>
- which is particularly useful if you manage a transactional editing domain.
- </p>
- <p>
- This is required only in some specific and advanced scenarios.
- </p>
- <p>
- In standard situations you will not have to worry about that, and
- editing mechanisms will work out of the box, including dragging an
- element from one view into another view, provided they are in the
- same resource set and such drag and drop makes sense.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Resources</h2>
- <p>
- </p>
- <ul>
- <li>If you need a machanism to fill some data for the first time you use a model, you can provide
- a specific implementation of <a href="#ResourceManager">Resource Manager</a>.</li>
- <li>If you want to interact with Resource Loading, you can provide a specific <a href="#ResourceLoader">Resource
- Loader</a></li>
- </ul>
- <p>
- </p>
- <p>
- Concerning saving objects, there are some specific parts that can be customized:
- </p>
- <p>
- </p>
- <ul>
- <li><a href="#ResourceSaveStrategy">Resource Save Strategy</a>, if you want to manage the save.</li>
- </ul>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Resource Loader<a id="ResourceLoader"></a></h3>
- <p>
- The class <abbr title="org.eclipse.emf.parsley.resource.ResourceLoader">ResourceLoader</abbr>
- can be used to handle resource loading.
- This class uses internally the <a href="#ResourceManager">Resource Manager</a>.
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Resource Manager<a id="ResourceManager"></a></h3>
- <p>
- Tasks concerning an EMF <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
- are
- delegated to <abbr title="org.eclipse.emf.parsley.resource.ResourceManager">ResourceManager</abbr>
- .
- </p>
- <p>
- One of such tasks is initializing the resource, e.g., when, after loading, it is
- found empty. You can derive from this class (and bind it in the Guice module) and provide a custom implementation
- of the method <strong>initialize</strong>.
- </p>
- <p>
- Saving a resource is also delegated to this class, using the method <strong>save</strong>,
- which is expected to return a boolean value representing whether saving
- has succeeded (the default implementation simply saves the resource and returns true).
- </p>
- <p>
- In the DSL, you can specify a <strong>resourceManager</strong> block, and within that block
- you can specify <strong>initializeResource</strong> and <strong>saveResource</strong>, which correspond to
- <strong>inizialize</strong> and <strong>save</strong> methods, respectively. In both cases, inside the
- block expression, the resource is available with the name <strong>it</strong>; for example
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- import org.eclipse.emf.parsley.examples.library.EXTLibraryFactory
-
- ...
-
- resourceManager {
- val EXTLibraryFactory libraryFactory = EXTLibraryFactory.eINSTANCE;
-
- initializeResource {
- // it is of type org.eclipse.emf.ecore.resource.Resource
- it.getContents() += libraryFactory.createLibrary
- }
- saveResource {
- // it is of type org.eclipse.emf.ecore.resource.Resource
- it.save(null)
- return true
- }
- }
-
- ...
- </pre>
- <p>
- </p>
- </br>
- <h3 class="featurette-heading text-parsley2">Resource Save Strategy<a id="ResourceSaveStrategy"></a></h3>
- <p>
- Resource saving is delegated to <abbr title="org.eclipse.emf.parsley.resource.ResourceSaveStrategy">ResourceSaveStrategy</abbr>
-
- which, by defaults only saves the passed <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
- ,
- by delegating to <abbr title="org.eclipse.emf.parsley.resource.ResourceManager">ResourceManager</abbr>
-
- (see <a href="#ResourceManager"></a>).
- You can inject your own save strategy and customize the saving strategy, for
- instance, you may want to validate the resource before saving
- (a usable example of this strategy is
- <abbr title="org.eclipse.emf.parsley.resource.ValidateBeforeSaveStrategy">ValidateBeforeSaveStrategy</abbr>
- ,
- see also section <a href="#addref" rel="Validation">Validation</a>).
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Configurator</h2>
- <p>
- In Parsley, instead of using abstract classes, we often provide concrete
- classes that implement superclass' abstract methods (or interface methods)
- by delegating to an injected <abbr title="org.eclipse.emf.parsley.config.Configurator">Configurator</abbr>
- .
- Such configurator calls methods in its hierarchy using polymorphic dispatch;
- in particular, the first argument passed to these methods is the object
- requesting that specific service to the configurator; typically it will be
- a UI object, e.g., a view part.
- </p>
- <p>
- These are the methods that can be customized declaratively:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- /**
- * Returns the {@link URI} of the resource for the requestor for any use the requestor may need it
- * @param requestor
- * @return
- */
- public URI resourceURI(Object requestor) {
- return null;
- }
-
- /**
- * Returns the {@link EClass} for the requestor
- * @param requestor
- * @return
- */
- public EClass eClass(Object requestor) {
- return null;
- }
- </pre>
- <p>
- </p>
- <p>
- The idea is that clients that use such an injected instance should call
- the <strong>get</strong> methods, e.g., <strong>getEClass</strong>, while the customization should be defined
- using polymorphic dispatch, e.g.,
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- class MyConfigurator extends Configurator {
-
- public EClass eClass(MyView1 view1) {
- return ...;
- }
-
- public EClass eClass(MyOtherView view) {
- return ...;
- }
- }
- </pre>
- <p>
- </p>
- <p>
- In the DSL, you can specify a <strong>configurator</strong> section, e.g.,
- (the requestor object can be accessed using the implicit variable
- <strong>it</strong>):
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- module my.project {
-
- configurator {
- resourceURI {
- MyTreeFormView -&gt; {
- return ...;
- }
- MyTableView -&gt; {
- return ...;
- }
- }
- eClass {
- MyTableView -&gt; {
- return ...;
- }
- MyTableFormView -&gt; {
- return ...;
- }
- }
- }
- }
- </pre>
- <p>
- </p>
- <p>
- The project wizard will generate in the <strong>module.parsley</strong> the
- required <strong>configurator</strong> sections, depending on the specific template chosen,
- with some <strong>// TODO</strong> comments to help implementing them, e.g.,
- </p>
- <p>
- </p>
- <pre class="prettyprint lang-parsley" skin="desert">
- module my.project {
-
- configurator {
- eClass {
- MyView -&gt; {
- // TODO return the EClass of objects to be shown
- }
- }
- resourceURI {
- MyView -&gt; {
- // TODO create and return a org.eclipse.emf.common.util.URI
- return null;
- }
- }
- }
- }
- </pre>
- <p>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Validation</h2>
- <p>
- EMF Parsley supports standard EMF validation automatically, e.g., via the context menu
- "Validate"; thus, if you already have constraints implemented for your meta-model, the
- validation action will check them.
- </p>
- <p>
- EMF validation can also be triggered manually using an injected <abbr title="org.eclipse.emf.parsley.validation.ValidationRunner">ValidationRunner</abbr>
- ,
- which provides methods for validating a single <abbr title="org.eclipse.emf.ecore.EObject">EObject</abbr>
- or an entire
- <abbr title="org.eclipse.emf.ecore.resource.Resource">Resource</abbr>
- . These <strong>validate</strong> methods return an EMF
- <abbr title="org.eclipse.emf.common.util.Diagnostic">Diagnostic</abbr>
- that can be used to find out possible errors, warnings
- and infos collected during the validation.
- </p>
- <p>
- There are overloaded versions of <strong>validate</strong> methods that also take an
- <abbr title="org.eclipse.emf.parsley.validation.IssueReporter">IssueReporter</abbr>
- :
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- /**
- * Validates, reports diagnostics through the passed {@link IssueReporter}
- * and returns the list of reported diagnostics.
- *
- * @param eObject
- * @param reporter
- * @return
- */
- public List&lt;Diagnostic&gt; validate(EObject eObject, IssueReporter reporter) {
- return reporter.report(validate(eObject));
- }
-
- /**
- * Validates, reports diagnostics through the passed {@link IssueReporter}
- * and returns the list of reported diagnostics.
- *
- * @param resource
- * @param reporter
- * @return
- */
- public List&lt;Diagnostic&gt; validate(Resource resource, IssueReporter reporter) {
- return reporter.report(validate(resource));
- }
- </pre>
- <p>
- </p>
- <p>
- The reporter is asked to report the collected diagnostic and it is expected to return
- the list of issues effectively reported. For example, an issue reporter can
- report only errors (e.g., diagnostic whose severity is <strong>Diagnostic.ERROR</strong>), while
- ignoring warnings and other diagnostic information.
- </p>
- <p>
- We provide a utility class that can be injected, <abbr title="org.eclipse.emf.parsley.validation.DiagnosticUtil">DiagnosticUtil</abbr>
- ,
- with utility methods, like flattening diagnostic into a list (EMF diagnostic are typically nested in
- a tree form), to quickly select only the errors, and to have a string representation.
- </p>
- <p>
- The default implementation of <abbr title="org.eclipse.emf.parsley.validation.IssueReporter">IssueReporter</abbr>
-
- is <abbr title="org.eclipse.emf.parsley.validation.DialogErrorReporter">DialogErrorReporter</abbr>
- , which uses an EMF
- dialog to report ONLY errors. Another implementation that can be used for testing purposes
- is <abbr title="org.eclipse.emf.parsley.validation.LogIssueReporter">LogIssueReporter</abbr>
- , which logs diagnostic using
- the corresponding log4j methods (i.e., <strong>error</strong>, <strong>warn</strong>, <strong>info</strong>).
- </p>
- <p>
- An example of use of the above classes can be found in <abbr title="org.eclipse.emf.parsley.resource.ValidateBeforeSaveStrategy">ValidateBeforeSaveStrategy</abbr>
-
- (see section <a href="#ResourceSaveStrategy">Resource Save Strategy</a>):
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- public class ValidateBeforeSaveStrategy extends ResourceSaveStrategy {
-
- @Inject
- private ValidationRunner validationRunner;
-
- @Inject
- private IssueReporter issueReporter;
-
- @Override
- public boolean save(Resource resource) throws IOException {
- if (!precondition(resource)) {
- return false;
- }
- return super.save(resource);
- }
-
- protected boolean precondition(Resource resource) {
- return validationRunner.validate(resource, issueReporter).size() == 0;
- }
- }
- </pre>
- <p>
- </p>
- <p>
- Thus, if you use a <abbr title="org.eclipse.emf.parsley.resource.ValidateBeforeSaveStrategy">ValidateBeforeSaveStrategy</abbr>
- ,
- with the default Guice bindings, upon saving, if validation finds errors, it will
- cancel the saving and it will show a dialog with errors.
- </p>
- </div>
- </div>
- </div>
- <hr style="width:64.6%;margin-bottom:28px;margin-top:30px;" class="col-md-8 col-md-offset-3">
- <div class="row featurette">
- <div class="col-md-8 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">Advanced Features</h1>
- <p>
- In this chapter we describe some advanced features.
- </p>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Testing Framework</h2>
- <p>
- We provide some utility classes for testing <strong>EMF Parsley</strong> components in the feature
- "Emf Parsley Junit4 Support". By deriving from one of the abstract classes in our
- testing bundle, you will be able to write tests that are meant to be run as Junit test,
- that is to say, NOT as Plug-in Junit tests. Thus, you will not need a running Eclipse product
- to execute such tests: they will be much faster. Indeed, many parts of Parsley can
- be tested even without a running Eclipse.
- </p>
- <p>
- </p>
- <ul>
- <li><abbr title="org.eclipse.emf.parsley.junit4.AbstractEmfParsleyTest">AbstractEmfParsleyTest</abbr>
- : this provides
- a few utility methods, e.g., for creating an <abbr title="com.google.inject.Injector">Injector</abbr>
- .</li>
- <li><abbr title="org.eclipse.emf.parsley.junit4.AbstractEmfParsleyShellBasedTest">AbstractEmfParsleyShellBasedTest</abbr>
- : this allows
- to run Junit tests that require a <abbr title="org.eclipse.swt.widgets.Display">Display</abbr>
- and a
- <abbr title="org.eclipse.swt.widgets.Shell">Shell</abbr>
- .</li>
- <li><abbr title="org.eclipse.emf.parsley.junit4.AbstractEmfParsleyControlBasedTest">AbstractEmfParsleyControlBasedTest</abbr>
- : an extension
- of the previous class for tests that also require databinding capabilities, e.g.,
- tests for <abbr title="org.eclipse.swt.widgets.Control">Control</abbr>
- elements; this provides many assert
- methods for several kinds of controls, such as <strong>assertCheckbox</strong>, <strong>assertCombo</strong>, etc.</li>
- </ul>
- <p>
- </p>
- <p>
- We use these classes for testing most of our classes; you might want to have a look
- at the project <strong>org.eclipse.emf.parsley.tests</strong> for some usage examples.
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">Eclipse 4.x</h2>
- <p>
- Instead of using the Extension Point mechanism, EMF Parsley leverages from DSL and Google Guice Injection.
- </p>
- <p>
- Because of this, it is very easy to use it with Eclipse 4.x (e4).
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>First Example Setup</strong>
- </p>
- <p>
- If you followed the steps described in section <a href="#addref" rel="First Example">First Example</a> you will have already
- what we need to begin. Otherwise the following wizard will bring you to that point.
- </p>
- <p>
- </p>
- <ol>
- <li>File -&gt; New... -&gt; Example...</li>
- <li>from Category "Emf Parsley Examples", select "Emf Parsley First Example"</li>
- <li>press Next and Finish</li>
- </ol>
- <p>
- </p>
- <p>
- You will end up with three plug-ins:
- </p>
- <p>
- </p>
- <ul>
- <li>org.eclipse.emf.parsley.examples.firstexample (the EMF Parsley example plug-in)</li>
- <li>org.eclipse.emf.examples.library (the model plug-in)</li>
- <li>org.eclipse.emf.examples.library.edit (the model.edit plug-in)</li>
- </ul>
- <p>
- </p>
- <p>
- As a reminder, in section <a href="#addref" rel="First Example">First Example</a> we reached the point where we launched a second Eclipse
- instance (but, of course, just defining a product you could have a standalone 3.x application) with a
- view (called "My Library Tree Form") that allowed to manage the model.
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Preparing for a pure e4 Application</strong>
- </p>
- <p>
- What we will do now is starting from the previous step and create an e4 Application (on top of
- the previous plug-ins) that gets to the same result, but now with a pure e4 Part.
- </p>
- <p>
- In order to do this we need to export the <strong>"org.eclipse.emf.parsley.examples.firstexample"</strong> package from the first plug-in.
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Create an e4 Application</strong>
- </p>
- <p>
- Now let's create a new, empty, e4 application, e.g. <strong>"org.eclipse.emf.parsley.examples.firstexample.application"</strong>
- (you can find details on how to create e4 applications in <a href="http://www.rcp-vision.com/?p=4694&lang=en">our
- tutorials</a>).
- </p>
- <p>
- Create a Part and ensure that the application starts.
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Using a TreeComposite into an e4 Part</strong>
- </p>
- <p>
- In the just created plug-in we need dependencies from the previous plug-ins: so open the <strong>org.eclipse.emf.parsley.examples.firstexample.application/MANIFEST.MF</strong> file, go to <strong>Dependencies</strong>
- tab and add the three previous plug-ins. Add also <strong>"org.eclipse.emf.parsley"</strong> plug-in.
- Don't forget to add the previous, and the required plug-ins, also to the Product.
- </p>
- <p>
- Open the Part java class and make the following changes:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- // Use these imports during Organizing Imports operation
- import org.eclipse.emf.common.util.URI;
- import org.eclipse.emf.ecore.resource.Resource;
- import org.eclipse.swt.widgets.Composite;
-
- // The part implements IMenuListener for context menu handling
- public class MyEclipse4Part {
-
- //the EMF Parley composite for showing a tree and a detail form
- private TreeFormComposite treeFormComposite;
- //the EMF Resource
- private Resource resource;
- //URI for EMF Resource
- private URI uri = URI.createFileURI(System.getProperty("user.home")
- + "/MyLibrary.library");
-
- </pre>
- <p>
- </p>
- <p>
- Modify the <strong>@PostConstruct</strong> method with this code:
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @PostConstruct
- public void postConstruct(Composite parent) throws Exception {
- // Guice injector
- private Injector injector = FirstexampleInjectorProvider.getInjector();
-
- // The EditingDomain is needed for context menu and drag and drop
- EditingDomain editingDomain = injector.getInstance(EditingDomain.class);
-
- ResourceLoader resourceLoader = injector.getInstance(ResourceLoader.class);
- //load the resource
- resource = resourceLoader.getResource(editingDomain, uri).getResource();
-
- TreeFormFactory treeFormFactory = injector.getInstance(TreeFormFactory.class);
- //create the tree-form composite
- treeFormComposite = treeFormFactory.createTreeFormComposite(parent, SWT.BORDER);
-
- // Guice injected viewer context menu helper
- ViewerContextMenuHelper contextMenuHelper = injector.getInstance(ViewerContextMenuHelper.class);
- // Guice injected viewer drag and drop helper
- ViewerDragAndDropHelper dragAndDropHelper = injector.getInstance(ViewerDragAndDropHelper.class);
-
- // set context menu and drag and drop
- contextMenuHelper.addViewerContextMenu(treeFormComposite.getViewer(), editingDomain);
- dragAndDropHelper.addDragAndDrop(treeFormComposite.getViewer(), editingDomain);
-
- //update the composite
- treeFormComposite.update(resource);
- }
- </pre>
- <p>
- </p>
- <p>
- The Google Guice Injector (not to be confused with the Eclipse e4 Injector) is retrieved
- using the injector provider class generated by the DSL compiler
- (see also <a href="#InjectorProvider">Obtaining the Injector</a>).
- </p>
- <p>
- If you now run the application you will be able to manage the model:
- </p>
- <p>
- </p>
- <img src="images/07-eclipse4-part.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- but you will notice that it is not possible to persist the changes to the model.
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Adding the dirty state and Save command</strong>
- </p>
- <p>
- In order to allow persisting the model changes we have to add the dirty state handling to the part and
- the Save command to the application.
- Let's start with adding the following attribute to the part
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Inject
- MDirtyable dirty;
- </pre>
- <p>
- </p>
- <p>
- add to <strong>@PostConstruct</strong> method the following code in order to update the dirty state
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- editingDomain.getCommandStack().addCommandStackListener(
- new CommandStackListener() {
- public void commandStackChanged(EventObject event) {
- if (dirty != null)
- dirty.setDirty(true);
- }
- });
- </pre>
- <p>
- </p>
- <p>
- and add the <strong>@Persist</strong> method, which will be called when the part is saved
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- @Persist
- public void save(MDirtyable dirty) throws IOException {
- resource.save(null);
- if (dirty != null) {
- dirty.setDirty(false);
- }
- }
- </pre>
- <p>
- </p>
- <p>
- and, in the end, add the <strong>Save</strong> handler along with the correspondent <strong>Command</strong> and <strong>Menu</strong>
- (you can find how to create handlers, commands and menus in an e4 applications in <a href="http://www.rcp-vision.com/?p=4972&lang=en">our
- tutorials</a>)
- </p>
- <p>
- </p>
- <pre class="prettyprint" skin="desert">
- import javax.inject.Named;
-
- public class SaveHandler {
-
- @Execute
- void execute(EPartService partService, @Named(IServiceConstants.ACTIVE_PART) MPart part) {
- partService.savePart(part, false);
- }
- }
- </pre>
- <p>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">RAP</h2>
- <p>
- As you may know <a href="http://eclipse.org/rap/">RAP (Remote Application Platform)</a> is a technology that allows you to run an Eclipse RCP application over the web.
- </p>
- <p>
- In order to obtain this goal you have to setup a specific RAP Target Platform, for instance the one that RAP itself provides once you install it.
- </p>
- <p>
- However when you want to use an Eclipse RCP framework over the RAP Platform, you generally have to deal with
- dependencies, since not all Eclipse frameworks are ready-to-use with RAP, especially those related with the SWT layer.
- </p>
- <p>
- EMF Parsley provides a proper RAP Target Platform that allows you to start leveraging Parsley potentials to the web the same way you have
- learned to do with desktop (RCP) development.
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Installing the RAP Tools</strong>
- </p>
- <p>
- To begin with, you need to install the RAP Tools into the IDE.
- This can be accomplished with the following steps:
- </p>
- <ol>
- <li>Help -&gt; Install New Software ...</li>
- <li>select the main Eclipse Update site</li>
- <li>expand category "Web, XML, Java EE and OSGi Enterprise Development"</li>
- <li>select "RAP Tools" and complete the installation, restarting the IDE at the end</li>
- <li>after IDE restarts just close the Welcome page</li>
- </ol>
- <p>
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Setup the EMF Parsley RAP Target Platform</strong>
- </p>
- <p>
- After having installed EMF Parsley as described <a href="https://www.eclipse.org/emf-parsley/download.html">here</a> and
- created a new workspace, you can setup the EMF Parsley RAP Target Platform in the following way:
- </p>
- <ol>
- <li>File -&gt; New... -&gt; Example...</li>
- <li>from Category "Emf Parsley Examples", select "Emf Parsley Rap Target Platform Example"</li>
- <li>press Next and Finish</li>
- <li>open the Target Definition file <strong>emf-parsely-rap.target</strong></li>
- <li>wait until the "Resolving Target Definition" job is done (check the status bar)</li>
- <li>when finished, click on hyperlink "Set as Target Platform"</li>
- </ol>
- <p>
- </p>
- <p>
- You will end up with a RAP-enabled workspace, enhanced by EMF and Parsley!
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Running the Parsley RAP UI Example</strong>
- </p>
- <p>
- Here is the fastest way to get a working web application with all the stuff put togheter:
- </p>
- <ol>
- <li>File -&gt; New... -&gt; Example...</li>
- <li>from Category "Emf Parsley Examples", select "Emf Parsley Rap Example"</li>
- <li>press Next and Finish</li>
- <li>expand plug-in <strong>"org.eclipse.emf.parsley.examples.rap.ui"</strong></li>
- <li>right-click "Emf_Parsley_RAP_UI_Example.launch" and click "Run as" "Emf_Parsley_RAP_UI_Example"</li>
- </ol>
- <p>
- </p>
- <p>
- What you will get is a web application that allows you to interact with the model instance as you would
- do in a desktop (RCP) environment.
- </p>
- <p>
- </p>
- <img src="images/08-rap-ui-example-running.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- In this web application you can see two views:
- </p>
- <ul>
- <li>the one on the left is a read-only view; it just reflects the model content, but it does not react to changes (the classic Eclipse dirty indicator is not triggered
- by changes) and you are not able to save. Its model is created in class <strong>org.eclipse.emf.parsley.examples.rap.ui.GuiceModule.CustomResourceManager</strong>
- and is not persisted</li>
- <li>the view on the right is instead a Saveable view and therefore it not only triggers the dirty state after
- a change, but also allows you to save the modifications with the automatic dirty state reset. Its model
- is persisted in file <strong>System.getProperty("java.io.tmpdir")+"/My.model")</strong></li>
- </ul>
- <p>
- </p>
- <p>
- Of course, since this is a web application, you can also open a browser on another pc or device on the same network and type the address,
- replacing 127.0.0.1 with the IP of the machine where the application was launched.
- </p>
- <p>
- </p>
- <ol>
- </ol>
- <p>
- </p>
- <p>
- <strong>Running the Parsley RAP CDO Example</strong>
- </p>
- <p>
- The EMF default XMI persistence is certainly very handy to start with, but as soon as you want a more
- production-ready EMF persistence architecture, well, <a href="http://wiki.eclipse.org/CDO">CDO</a> is for sure the way to go.
- In fact with CDO you basically have an EMF model instance shared between clients, that also allows the
- clients to be synchronized with the model changes.
- </p>
- <p>
- In this example, in order to keep things simple, we will use CDO with an in-memory store (MEMStore) whose contents will be lost once the server is stopped.
- However CDO can be configured for usage with RDBMS, Object-oriented or NO-SQL databases (see <a href="http://eclipse.org/cdo/documentation/">here</a> for details)
- </p>
- <p>
- To start with we need a CDO Server running and we can obtain it with an example plugin that can be used
- both in an RCP and in a RAP workspace.
- </p>
- <p>
- </p>
- <ol>
- <li>File -&gt; New... -&gt; Example...</li>
- <li>from Category "Emf Parsley Examples", select "Emf Parsley Cdo Server Example"</li>
- <li>press Next and Finish</li>
- <li>expand plug-in <strong>"org.eclipse.emf.parsley.examples.cdo.server"</strong></li>
- <li>right-click "CDOServerExample.launch" and click "Run as" "CDOServerExample"</li>
- <li>a message on the Console <strong>"Repository[demo] started!"</strong> informs that the CDO Server instance
- is started!</li>
- </ol>
- <p>
- </p>
- <p>
- Now we can create the web application that will use the CDO server just started.
- </p>
- <p>
- </p>
- <ol>
- <li>File -&gt; New... -&gt; Example...</li>
- <li>from Category "Emf Parsley Examples", select "Emf Parsley Rap Cdo Example"</li>
- <li>press Next and Finish</li>
- </ol>
- <p>
- </p>
- <p>
- The plug-in projects created are:
- </p>
- <p>
- </p>
- <ul>
- <li>the Model (org.eclipse.emf.parsley.examples.cdo.model)</li>
- <li>a Parsley plug-in with a TreeForm (org.eclipse.emf.parsley.examples.cdo.treeform)</li>
- <li>the webapp (org.eclipse.emf.parsley.examples.cdo.rap)</li>
- </ul>
- <p>
- </p>
- <p>
- Then let's start the application
- </p>
- <p>
- </p>
- <ol>
- <li>expand plug-in <strong>"org.eclipse.emf.parsley.examples.cdo.rap"</strong></li>
- <li>right-click "EMF-Parsley_Library_RAP.launch" and click "Run as" "EMF-Parsley_Library_RAP"</li>
- </ol>
- <p>
- </p>
- <p>
- If you happen to see this
- </p>
- <p>
- </p>
- <img src="images/08-rap-refresh.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- just press the refresh button and should see the following
- </p>
- <p>
- </p>
- <img src="images/08-rap-cdo-1.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- <p>
- Now feel free to open the same address from more browsers window (yes, on different machines or devices, possibly)
- and see the power of this technology stack at work!
- </p>
- <p>
- </p>
- <img src="images/08-rap-cdo-2.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;">
- <p>
- </p>
- </div>
- </div>
- </div>
- <hr style="width:64.6%;margin-bottom:28px;margin-top:30px;" class="col-md-8 col-md-offset-3">
- <div class="row featurette">
- <div class="col-md-8 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">Migration Guide</h1>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">From 0.6.0 to 0.7.0</h2>
- <p>
- </p>
- <ul>
- <li><strong>Multiple DSL files in the same project</strong>: thanks to the radical change to the structure
- of EMF Parsley projects, detailed in the following, it is now possible to define several
- <strong>.parsley</strong> files in the same project.</li>
- <li><strong>Structure of projects</strong>: the structure of EMF Parsley projects has radically changed
- (see <a href="#DslProjectStructure">The structure of an EMF Parsley project</a>).
- If you have existing projects you need to perform these steps to adjust the compilation errors you will
- get:<ol>
- <li>Remove the executable extension factory class from the <strong>src</strong> folder (the DSL will now generate it in the
- <strong>emfparsley-gen</strong> source folder)
- <img src="images/project-migration-exec-ext-fact.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;"></li>
- <li>Remove the guice module from the <strong>src</strong> folder, in the example above, it is <strong>FirstexampleGuiceModule</strong></li>
- <li>Modify the activator: instead of extending <strong>EmfParsleyAbstractActivator</strong> it must extend the
- standard <abbr title="org.eclipse.ui.plugin.AbstractUIPlugin">AbstractUIPlugin</abbr>
- ; then remove the method<pre class="prettyprint" skin="desert">
- public EmfParsleyGuiceModule createModule()
- </pre></li>
- <li>Manually remove all the contents of the <strong>emfparsley-gen</strong> folder (the name of the generated
- classes are now prefixed with the module name, but the previously generated ones might still be there)
- <img src="images/project-migration-clean-gen.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;"></li>
- <li>Perform a "clean" on the project (so that the contents of <strong>emfparsley-gen</strong> are generated)</li>
- <li>Read the next part about <strong>plugin.xml</strong></li>
- </ol></li>
- <li><strong>The plugin.xml and the new EMF Parsley builder</strong>: the way we handle the
- <strong>plugin.xml</strong> has improved, and we also automatically merge subsequent changes in the
- DSL file <strong>parts</strong> section. Please have a look at <a href="#PluginXml">How the DSL handles the plugin.xml</a> for
- the details.IMPORTANT: This merging takes place ONLY if your project has the <strong>EMF Parsley builder nature</strong>.
- Since version 0.6.1 this nature is automatically applied to the projects created with our wizard.
- In existing projects, you have to enable the nature yourself by right-clicking on the project,
- then "Configure" and then "Enable EMF Parsley builder.Once you added this new nature, please remove the <strong>plugin.xml_emfparsley_gen</strong> from the root
- of your project, and perform a clean of the project.</li>
- <li><strong>InjectorProvider</strong>: the activator generated by the project wizard does not provide
- anymore a means to retrieve the injector. This functionality is now implemented by an <strong>InjectorProvider</strong>
- class which is automatically generated for each DSL module (see <a href="#InjectorProvider">Obtaining the Injector</a>).For example, in the first example,
- <a href="#addref" rel="First Example">First Example</a>, instead of doing<pre class="prettyprint" skin="desert">
- FirstexampleActivator.getDefault().getInjector();
- </pre>you need to do<pre class="prettyprint" skin="desert">
- FirstexampleInjectorProvider.getInjector();
- </pre></li>
- </ul>
- <p>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">From 0.5.0 to 0.6.0</h2>
- <p>
- </p>
- <ul>
- <li>The way we handle the <abbr title="org.eclipse.emf.edit.domain.EditingDomain">EditingDomain</abbr>
- is
- changed and improved to some extent. In standard scenarios this should not
- require any modifications. In advanced scenarios this will provide complete
- control on the editing domain. We refer to the new section in the documentation,
- <a href="#addref" rel="Editing Domain">Editing Domain</a>.</li>
- <li><strong>Tree With Columns</strong>: a new component has been added:The <strong>Tree With Columns Component</strong> provides a tree representation just like <a href="#addref" rel="Tree Component">Tree Component</a>,
- but it also shows table columns representing the features of the specified <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- .IMPORTANT: the <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- is used to retrieve the features to be shown, and
- NOT to filter elements to be shown (as opposite to the <a href="#addref" rel="Table Component">Table Component</a>). If a given
- row in the tree represents an object whose class does not have the feature for a given column, then the
- corresponding table cell for that object will be empty.For example, the following screenshot shows a tree with columns representing a library; the specified
- <abbr title="org.eclipse.emf.ecore.EClass">EClass</abbr>
- is the <strong>Writer</strong> so the columns show the features of the
- <strong>Writer</strong>'s class. Some of these features, e.g., <strong>address</strong>, <strong>firstName</strong> and <strong>lastName</strong>, are defined
- in the superclasses of <strong>Writer</strong>. The objects of class <strong>Employee</strong> have these features as well, while
- they don't have features that are specific of <strong>Writer</strong>, e.g., <strong>name</strong> and <strong>books</strong>, thus the corresponding
- cells for employees will be empty.<img src="images/03-components-treecolumns.png" class="img-responsive centered" style="margin-top:10px;margin-bottom:10px;"><strong>EMF Parsley</strong> provides a factory that can be used to create such a component, like in the code below:<pre class="prettyprint" skin="desert">
- @Inject ViewerFactory viewerFactory;
-
- (...)
-
- treeViewer = createTreeViewerWithColumns(parent, getEClass(), getContents());
- </pre>Since this component mixes the features of a tree and a table, the customizations are basically the
- same shown in the subsections of <a href="#addref" rel="Tree Component"></a> and <a href="#addref" rel="Table Component"></a>.</li>
- <li><strong>EmfSelectionHelper</strong> only deals with selection element; utility methods for events is now
- delegated to <strong>EmfEventHelper</strong>.</li>
- <li>label provider for trees and table label providers for tables can now specify declaratively custom
- fonts, foreground and background colors.For tables, you can customize the font, foreground and background color for the entire row or for a single
- cell.Here are some examples:<pre class="prettyprint lang-parsley" skin="desert">
- labelProvider{
- ...
- font {
- Book -&gt; // must return a org.eclipse.swt.graphics.Font
- }
- foreground {
- Book -&gt; // must return a org.eclipse.swt.graphics.Color
- }
- background {
- Book -&gt; // must return a org.eclipse.swt.graphics.Color
- }
- }
- </pre><pre class="prettyprint lang-parsley" skin="desert">
- tableLabelProvider {
- ...
- font {
- Library : name -&gt; JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)
- }
-
- foreground {
- Library : books -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)
- }
-
- background {
- Library : address -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)
- }
-
- rowFont {
- Library -&gt; JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)
- }
-
- rowForeground {
- Library -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)
- }
-
- rowBackground {
- Library -&gt; Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)
- }
- }
- </pre></li>
- </ul>
- <p>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">From 0.4 to 0.5</h2>
- <p>
- </p>
- <ul>
- <li><strong>ViewerInitializer</strong> has been removed: all creation and initialization of viewers
- is performed using <abbr title="org.eclipse.emf.parsley.viewers.ViewerFactory">ViewerFactory</abbr>
- ; its API has been
- revised and simplified.</li>
- <li>the packages <strong>factories</strong> and <strong>builders</strong> have been removed
- and their classes have been moved to other packages.
- If you get compiler errors, a simple "Organize Imports" should fix
- the imports. If you use the DSL a simple regeneration should fix things.</li>
- <li><strong>IViewerMouseListener</strong> has been moved from the <strong>listeners</strong>
- package to the <strong>viewers</strong> package.</li>
- <li>classes in <strong>editor.outline</strong> have been moved into <strong>editors</strong>
- package.</li>
- <li>The creation of caption labels for forms and dialogs has slightly
- changed, concerning the default behavior
- (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=472691">https://bugs.eclipse.org/bugs/show_bug.cgi?id=472691</a>):
- we take the text from <abbr title="org.eclipse.emf.edit.provider.IItemPropertyDescriptor">IItemPropertyDescriptor</abbr>
- if
- the EObject provides it. (This does not happen for table column headers, since we don't have
- any EObject when we build the table columns).
- If you used to call this method on a
- <abbr title="org.eclipse.emf.parsley.ui.provider.FormFeatureCaptionProvider">FormFeatureCaptionProvider</abbr>
- or
- <abbr title="org.eclipse.emf.parsley.ui.provider.DialogFeatureCaptionProvider">DialogFeatureCaptionProvider</abbr><pre class="prettyprint" skin="desert">
- public Label getLabel(Composite parent, EClass eClass, EStructuralFeature feature)
- </pre>be warned that this method has changed its signature into<pre class="prettyprint" skin="desert">
- public Label getLabel(Composite parent, EObject o, EStructuralFeature feature)
- </pre>and of course also its semantics, since you need to pass an EObject not its EClass.</li>
- <li>a new method is available in <abbr title="org.eclipse.emf.parsley.edit.action.EditingMenuBuilder">EditingMenuBuilder</abbr>
- ,
- <strong>actionChange</strong>: If you want to implement more complex menu commands that do not
- only add elements to a container, you can use the method
- <strong>actionChange</strong>, specifying the label for the menu, the model's element
- that will be affected by the changes specified as a lambda expression
- (the third argument). The lambda expression will also get the specified
- model's element as argument. (This is related to
- <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=475188">https://bugs.eclipse.org/bugs/show_bug.cgi?id=475188</a>).
- Please also have a look at the updated documentation of section <a href="#addref" rel="Contextual Menu">Contextual Menu</a>:
- the already existing <strong>actionAdd</strong> should be used with care, since it might leave the model
- with dangling references -- with that respect we also updated the first example
- <a href="#addref" rel="First Example">First Example</a>, so that
- it uses <strong>actionChange</strong> to implement correctly what we used to achieve with <strong>actionAdd</strong>.</li>
- <li>Adding context menu to a viewer has been extremely simplified
- (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=455727">https://bugs.eclipse.org/bugs/show_bug.cgi?id=455727</a>):
- A context menu can be added to any <abbr title="org.eclipse.jface.viewers.StructuredViewer">StructuredViewer</abbr>
- by using an
- injected <abbr title="org.eclipse.emf.parsley.menus.ViewerContextMenuHelper">ViewerContextMenuHelper</abbr>
- . This provides some
- methods for adding the context menu<pre class="prettyprint" skin="desert">
- @Inject ViewerContextMenuHelper contextMenuHelper;
- (...)
-
- // simplest form
- contextMenuHelper.addViewerContextMenu(viewer);
-
- // if you have an AdapterFactoryEditingDomain already
- contextMenuHelper.addViewerContextMenu(viewer, editingDomain);
-
- // if you're inside an IWorkbenchPart
- contextMenuHelper.addViewerContextMenu(viewer, editingDomain, part);
- </pre></li>
- <li>Drag and drop support has been separated from context menu support
- (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=475914">https://bugs.eclipse.org/bugs/show_bug.cgi?id=475914</a>):
- thus, adding context menu does NOT automatically add drag and drop.Drag and drop can be added to any <abbr title="org.eclipse.jface.viewers.StructuredViewer">StructuredViewer</abbr>
- by using an
- injected <abbr title="org.eclipse.emf.parsley.edit.ui.dnd.ViewerDragAndDropHelper">ViewerDragAndDropHelper</abbr>
- ,
- using its methods <strong>addDragAndDrop</strong>.</li>
- <li>Saveable table views and table views reacting on selection
- do not require an implementation of the method
- <strong>getContents()</strong>, which has also been removed from the API, from the
- <abbr title="org.eclipse.emf.parsley.config.Configurator">Configurator</abbr>
- methods, and from
- the <strong>configurator</strong> section in the DSL: contents retrieval is completely
- delegated to the new <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProvider">TableViewerContentProvider</abbr>
- ,
- whose default implementation is able to automatically retrieve all the
- contents of a given type (i.e., EClass) automatically.
- The DSL provides the new <strong>tableViewerContentProvider</strong> specification,
- see the new section <a href="#TableViewerContentProvider">Table Viewer Content Provider</a>.</li>
- <li>Similarly, table views reacting on selection
- do not require an implementation of the method
- <strong>getEStructuralFeature()</strong>: they require an implementation of
- <strong>getEClass()</strong> which specifies the type of the objects to be
- shown in the table.
- <strong>getEStructuralFeature()</strong> has also been removed from the API, from the
- <abbr title="org.eclipse.emf.parsley.config.Configurator">Configurator</abbr>
- methods, and from
- the <strong>configurator</strong> section in the DSL: contents retrieval is not
- performed using a feature (which is limitative): it is completely
- delegated to the new <abbr title="org.eclipse.emf.parsley.edit.ui.provider.TableViewerContentProvider">TableViewerContentProvider</abbr>
- ,
- whose default implementation is able to automatically retrieve all the
- contents of a given type (i.e., EClass) automatically.</li>
- </ul>
- <p>
- </p>
- </div>
- </br>
- <div >
- <h2 id="par" class="featurette-heading text-parsley1">From 0.3 to 0.4</h2>
- <p>
- </p>
- <ul>
- <li><strong>EmptyResourceInitializer</strong> has been removed: you should now use
- <abbr title="org.eclipse.emf.parsley.resource.ResourceManager">ResourceManager</abbr>
- ,
- see section <a href="#ResourceManager">Resource Manager</a></li>
- <li><strong>ResourceSaveManager</strong> has been removed: you should now use
- <abbr title="org.eclipse.emf.parsley.resource.ResourceSaveStrategy">ResourceSaveStrategy</abbr>
- ,
- see section <a href="#ResourceSaveStrategy">Resource Save Strategy</a></li>
- <li>Project wizards have been redesigned: they generate a <strong>module.parsley</strong>
- that uses the <strong>configurator</strong> for specifying required information
- (see section <a href="#addref" rel="Configurator">Configurator</a> and the updated
- first example, section <a href="#addref" rel="First Example">First Example</a>)</li>
- </ul>
- <p>
- </p>
- </div>
- </div>
- </div>
- </br></br></br></br></br></br></br>
- <!-- /END THE FEATURETTES -->
-</div>
- <!-- FOOTER -->
- <footer style="z-index: 1001;position:relative;background-color:#35414C;-webkit-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);box-shadow: 0px -3px 8px 0px rgba(30,51,72,1);margin-top:1.3%;">
- <img width="100%" alt="" src="img/footer.jpg" />
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-97px 0px 31px 0px;min-height: 36px;">
- <div class="container" style="width:37.6%;">
-
- </div>
- </nav>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-18px 0px 0px 0px;min-height: 36px;">
- <div class="container" style="width:57%;">
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-4">
- <ul class="nav navbar-nav miolifooter">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li style="border-right: 0 none;"><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <p class="terms" style="margin:0px;padding:21px 0px 6px 20px;"><a target="_blank" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/">Legal</a><a class="pull-right" style="z-index: 1001;position:relative;margin:-38px 4% 0px 0px;" href="#top" id="topbutton"><img alt="Back to top" src="img/arrow_up.png"/></a></p>
- </footer>
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>-->
- <script src="js/vendor/jquery.min.js"></script>
- <script src="js/vendor/jquery.scrollstop.js"></script>
- <script src="js/vendor/bootstrap.min.js"></script>
-
- <!-- Open lightbox-content image -->
- <script type="text/javascript">
- $('.featurette-image').click(function(){
- $('.lightbox-content').empty();
- $($(this).parents('div').html()).appendTo('.lightbox-content');
- $('#myModal').modal({show:true});});
- </script>
-
- <script type="text/javascript">
- $('#twitterli').mouseover(function() {
- $('a#twitterli > img').attr('src','img/twitter_h1.png');
- });
- $('#twitterli').mouseout(function() {
- $('a#twitterli > img').attr('src','img/twitter.png');
- });
-
- $('#twitterfooter').mouseover(function() {
- $('a#twitterfooter > img').attr('src','img/twitter_h2.png');
- });
- $('#twitterfooter').mouseout(function() {
- $('a#twitterfooter > img').attr('src','img/twitter.png');
- });
-
- $('#topbutton').mouseover(function() {
- $('a#topbutton > img').attr('src','img/arrow_up_h.png');
- });
- $('#topbutton').mouseout(function() {
- $('a#topbutton > img').attr('src','img/arrow_up.png');
- });
-
- $('.scrollup').mouseover(function() {
- $('a.scrollup').css('opacity', '1');
- });
- $('.scrollup').mouseout(function() {
- $('a.scrollup').css('opacity', '0.35');
- });
-
- //gestione scroll verticale
- $(function() {
- $('a[href*=#]').click(function() {
- if(this.hash=="#top"){
- $('html,body').animate({scrollTop:0}, 800);
- return false;
- } else {
- var arrivo = $(this.hash);
- if (arrivo.length) {
- arrivo=arrivo.offset().top;
- $('html,body').animate({scrollTop:arrivo-205}, 500);
- return false;
- }
- }
- });
- });
-
- $(window).scroll(function() {
- var y = $(this).scrollTop();
- if (y < 800)
- $('a.scrollup').fadeOut();
- else
- $('a.scrollup').fadeIn();
- });
- //prevscroll
- var prevscroll = 0;
- $(window).on("scrollstop", function() {
- var scrollposition = $('html,body').scrollTop()+210;
- if(/chrome/.test(navigator.userAgent.toLowerCase()))
- scrollposition = $("body").scrollTop()+210;
- var mieipar = $("[id^='par']");
- mieipar.each(function(idx) {
- if(idx==mieipar.length-1 && scrollposition>=$(this).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- } else if(scrollposition>=$(this).offset().top && scrollposition<mieipar.eq(idx + 1).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- }
- });
- //inizio prevscroll
- //Gestione scroll del menu laterale in base alla posizione della pagina
- var menuScrollSize = '-250px';
- var pageScrollThreshold = 16730;
- if($(window).height()<$(".dropdown-menu").height()+190){
- if(prevscroll<scrollposition){
- if(scrollposition>pageScrollThreshold)
- $(".dropdown-menu").css('top', menuScrollSize);
- } else
- $(".dropdown-menu").css('top', '0px');
- prevscroll=scrollposition;
- } else if($(".dropdown-menu").css('top')!=null && $(".dropdown-menu").css('top')==menuScrollSize){
- $(".dropdown-menu").css('top', '0px');
- }
- //fine prevscroll
- });
-
- $(document).ready(function() {
- //Setto link attivo nel menu
- var mieili = $('.miomenu li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).addClass('mioactive');
- return false;
- }
- });
- //Setto link attivo nel footer
- mieili = $('.miolifooter li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).children().addClass('mioactivefooter');
- return false;
- }
- });
-
- //Setto gli indici per l'effertto hover del dropdown-menu
- var mieiidx = $(".dropdown-menu a[href='#par']");
- var mieipar = $("[id^='par']");
- mieiidx.each(function(idx) {
- $(this).attr('href','#par'+idx);
- if(idx<mieipar.length)
- mieipar.eq(idx).attr('id','par'+idx);
- });
-
- //Setto le references #addref
- var mieiaddref = $("a[href='#addref']");
- mieiaddref.each(function(idx) {
- var ref = $(".dropdown-menu a:contains("+$(this).attr('rel')+")").attr('href');
- if(ref!=null && ref.length>0)
- $(this).attr('href',ref);
- });
- });
-
- //Levo il blur da tutti i link
- $("a").focus(
- function () {
- if ($(this).blur) $(this).blur();
- }
- );
-
- $('#questiondiv').mouseover(function() {
- $('#questiondiv').css('background-color','#D7EFDA');
- });
- $('#questiondiv').mouseout(function() {
- $('#questiondiv').css('background-color','#e8f9ea');
- });
-
- $('#bugdiv').mouseover(function() {
- $('#bugdiv').css('background-color','#F0F2C6');
- });
- $('#bugdiv').mouseout(function() {
- $('#bugdiv').css('background-color','rgb(246, 247, 227)');
- });
-
- $('#suppdiv').mouseover(function() {
- $('#suppdiv').css('background-color','#E8E8E8');
- });
- $('#suppdiv').mouseout(function() {
- $('#suppdiv').css('background-color','rgb(242, 242, 242)');
- });
-
- $('#twdiv').mouseover(function() {
- $('#twdiv').css('background-color','#CFE5F7');
- });
- $('#twdiv').mouseout(function() {
- $('#twdiv').css('background-color','#e8f3fc');
- });
- </script>
- <script type="text/javascript" src="google-code-prettify/lang-common.js"></script><script type="text/javascript">
- registerLanguage('import|module|parts|labelProvider|text|image|elements|label|featuresProvider|features|formControlFactory|control|target|viewerContentProvider|tableViewerContentProvider|children|viewpart|viewname|viewclass|viewcategory|for|new|switch|default|boolean|do|if|this|double|throw|null|true|false|it|as|byte|else|case|enum|instanceof|return|featureCaptionProvider|formFeatureCaptionProvider|dialogFeatureCaptionProvider|val|var|catch|extends|int|short|try|char|void|finally|long|float|super|while|proposals|dialogControlFactory|menuBuilder|menus|emfMenus|resourceManager|initializeResource|saveResource|configurator|resourceURI|eClass|bindings|type|provide|value|font|foreground|background|tableLabelProvider|rowFont|rowForeground|rowBackground', 'emfparsley');
- </script>
-</body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/download.html b/doc/org.eclipse.emf.parsley.doc.websitegen/website/download.html
deleted file mode 100644
index 019bf95bf..000000000
--- a/doc/org.eclipse.emf.parsley.doc.websitegen/website/download.html
+++ /dev/null
@@ -1,399 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="The website of Eclipse EMF Parsley, an open-source framework for development User Interfaces upon EMF models">
- <meta name="author" content="Francesco Guidieri, Paolo Bachini">
- <link rel="icon" href="/favicon.ico">
-
- <title>EMF Parsley - Play with your UI and EMF!</title>
- <link rel="SHORTCUT ICON" href="img/logo_nw.gif" />
- <!-- styles -->
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
-
- <!-- Bootstrap core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <link href="css/main.css" rel="stylesheet">
- <!-- Animate CSS -->
- <link href="css/animate.css" rel="stylesheet">
-
- <!--[if lt IE 9]>
- <link href="css/iebugs.css" rel="stylesheet" type='text/css'>
- <![endif]-->
-
- <!-- Custom styles for this template -->
- <link href="carousel.css" rel="stylesheet">
-
- <!-- Bootstrap Lightbox -->
- <link href="bootstrap-lightbox/bootstrap-lightbox.min.css" rel="stylesheet">
- <!--<script src="js/twitter.js" type="text/javascript"></script>-->
- <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
- <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
- <script src="assets/js/ie-emulation-modes-warning.js"></script>
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="assets/js/ie10-viewport-bug-workaround.js"></script>
-
- <!-- Run Prettify -->
- <script src="prettify/run_prettify.js"></script>
-
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
- ga('create', 'UA-58549052-1', 'auto');
- ga('send', 'pageview');
-
- </script>
-</head>
-<body>
- <!-- ====== NAVBAR ====== -->
- <body style="overflow-y: scroll; padding-top:185px;">
- <div class="navbar-fixed-top" style="background:url(img/bg-100x100.jpg)">
- <div class="container" style="width:1150px;">
- <div class="navbar-header">
- <a href="index.html"><img class="img-responsive" alt="" src="img/logo.gif"/></a>
- </div>
- </div>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-31px 0px 3px 0px;min-height: 36px;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" style="margin-bottom:2px;">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav pull-right mioli">
- <li><a href="support.html">Contact Us</a></li>
- <li><a href="http://www.eclipse.org">Eclipse.org</a></li>
- <li style="border-right: 0 none;"><a target="_blank" href="https://twitter.com/EmfParsley" id="twitterli"><img style="width:25px;float:left;margin-top: 5px; margin-right:1px;" alt="" src="img/twitter.png"/>@EmfParsley</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <div style="background:url(img/bg1-100x100.jpg);">
- <nav class="navbar navbar-default miomenubar" role="navigation" style="border-radius:0px; background: url('img/menu.jpg') no-repeat; border: 0 none; -webkit-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);margin-bottom:0;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
- <ul class="nav navbar-nav pull-left miomenu">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- </div>
- </div>
- <!-- NAVBAR End -->
-<style>
-.row {
- -webkit-animation: fadeInDownBig 1s;
- -moz-animation: fadeInDownBig 1s;
- -ms-animation: fadeInDownBig 1s;
- -o-animation: fadeInDownBig 1s;
- animation: fadeInDownBig 1s;
-}
-
-#baseanim {
- padding:0px;
- width: 50px;
- margin: 8px 0px 0px -100px;
-}
-
-#arrowanim {
- padding:0px;
- width: 22px;
- margin: -12px 0px 0px -85px;
- -webkit-animation: mybounceInDown 2s;
- -moz-animation: mybounceInDown 2s;
- -ms-animation: mybounceInDown 2s;
- -o-animation: mybounceInDown 2s;
- animation: mybounceInDown 2s;
-}
-</style>
-
-<div class="container marketing" style="margin-top:2%;">
- <div class="row featurette">
- <div class="col-md-10 col-md-offset-1">
- <img src="img/arrow_down.png" alt="" class="featurette-image img-responsive pull-left" id="arrowanim">
- <img src="img/base.png" alt="" class="featurette-image img-responsive pull-left" id="baseanim">
- <h1 class="featurette-heading text-parsley">EMF Parsley - Downloads</h1>
- <p>
- To install via the update site URL listed below, copy and paste it into the "Help &gt; Install new software" dialog.
- </p>
- <p>
- N.B. All API are to be considered provisional!
- </p>
- <br><br>
- <div>
- <h2 class="featurette-heading text-parsley1">Update Sites</h2>
- <ul>
- <li>All Releases: <a href="http://download.eclipse.org/emf-parsley/updates">http://download.eclipse.org/emf-parsley/updates</a></li>
- <li>0.6.x: <a href="http://download.eclipse.org/emf-parsley/updates/0.6">http://download.eclipse.org/emf-parsley/updates/0.6</a>
- (EMF Parsley DSL requires Xtext 2.9.1, which has to be taken from http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/ so make sure you add this update site before installing the DSL feature - included in the SDK).</li>
- <li>0.5.x: <a href="http://download.eclipse.org/emf-parsley/updates/0.5">http://download.eclipse.org/emf-parsley/updates/0.5</a>
- (EMF Parsley DSL requires Xtext 2.8.4, which has to be taken from http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/ so make sure you add this update site before installing the DSL feature - included in the SDK).</li>
- <li>0.4.x: <a href="http://download.eclipse.org/emf-parsley/updates/0.4">http://download.eclipse.org/emf-parsley/updates/0.4</a>
- (EMF Parsley DSL requires Xtext 2.8.3, which has to be taken from http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/ so make sure you add this update site before installing the DSL feature - included in the SDK).</li>
- <li>0.3.x: <a href="http://download.eclipse.org/emf-parsley/updates/0.3">http://download.eclipse.org/emf-parsley/updates/0.3</a>
- (EMF Parsley DSL requires Xtext 2.7.3, which has to be taken from http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/ so make sure you add this update site before installing the DSL feature - included in the SDK).</li>
- <li>Latest Stable Nightly Build: <a href="https://hudson.eclipse.org/emf-parsley/job/emf-parsley-nightly/lastSuccessfulBuild/artifact/target/repository/">https://hudson.eclipse.org/emf-parsley/job/emf-parsley-nightly/lastSuccessfulBuild/artifact/target/repository/</a></li>
- <li>Latest Stable Snapshot Build: <a href="https://hudson.eclipse.org/emf-parsley/job/emf-parsley-tycho-gerrit/lastSuccessfulBuild/artifact/target/repository/">https://hudson.eclipse.org/emf-parsley/job/emf-parsley-tycho-gerrit/lastSuccessfulBuild/artifact/target/repository/</a></li>
- </ul>
- <p>
- All downloads are provided under the terms and conditions of the Eclipse Foundation Software User Agreement unless otherwise specified.
- </p>
- </div>
- <br><br>
- <div>
- <h2 class="featurette-heading text-parsley1">Old Milestones</h2>
- <ul>
- <li>These are old milestone releases: <a href="http://download.eclipse.org/emf-parsley/archive/updates">http://download.eclipse.org/emf-parsley/archive/updates</a></li>
- </ul>
- <p>
- All downloads are provided under the terms and conditions of the Eclipse Foundation Software User Agreement unless otherwise specified.
- </p>
- </div>
- <br><br>
- <div style="margin-bottom:9%;">
- <h2 class="featurette-heading text-parsley1">Links</h2>
- <p>
- <a href="https://projects.eclipse.org/content/eclipse-public-license-1.0">Eclipse Public License 1.0</a>
- </p>
- </div>
- </div>
- </div>
-</div>
- <!-- FOOTER -->
- <footer style="z-index: 1001;position:relative;background-color:#35414C;-webkit-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);box-shadow: 0px -3px 8px 0px rgba(30,51,72,1);margin-top:1.3%;">
- <img width="100%" alt="" src="img/footer.jpg" />
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-97px 0px 31px 0px;min-height: 36px;">
- <div class="container" style="width:37.6%;">
-
- </div>
- </nav>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-18px 0px 0px 0px;min-height: 36px;">
- <div class="container" style="width:57%;">
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-4">
- <ul class="nav navbar-nav miolifooter">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li style="border-right: 0 none;"><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <p class="terms" style="margin:0px;padding:21px 0px 6px 20px;"><a target="_blank" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/">Legal</a><a class="pull-right" style="z-index: 1001;position:relative;margin:-38px 4% 0px 0px;" href="#top" id="topbutton"><img alt="Back to top" src="img/arrow_up.png"/></a></p>
- </footer>
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>-->
- <script src="js/vendor/jquery.min.js"></script>
- <script src="js/vendor/jquery.scrollstop.js"></script>
- <script src="js/vendor/bootstrap.min.js"></script>
-
- <!-- Open lightbox-content image -->
- <script type="text/javascript">
- $('.featurette-image').click(function(){
- $('.lightbox-content').empty();
- $($(this).parents('div').html()).appendTo('.lightbox-content');
- $('#myModal').modal({show:true});});
- </script>
-
- <script type="text/javascript">
- $('#twitterli').mouseover(function() {
- $('a#twitterli > img').attr('src','img/twitter_h1.png');
- });
- $('#twitterli').mouseout(function() {
- $('a#twitterli > img').attr('src','img/twitter.png');
- });
-
- $('#twitterfooter').mouseover(function() {
- $('a#twitterfooter > img').attr('src','img/twitter_h2.png');
- });
- $('#twitterfooter').mouseout(function() {
- $('a#twitterfooter > img').attr('src','img/twitter.png');
- });
-
- $('#topbutton').mouseover(function() {
- $('a#topbutton > img').attr('src','img/arrow_up_h.png');
- });
- $('#topbutton').mouseout(function() {
- $('a#topbutton > img').attr('src','img/arrow_up.png');
- });
-
- $('.scrollup').mouseover(function() {
- $('a.scrollup').css('opacity', '1');
- });
- $('.scrollup').mouseout(function() {
- $('a.scrollup').css('opacity', '0.35');
- });
-
- //gestione scroll verticale
- $(function() {
- $('a[href*=#]').click(function() {
- if(this.hash=="#top"){
- $('html,body').animate({scrollTop:0}, 800);
- return false;
- } else {
- var arrivo = $(this.hash);
- if (arrivo.length) {
- arrivo=arrivo.offset().top;
- $('html,body').animate({scrollTop:arrivo-205}, 500);
- return false;
- }
- }
- });
- });
-
- $(window).scroll(function() {
- var y = $(this).scrollTop();
- if (y < 800)
- $('a.scrollup').fadeOut();
- else
- $('a.scrollup').fadeIn();
- });
- //prevscroll
- var prevscroll = 0;
- $(window).on("scrollstop", function() {
- var scrollposition = $('html,body').scrollTop()+210;
- if(/chrome/.test(navigator.userAgent.toLowerCase()))
- scrollposition = $("body").scrollTop()+210;
- var mieipar = $("[id^='par']");
- mieipar.each(function(idx) {
- if(idx==mieipar.length-1 && scrollposition>=$(this).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- } else if(scrollposition>=$(this).offset().top && scrollposition<mieipar.eq(idx + 1).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- }
- });
- //inizio prevscroll
- //Gestione scroll del menu laterale in base alla posizione della pagina
- var menuScrollSize = '-250px';
- var pageScrollThreshold = 16730;
- if($(window).height()<$(".dropdown-menu").height()+190){
- if(prevscroll<scrollposition){
- if(scrollposition>pageScrollThreshold)
- $(".dropdown-menu").css('top', menuScrollSize);
- } else
- $(".dropdown-menu").css('top', '0px');
- prevscroll=scrollposition;
- } else if($(".dropdown-menu").css('top')!=null && $(".dropdown-menu").css('top')==menuScrollSize){
- $(".dropdown-menu").css('top', '0px');
- }
- //fine prevscroll
- });
-
- $(document).ready(function() {
- //Setto link attivo nel menu
- var mieili = $('.miomenu li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).addClass('mioactive');
- return false;
- }
- });
- //Setto link attivo nel footer
- mieili = $('.miolifooter li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).children().addClass('mioactivefooter');
- return false;
- }
- });
-
- //Setto gli indici per l'effertto hover del dropdown-menu
- var mieiidx = $(".dropdown-menu a[href='#par']");
- var mieipar = $("[id^='par']");
- mieiidx.each(function(idx) {
- $(this).attr('href','#par'+idx);
- if(idx<mieipar.length)
- mieipar.eq(idx).attr('id','par'+idx);
- });
-
- //Setto le references #addref
- var mieiaddref = $("a[href='#addref']");
- mieiaddref.each(function(idx) {
- var ref = $(".dropdown-menu a:contains("+$(this).attr('rel')+")").attr('href');
- if(ref!=null && ref.length>0)
- $(this).attr('href',ref);
- });
- });
-
- //Levo il blur da tutti i link
- $("a").focus(
- function () {
- if ($(this).blur) $(this).blur();
- }
- );
-
- $('#questiondiv').mouseover(function() {
- $('#questiondiv').css('background-color','#D7EFDA');
- });
- $('#questiondiv').mouseout(function() {
- $('#questiondiv').css('background-color','#e8f9ea');
- });
-
- $('#bugdiv').mouseover(function() {
- $('#bugdiv').css('background-color','#F0F2C6');
- });
- $('#bugdiv').mouseout(function() {
- $('#bugdiv').css('background-color','rgb(246, 247, 227)');
- });
-
- $('#suppdiv').mouseover(function() {
- $('#suppdiv').css('background-color','#E8E8E8');
- });
- $('#suppdiv').mouseout(function() {
- $('#suppdiv').css('background-color','rgb(242, 242, 242)');
- });
-
- $('#twdiv').mouseover(function() {
- $('#twdiv').css('background-color','#CFE5F7');
- });
- $('#twdiv').mouseout(function() {
- $('#twdiv').css('background-color','#e8f3fc');
- });
- </script>
-</body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/index.html b/doc/org.eclipse.emf.parsley.doc.websitegen/website/index.html
deleted file mode 100644
index c1607b007..000000000
--- a/doc/org.eclipse.emf.parsley.doc.websitegen/website/index.html
+++ /dev/null
@@ -1,364 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="The website of Eclipse EMF Parsley, an open-source framework for development User Interfaces upon EMF models">
- <meta name="author" content="Francesco Guidieri, Paolo Bachini">
- <link rel="icon" href="/favicon.ico">
-
- <title>EMF Parsley - Play with your UI and EMF!</title>
- <link rel="SHORTCUT ICON" href="img/logo_nw.gif" />
- <!-- styles -->
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
-
- <!-- Bootstrap core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <link href="css/main.css" rel="stylesheet">
- <!-- Animate CSS -->
- <link href="css/animate.css" rel="stylesheet">
-
- <!--[if lt IE 9]>
- <link href="css/iebugs.css" rel="stylesheet" type='text/css'>
- <![endif]-->
-
- <!-- Custom styles for this template -->
- <link href="carousel.css" rel="stylesheet">
-
- <!-- Bootstrap Lightbox -->
- <link href="bootstrap-lightbox/bootstrap-lightbox.min.css" rel="stylesheet">
- <!--<script src="js/twitter.js" type="text/javascript"></script>-->
- <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
- <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
- <script src="assets/js/ie-emulation-modes-warning.js"></script>
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="assets/js/ie10-viewport-bug-workaround.js"></script>
-
- <!-- Run Prettify -->
- <script src="prettify/run_prettify.js"></script>
-
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
- ga('create', 'UA-58549052-1', 'auto');
- ga('send', 'pageview');
-
- </script>
-</head>
-<body>
- <!-- ====== NAVBAR ====== -->
- <body style="overflow-y: scroll; padding-top:185px;">
- <div class="navbar-fixed-top" style="background:url(img/bg-100x100.jpg)">
- <div class="container" style="width:1150px;">
- <div class="navbar-header">
- <a href="index.html"><img class="img-responsive" alt="" src="img/logo.gif"/></a>
- </div>
- </div>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-31px 0px 3px 0px;min-height: 36px;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" style="margin-bottom:2px;">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav pull-right mioli">
- <li><a href="support.html">Contact Us</a></li>
- <li><a href="http://www.eclipse.org">Eclipse.org</a></li>
- <li style="border-right: 0 none;"><a target="_blank" href="https://twitter.com/EmfParsley" id="twitterli"><img style="width:25px;float:left;margin-top: 5px; margin-right:1px;" alt="" src="img/twitter.png"/>@EmfParsley</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <div style="background:url(img/bg1-100x100.jpg);">
- <nav class="navbar navbar-default miomenubar" role="navigation" style="border-radius:0px; background: url('img/menu.jpg') no-repeat; border: 0 none; -webkit-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);margin-bottom:0;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
- <ul class="nav navbar-nav pull-left miomenu">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- </div>
- </div>
- <!-- NAVBAR End -->
-<style>
- .row {
- -webkit-animation: zoomIn 1.5s;
- -moz-animation: zoomIn 1.5s;
- -ms-animation: zoomIn 1.5s;
- -o-animation: zoomIn 1.5s;
- animation: zoomIn 1.5s;
- }
-
- #rbhover>img:hover{
- -webkit-animation: rubberBand 0.8s;
- -moz-animation: rubberBand 0.8s;
- -ms-animation: rubberBand 0.8s;
- -o-animation: rubberBand 0.8s;
- animation: rubberBand 0.8s;
- }
-</style>
-<div class="container marketing" style="margin-top:34px;">
- <div class="row featurette">
- <div class="col-sm-6 col-md-6">
- <h2 class="featurette-heading" style="margin-top:-13px;color: #246025;">What is EMF Parsley?</h2><!-- <span class="text-muted">It'll blow your mind.</span> -->
- <p class="lead" style="text-align: justify; padding-right: 5px;margin-bottom: 26px;color:#383838;">EMF Parsley is an Eclipse project that provides a set of reusable UI components based on EMF (trees, tables, forms, views, editors), hiding most of the complexity of internal details, that can be used in your EMF-based plugin out-of-the-box. These parts are easily customizable via a DSL, implemented in Xtext. This project has been designed starting from EMF UI generated code, adding extensibility mechanism that make it very modular: all components are highly reusable and customizable via Dependency Injection (via Google Guice).<BR>As in cooking, EMF Parsley aims to be used in several EMF based parts. Its little components can be embedded wherever there is an EMF model and fully customized.</p>
- <div class="row">
- <div class="col-md-5 col-md-offset-1"><a id="rbhover" href="download.html" style="text-decoration: none;font-size: 19px; font-family: Corbert, Segoe UI,sans-serif; letter-spacing: -0.5px;"><img class="img-responsive pull-left" alt="" src="img/dowload_icon.png"/></br>Download</a></div>
- <div class="col-md-6" style="padding-left:0px;"><a id="rbhover" href="documentation.html" style="text-decoration: none;font-size: 19px; font-family: Corbert, Segoe UI,sans-serif; letter-spacing: -0.5px;"><img class="img-responsive pull-left" alt="" src="img/documentation_icon.png"/></br>Documentation</a></div>
- </div>
- </div>
- <div class="col-md-1" style="width:4%"></div>
- <div class="embed-responsive embed-responsive-16by9">
- <iframe class="embed-responsive-item" style="border: 4px solid rgb(229, 236, 242);" wmode="Opaque" allowfullscreen="" src="https://www.youtube.com/embed/-S8mh5p-ChE"></iframe>
- </div>
- </div>
- <div class="row featurette" style="margin-top:8%;">
- <div class="col-md-10 col-md-offset-1" style="padding:0px;"><img class="img-responsive" src="img/made.jpg"></div>
- </div>
- <div class="row featurette" style="margin-top:7.5%;margin-bottom:6%;">
- <div class="col-md-10 col-md-offset-1" style="padding:0px;">
- <a href="#"><img id="zoom_img" class="featurette-image img-responsive" src="img/works.jpg" style="margin-left:auto;margin-right:auto;"></a>
- </div>
- <div id="myModal" class="modal fade" tabindex="-1" role="dialog" style="overflow:hidden;">
- <div class="lightbox-content img-responsive" style="display: block; margin: 5% 1%;"></div>
- </div>
- </div>
-</div>
- <!-- FOOTER -->
- <footer style="z-index: 1001;position:relative;background-color:#35414C;-webkit-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);box-shadow: 0px -3px 8px 0px rgba(30,51,72,1);margin-top:1.3%;">
- <img width="100%" alt="" src="img/footer.jpg" />
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-97px 0px 31px 0px;min-height: 36px;">
- <div class="container" style="width:37.6%;">
-
- </div>
- </nav>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-18px 0px 0px 0px;min-height: 36px;">
- <div class="container" style="width:57%;">
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-4">
- <ul class="nav navbar-nav miolifooter">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li style="border-right: 0 none;"><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <p class="terms" style="margin:0px;padding:21px 0px 6px 20px;"><a target="_blank" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/">Legal</a><a class="pull-right" style="z-index: 1001;position:relative;margin:-38px 4% 0px 0px;" href="#top" id="topbutton"><img alt="Back to top" src="img/arrow_up.png"/></a></p>
- </footer>
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>-->
- <script src="js/vendor/jquery.min.js"></script>
- <script src="js/vendor/jquery.scrollstop.js"></script>
- <script src="js/vendor/bootstrap.min.js"></script>
-
- <!-- Open lightbox-content image -->
- <script type="text/javascript">
- $('.featurette-image').click(function(){
- $('.lightbox-content').empty();
- $($(this).parents('div').html()).appendTo('.lightbox-content');
- $('#myModal').modal({show:true});});
- </script>
-
- <script type="text/javascript">
- $('#twitterli').mouseover(function() {
- $('a#twitterli > img').attr('src','img/twitter_h1.png');
- });
- $('#twitterli').mouseout(function() {
- $('a#twitterli > img').attr('src','img/twitter.png');
- });
-
- $('#twitterfooter').mouseover(function() {
- $('a#twitterfooter > img').attr('src','img/twitter_h2.png');
- });
- $('#twitterfooter').mouseout(function() {
- $('a#twitterfooter > img').attr('src','img/twitter.png');
- });
-
- $('#topbutton').mouseover(function() {
- $('a#topbutton > img').attr('src','img/arrow_up_h.png');
- });
- $('#topbutton').mouseout(function() {
- $('a#topbutton > img').attr('src','img/arrow_up.png');
- });
-
- $('.scrollup').mouseover(function() {
- $('a.scrollup').css('opacity', '1');
- });
- $('.scrollup').mouseout(function() {
- $('a.scrollup').css('opacity', '0.35');
- });
-
- //gestione scroll verticale
- $(function() {
- $('a[href*=#]').click(function() {
- if(this.hash=="#top"){
- $('html,body').animate({scrollTop:0}, 800);
- return false;
- } else {
- var arrivo = $(this.hash);
- if (arrivo.length) {
- arrivo=arrivo.offset().top;
- $('html,body').animate({scrollTop:arrivo-205}, 500);
- return false;
- }
- }
- });
- });
-
- $(window).scroll(function() {
- var y = $(this).scrollTop();
- if (y < 800)
- $('a.scrollup').fadeOut();
- else
- $('a.scrollup').fadeIn();
- });
- //prevscroll
- var prevscroll = 0;
- $(window).on("scrollstop", function() {
- var scrollposition = $('html,body').scrollTop()+210;
- if(/chrome/.test(navigator.userAgent.toLowerCase()))
- scrollposition = $("body").scrollTop()+210;
- var mieipar = $("[id^='par']");
- mieipar.each(function(idx) {
- if(idx==mieipar.length-1 && scrollposition>=$(this).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- } else if(scrollposition>=$(this).offset().top && scrollposition<mieipar.eq(idx + 1).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- }
- });
- //inizio prevscroll
- //Gestione scroll del menu laterale in base alla posizione della pagina
- var menuScrollSize = '-250px';
- var pageScrollThreshold = 16730;
- if($(window).height()<$(".dropdown-menu").height()+190){
- if(prevscroll<scrollposition){
- if(scrollposition>pageScrollThreshold)
- $(".dropdown-menu").css('top', menuScrollSize);
- } else
- $(".dropdown-menu").css('top', '0px');
- prevscroll=scrollposition;
- } else if($(".dropdown-menu").css('top')!=null && $(".dropdown-menu").css('top')==menuScrollSize){
- $(".dropdown-menu").css('top', '0px');
- }
- //fine prevscroll
- });
-
- $(document).ready(function() {
- //Setto link attivo nel menu
- var mieili = $('.miomenu li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).addClass('mioactive');
- return false;
- }
- });
- //Setto link attivo nel footer
- mieili = $('.miolifooter li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).children().addClass('mioactivefooter');
- return false;
- }
- });
-
- //Setto gli indici per l'effertto hover del dropdown-menu
- var mieiidx = $(".dropdown-menu a[href='#par']");
- var mieipar = $("[id^='par']");
- mieiidx.each(function(idx) {
- $(this).attr('href','#par'+idx);
- if(idx<mieipar.length)
- mieipar.eq(idx).attr('id','par'+idx);
- });
-
- //Setto le references #addref
- var mieiaddref = $("a[href='#addref']");
- mieiaddref.each(function(idx) {
- var ref = $(".dropdown-menu a:contains("+$(this).attr('rel')+")").attr('href');
- if(ref!=null && ref.length>0)
- $(this).attr('href',ref);
- });
- });
-
- //Levo il blur da tutti i link
- $("a").focus(
- function () {
- if ($(this).blur) $(this).blur();
- }
- );
-
- $('#questiondiv').mouseover(function() {
- $('#questiondiv').css('background-color','#D7EFDA');
- });
- $('#questiondiv').mouseout(function() {
- $('#questiondiv').css('background-color','#e8f9ea');
- });
-
- $('#bugdiv').mouseover(function() {
- $('#bugdiv').css('background-color','#F0F2C6');
- });
- $('#bugdiv').mouseout(function() {
- $('#bugdiv').css('background-color','rgb(246, 247, 227)');
- });
-
- $('#suppdiv').mouseover(function() {
- $('#suppdiv').css('background-color','#E8E8E8');
- });
- $('#suppdiv').mouseout(function() {
- $('#suppdiv').css('background-color','rgb(242, 242, 242)');
- });
-
- $('#twdiv').mouseover(function() {
- $('#twdiv').css('background-color','#CFE5F7');
- });
- $('#twdiv').mouseout(function() {
- $('#twdiv').css('background-color','#e8f3fc');
- });
- </script>
-</body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/sources.html b/doc/org.eclipse.emf.parsley.doc.websitegen/website/sources.html
deleted file mode 100644
index e8c3423e9..000000000
--- a/doc/org.eclipse.emf.parsley.doc.websitegen/website/sources.html
+++ /dev/null
@@ -1,386 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="The website of Eclipse EMF Parsley, an open-source framework for development User Interfaces upon EMF models">
- <meta name="author" content="Francesco Guidieri, Paolo Bachini">
- <link rel="icon" href="/favicon.ico">
-
- <title>EMF Parsley - Play with your UI and EMF!</title>
- <link rel="SHORTCUT ICON" href="img/logo_nw.gif" />
- <!-- styles -->
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
-
- <!-- Bootstrap core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <link href="css/main.css" rel="stylesheet">
- <!-- Animate CSS -->
- <link href="css/animate.css" rel="stylesheet">
-
- <!--[if lt IE 9]>
- <link href="css/iebugs.css" rel="stylesheet" type='text/css'>
- <![endif]-->
-
- <!-- Custom styles for this template -->
- <link href="carousel.css" rel="stylesheet">
-
- <!-- Bootstrap Lightbox -->
- <link href="bootstrap-lightbox/bootstrap-lightbox.min.css" rel="stylesheet">
- <!--<script src="js/twitter.js" type="text/javascript"></script>-->
- <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
- <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
- <script src="assets/js/ie-emulation-modes-warning.js"></script>
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="assets/js/ie10-viewport-bug-workaround.js"></script>
-
- <!-- Run Prettify -->
- <script src="prettify/run_prettify.js"></script>
-
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
- ga('create', 'UA-58549052-1', 'auto');
- ga('send', 'pageview');
-
- </script>
-</head>
-<body>
- <!-- ====== NAVBAR ====== -->
- <body style="overflow-y: scroll; padding-top:185px;">
- <div class="navbar-fixed-top" style="background:url(img/bg-100x100.jpg)">
- <div class="container" style="width:1150px;">
- <div class="navbar-header">
- <a href="index.html"><img class="img-responsive" alt="" src="img/logo.gif"/></a>
- </div>
- </div>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-31px 0px 3px 0px;min-height: 36px;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" style="margin-bottom:2px;">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav pull-right mioli">
- <li><a href="support.html">Contact Us</a></li>
- <li><a href="http://www.eclipse.org">Eclipse.org</a></li>
- <li style="border-right: 0 none;"><a target="_blank" href="https://twitter.com/EmfParsley" id="twitterli"><img style="width:25px;float:left;margin-top: 5px; margin-right:1px;" alt="" src="img/twitter.png"/>@EmfParsley</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <div style="background:url(img/bg1-100x100.jpg);">
- <nav class="navbar navbar-default miomenubar" role="navigation" style="border-radius:0px; background: url('img/menu.jpg') no-repeat; border: 0 none; -webkit-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);margin-bottom:0;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
- <ul class="nav navbar-nav pull-left miomenu">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- </div>
- </div>
- <!-- NAVBAR End -->
-
- <style>
- .row {
- -webkit-animation: zoomIn 1.5s;
- -moz-animation: zoomIn 1.5s;
- -ms-animation: zoomIn 1.5s;
- -o-animation: zoomIn 1.5s;
- animation: zoomIn 1.5s;
- }
- </style>
-
- <!-- START THE FEATURETTES -->
- <div id="page">
- <div class="inner">
- </br>
- <!-- scrollup ICON -->
- <a class="scrollup" href="#top"></a>
- <!-- scrollup ICON -->
- <div class="row featurette">
- <div class="col-md-6 col-md-offset-3">
- <h1 id="par" class="featurette-heading text-parsley">Getting Sources</h1>
- <p>
- If you want to get the sources of EMF Parsley,
- for instance, to contribute new features and patches, you can get them
- via Git and setup the workspace manually. However, we strongly reccomend to
- use the automatic procedure detailed below.
- </p>
- <p>
- If you want to develop also the <a href="http://eclipse.org/rap/">RAP</a>
- version of Emf Parsley, you will need a different workspace (and a different target platform).
- </p>
- <p>
- We use <a href="https://wiki.eclipse.org/Eclipse_Oomph_Installer">Oomph</a> for provisioning
- a full Eclipse IDE and workspace setup for Parsley.
- </p>
- <p>
- </p>
- <ul>
- <li>Download and start Oomph: <a href="https://wiki.eclipse.org/Eclipse_Oomph_Installer">https://wiki.eclipse.org/Eclipse_Oomph_Installer</a></li>
- <li>On the initial page, click on the Switch to advanced mode button in the top right</li>
- <li>On the Product page, select Eclipse IDE for Eclipse Committers.</li>
- <li>On the Projects page, expand the "EMF Parsley" node.</li>
- <li>either double-click on "RCP" or "RAP" for setting up the workspace for either the RCP version of
- Parsley or the RAP version (it is likely that you choose the former).</li>
- <li>Choose your preferred installation settings on the Variables page:
- If you plan to contribute patches using Gerrit, check "Show all variables"
- and make sure you select ("SSH (read-write Gerrit)") in the Git or Gerrit repository</li>
- <li>Then specify your Bugzilla/Hudson password and Git/Gerrit user ID
- (you can also specify the password and check that your credential are correct using the "Authenticate..." button).</li>
- </ul>
- <p>
- </p>
- <p>
- Press next and finish.
- This will first create an Eclipse installation with all the needed plug-ins for developing EMF Parsley
- and then will start the new installed Eclipse (press Finish to close the first installation dialog).
- The new installed Eclipse will automatically setup the workspace and you will have to wait for this procedure
- to end (you can click on the animated arrow icon on the status bar to show the progress).
- </p>
- </div>
- </div>
- </div>
- </br></br></br></br></br></br></br>
- <!-- /END THE FEATURETTES -->
- </div>
- <!-- FOOTER -->
- <footer style="z-index: 1001;position:relative;background-color:#35414C;-webkit-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);box-shadow: 0px -3px 8px 0px rgba(30,51,72,1);margin-top:1.3%;">
- <img width="100%" alt="" src="img/footer.jpg" />
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-97px 0px 31px 0px;min-height: 36px;">
- <div class="container" style="width:37.6%;">
-
- </div>
- </nav>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-18px 0px 0px 0px;min-height: 36px;">
- <div class="container" style="width:57%;">
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-4">
- <ul class="nav navbar-nav miolifooter">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li style="border-right: 0 none;"><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <p class="terms" style="margin:0px;padding:21px 0px 6px 20px;"><a target="_blank" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/">Legal</a><a class="pull-right" style="z-index: 1001;position:relative;margin:-38px 4% 0px 0px;" href="#top" id="topbutton"><img alt="Back to top" src="img/arrow_up.png"/></a></p>
- </footer>
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>-->
- <script src="js/vendor/jquery.min.js"></script>
- <script src="js/vendor/jquery.scrollstop.js"></script>
- <script src="js/vendor/bootstrap.min.js"></script>
-
- <!-- Open lightbox-content image -->
- <script type="text/javascript">
- $('.featurette-image').click(function(){
- $('.lightbox-content').empty();
- $($(this).parents('div').html()).appendTo('.lightbox-content');
- $('#myModal').modal({show:true});});
- </script>
-
- <script type="text/javascript">
- $('#twitterli').mouseover(function() {
- $('a#twitterli > img').attr('src','img/twitter_h1.png');
- });
- $('#twitterli').mouseout(function() {
- $('a#twitterli > img').attr('src','img/twitter.png');
- });
-
- $('#twitterfooter').mouseover(function() {
- $('a#twitterfooter > img').attr('src','img/twitter_h2.png');
- });
- $('#twitterfooter').mouseout(function() {
- $('a#twitterfooter > img').attr('src','img/twitter.png');
- });
-
- $('#topbutton').mouseover(function() {
- $('a#topbutton > img').attr('src','img/arrow_up_h.png');
- });
- $('#topbutton').mouseout(function() {
- $('a#topbutton > img').attr('src','img/arrow_up.png');
- });
-
- $('.scrollup').mouseover(function() {
- $('a.scrollup').css('opacity', '1');
- });
- $('.scrollup').mouseout(function() {
- $('a.scrollup').css('opacity', '0.35');
- });
-
- //gestione scroll verticale
- $(function() {
- $('a[href*=#]').click(function() {
- if(this.hash=="#top"){
- $('html,body').animate({scrollTop:0}, 800);
- return false;
- } else {
- var arrivo = $(this.hash);
- if (arrivo.length) {
- arrivo=arrivo.offset().top;
- $('html,body').animate({scrollTop:arrivo-205}, 500);
- return false;
- }
- }
- });
- });
-
- $(window).scroll(function() {
- var y = $(this).scrollTop();
- if (y < 800)
- $('a.scrollup').fadeOut();
- else
- $('a.scrollup').fadeIn();
- });
- //prevscroll
- var prevscroll = 0;
- $(window).on("scrollstop", function() {
- var scrollposition = $('html,body').scrollTop()+210;
- if(/chrome/.test(navigator.userAgent.toLowerCase()))
- scrollposition = $("body").scrollTop()+210;
- var mieipar = $("[id^='par']");
- mieipar.each(function(idx) {
- if(idx==mieipar.length-1 && scrollposition>=$(this).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- } else if(scrollposition>=$(this).offset().top && scrollposition<mieipar.eq(idx + 1).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- }
- });
- //inizio prevscroll
- //Gestione scroll del menu laterale in base alla posizione della pagina
- var menuScrollSize = '-250px';
- var pageScrollThreshold = 16730;
- if($(window).height()<$(".dropdown-menu").height()+190){
- if(prevscroll<scrollposition){
- if(scrollposition>pageScrollThreshold)
- $(".dropdown-menu").css('top', menuScrollSize);
- } else
- $(".dropdown-menu").css('top', '0px');
- prevscroll=scrollposition;
- } else if($(".dropdown-menu").css('top')!=null && $(".dropdown-menu").css('top')==menuScrollSize){
- $(".dropdown-menu").css('top', '0px');
- }
- //fine prevscroll
- });
-
- $(document).ready(function() {
- //Setto link attivo nel menu
- var mieili = $('.miomenu li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).addClass('mioactive');
- return false;
- }
- });
- //Setto link attivo nel footer
- mieili = $('.miolifooter li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).children().addClass('mioactivefooter');
- return false;
- }
- });
-
- //Setto gli indici per l'effertto hover del dropdown-menu
- var mieiidx = $(".dropdown-menu a[href='#par']");
- var mieipar = $("[id^='par']");
- mieiidx.each(function(idx) {
- $(this).attr('href','#par'+idx);
- if(idx<mieipar.length)
- mieipar.eq(idx).attr('id','par'+idx);
- });
-
- //Setto le references #addref
- var mieiaddref = $("a[href='#addref']");
- mieiaddref.each(function(idx) {
- var ref = $(".dropdown-menu a:contains("+$(this).attr('rel')+")").attr('href');
- if(ref!=null && ref.length>0)
- $(this).attr('href',ref);
- });
- });
-
- //Levo il blur da tutti i link
- $("a").focus(
- function () {
- if ($(this).blur) $(this).blur();
- }
- );
-
- $('#questiondiv').mouseover(function() {
- $('#questiondiv').css('background-color','#D7EFDA');
- });
- $('#questiondiv').mouseout(function() {
- $('#questiondiv').css('background-color','#e8f9ea');
- });
-
- $('#bugdiv').mouseover(function() {
- $('#bugdiv').css('background-color','#F0F2C6');
- });
- $('#bugdiv').mouseout(function() {
- $('#bugdiv').css('background-color','rgb(246, 247, 227)');
- });
-
- $('#suppdiv').mouseover(function() {
- $('#suppdiv').css('background-color','#E8E8E8');
- });
- $('#suppdiv').mouseout(function() {
- $('#suppdiv').css('background-color','rgb(242, 242, 242)');
- });
-
- $('#twdiv').mouseover(function() {
- $('#twdiv').css('background-color','#CFE5F7');
- });
- $('#twdiv').mouseout(function() {
- $('#twdiv').css('background-color','#e8f3fc');
- });
- </script>
- <script type="text/javascript" src="google-code-prettify/lang-common.js"></script>
-</body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/support.html b/doc/org.eclipse.emf.parsley.doc.websitegen/website/support.html
deleted file mode 100644
index b6b38df9a..000000000
--- a/doc/org.eclipse.emf.parsley.doc.websitegen/website/support.html
+++ /dev/null
@@ -1,383 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="The website of Eclipse EMF Parsley, an open-source framework for development User Interfaces upon EMF models">
- <meta name="author" content="Francesco Guidieri, Paolo Bachini">
- <link rel="icon" href="/favicon.ico">
-
- <title>EMF Parsley - Play with your UI and EMF!</title>
- <link rel="SHORTCUT ICON" href="img/logo_nw.gif" />
- <!-- styles -->
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
-
- <!-- Bootstrap core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <link href="css/main.css" rel="stylesheet">
- <!-- Animate CSS -->
- <link href="css/animate.css" rel="stylesheet">
-
- <!--[if lt IE 9]>
- <link href="css/iebugs.css" rel="stylesheet" type='text/css'>
- <![endif]-->
-
- <!-- Custom styles for this template -->
- <link href="carousel.css" rel="stylesheet">
-
- <!-- Bootstrap Lightbox -->
- <link href="bootstrap-lightbox/bootstrap-lightbox.min.css" rel="stylesheet">
- <!--<script src="js/twitter.js" type="text/javascript"></script>-->
- <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
- <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
- <script src="assets/js/ie-emulation-modes-warning.js"></script>
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="assets/js/ie10-viewport-bug-workaround.js"></script>
-
- <!-- Run Prettify -->
- <script src="prettify/run_prettify.js"></script>
-
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
- ga('create', 'UA-58549052-1', 'auto');
- ga('send', 'pageview');
-
- </script>
-</head>
-<body>
- <!-- ====== NAVBAR ====== -->
- <body style="overflow-y: scroll; padding-top:185px;">
- <div class="navbar-fixed-top" style="background:url(img/bg-100x100.jpg)">
- <div class="container" style="width:1150px;">
- <div class="navbar-header">
- <a href="index.html"><img class="img-responsive" alt="" src="img/logo.gif"/></a>
- </div>
- </div>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-31px 0px 3px 0px;min-height: 36px;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" style="margin-bottom:2px;">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav pull-right mioli">
- <li><a href="support.html">Contact Us</a></li>
- <li><a href="http://www.eclipse.org">Eclipse.org</a></li>
- <li style="border-right: 0 none;"><a target="_blank" href="https://twitter.com/EmfParsley" id="twitterli"><img style="width:25px;float:left;margin-top: 5px; margin-right:1px;" alt="" src="img/twitter.png"/>@EmfParsley</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <div style="background:url(img/bg1-100x100.jpg);">
- <nav class="navbar navbar-default miomenubar" role="navigation" style="border-radius:0px; background: url('img/menu.jpg') no-repeat; border: 0 none; -webkit-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);margin-bottom:0;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
- <ul class="nav navbar-nav pull-left miomenu">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- </div>
- </div>
- <!-- NAVBAR End -->
-<style>
- .divbox {
- border: 1px solid #e7e7e7;
- margin-bottom:2.5%;
- padding:5px 0px 32px 0px;
- }
-
- #questiondiv,#suppdiv {
- -webkit-animation: zoomInRight 1.5s;
- -moz-animation: zoomInRight 1.5s;
- -ms-animation: zoomInRight 1.5s;
- -o-animation: zoomInRight 1.5s;
- animation: zoomInRight 1.5s;
- }
-
- #bugdiv,#twdiv {
- -webkit-animation: zoomInLeft 1.5s;
- -moz-animation: zoomInLeft 1.5s;
- -ms-animation: zoomInLeft 1.5s;
- -o-animation: zoomInLeft 1.5s;
- animation: zoomInLeft 1.5s;
- }
-</style>
-<div class="container marketing" style="margin-top:6px;">
- <div class="row featurette">
- <a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=263" target="_blank">
- <div id="questiondiv" class="col-md-9 col-md-offset-1 divbox" style="background: none repeat scroll 0% 0% #e8f9ea;">
- <img src="img/question.png" alt="" class="featurette-image img-responsive pull-left" style="width:64px; margin:25px 58px 0px 44px;">
- <h3 style="text-shadow: 0px 0px 4px #80BA81;color:#2B2B2B;">Got Questions?</h3>
- <p>
- The <b>EMF Parsley forum</b> is the first sources for getting answers.<br>Please ask any questions clearly and with sufficient information attached.
- </p>
- </div>
- </a>
- <a href="https://bugs.eclipse.org/bugs/buglist.cgi?classification=Modeling&component=Core&product=EMF.Parsley" target="_blank">
- <div id="bugdiv" class="col-md-9 col-md-offset-1 divbox" style="background: none repeat scroll 0% 0% rgb(246, 247, 227);">
- <img style="width:70px; margin:36px 55px 5px 41px;" class="featurette-image img-responsive pull-left" alt="" src="img/bug.png">
- <h3 style="text-shadow: 0px 0px 4px #B2B56E;color:#2B2B2B;">Found a Bug?</h3>
- <p>
- Bug reports and enhancement request are tracked at <b>bugs.eclipse.org</b>.<br>Please explain the problem and provide a reduced but reproducible example.
- </p>
- </div>
- </a>
- <a href="http://www.rcp-vision.com/?page_id=6927" target="_blank">
- <div id="suppdiv" class="col-md-9 col-md-offset-1 divbox" style="background: none repeat scroll 0% 0% rgb(242, 242, 242);">
- <img style="width:48px; margin:39px 66px 5px 52px;" class="featurette-image img-responsive pull-left" alt="" src="img/support.png">
- <h3 style="text-shadow: 0px 0px 4px #9E7479;color:#2B2B2B;">Professional Support</h3>
- <p>
- Need training, problem solving, or just a prototype for your modeled UI?<br><b>RCP Vision</b> offers all kinds of professional consulting around EMF Parsley.
- </p>
- </div>
- </a>
- <a href="https://twitter.com/EmfParsley" target="_blank">
- <div id="twdiv" class="col-md-9 col-md-offset-1 divbox" style="background: none repeat scroll 0 0 #e8f3fc;margin-bottom:1.5%;">
- <img style="width:46px; margin:41px 67px 5px 53px;" class="featurette-image img-responsive pull-left" alt="" src="img/twitter_support.png">
- <h3 style="text-shadow: 0px 0px 4px #648CAD;color:#2B2B2B;">EmfParsley on Twitter</h3>
- <p>
- If you are on twitter and want to get notified about all things EmfParsley,<br>you should consider following <b>@EmfParsley</b>.
- </p>
- </div>
- </a>
- </div>
-</div>
- <!-- FOOTER -->
- <footer style="z-index: 1001;position:relative;background-color:#35414C;-webkit-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);box-shadow: 0px -3px 8px 0px rgba(30,51,72,1);margin-top:1.3%;">
- <img width="100%" alt="" src="img/footer.jpg" />
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-97px 0px 31px 0px;min-height: 36px;">
- <div class="container" style="width:37.6%;">
-
- </div>
- </nav>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-18px 0px 0px 0px;min-height: 36px;">
- <div class="container" style="width:57%;">
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-4">
- <ul class="nav navbar-nav miolifooter">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li style="border-right: 0 none;"><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <p class="terms" style="margin:0px;padding:21px 0px 6px 20px;"><a target="_blank" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/">Legal</a><a class="pull-right" style="z-index: 1001;position:relative;margin:-38px 4% 0px 0px;" href="#top" id="topbutton"><img alt="Back to top" src="img/arrow_up.png"/></a></p>
- </footer>
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>-->
- <script src="js/vendor/jquery.min.js"></script>
- <script src="js/vendor/jquery.scrollstop.js"></script>
- <script src="js/vendor/bootstrap.min.js"></script>
-
- <!-- Open lightbox-content image -->
- <script type="text/javascript">
- $('.featurette-image').click(function(){
- $('.lightbox-content').empty();
- $($(this).parents('div').html()).appendTo('.lightbox-content');
- $('#myModal').modal({show:true});});
- </script>
-
- <script type="text/javascript">
- $('#twitterli').mouseover(function() {
- $('a#twitterli > img').attr('src','img/twitter_h1.png');
- });
- $('#twitterli').mouseout(function() {
- $('a#twitterli > img').attr('src','img/twitter.png');
- });
-
- $('#twitterfooter').mouseover(function() {
- $('a#twitterfooter > img').attr('src','img/twitter_h2.png');
- });
- $('#twitterfooter').mouseout(function() {
- $('a#twitterfooter > img').attr('src','img/twitter.png');
- });
-
- $('#topbutton').mouseover(function() {
- $('a#topbutton > img').attr('src','img/arrow_up_h.png');
- });
- $('#topbutton').mouseout(function() {
- $('a#topbutton > img').attr('src','img/arrow_up.png');
- });
-
- $('.scrollup').mouseover(function() {
- $('a.scrollup').css('opacity', '1');
- });
- $('.scrollup').mouseout(function() {
- $('a.scrollup').css('opacity', '0.35');
- });
-
- //gestione scroll verticale
- $(function() {
- $('a[href*=#]').click(function() {
- if(this.hash=="#top"){
- $('html,body').animate({scrollTop:0}, 800);
- return false;
- } else {
- var arrivo = $(this.hash);
- if (arrivo.length) {
- arrivo=arrivo.offset().top;
- $('html,body').animate({scrollTop:arrivo-205}, 500);
- return false;
- }
- }
- });
- });
-
- $(window).scroll(function() {
- var y = $(this).scrollTop();
- if (y < 800)
- $('a.scrollup').fadeOut();
- else
- $('a.scrollup').fadeIn();
- });
- //prevscroll
- var prevscroll = 0;
- $(window).on("scrollstop", function() {
- var scrollposition = $('html,body').scrollTop()+210;
- if(/chrome/.test(navigator.userAgent.toLowerCase()))
- scrollposition = $("body").scrollTop()+210;
- var mieipar = $("[id^='par']");
- mieipar.each(function(idx) {
- if(idx==mieipar.length-1 && scrollposition>=$(this).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- } else if(scrollposition>=$(this).offset().top && scrollposition<mieipar.eq(idx + 1).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- }
- });
- //inizio prevscroll
- //Gestione scroll del menu laterale in base alla posizione della pagina
- var menuScrollSize = '-250px';
- var pageScrollThreshold = 16730;
- if($(window).height()<$(".dropdown-menu").height()+190){
- if(prevscroll<scrollposition){
- if(scrollposition>pageScrollThreshold)
- $(".dropdown-menu").css('top', menuScrollSize);
- } else
- $(".dropdown-menu").css('top', '0px');
- prevscroll=scrollposition;
- } else if($(".dropdown-menu").css('top')!=null && $(".dropdown-menu").css('top')==menuScrollSize){
- $(".dropdown-menu").css('top', '0px');
- }
- //fine prevscroll
- });
-
- $(document).ready(function() {
- //Setto link attivo nel menu
- var mieili = $('.miomenu li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).addClass('mioactive');
- return false;
- }
- });
- //Setto link attivo nel footer
- mieili = $('.miolifooter li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).children().addClass('mioactivefooter');
- return false;
- }
- });
-
- //Setto gli indici per l'effertto hover del dropdown-menu
- var mieiidx = $(".dropdown-menu a[href='#par']");
- var mieipar = $("[id^='par']");
- mieiidx.each(function(idx) {
- $(this).attr('href','#par'+idx);
- if(idx<mieipar.length)
- mieipar.eq(idx).attr('id','par'+idx);
- });
-
- //Setto le references #addref
- var mieiaddref = $("a[href='#addref']");
- mieiaddref.each(function(idx) {
- var ref = $(".dropdown-menu a:contains("+$(this).attr('rel')+")").attr('href');
- if(ref!=null && ref.length>0)
- $(this).attr('href',ref);
- });
- });
-
- //Levo il blur da tutti i link
- $("a").focus(
- function () {
- if ($(this).blur) $(this).blur();
- }
- );
-
- $('#questiondiv').mouseover(function() {
- $('#questiondiv').css('background-color','#D7EFDA');
- });
- $('#questiondiv').mouseout(function() {
- $('#questiondiv').css('background-color','#e8f9ea');
- });
-
- $('#bugdiv').mouseover(function() {
- $('#bugdiv').css('background-color','#F0F2C6');
- });
- $('#bugdiv').mouseout(function() {
- $('#bugdiv').css('background-color','rgb(246, 247, 227)');
- });
-
- $('#suppdiv').mouseover(function() {
- $('#suppdiv').css('background-color','#E8E8E8');
- });
- $('#suppdiv').mouseout(function() {
- $('#suppdiv').css('background-color','rgb(242, 242, 242)');
- });
-
- $('#twdiv').mouseover(function() {
- $('#twdiv').css('background-color','#CFE5F7');
- });
- $('#twdiv').mouseout(function() {
- $('#twdiv').css('background-color','#e8f3fc');
- });
- </script>
-</body>
-</html>
diff --git a/doc/org.eclipse.emf.parsley.doc.websitegen/website/userReviews.html b/doc/org.eclipse.emf.parsley.doc.websitegen/website/userReviews.html
deleted file mode 100644
index eb9841cf6..000000000
--- a/doc/org.eclipse.emf.parsley.doc.websitegen/website/userReviews.html
+++ /dev/null
@@ -1,367 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="The website of Eclipse EMF Parsley, an open-source framework for development User Interfaces upon EMF models">
- <meta name="author" content="Francesco Guidieri, Paolo Bachini">
- <link rel="icon" href="/favicon.ico">
-
- <title>EMF Parsley - Play with your UI and EMF!</title>
- <link rel="SHORTCUT ICON" href="img/logo_nw.gif" />
- <!-- styles -->
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
-
- <!-- Bootstrap core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <link href="css/main.css" rel="stylesheet">
- <!-- Animate CSS -->
- <link href="css/animate.css" rel="stylesheet">
-
- <!--[if lt IE 9]>
- <link href="css/iebugs.css" rel="stylesheet" type='text/css'>
- <![endif]-->
-
- <!-- Custom styles for this template -->
- <link href="carousel.css" rel="stylesheet">
-
- <!-- Bootstrap Lightbox -->
- <link href="bootstrap-lightbox/bootstrap-lightbox.min.css" rel="stylesheet">
- <!--<script src="js/twitter.js" type="text/javascript"></script>-->
- <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
- <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
- <script src="assets/js/ie-emulation-modes-warning.js"></script>
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="assets/js/ie10-viewport-bug-workaround.js"></script>
-
- <!-- Run Prettify -->
- <script src="prettify/run_prettify.js"></script>
-
- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
- ga('create', 'UA-58549052-1', 'auto');
- ga('send', 'pageview');
-
- </script>
-</head>
-<body>
- <!-- ====== NAVBAR ====== -->
- <body style="overflow-y: scroll; padding-top:185px;">
- <div class="navbar-fixed-top" style="background:url(img/bg-100x100.jpg)">
- <div class="container" style="width:1150px;">
- <div class="navbar-header">
- <a href="index.html"><img class="img-responsive" alt="" src="img/logo.gif"/></a>
- </div>
- </div>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-31px 0px 3px 0px;min-height: 36px;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" style="margin-bottom:2px;">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav pull-right mioli">
- <li><a href="support.html">Contact Us</a></li>
- <li><a href="http://www.eclipse.org">Eclipse.org</a></li>
- <li style="border-right: 0 none;"><a target="_blank" href="https://twitter.com/EmfParsley" id="twitterli"><img style="width:25px;float:left;margin-top: 5px; margin-right:1px;" alt="" src="img/twitter.png"/>@EmfParsley</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <div style="background:url(img/bg1-100x100.jpg);">
- <nav class="navbar navbar-default miomenubar" role="navigation" style="border-radius:0px; background: url('img/menu.jpg') no-repeat; border: 0 none; -webkit-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);box-shadow: 0px 3px 8px 0px rgba(171,209,173,1);margin-bottom:0;">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- </div>
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
- <ul class="nav navbar-nav pull-left miomenu">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- </div>
- </div>
- <!-- NAVBAR End -->
-<style>
- .divbox {
- border: 1px solid #e7e7e7;
- margin-bottom:2.5%;
- padding:5px 0px 32px 0px;
- }
-
- #questiondiv,#suppdiv {
- -webkit-animation: zoomInRight 1.5s;
- -moz-animation: zoomInRight 1.5s;
- -ms-animation: zoomInRight 1.5s;
- -o-animation: zoomInRight 1.5s;
- animation: zoomInRight 1.5s;
- }
-
- #bugdiv,#twdiv {
- -webkit-animation: zoomInLeft 1.5s;
- -moz-animation: zoomInLeft 1.5s;
- -ms-animation: zoomInLeft 1.5s;
- -o-animation: zoomInLeft 1.5s;
- animation: zoomInLeft 1.5s;
- }
-</style>
-<div class="container marketing" style="margin-top:6px;">
- <div class="row featurette">
- <a href="https://goo.gl/pLtvOg" target="_blank">
- <div id="questiondiv" class="col-md-9 col-md-offset-1 divbox" style="background: none repeat scroll 0% 0% #e8f9ea;">
- <h3 style="text-shadow: 0px 0px 4px #80BA81;color:#2B2B2B;margin-left: 10px;">Ed Merks - EMF Project Lead</h3>
- <p style="margin-left: 20px;margin-right: 20px;">
- <b>"What you've showed is crazy cool..."</b> commenting the First talk on EMF Parsley at EclipseConEurope 2013!
- <br><br><i>Click for the video</i>
- </p>
- </div>
- </a>
- <a href="http://www.objectsecurity.com/img/2a.jpg" target="_blank">
- <div id="bugdiv" class="col-md-9 col-md-offset-1 divbox" style="background: none repeat scroll 0% 0% rgb(246, 247, 227);">
- <h3 style="text-shadow: 0px 0px 4px #B2B56E;color:#2B2B2B;margin-left: 10px;">Ulrich Lang - Object Security</h3>
- <p style="margin-left: 20px;margin-right: 20px;">
- “EMF Parsley has helped us achieve some of the specific UI goals for our EMF-based product. We were looking for a tool that would give us a flexible, low-maintenance EMF-based model editing capability without hard-coding etc. and that would support Eclipse RAP. At the same time we were looking for ways to make the editor visually appealing.
- And because this was for production use, we needed good documentation and technical support. EMF Parsley met these requirements very well.
- <br>And the Parsley technical support team at RCP-Vision was great to assist us, very competent and responsive.”
- <br><br><i>Click for a screenshot</i>
- </p>
- </div>
- </a>
-</div>
-</div>
- <!-- FOOTER -->
- <footer style="z-index: 1001;position:relative;background-color:#35414C;-webkit-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);-moz-box-shadow: 0px -3px 8px 0px rgba(171,209,173,1);box-shadow: 0px -3px 8px 0px rgba(30,51,72,1);margin-top:1.3%;">
- <img width="100%" alt="" src="img/footer.jpg" />
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-97px 0px 31px 0px;min-height: 36px;">
- <div class="container" style="width:37.6%;">
-
- </div>
- </nav>
- <nav class="navbar navbar-default" role="navigation" style="background-color:transparent; border:0 none; margin:-18px 0px 0px 0px;min-height: 36px;">
- <div class="container" style="width:57%;">
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-4">
- <ul class="nav navbar-nav miolifooter">
- <li><a href="index.html">Home</a></li>
- <li><a href="download.html">Download</a></li>
- <li><a href="documentation.html">Documentation</a></li>
- <li><a href="sources.html">Sources</a></li>
- <li><a href="support.html">Support</a></li>
- <li style="border-right: 0 none;"><a href="userReviews.html">UserReviews</a></li>
- </ul>
- </div><!-- /.navbar-collapse -->
- </div>
- </nav>
- <p class="terms" style="margin:0px;padding:21px 0px 6px 20px;"><a target="_blank" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a target="_blank" href="http://www.eclipse.org/legal/">Legal</a><a class="pull-right" style="z-index: 1001;position:relative;margin:-38px 4% 0px 0px;" href="#top" id="topbutton"><img alt="Back to top" src="img/arrow_up.png"/></a></p>
- </footer>
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>-->
- <script src="js/vendor/jquery.min.js"></script>
- <script src="js/vendor/jquery.scrollstop.js"></script>
- <script src="js/vendor/bootstrap.min.js"></script>
-
- <!-- Open lightbox-content image -->
- <script type="text/javascript">
- $('.featurette-image').click(function(){
- $('.lightbox-content').empty();
- $($(this).parents('div').html()).appendTo('.lightbox-content');
- $('#myModal').modal({show:true});});
- </script>
-
- <script type="text/javascript">
- $('#twitterli').mouseover(function() {
- $('a#twitterli > img').attr('src','img/twitter_h1.png');
- });
- $('#twitterli').mouseout(function() {
- $('a#twitterli > img').attr('src','img/twitter.png');
- });
-
- $('#twitterfooter').mouseover(function() {
- $('a#twitterfooter > img').attr('src','img/twitter_h2.png');
- });
- $('#twitterfooter').mouseout(function() {
- $('a#twitterfooter > img').attr('src','img/twitter.png');
- });
-
- $('#topbutton').mouseover(function() {
- $('a#topbutton > img').attr('src','img/arrow_up_h.png');
- });
- $('#topbutton').mouseout(function() {
- $('a#topbutton > img').attr('src','img/arrow_up.png');
- });
-
- $('.scrollup').mouseover(function() {
- $('a.scrollup').css('opacity', '1');
- });
- $('.scrollup').mouseout(function() {
- $('a.scrollup').css('opacity', '0.35');
- });
-
- //gestione scroll verticale
- $(function() {
- $('a[href*=#]').click(function() {
- if(this.hash=="#top"){
- $('html,body').animate({scrollTop:0}, 800);
- return false;
- } else {
- var arrivo = $(this.hash);
- if (arrivo.length) {
- arrivo=arrivo.offset().top;
- $('html,body').animate({scrollTop:arrivo-205}, 500);
- return false;
- }
- }
- });
- });
-
- $(window).scroll(function() {
- var y = $(this).scrollTop();
- if (y < 800)
- $('a.scrollup').fadeOut();
- else
- $('a.scrollup').fadeIn();
- });
- //prevscroll
- var prevscroll = 0;
- $(window).on("scrollstop", function() {
- var scrollposition = $('html,body').scrollTop()+210;
- if(/chrome/.test(navigator.userAgent.toLowerCase()))
- scrollposition = $("body").scrollTop()+210;
- var mieipar = $("[id^='par']");
- mieipar.each(function(idx) {
- if(idx==mieipar.length-1 && scrollposition>=$(this).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- } else if(scrollposition>=$(this).offset().top && scrollposition<mieipar.eq(idx + 1).offset().top){
- var parid = $(this).attr('id').match(/\d+/);
- $('.activemenu').removeClass("activemenu");
- $("a[href='#par"+parid+"']").parent().addClass("activemenu");
- }
- });
- //inizio prevscroll
- //Gestione scroll del menu laterale in base alla posizione della pagina
- var menuScrollSize = '-250px';
- var pageScrollThreshold = 16730;
- if($(window).height()<$(".dropdown-menu").height()+190){
- if(prevscroll<scrollposition){
- if(scrollposition>pageScrollThreshold)
- $(".dropdown-menu").css('top', menuScrollSize);
- } else
- $(".dropdown-menu").css('top', '0px');
- prevscroll=scrollposition;
- } else if($(".dropdown-menu").css('top')!=null && $(".dropdown-menu").css('top')==menuScrollSize){
- $(".dropdown-menu").css('top', '0px');
- }
- //fine prevscroll
- });
-
- $(document).ready(function() {
- //Setto link attivo nel menu
- var mieili = $('.miomenu li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).addClass('mioactive');
- return false;
- }
- });
- //Setto link attivo nel footer
- mieili = $('.miolifooter li');
- mieili.each(function(idx) {
- var indirizzo = $(this).children().attr('href');
- if(indirizzo!=null && indirizzo.length>0 && (window.location.href.indexOf(indirizzo)>0 || (window.location.href=='http://www.eclipse.org/emf-parsley/' || window.location.href=='https://www.eclipse.org/emf-parsley/' && indirizzo.indexOf('index')>0))){
- $(this).children().addClass('mioactivefooter');
- return false;
- }
- });
-
- //Setto gli indici per l'effertto hover del dropdown-menu
- var mieiidx = $(".dropdown-menu a[href='#par']");
- var mieipar = $("[id^='par']");
- mieiidx.each(function(idx) {
- $(this).attr('href','#par'+idx);
- if(idx<mieipar.length)
- mieipar.eq(idx).attr('id','par'+idx);
- });
-
- //Setto le references #addref
- var mieiaddref = $("a[href='#addref']");
- mieiaddref.each(function(idx) {
- var ref = $(".dropdown-menu a:contains("+$(this).attr('rel')+")").attr('href');
- if(ref!=null && ref.length>0)
- $(this).attr('href',ref);
- });
- });
-
- //Levo il blur da tutti i link
- $("a").focus(
- function () {
- if ($(this).blur) $(this).blur();
- }
- );
-
- $('#questiondiv').mouseover(function() {
- $('#questiondiv').css('background-color','#D7EFDA');
- });
- $('#questiondiv').mouseout(function() {
- $('#questiondiv').css('background-color','#e8f9ea');
- });
-
- $('#bugdiv').mouseover(function() {
- $('#bugdiv').css('background-color','#F0F2C6');
- });
- $('#bugdiv').mouseout(function() {
- $('#bugdiv').css('background-color','rgb(246, 247, 227)');
- });
-
- $('#suppdiv').mouseover(function() {
- $('#suppdiv').css('background-color','#E8E8E8');
- });
- $('#suppdiv').mouseout(function() {
- $('#suppdiv').css('background-color','rgb(242, 242, 242)');
- });
-
- $('#twdiv').mouseover(function() {
- $('#twdiv').css('background-color','#CFE5F7');
- });
- $('#twdiv').mouseout(function() {
- $('#twdiv').css('background-color','#e8f3fc');
- });
- </script>
-</body>
-</html>

Back to the top