<!DOCTYPE html>
<html class="no-js">
<head>
<!-- Basic Page Needs
        ================================================== -->
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="icon" type="image/png" href="images/favicon.ico">
<title>Capella MBSE Tool - Add-Ons</title>
<meta name="description" content="Beyond Capella, the ecosystem offers extensions to unleash the power of your MBSE workbench.">
<meta name="keywords" content="">
<meta name="author" content="">
<!-- Mobile Specific Metas
        ================================================== -->
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Template CSS Files
        ================================================== -->
<!-- Twitter Bootstrs CSS -->
<link rel="stylesheet" href="css/bootstrap.min.css">
<!-- animate css -->
<link rel="stylesheet" href="css/animate.css">
<!-- template main css file -->
<link rel="stylesheet" href="css/main.css">
<!-- responsive css -->
<link rel="stylesheet" href="css/responsive.css">
<link rel="stylesheet" href="css/latofonts.css">

<script src="https://use.fontawesome.com/b51f77a16a.js"></script>

<!-- Cookie content -->
<link rel="stylesheet" type="text/css" href="//www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css" />
<script async src="//www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script>

<!-- Eclipse Foundation Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5WLCZXC');</script>
<!-- End Google Tag Manager -->

<!-- Template Javascript Files
        ================================================== -->
<!-- Angular -->
<base href="/capella/">
<script src="js/angular-1.7.8.min.js"></script>
<script src="angular/capella.js"></script>

<!-- modernizr js -->
<script src="js/vendor/modernizr-2.6.2.min.js"></script>
<!-- jquery -->
<script src="js/jquery-3.4.1.min.js"></script>
<script src="js/popper-1.14.3.min.js"></script>
<!-- bootstrap js -->
<script src="js/bootstrap.min.js"></script>
<!-- wow js -->
<script src="js/wow.min.js"></script>
<!-- template main js -->
<script async src="js/main.js"></script>

