<!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, 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>