</head>
<body ng-app="capella" data-deferred-cloak>
	<!--
     ==================================================
     Header Section
     ================================================== -->
	<ng-include src="'angular/blocks/header.html'"></ng-include>
	<!--
    ==================================================
    Intro Section
    ================================================== -->
	<section class="hero-area addons">
		<div class="container">
			<div class="row">
				<div class="col-md-12 text-center">
					<div class="block wow fadeInUp" data-wow-delay=".3s">

						<section class="cd-intro">
							<h1 class="wow fadeInUp animated" data-wow-delay=".4s">Add-Ons</h1>
						</section>
						<!-- cd-intro -->
						<h2 class="wow fadeInUp animated" data-wow-delay=".6s">
							Beyond Eclipse Capella&trade;, the ecosystem offers extensions <br>to
							unleash the power of your MBSE workbench
						</h2>
					</div>
				</div>
			</div>
		</div>
	</section>
	<!--/#intro_banner-->

	<!--
        ==================================================
        Secure your industrial Capella deployment
        ================================================== -->
		<section id="services" class="">
				<div class="container">
				
					<div class="row">
						<p><i>To install Capella extensions have a look to the <a href="https://github.com/eclipse/capella/blob/master/doc/plugins/org.polarsys.capella.ui.doc/html/Installation%20Guide/How%20to%20install%20Capella%20and%20Addons.mediawiki#Configuration_and_Extensibility" target="_blank">installation procedure</a></i></p>
					</div>
					
					<div class="row">
						<div id="accordion-opensource-addons" class="accordion dropdown_content">
						</div>
					</div>
					
					<div class="row">
						<div id="accordion-commercial-addons" class="accordion dropdown_content">
						</div>
					</div>
					
					<div class="row">
						<div id="accordion-labs-addons"><h1>Labs add-ons</h1></div>
						It is the place where Capella users, as well as tool providers, can collaborate and create synergies to develop Capella add-ons
						<a class="btn btn-default" href="https://labs4capella.github.io">Discover Labs for Capella&nbsp;<i class="fa fa-external-link"></i></a>
						<br/><br/>
					</div>
					
					<div class="row">
						<div id="accordion-sample-addons" class="accordion dropdown_content">
						</div>
					</div>
					
					<div class="row">
						<p class="underline"><b><u>Compatibility and integration</u></b></p>
						<p><i>Each author is responsible for the compatibility of his add-ons with different versions of Capella. See the Add-ons <a href="https://wiki.eclipse.org/Capella/Roadmap#Add-ons" target="_blank">releases and compatibility matrix</a></i>
						<br><i>Additional integration may be needed between two add-ons provided by different authors.</i></p>
					</div>
					
				</div>
		</section>
		
		<script>

				   $.getJSON('json/downloads.json', function(data) {
					  let eplAddons = data.addons.filter(function(a) { return a.licence == 'EPL' && !a.isSample }); //Open-source add-ons
					  let commercialAddons = data.addons.filter(function(a) { return a.licence == 'Commercial' }); //Commercial add-ons
					  let sampleAddons = data.addons.filter(function(a) { return a.isSample });

					  if (eplAddons.length != 0) {
						addTitleToDiv("accordion-opensource-addons", "Open-Source Add-ons");
						for (addon in eplAddons) {
							addAddonSection(data, eplAddons[addon], "accordion-opensource-addons");
						}
					  }

					  if (commercialAddons.length != 0) {
						addTitleToDiv("accordion-commercial-addons", "Commercial Add-ons");
						for (addon in commercialAddons) {
							addAddonSection(data, commercialAddons[addon], "accordion-commercial-addons");
						}
					  }
					  
					  if (sampleAddons.length != 0) {
						addTitleToDiv("accordion-sample-addons", "Sample Add-ons", "Add-ons that show how to start developing add-ons for Capella using Capella Studio");
						
						for (addon in sampleAddons) {
							addAddonSection(data, sampleAddons[addon], "accordion-sample-addons");
						}
					  }
				   });

				  function addTitleToDiv(divId, title, description) {
					let desc = description == undefined ? "": description;
					document.getElementById(divId).innerHTML += "<div><h1>" + title + "</h1>" + desc + "</div>";
				  }

				  function createKeysLinks(data, addon, download, icons) {
							let keys = Object.keys(download).filter(function(x) { return x != "notes" });
							let links = keys.map(function(k) {
							let icon = icons == undefined && data.lang[k].icon ? '<i class="pl-2 {0}" aria-hidden="true"></i>'.format(data.lang[k].icon) : "";
							if (data.lang[k].target == "_expand") {
								return '<a data-toggle="collapse" data-target="#collapse-notes-{3}">{4}{5}</a>'.format(download[k], data.lang[k].target, data.versionBranch, addon.key, data.lang[k].text, icon);
							} else if (Array.isArray(download[k])) {
								let value = download[k];
								return data.lang[k].text + "s"+ icon + " (" + value.map(function(x) { return '<a href="{0}" onClick="ga(\'send\', \'event\', \'Capella\', \'{1}\', \'{2}\');">{3}</a>'.format(x.url, data.versionBranch, addon.key, x.name) }).join(" + ")+")";
							}
							return '<a href="{0}" {1} onClick="ga(\'send\', \'event\', \'Capella\', \'{2}\', \'{3}\');">{4}{5}</a>'.format(download[k], data.lang[k].target == undefined ? "" : 'target="'+data.lang[k].target+'}"', data.versionBranch, addon.key, data.lang[k].text, icon);
						 }).join(" - ");
						 return links;
				  }

				  function addAddonSection(data, addon, divId) {
					let keys = Object.keys(addon.download);
					let links = createKeysLinks(data, addon, addon.download);
						 let header = [];
						 if (addon.contact) {
							header.push("Contact: "+addon.contact);
						 }
						 if (addon.licence) {
							header.push("License: "+addon.licence);
						 }
						 if (addon.tags) {
						 	let tags='';
						 	for (tag in addon.tags) {
						 		tags+=' <button class="tag">'+addon.tags[tag]+'</button>';
							}
							header.push(tags);
						 }
						 header=header.join(" - ");

						 let compatible = addon.compatibleWithCurrentVersion === false ? '<button role="button" class="fa fa-exclamation-triangle btn-link btn-xs alert-compatibility" data-toggle="tooltip" data-placement="bottom" title="{0}" ></button>'.format(data.lang.compatibility.text) : "";
						 let addonName = addon.isViewpoint ? addon.name + " Viewpoint" : addon.name;
						 let fragment = addon.fragment != undefined ? addon.fragment : addon.key;
						 
						 let dropdown = '<div class="accordion-heading"><a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordion2" href="#{0}"><h3>{1}</h3><span class="fa fa-caret-down txt_yellow">&nbsp;</span><span class="descr txt_lightest_grey">{2}</span></a></div>'.format(fragment, addonName, header);

						 let sections = keys.filter(function(k) { return data.lang[k].target == "_expand" }).map(function(k) {
							let div = '<div class="collapse notes-section" id="collapse-notes-'+addon.key+'"><h3>'+data.lang[k].text+'</h3>'+createKeysLinks(data, addon, addon.download[k])+addon.download[k]["notes"]+'</div>';
							return div;
						 }).join("");

						 let content = '<div id="{0}" class="accordion-body collapse" style="height: 0px;"><div class="accordion-inner">{1}<p>{2}{3}</p>{4}</div></div>'.format(fragment, addon.description, compatible, links, sections);
						 let result = '<div class="accordion-group">{0}{1}</div>'.format(dropdown, content);
						 
						 document.getElementById(divId).innerHTML += result;

					  $('[data-toggle="popover"]').popover( { html: true, container: 'body' });
					  $('[data-toggle="tooltip"]').tooltip();
					}
			  </script>

			  
			  
	<!-- #services -->

	<div id="back-to-top" data-spy="affix" data-offset-top="100"
		class="back-to-top hidden-xs hidden-sm affix-top">
		<button class="btn btn-default" title="Back to Top">
			<i class="fa fa-caret-up"></i>
		</button>
	</div>
	<script type="text/javascript">
	// Back to top
		jQuery('#back-to-top').on('click', function() {
			jQuery("html, body").animate({
				scrollTop : 0
			}, 500);
			return false;
		});
	</script>

	<!--
        ==================================================
        Call To Action Section Start
        ================================================== -->
        		<ng-include src="'angular/blocks/call2action_services.html'"></ng-include>



	<!--
        ==================================================
        Footer Section
        ================================================== -->
	<ng-include src="'angular/blocks/footer.html'"></ng-include>
	<script async src="js/googleAnalytics.js" ></script>
</body>
</html>