diff --git a/LICENCE b/LICENCE
new file mode 100644
index 0000000..e23ece2
--- /dev/null
+++ b/LICENCE
@@ -0,0 +1,277 @@
+Eclipse Public License - v 2.0
+
+ THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+ PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
+ OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial content
+ Distributed under this Agreement, and
+
+ b) in the case of each subsequent Contributor:
+ i) changes to the Program, and
+ ii) additions to the Program;
+ where such changes and/or additions to the Program originate from
+ and are Distributed by that particular Contributor. A Contribution
+ "originates" from a Contributor if it was added to the Program by
+ such Contributor itself or anyone acting on such Contributor's behalf.
+ Contributions do not include changes or additions to the Program that
+ are not Modified Works.
+
+"Contributor" means any person or entity that Distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions Distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement
+or any Secondary License (as applicable), including Contributors.
+
+"Derivative Works" shall mean any work, whether in Source Code or other
+form, that is based on (or derived from) the Program and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship.
+
+"Modified Works" shall mean any work in Source Code or other form that
+results from an addition to, deletion from, or modification of the
+contents of the Program, including, for purposes of clarity any new file
+in Source Code form that contains any contents of the Program. Modified
+Works shall not include works that contain only declarations,
+interfaces, types, classes, structures, or files of the Program solely
+in each case in order to link to, bind by name, or subclass the Program
+or Modified Works thereof.
+
+"Distribute" means the acts of a) distributing or b) making available
+in any manner that enables the transfer of a copy.
+
+"Source Code" means the form of a Program preferred for making
+modifications, including but not limited to software source code,
+documentation source, and configuration files.
+
+"Secondary License" means either the GNU General Public License,
+Version 2.0, or any later versions of that license, including any
+exceptions or additional permissions as identified by the initial
+Contributor.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free copyright
+ license to reproduce, prepare Derivative Works of, publicly display,
+ publicly perform, Distribute and sublicense the Contribution of such
+ Contributor, if any, and such Derivative Works.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free patent
+ license under Licensed Patents to make, use, sell, offer to sell,
+ import and otherwise transfer the Contribution of such Contributor,
+ if any, in Source Code or other form. This patent license shall
+ apply to the combination of the Contribution and the Program if, at
+ the time the Contribution is added by the Contributor, such addition
+ of the Contribution causes such combination to be covered by the
+ Licensed Patents. The patent license shall not apply to any other
+ combinations which include the Contribution. No hardware per se is
+ licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the
+ licenses to its Contributions set forth herein, no assurances are
+ provided by any Contributor that the Program does not infringe the
+ patent or other intellectual property rights of any other entity.
+ Each Contributor disclaims any liability to Recipient for claims
+ brought by any other entity based on infringement of intellectual
+ property rights or otherwise. As a condition to exercising the
+ rights and licenses granted hereunder, each Recipient hereby
+ assumes sole responsibility to secure any other intellectual
+ property rights needed, if any. For example, if a third party
+ patent license is required to allow Recipient to Distribute the
+ Program, it is Recipient's responsibility to acquire that license
+ before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has
+ sufficient copyright rights in its Contribution, if any, to grant
+ the copyright license set forth in this Agreement.
+
+ e) Notwithstanding the terms of any Secondary License, no
+ Contributor makes additional grants to any Recipient (other than
+ those set forth in this Agreement) as a result of such Recipient's
+ receipt of the Program under the terms of a Secondary License
+ (if permitted under the terms of Section 3).
+
+3. REQUIREMENTS
+
+3.1 If a Contributor Distributes the Program in any form, then:
+
+ a) the Program must also be made available as Source Code, in
+ accordance with section 3.2, and the Contributor must accompany
+ the Program with a statement that the Source Code for the Program
+ is available under this Agreement, and informs Recipients how to
+ obtain it in a reasonable manner on or through a medium customarily
+ used for software exchange; and
+
+ b) the Contributor may Distribute the Program under a license
+ different than this Agreement, provided that such license:
+ i) effectively disclaims on behalf of all other Contributors all
+ warranties and conditions, express and implied, including
+ warranties or conditions of title and non-infringement, and
+ implied warranties or conditions of merchantability and fitness
+ for a particular purpose;
+
+ ii) effectively excludes on behalf of all other Contributors all
+ liability for damages, including direct, indirect, special,
+ incidental and consequential damages, such as lost profits;
+
+ iii) does not attempt to limit or alter the recipients' rights
+ in the Source Code under section 3.2; and
+
+ iv) requires any subsequent distribution of the Program by any
+ party to be under a license that satisfies the requirements
+ of this section 3.
+
+3.2 When the Program is Distributed as Source Code:
+
+ a) it must be made available under this Agreement, or if the
+ Program (i) is combined with other material in a separate file or
+ files made available under a Secondary License, and (ii) the initial
+ Contributor attached to the Source Code the notice described in
+ Exhibit A of this Agreement, then the Program may be made available
+ under the terms of such Secondary Licenses, and
+
+ b) a copy of this Agreement must be included with each copy of
+ the Program.
+
+3.3 Contributors may not remove or alter any copyright, patent,
+trademark, attribution notices, disclaimers of warranty, or limitations
+of liability ("notices") contained within the Program from any copy of
+the Program which they Distribute, provided that Contributors may add
+their own appropriate notices.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program,
+the Contributor who includes the Program in a commercial product
+offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes
+the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and indemnify every
+other Contributor ("Indemnified Contributor") against any losses,
+damages and costs (collectively "Losses") arising from claims, lawsuits
+and other legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the Program
+in a commercial product offering. The obligations in this section do not
+apply to any claims or Losses relating to any actual or alleged
+intellectual property infringement. In order to qualify, an Indemnified
+Contributor must: a) promptly notify the Commercial Contributor in
+writing of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those performance
+claims and warranties, and if a court requires any other Contributor to
+pay any damages as a result, the Commercial Contributor must pay
+those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
+BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
+TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+PURPOSE. Each Recipient is solely responsible for determining the
+appropriateness of using and distributing the Program and assumes all
+risks associated with its exercise of rights under this Agreement,
+including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs
+or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
+SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other software
+or hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and
+may only be modified in the following manner. The Agreement Steward
+reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement
+Steward has the right to modify this Agreement. The Eclipse Foundation
+is the initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+Distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to Distribute the Program (including its
+Contributions) under the new version.
+
+Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
+receives no rights or licenses to the intellectual property of any
+Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted
+under this Agreement are reserved. Nothing in this Agreement is intended
+to be enforceable by any entity that is not a Contributor or Recipient.
+No third-party beneficiary rights are created under this Agreement.
+
+Exhibit A - Form of Secondary Licenses Notice
+
+"This Source Code may also be made available under the following
+Secondary Licenses when the conditions for such availability set forth
+in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
+version(s), and exceptions or additional permissions here}."
+
+ Simply including a copy of this Agreement, including this Exhibit A
+ is not sufficient to license the Source Code under Secondary Licenses.
+
+ If it is not possible or desirable to put the notice in a particular
+ file, then You may include the notice in a location (such as a LICENSE
+ file in a relevant directory) where a recipient would be likely to
+ look for such a notice.
+
+ You may add additional accurate notices of copyright ownership.
\ No newline at end of file
diff --git a/README.md b/README.md
index c1c41e6..4339163 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,50 @@
-# schematic
+# Domain(s)-specialist viewpoint for system schematics addon for Capella (MBSE)
+## Purpose
+In Cyber Physic system, most of the architecture work is done within a schematic tool (Autodesk Autocad, etc) for designing the system and its corresponding physical architecture realized by (mostly) hardware components (pumps, etc).
+However this (usual and classic) way of proceeding does not ease for moving up to the architecture levels (logical, system and operational), leading to inconsistencies between domain-specialists (electrical, hydraulic, etc) and even more with the upper system-level.
-## Getting started
+This add-on permits a domain-specialist engineer to work with "block and link" simplified representations and be able to generate the domain-specialist representation from it (one-click process).
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+## How it works
+A "block" within a Physical Architecture Blank will be "replaced" dynamically with its right domain-specific visual representation, according to the property values set for this block. The (pre-defined by settings) property values map the "block" with a component type or material from a (pre-defined by settings) catalog, allowing its dynamic replacement at runtime and taking care of interfaces/links positionning.
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin https://developers.naval-group.com/gitlab/axe63/capella_addons/schematic.git
-git branch -M main
-git push -uf origin main
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](https://developers.naval-group.com/gitlab/axe63/capella_addons/schematic/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
+## Visuals
+TODO
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+## Installation
+Download the build and unzip it in the dropins directory within your Capella installation. Restart Capella.
+Then activate the corresponding viewpoint in Capella to enable it.
-## Name
-Choose a self-explaining name for your project.
+> Please consult the releases page for the supported Capella's versions.
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+## Usage
+Set the right settings (look at the documentation within the Capella help) for importing the visual figures for each domain-specialist representation according to the right properties you are going to assign to each component.
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+Model your physical architecture (within the Physical Architecture, with a "Physical Architecture Blank" type diagramme) as you usually do (business as usual).
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+Select the Domain(s)-specialist viewpoint for system schematics for this diagramme and the magic happens. A new diagramme is generated !
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+> Disclaimer: this addon is delivered as-is and we are not liable of any data loss or data corruption your project may occur by using it.
## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+Unfortunatly we do not provide any assistance or support for the addon usage. Please use as much as possible the Gitlab forum for help and/or assistance as we hope the community will participate and contribute.
## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
+To date, we do not plan any enhancements however if you have ideas for releases in the future, feel free to contact us or propose it in the forum.
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
+Regarding the maintenance planning for supporting the next Capella releases, source code is at your disposal and we will be happy to merge your new branch proposal or PR.
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+## Contributing
+Feel free to help us, we are open to any assistance or support.
## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
+Thank you to all contributors that made it possible.
+Copyright 2022 Naval Group SA
## License
-For open source projects, say how it is licensed.
+This project is under the EPL2.0
## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+We run out of energy or time for this project, development has slowed down. You can make us an explicit request for becoming a maintainer.
diff --git a/dev/com.navalgroup.dev/.project b/dev/com.navalgroup.dev/.project
new file mode 100644
index 0000000..1885a22
--- /dev/null
+++ b/dev/com.navalgroup.dev/.project
@@ -0,0 +1,11 @@
+
+
+ com.navalgroup.dev
+
+
+
+
+
+
+
+
diff --git a/dev/com.navalgroup.dev/.settings/org.eclipse.core.resources.prefs b/dev/com.navalgroup.dev/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..319bf27
--- /dev/null
+++ b/dev/com.navalgroup.dev/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//Spec/spec.textile=UTF-8
diff --git a/dev/com.navalgroup.dev/CheckstyleConfiguration.xml b/dev/com.navalgroup.dev/CheckstyleConfiguration.xml
new file mode 100644
index 0000000..7c1cc51
--- /dev/null
+++ b/dev/com.navalgroup.dev/CheckstyleConfiguration.xml
@@ -0,0 +1,365 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/com.navalgroup.dev/checkstyle-suppressions.xml b/dev/com.navalgroup.dev/checkstyle-suppressions.xml
new file mode 100644
index 0000000..fa74026
--- /dev/null
+++ b/dev/com.navalgroup.dev/checkstyle-suppressions.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/com.navalgroup.dev/codetemplates.xml b/dev/com.navalgroup.dev/codetemplates.xml
new file mode 100644
index 0000000..d22d98b
--- /dev/null
+++ b/dev/com.navalgroup.dev/codetemplates.xml
@@ -0,0 +1,40 @@
+/**
+
+ * @return the ${bare_field_name}
+ *//**
+ * @param ${param} the ${bare_field_name} to set
+ *//**
+ * ${tags}
+ *//**
+ * Copyright (c) 2021 Naval Group SA.
+ *//**
+ * @author ${user}
+ *
+ * ${tags}
+ *//**
+ *
+ *//**
+ * ${tags}
+ *//**
+ * ${tags}
+ * ${see_to_target}
+ */${filecomment}
+${package_declaration}
+
+${typecomment}
+${type_declaration}
+
+
+
+// ${todo} Auto-generated catch block
+${exception_var}.printStackTrace();// ${todo} Auto-generated method stub
+${body_statement}${body_statement}
+// ${todo} Auto-generated constructor stubreturn ${field};${field} = ${param};
\ No newline at end of file
diff --git a/dev/com.navalgroup.dev/formatter.xml b/dev/com.navalgroup.dev/formatter.xml
new file mode 100644
index 0000000..056685b
--- /dev/null
+++ b/dev/com.navalgroup.dev/formatter.xml
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/com.navalgroup.dev/pmd-rules.xml b/dev/com.navalgroup.dev/pmd-rules.xml
new file mode 100644
index 0000000..51f81ff
--- /dev/null
+++ b/dev/com.navalgroup.dev/pmd-rules.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/features/com.navalgroup.capella.schematic.feature/.gitignore b/features/com.navalgroup.capella.schematic.feature/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/features/com.navalgroup.capella.schematic.feature/.project b/features/com.navalgroup.capella.schematic.feature/.project
new file mode 100644
index 0000000..d948f13
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/.project
@@ -0,0 +1,17 @@
+
+
+ com.navalgroup.capella.schematic.feature
+
+
+
+
+
+ org.eclipse.pde.FeatureBuilder
+
+
+
+
+
+ org.eclipse.pde.FeatureNature
+
+
diff --git a/features/com.navalgroup.capella.schematic.feature/about.html b/features/com.navalgroup.capella.schematic.feature/about.html
new file mode 100644
index 0000000..5eb1046
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/about.html
@@ -0,0 +1,36 @@
+
+
+
+
+About
+
+
+
About This Content
+
+
May 13, 2022
+
License
+
+
+ The Eclipse Foundation makes available all content in this plug-in
+ ("Content"). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 ("EPL"). A copy of the EPL is
+ available at http://www.eclipse.org/legal/epl-2.0.
+ For purposes of the EPL, "Program" will mean the Content.
+
+
+
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ ("Redistributor") and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at http://www.eclipse.org.
+
+
+
+
\ No newline at end of file
diff --git a/features/com.navalgroup.capella.schematic.feature/build.properties b/features/com.navalgroup.capella.schematic.feature/build.properties
new file mode 100644
index 0000000..5d8bbf3
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/build.properties
@@ -0,0 +1,14 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+
+bin.includes = feature.xml,\
+ feature.properties,\
+ about.html
diff --git a/features/com.navalgroup.capella.schematic.feature/feature.properties b/features/com.navalgroup.capella.schematic.feature/feature.properties
new file mode 100644
index 0000000..c98f12f
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/feature.properties
@@ -0,0 +1,13 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+
+pluginName = Capella Schematic Viewpoint Feature
+providerName = Naval Group SA
\ No newline at end of file
diff --git a/features/com.navalgroup.capella.schematic.feature/feature.xml b/features/com.navalgroup.capella.schematic.feature/feature.xml
new file mode 100644
index 0000000..422857b
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/feature.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+ Capella 1.4.x <-> Capella Schematic Viewpont Feature.
+
+
+
+ Copyright (c) 2021 Naval Group SA.
+
+
+
+ Copyright (c) 2021 Naval Group SA.
+
+
+
+
+
+
+
+
+
diff --git a/features/com.navalgroup.capella.schematic.feature/pom.xml b/features/com.navalgroup.capella.schematic.feature/pom.xml
new file mode 100644
index 0000000..96dd838
--- /dev/null
+++ b/features/com.navalgroup.capella.schematic.feature/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ 4.0.0
+
+
+ com.navalgroup.capella.schematic
+ com.navalgroup.capella.schematic.parent
+ 1.1.0-SNAPSHOT
+ ../../
+
+
+ com.navalgroup.capella.schematic
+ com.navalgroup.capella.schematic.feature
+ eclipse-feature
+ 1.1.0-SNAPSHOT
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/.checkstyle b/plugins/com.navalgroup.capella.schematic.design/.checkstyle
new file mode 100644
index 0000000..9a5b03c
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/.checkstyle
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/.classpath b/plugins/com.navalgroup.capella.schematic.design/.classpath
new file mode 100644
index 0000000..39810b7
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/.gitignore b/plugins/com.navalgroup.capella.schematic.design/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/plugins/com.navalgroup.capella.schematic.design/.project b/plugins/com.navalgroup.capella.schematic.design/.project
new file mode 100644
index 0000000..3d14dd2
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/.project
@@ -0,0 +1,34 @@
+
+
+ com.navalgroup.capella.schematic.design
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ net.sf.eclipsecs.core.CheckstyleBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+ net.sf.eclipsecs.core.CheckstyleNature
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/META-INF/MANIFEST.MF b/plugins/com.navalgroup.capella.schematic.design/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9da0f02
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: com.navalgroup.capella.schematic.design;singleton:=true
+Bundle-Version: 1.1.0.qualifier
+Bundle-Activator: com.navalgroup.capella.schematic.design.SchematicDesignPlugin$Implementation
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.sirius,
+ org.eclipse.sirius.common.acceleo.aql,
+ org.polarsys.capella.core.data.gen,
+ org.eclipse.gmf.runtime.diagram.ui,
+ org.eclipse.sirius.diagram,
+ org.eclipse.sirius.diagram.ui,
+ org.eclipse.sirius.ext.base,
+ org.polarsys.capella.core.sirius.analysis,
+ org.eclipse.emf.common.ui,
+ com.navalgroup.capella.schematic.ui,
+ org.eclipse.core.expressions
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: com.navalgroup.capella.schematic.design,
+ com.navalgroup.capella.schematic.design.images.editparts,
+ com.navalgroup.capella.schematic.design.images.figures,
+ com.navalgroup.capella.schematic.design.images.providers,
+ com.navalgroup.capella.schematic.design.services,
+ com.navalgroup.capella.schematic.design.ui.handlers,
+ com.navalgroup.capella.schematic.design.ui.property.testers
+Automatic-Module-Name: com.navalgroup.capella.schematic.design
diff --git a/plugins/com.navalgroup.capella.schematic.design/OSGI-INF/l10n/bundle.properties b/plugins/com.navalgroup.capella.schematic.design/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000..634defc
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,39 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+Bundle-Vendor = Naval Group SA
+Bundle-Name = Capella Schematic Viewpoint Design
+
+schematic.viewpoint.name=Schematic
+schematic.layer.image=Schematic Name
+schematic.layer.label.rtpf = Schematic RTPF
+schematic.layer.label.conf.file = Schematic Other Labels
+
+schematic.menu.label=Schematic Viewpoint
+schematic.action.rotate.90.left.label=Rotate 90 degrees left
+schematic.action.rotate.90.left.tootip=Rotate image 90 degrees left
+schematic.action.rotate.90.right.label=Rotate 90 degrees right
+schematic.action.rotate.90.right.tootip=Rotate image 90 degrees right
+schematic.action.rotate.180.label=Rotate 180 degrees
+schematic.action.rotate.180.tootip=Rotate image 180 degrees
+schematic.action.horizontal.symmetry.label=Flip horizontally
+schematic.action.horizontal.symmetry.tooltip=Flip image horizontally
+schematic.action.vertical.symmetry.label=Flip vertically
+schematic.action.vertical.symmetry.tooltip=Flip image vertically
+schematic.action.back.initial.label=Back to Initial Image
+schematic.action.back.initial.tooltip=Back to Initial Image
+
+ConfigurationFileService_CouldNotLoadConfigurationFile=The configuration file %s could not be loaded.
+ConfigurationFileService_WrongConfigurationPropertyValue=The configuration with key %s exists in configuration file but has wrong value. Please correct it.
+ConfigurationFileService_ImageFileNotFound=The configuration with key %s exists in configuration file but image file is not accessible. Please check if the image file exists or if the project containing the images is in the workspace and is opened.
+ConfigurationFileService_NoConfigurationPropertyValue=The key %s is not defined in the configuration file. Please add it.
+ConfigurationFileService_NoConfigurationFileInPreference=No configuration/mapping file has been found for Schematic viewpoint. Please set it in Capella > Schematic preferences.
+SchematicService_NoSessionFound=Save image position: No session found. Rotation/Symmetry can not be applied.
+AbstractSchematicDNodeContainerEditPart_ImageTranslationNotAvailableOnSVGImage=It is not possible to apply a transformation (rotation/symmetry) to SVG images. You have to add a new image to the global images project.
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.design/about.html b/plugins/com.navalgroup.capella.schematic.design/about.html
new file mode 100644
index 0000000..5eb1046
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/about.html
@@ -0,0 +1,36 @@
+
+
+
+
+About
+
+
+
About This Content
+
+
May 13, 2022
+
License
+
+
+ The Eclipse Foundation makes available all content in this plug-in
+ ("Content"). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 ("EPL"). A copy of the EPL is
+ available at http://www.eclipse.org/legal/epl-2.0.
+ For purposes of the EPL, "Program" will mean the Content.
+
+
+
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ ("Redistributor") and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at http://www.eclipse.org.
+
+
+
+
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.design/bin/.gitignore b/plugins/com.navalgroup.capella.schematic.design/bin/.gitignore
new file mode 100644
index 0000000..c2d9872
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/bin/.gitignore
@@ -0,0 +1 @@
+/com/
diff --git a/plugins/com.navalgroup.capella.schematic.design/build.properties b/plugins/com.navalgroup.capella.schematic.design/build.properties
new file mode 100644
index 0000000..8853004
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/build.properties
@@ -0,0 +1,19 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ description/,\
+ plugin.xml,\
+ OSGI-INF/,\
+ icons/,\
+ about.html
diff --git a/plugins/com.navalgroup.capella.schematic.design/description/schematic-1.4.2.odesign b/plugins/com.navalgroup.capella.schematic.design/description/schematic-1.4.2.odesign
new file mode 100644
index 0000000..f4e3e64
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/description/schematic-1.4.2.odesign
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/description/schematic-5.1.0.odesign b/plugins/com.navalgroup.capella.schematic.design/description/schematic-5.1.0.odesign
new file mode 100644
index 0000000..2ae8efc
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/description/schematic-5.1.0.odesign
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/description/schematic-5.2.0.odesign b/plugins/com.navalgroup.capella.schematic.design/description/schematic-5.2.0.odesign
new file mode 100644
index 0000000..2ae8efc
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/description/schematic-5.2.0.odesign
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/backToInitialPosition.png b/plugins/com.navalgroup.capella.schematic.design/icons/backToInitialPosition.png
new file mode 100644
index 0000000..4dcff67
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/backToInitialPosition.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/horizontalSymmetry.png b/plugins/com.navalgroup.capella.schematic.design/icons/horizontalSymmetry.png
new file mode 100644
index 0000000..9924018
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/horizontalSymmetry.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/rotation180.gif b/plugins/com.navalgroup.capella.schematic.design/icons/rotation180.gif
new file mode 100644
index 0000000..274459e
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/rotation180.gif differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/rotation90Left.gif b/plugins/com.navalgroup.capella.schematic.design/icons/rotation90Left.gif
new file mode 100644
index 0000000..8f1ee8b
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/rotation90Left.gif differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/rotation90Right.gif b/plugins/com.navalgroup.capella.schematic.design/icons/rotation90Right.gif
new file mode 100644
index 0000000..1bbdb55
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/rotation90Right.gif differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/schematic.gif b/plugins/com.navalgroup.capella.schematic.design/icons/schematic.gif
new file mode 100644
index 0000000..830be0e
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/schematic.gif differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/transparent_16.png b/plugins/com.navalgroup.capella.schematic.design/icons/transparent_16.png
new file mode 100644
index 0000000..7b6496c
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/transparent_16.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/icons/verticalSymmetry.png b/plugins/com.navalgroup.capella.schematic.design/icons/verticalSymmetry.png
new file mode 100644
index 0000000..3d3e052
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.design/icons/verticalSymmetry.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.design/plugin.xml b/plugins/com.navalgroup.capella.schematic.design/plugin.xml
new file mode 100644
index 0000000..d9cd5cd
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/plugin.xml
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/pom.xml b/plugins/com.navalgroup.capella.schematic.design/pom.xml
new file mode 100644
index 0000000..3c4ed5e
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ 4.0.0
+
+
+ com.navalgroup.capella.schematic
+ com.navalgroup.capella.schematic.parent
+ 1.1.0-SNAPSHOT
+ ../../
+
+
+ com.navalgroup.capella.schematic
+ com.navalgroup.capella.schematic.design
+ eclipse-plugin
+ 1.1.0-SNAPSHOT
+
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/Messages.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/Messages.java
new file mode 100644
index 0000000..19b08d5
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/Messages.java
@@ -0,0 +1,44 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design;
+
+import org.eclipse.sirius.ext.base.I18N;
+import org.eclipse.sirius.ext.base.I18N.TranslatableMessage;
+
+/**
+ * I18n messages for the plug-in.
+ *
+ * @author Nathalie Lepine
+ */
+public class Messages {
+
+ @TranslatableMessage
+ public static String ConfigurationFileService_CouldNotLoadConfigurationFile;
+ @TranslatableMessage
+ public static String ConfigurationFileService_WrongConfigurationPropertyValue;
+ @TranslatableMessage
+ public static String ConfigurationFileService_ImageFileNotFound;
+ @TranslatableMessage
+ public static String ConfigurationFileService_NoConfigurationPropertyValue;
+ @TranslatableMessage
+ public static String ConfigurationFileService_NoConfigurationFileInPreference;
+ @TranslatableMessage
+ public static String SchematicService_NoSessionFound;
+ @TranslatableMessage
+ public static String AbstractSchematicDNodeContainerEditPart_ImageTranslationNotAvailableOnSVGImage;
+
+ static {
+ // initialize resource bundle
+ I18N.initializeMessages(Messages.class, SchematicDesignPlugin.INSTANCE);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/SchematicDesignPlugin.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/SchematicDesignPlugin.java
new file mode 100644
index 0000000..3fdb3a2
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/SchematicDesignPlugin.java
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.ui.EclipseUIPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
+import org.eclipse.sirius.viewpoint.description.Viewpoint;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ *
+ * @author Nathalie Lepine
+ */
+public class SchematicDesignPlugin extends EMFPlugin {
+ /**
+ * The plug-in ID.
+ */
+ public static final String PLUGIN_ID = "com.navalgroup.capella.schematic.design";
+
+ /**
+ * The shared instance.
+ */
+ public static final SchematicDesignPlugin INSTANCE = new SchematicDesignPlugin();
+
+ /** The sole instance of the bundle activator. */
+ private static Implementation plugin;
+
+ /**
+ * Viewpoints.
+ */
+ private static Set viewpoints;
+
+ /**
+ * The constructor.
+ */
+ public SchematicDesignPlugin() {
+ super(new ResourceLocator[0]);
+ }
+
+ @Override
+ public ResourceLocator getPluginResourceLocator() {
+ return plugin;
+ }
+
+ /**
+ * Returns the singleton instance of the Eclipse plugin.
+ *
+ * @return the singleton instance.
+ */
+ public static Implementation getPlugin() {
+ return plugin;
+ }
+
+ /**
+ * The activator class controls the plug-in lifecycle.
+ */
+ public static class Implementation extends EclipseUIPlugin implements BundleActivator {
+ /**
+ * Returns current Capella version
+ */
+ private String getCapellaVersion() {
+ String fullVersion = Platform.getBundle("org.polarsys.capella.rcp").getVersion().toString();
+ String version = String.join(".", Arrays.copyOf(fullVersion.split("\\."), 3));
+ logWarning("Capella Version : " + version);
+ return version;
+ }
+
+ /**
+ * Constructor thanks to which the code works both in and outside of eclipse.
+ */
+ public Implementation() {
+ SchematicDesignPlugin.plugin = this;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.
+ * BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ viewpoints = new HashSet();
+ viewpoints.addAll(ViewpointRegistry.getInstance()
+ .registerFromPlugin("/" + PLUGIN_ID + "/description/schematic-" + getCapellaVersion() + ".odesign"));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ if (viewpoints != null) {
+ for (final Viewpoint viewpoint : viewpoints) {
+ ViewpointRegistry.getInstance().disposeFromPlugin(viewpoint);
+ }
+ viewpoints.clear();
+ viewpoints = null;
+ }
+ super.stop(context);
+ }
+
+ /**
+ * Logs an {@link IStatus#WARNING} in the Error Log.
+ *
+ * @param message
+ * the (maybe-{@code null}) {@link String message} to log.
+ */
+ public void logWarning(String message) {
+ logWarning(message, null);
+ }
+
+ /**
+ * Logs an {@link IStatus#ERROR} in the Error Log.
+ *
+ * @param message
+ * the (maybe-{@code null}) {@link String message} to log.
+ */
+ public void logError(String message) {
+ logError(message, null);
+ }
+
+ /**
+ * Log an {@link IStatus#WARNING} in the Error Log.
+ *
+ * @param message
+ * the (maybe-{@code null}) {@link String message} to log.
+ * @param cause
+ * the (maybe-{@code null}) cause {@link Throwable}.
+ */
+ public void logWarning(String message, Throwable cause) {
+ getLog().log(new Status(IStatus.WARNING, PLUGIN_ID, message, cause));
+ }
+
+ /**
+ * Log an {@link IStatus#ERROR} in the Error Log.
+ *
+ * @param message
+ * the (maybe-{@code null}) {@link String message} to log.
+ * @param cause
+ * the (maybe-{@code null}) cause {@link Throwable}.
+ */
+ public void logError(String message, Throwable cause) {
+ getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message, cause));
+ }
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/AbstractSchematicDNodeContainerEditPart.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/AbstractSchematicDNodeContainerEditPart.java
new file mode 100644
index 0000000..2f01cad
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/AbstractSchematicDNodeContainerEditPart.java
@@ -0,0 +1,212 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.editparts;
+
+import java.util.Optional;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.sirius.common.tools.api.util.ReflectionHelper;
+import org.eclipse.sirius.common.tools.api.util.StringUtil;
+import org.eclipse.sirius.diagram.DDiagramElement;
+import org.eclipse.sirius.diagram.DDiagramElementContainer;
+import org.eclipse.sirius.diagram.WorkspaceImage;
+import org.eclipse.sirius.diagram.business.internal.query.DDiagramElementContainerExperimentalQuery;
+import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeContainerEditPart;
+import org.eclipse.sirius.diagram.ui.tools.api.figure.SVGWorkspaceImageFigure;
+import org.eclipse.sirius.diagram.ui.tools.api.figure.WorkspaceImageFigure;
+import org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath;
+import org.eclipse.sirius.diagram.ui.tools.internal.figure.ContainerWithTitleBlockFigure;
+import org.eclipse.sirius.ext.base.Option;
+import org.eclipse.sirius.ext.base.Options;
+import org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.SiriusDefaultSizeNodeFigure;
+import org.eclipse.sirius.viewpoint.DStylizable;
+import org.eclipse.sirius.viewpoint.description.style.LabelBorderStyleDescription;
+import org.polarsys.capella.core.data.capellacore.CapellaElement;
+import org.polarsys.capella.core.data.capellacore.IntegerPropertyValue;
+import org.polarsys.capella.core.data.cs.Part;
+
+import com.navalgroup.capella.schematic.design.Messages;
+import com.navalgroup.capella.schematic.design.SchematicDesignPlugin;
+import com.navalgroup.capella.schematic.design.images.figures.RotativeImageListener;
+import com.navalgroup.capella.schematic.design.images.figures.SchematicSVGWorkspaceImageFigure;
+import com.navalgroup.capella.schematic.design.images.figures.SchematicWorkspaceImageFigure;
+import com.navalgroup.capella.schematic.design.services.SchematicServices;
+import com.navalgroup.capella.schematic.design.services.SchematicViewpointServices;
+
+/**
+ * Abstract DNodeContainerEditPart for Schematic to get image from property
+ * value and configuration file.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+@SuppressWarnings("restriction")
+public abstract class AbstractSchematicDNodeContainerEditPart extends DNodeContainerEditPart {
+
+ /**
+ * Lister for rotative image.
+ */
+ private static RotativeImageListener listener;
+
+ /**
+ * Constructor.
+ *
+ * @param view
+ * View
+ */
+ public AbstractSchematicDNodeContainerEditPart(View view) {
+ super(view);
+ }
+
+ /**
+ * Create background figure.
+ */
+ public void createBackgroundFigure() {
+ ReflectionHelper.setFieldValueWithoutException(this, "backgroundFigure", createBackgroundFigure(this));
+ }
+
+ /**
+ * Creates the background image.
+ *
+ * @param self
+ * the container edit part.
+ * @return the created image.
+ */
+ public IFigure createBackgroundFigure(final IGraphicalEditPart self) {
+ final EObject eObj = self.resolveSemanticElement();
+ if (eObj instanceof DDiagramElementContainer) {
+ final DDiagramElementContainer container = (DDiagramElementContainer) eObj;
+ if (container.getOwnedStyle() instanceof WorkspaceImage
+ && !SchematicViewpointServices.hasSchematicDNodeContainerChildren(container)) {
+ final WorkspaceImage img = (WorkspaceImage) container.getOwnedStyle();
+ return createWkpImageFigure(img);
+ }
+ }
+ return null;
+ }
+
+ private IFigure createWkpImageFigure(final WorkspaceImage img) {
+ IFigure imageFigure = null;
+ if (img != null && !StringUtil.isEmpty(img.getWorkspacePath())) {
+ String workspacePath = img.getWorkspacePath();
+ if (SchematicViewpointServices.SCHEMATIC_WORKSPACE_IMAGE_PATH.equals(workspacePath)) {
+ imageFigure = createSchematicImageFigure(img);
+ } else if (WorkspaceImageFigure.isSvgImage(workspacePath)) {
+ imageFigure = SVGWorkspaceImageFigure.createImageFigure(img);
+ } else {
+ imageFigure = WorkspaceImageFigure.createImageFigure(workspacePath);
+ }
+ }
+ return imageFigure;
+ }
+
+ private IFigure createSchematicImageFigure(final WorkspaceImage img) {
+ IFigure imageFigure;
+ EObject semanticElement = ((DDiagramElement) img.eContainer()).getTarget();
+ if (semanticElement instanceof CapellaElement) {
+ Optional imagePath = SchematicViewpointServices
+ .getSchematicImagePropertyValue((CapellaElement) semanticElement);
+ if (imagePath.isPresent()) {
+ if (WorkspaceImageFigure.isSvgImage(imagePath.get())) {
+ imageFigure = SchematicSVGWorkspaceImageFigure.createImageFigure(img);
+ } else {
+ imageFigure = SchematicWorkspaceImageFigure.createImageFigure(imagePath.get());
+ }
+ listener = new RotativeImageListener(this);
+ imageFigure.addFigureListener(listener);
+ } else {
+ imageFigure = WorkspaceImageFigure.createImageFigure(DiagramImagesPath.IMAGE_NOT_FOUND);
+ }
+ } else {
+ imageFigure = WorkspaceImageFigure.createImageFigure(DiagramImagesPath.IMAGE_NOT_FOUND);
+ }
+ return imageFigure;
+ }
+
+ /**
+ * Set image position.
+ *
+ * @param position
+ */
+ public void setPosition(int position) {
+ if (getBackgroundFigure() instanceof SchematicWorkspaceImageFigure) {
+ ((SchematicWorkspaceImageFigure) getBackgroundFigure()).setPosition(position);
+ } else if (getBackgroundFigure() instanceof SchematicSVGWorkspaceImageFigure) {
+ SchematicDesignPlugin.getPlugin().logWarning(
+ Messages.AbstractSchematicDNodeContainerEditPart_ImageTranslationNotAvailableOnSVGImage);
+ }
+ }
+
+ /**
+ * Update position when figure has changed.
+ */
+ public void figureHasChanged() {
+ if (getBackgroundFigure() != null) {
+ EObject semanticElement = resolveTargetSemanticElement();
+ if (semanticElement instanceof CapellaElement) {
+ // if part, search in abstract type
+ if (semanticElement instanceof Part) {
+ semanticElement = ((Part) semanticElement).getAbstractType();
+ }
+ Optional propertyValueValue = SchematicServices.getIntegerPropertyValueValue(
+ (CapellaElement) semanticElement, SchematicServices.SCHEMATIC_IMAGE_POSITION_PROPERTY_VALUE);
+ if (propertyValueValue.isPresent()) {
+ setPosition(propertyValueValue.get().getValue());
+
+ }
+ }
+ }
+ }
+
+ /**
+ * Creates a figure for this edit part, depending on the label style.
+ *
+ * @return a figure for this edit part.
+ */
+ protected NodeFigure createNodePlate() {
+ if (getBackgroundFigure() == null) {
+ return super.createNodePlate();
+ }
+
+ // keep previous image dimension if last style was workspace image.
+ NodeFigure result;
+ DDiagramElement dde = resolveDiagramElement();
+ Dimension defaultSize = getBackgroundFigure().getSize();
+ Option getLabelBorderStyle = getLabelBorderStyle(dde);
+ if (getLabelBorderStyle.some()) {
+ result = new ContainerWithTitleBlockFigure(getMapMode().DPtoLP(defaultSize.width),
+ getMapMode().DPtoLP(defaultSize.height), dde, getLabelBorderStyle.get());
+ } else {
+ result = new SiriusDefaultSizeNodeFigure(getMapMode().DPtoLP(defaultSize.width),
+ getMapMode().DPtoLP(defaultSize.height));
+ }
+
+ return result;
+ }
+
+ private Option getLabelBorderStyle(DStylizable viewNode) {
+ if (viewNode instanceof DDiagramElementContainer) {
+ return new DDiagramElementContainerExperimentalQuery((DDiagramElementContainer) viewNode)
+ .getLabelBorderStyle();
+ }
+ return Options.newNone();
+ }
+
+ @Override
+ public void refresh() {
+ super.refresh();
+ figureHasChanged();
+ }
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/SchematicDNodeContainer2EditPart.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/SchematicDNodeContainer2EditPart.java
new file mode 100644
index 0000000..f4d8cd1
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/SchematicDNodeContainer2EditPart.java
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.editparts;
+
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+ * DNodeContainer2EditPart for Schematic to get image from property value and
+ * configuration file.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class SchematicDNodeContainer2EditPart extends AbstractSchematicDNodeContainerEditPart {
+
+ /**
+ * Constructor.
+ *
+ * @param view
+ * View
+ */
+ public SchematicDNodeContainer2EditPart(View view) {
+ super(view);
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/SchematicDNodeContainerEditPart.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/SchematicDNodeContainerEditPart.java
new file mode 100644
index 0000000..402c736
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/editparts/SchematicDNodeContainerEditPart.java
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.editparts;
+
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+ * DNodeContainerEditPart for Schematic to get image from property value and
+ * configuration file.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class SchematicDNodeContainerEditPart extends AbstractSchematicDNodeContainerEditPart {
+
+ /**
+ * Constructor.
+ *
+ * @param view
+ * View
+ */
+ public SchematicDNodeContainerEditPart(View view) {
+ super(view);
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/RotativeImageListener.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/RotativeImageListener.java
new file mode 100644
index 0000000..e3ec826
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/RotativeImageListener.java
@@ -0,0 +1,110 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.figures;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.draw2d.AncestorListener;
+import org.eclipse.draw2d.FigureListener;
+import org.eclipse.draw2d.IFigure;
+
+import com.navalgroup.capella.schematic.design.images.editparts.AbstractSchematicDNodeContainerEditPart;
+
+/**
+ * Listener for rotative bordered nodes which notifies the edit part when a
+ * change has occured.
+ *
+ * @author @author Nathalie Lepine
+ */
+public class RotativeImageListener implements FigureListener, PropertyChangeListener, AncestorListener {
+ /**
+ * Container EditPart.
+ */
+ private AbstractSchematicDNodeContainerEditPart editpart;
+
+ /**
+ * Constructor.
+ *
+ * @param editpart
+ * The part to listen to
+ */
+ public RotativeImageListener(AbstractSchematicDNodeContainerEditPart editpart) {
+ this.editpart = editpart;
+ }
+
+ /**
+ * Notify the edit part that.
+ */
+ public void notifyEditPart() {
+ editpart.figureHasChanged();
+ }
+
+ /**
+ * figureMoved.
+ *
+ * @param source
+ * parameter
+ * @see org.eclipse.draw2d.FigureListener#figureMoved(org.eclipse.draw2d.IFigure)
+ */
+ @Override
+ public void figureMoved(IFigure source) {
+ notifyEditPart();
+ }
+
+ /**
+ * propertyChange.
+ *
+ * @param evt
+ * parameter
+ * @see java.beans.PropertyChangeListener#propertyChange(org.eclipse.draw2d.IFigure)
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ notifyEditPart();
+ }
+
+ /**
+ * ancestorAdded.
+ *
+ * @param ancestor
+ * parameter
+ * @see org.eclipse.draw2d.AncestorListener#ancestorAdded(org.eclipse.draw2d.IFigure)
+ */
+ @Override
+ public void ancestorAdded(IFigure ancestor) {
+ notifyEditPart();
+ }
+
+ /**
+ * ancestorMoved.
+ *
+ * @param ancestor
+ * parameter
+ * @see org.eclipse.draw2d.AncestorListener#ancestorMoved(org.eclipse.draw2d.IFigure)
+ */
+ @Override
+ public void ancestorMoved(IFigure ancestor) {
+ notifyEditPart();
+ }
+
+ /**
+ * ancestorRemoved.
+ *
+ * @param ancestor
+ * parameter
+ * @see org.eclipse.draw2d.AncestorListener#ancestorRemoved(org.eclipse.draw2d.IFigure)
+ */
+ @Override
+ public void ancestorRemoved(IFigure ancestor) {
+ notifyEditPart();
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/SchematicSVGWorkspaceImageFigure.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/SchematicSVGWorkspaceImageFigure.java
new file mode 100644
index 0000000..0e39a73
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/SchematicSVGWorkspaceImageFigure.java
@@ -0,0 +1,120 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.figures;
+
+import java.io.File;
+import java.util.Optional;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.sirius.common.tools.api.resource.FileProvider;
+import org.eclipse.sirius.common.tools.api.util.ReflectionHelper;
+import org.eclipse.sirius.diagram.DDiagramElement;
+import org.eclipse.sirius.diagram.WorkspaceImage;
+import org.eclipse.sirius.diagram.ui.tools.api.figure.SVGFigure;
+import org.eclipse.sirius.diagram.ui.tools.api.figure.SVGWorkspaceImageFigure;
+import org.eclipse.sirius.diagram.ui.tools.internal.figure.svg.SimpleImageTranscoder;
+import org.eclipse.sirius.ext.base.Option;
+import org.eclipse.sirius.ext.base.Options;
+import org.polarsys.capella.core.data.capellacore.CapellaElement;
+
+import com.navalgroup.capella.schematic.design.services.SchematicViewpointServices;
+
+/**
+ * SVGWorkspaceImageFigure for Schematic to get image from property value and
+ * configuration file.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+@SuppressWarnings("restriction")
+public class SchematicSVGWorkspaceImageFigure extends SVGWorkspaceImageFigure {
+
+ /**
+ * Create the {@link SVGWorkspaceImageFigure} from a {@link WorkspaceImage}
+ * instance.
+ *
+ * @param image
+ * {@link SVGWorkspaceImageFigure} specification.
+ * @return new Figure.
+ */
+ public static SVGWorkspaceImageFigure createImageFigure(final WorkspaceImage image) {
+ SchematicSVGWorkspaceImageFigure fig = new SchematicSVGWorkspaceImageFigure();
+ fig.refreshFigure(image);
+ return fig;
+ }
+
+ @Override
+ public void refreshFigure(final WorkspaceImage workspaceImage) {
+ if (workspaceImage != null) {
+ String workspacePath = workspaceImage.getWorkspacePath();
+ if (SchematicViewpointServices.SCHEMATIC_WORKSPACE_IMAGE_PATH.equals(workspacePath)) {
+ EObject semanticElement = ((DDiagramElement) workspaceImage.eContainer()).getTarget();
+ if (semanticElement instanceof CapellaElement) {
+ Optional imagePath = SchematicViewpointServices
+ .getSchematicImagePropertyValue((CapellaElement) semanticElement);
+ if (imagePath.isPresent()) {
+ workspacePath = imagePath.get();
+ }
+ }
+ }
+ boolean updated = this.updateImageURI(workspacePath);
+ if (updated) {
+ this.contentChanged();
+ SimpleImageTranscoder transcoder = getTranscoder();
+ if (transcoder != null) {
+ ReflectionHelper.setFieldValueWithoutException(this, "imageAspectRatioForModeWithViewBox",
+ transcoder.getAspectRatio());
+ }
+ }
+ } else {
+ this.setURI(null);
+ }
+ }
+
+ private boolean updateImageURI(String workspacePath) {
+ if (workspacePath != null) {
+ Option existingImageUri = SchematicSVGWorkspaceImageFigure.getImageUri(workspacePath, false);
+ if (existingImageUri.some()) {
+ setURI(existingImageUri.get());
+ } else {
+ setURI(SVGFigure.IMAGE_NOT_FOUND_URI);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Return an optional uri as used in the document key to read svg files.
+ *
+ * @param workspacePath
+ * the workspace path of the file.
+ * @param force
+ * true to avoid to check that the file exists and is readble.
+ * @return an optional system uri.
+ */
+ private static Option getImageUri(String workspacePath, boolean force) {
+ final File imageFile = FileProvider.getDefault().getFile(new Path(workspacePath));
+ if (imageFile != null && (force || imageFile.exists() && imageFile.canRead())) {
+ return Options.newSome(imageFile.toURI().toString());
+ }
+ Option nonExistingFile = Options.newNone();
+ if (force) {
+ // Deleted file : retrieve the key.
+ nonExistingFile = Options
+ .newSome(ResourcesPlugin.getWorkspace().getRoot().getLocationURI().toString() + workspacePath);
+ }
+
+ return nonExistingFile;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/SchematicWorkspaceImageFigure.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/SchematicWorkspaceImageFigure.java
new file mode 100644
index 0000000..660d8b4
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/figures/SchematicWorkspaceImageFigure.java
@@ -0,0 +1,210 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.figures;
+
+import java.util.Optional;
+
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.sirius.diagram.DDiagramElement;
+import org.eclipse.sirius.diagram.WorkspaceImage;
+import org.eclipse.sirius.diagram.ui.tools.api.figure.WorkspaceImageFigure;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.polarsys.capella.core.data.capellacore.CapellaElement;
+
+import com.navalgroup.capella.schematic.design.SchematicDesignPlugin;
+import com.navalgroup.capella.schematic.design.services.SchematicViewpointServices;
+
+/**
+ * WorkspaceImageFigure for Schematic to get image from property value and
+ * configuration file.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class SchematicWorkspaceImageFigure extends WorkspaceImageFigure {
+ /**
+ * Image Path.
+ */
+ private String imgPath;
+ /**
+ * Image position (default, 90 left, 90 right, 180, horizontal symmetry,
+ * vertical symmetry).
+ */
+ private int position;
+
+ /**
+ * Constructor.
+ *
+ * @param flyWeightImage
+ * Image
+ */
+ public SchematicWorkspaceImageFigure(Image flyWeightImage) {
+ super(flyWeightImage);
+ position = PositionConstants.NORTH;
+ }
+
+ /**
+ * Create image figure.
+ *
+ * @param path
+ * @return WorkspaceImageFigure
+ */
+ public static WorkspaceImageFigure createImageFigure(final String path) {
+ final SchematicWorkspaceImageFigure fig = new SchematicWorkspaceImageFigure(
+ WorkspaceImageFigure.flyWeightImage(path));
+ return fig;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see fr.obeo.dsl.viewpoint.diagram.ui.tools.api.figure.WorkspaceImageFigure#refreshFigure(fr.obeo.dsl.viewpoint.WorkspaceImage)
+ */
+ public void refreshFigure(final WorkspaceImage bundledImage) {
+ String path = bundledImage.getWorkspacePath();
+ if (SchematicViewpointServices.SCHEMATIC_WORKSPACE_IMAGE_PATH.equals(path)) {
+ EObject semanticElement = ((DDiagramElement) bundledImage.eContainer()).getTarget();
+ if (semanticElement instanceof CapellaElement) {
+ Optional imagePath = SchematicViewpointServices
+ .getSchematicImagePropertyValue((CapellaElement) semanticElement);
+ if (imagePath.isPresent()) {
+ path = imagePath.get();
+ }
+ }
+ }
+ imgPath = path;
+ final Image image = WorkspaceImageFigure.flyWeightImage(path);
+ if (image == this.getImage()) {
+ return;
+ }
+ this.setImage(image);
+ this.repaint();
+ }
+
+ private void refreshFigure() {
+ Image image = getImage(imgPath, position);
+ if (image == this.getImage()) {
+ return;
+ }
+ this.setImage(image);
+ this.repaint();
+ }
+
+ /**
+ * Set position and refresh figure.
+ *
+ * @param pos
+ * int
+ */
+ public void setPosition(int pos) {
+ this.position = pos;
+ refreshFigure();
+ }
+
+ private Image getImage(String path, int direction) {
+ String key = getKey(path, direction);
+ Image image = getImageFromRegistry(key);
+ if (image == null) {
+ // We have to create and store the image
+ if (direction == PositionConstants.NORTH) {
+ image = flyWeightImage(imgPath);
+ } else {
+ // We have to rotate the default image (NORTH)
+ Image northImage = getImage(path, PositionConstants.NORTH);
+ image = rotate(northImage, direction);
+ }
+ putImageInRegistry(key, image);
+ }
+ return image;
+ }
+
+ private String getKey(String path, int direction) {
+ return path + "?" + direction;
+ }
+
+ private Image getImageFromRegistry(String key) {
+ return SchematicDesignPlugin.getPlugin().getImageRegistry().get(key);
+ }
+
+ private void putImageInRegistry(String key, Image image) {
+ if (SchematicDesignPlugin.getPlugin().getImageRegistry().get(key) == null) {
+ SchematicDesignPlugin.getPlugin().getImageRegistry().put(key, image);
+ }
+ }
+
+ private static Image rotate(Image image, int direction) {
+ ImageData srcData = image.getImageData();
+
+ int bytesPerPixel = srcData.bytesPerLine / srcData.width;
+ boolean noRotation = direction == PositionConstants.HORIZONTAL || direction == PositionConstants.VERTICAL
+ || direction == PositionConstants.SOUTH;
+ int destBytesPerLine = noRotation ? srcData.width * bytesPerPixel : srcData.height * bytesPerPixel;
+ byte[] newData = new byte[srcData.data.length];
+
+ boolean isAlpha = srcData.alphaData != null;
+ byte[] newAlphaData = null;
+
+ if (isAlpha) {
+ newAlphaData = new byte[srcData.alphaData.length];
+ }
+ ImageData imgData = new ImageData(noRotation ? srcData.width : srcData.height,
+ noRotation ? srcData.height : srcData.width, srcData.depth, srcData.palette, destBytesPerLine, newData);
+ if (isAlpha) {
+ imgData.alphaData = newAlphaData;
+ }
+ imgData.alpha = srcData.alpha;
+
+ for (int srcY = 0; srcY < srcData.height; srcY++) {
+ for (int srcX = 0; srcX < srcData.width; srcX++) {
+ int destX;
+ int destY;
+ switch (direction) {
+ // left 90 degrees
+ case PositionConstants.WEST:
+ destX = srcY;
+ destY = srcData.width - srcX - 1;
+ break;
+ // right 90 degrees
+ case PositionConstants.EAST:
+ destX = srcData.height - srcY - 1;
+ destY = srcX;
+ break;
+ // horizontal symmetry
+ case PositionConstants.HORIZONTAL:
+ destX = srcData.width - srcX - 1;
+ destY = srcY;
+ break;
+ // vertical symmetry
+ case PositionConstants.VERTICAL:
+ destX = srcX;
+ destY = srcData.height - srcY - 1;
+ break;
+ // rotation 180 degrees
+ case PositionConstants.SOUTH:
+ destX = srcData.width - srcX - 1;
+ destY = srcData.height - srcY - 1;
+ break;
+ default:
+ destX = 0;
+ destY = 0;
+ }
+
+ imgData.setPixel(destX, destY, srcData.getPixel(srcX, srcY));
+ if (isAlpha) {
+ imgData.setAlpha(destX, destY, srcData.getAlpha(srcX, srcY));
+ }
+ }
+ }
+
+ return new Image(image.getDevice(), imgData);
+ }
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/providers/SchematicEditPartProvider.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/providers/SchematicEditPartProvider.java
new file mode 100644
index 0000000..3dcbaa3
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/images/providers/SchematicEditPartProvider.java
@@ -0,0 +1,54 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.images.providers;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeContainer2EditPart;
+import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeContainerEditPart;
+
+import com.navalgroup.capella.schematic.design.images.editparts.SchematicDNodeContainer2EditPart;
+import com.navalgroup.capella.schematic.design.images.editparts.SchematicDNodeContainerEditPart;
+import com.navalgroup.capella.schematic.design.services.SchematicServices;
+
+/**
+ * Edit Part Provider for Schematic to get Schematic edit parts for Schematic
+ * graphical elements.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+@SuppressWarnings("restriction")
+public class SchematicEditPartProvider extends AbstractEditPartProvider {
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider#getNodeEditPartClass(org.eclipse.gmf.runtime.notation.View)
+ */
+ // CHECKSTYLE:OFF
+ @Override
+ protected Class> getNodeEditPartClass(View view) {
+ final EObject resolvedSemanticElement = ViewUtil.resolveSemanticElement(view);
+ boolean isSchematicElement = SchematicServices.isSchematicElement(resolvedSemanticElement);
+ if (isSchematicElement) {
+ if (view.getType().equals(Integer.toString(DNodeContainerEditPart.VISUAL_ID))) {
+ return SchematicDNodeContainerEditPart.class;
+ }
+ if (view.getType().equals(Integer.toString(DNodeContainer2EditPart.VISUAL_ID))) {
+ return SchematicDNodeContainer2EditPart.class;
+ }
+ }
+ return super.getNodeEditPartClass(view);
+ }
+ // CHECKSTYLE:ON
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/ConfigurationFileServices.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/ConfigurationFileServices.java
new file mode 100644
index 0000000..3e4b7cf
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/ConfigurationFileServices.java
@@ -0,0 +1,192 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.services;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Optional;
+import java.util.Properties;
+
+import org.eclipse.sirius.diagram.ui.internal.refresh.listeners.WorkspaceFileResourceChangeListener;
+
+import com.navalgroup.capella.schematic.design.Messages;
+import com.navalgroup.capella.schematic.design.SchematicDesignPlugin;
+import com.navalgroup.capella.schematic.ui.preferences.SchematicPreferencePage;
+
+/**
+ * Services for configuration file.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+@SuppressWarnings("restriction")
+public final class ConfigurationFileServices {
+
+ /**
+ * Property value key for configuration file labels.
+ */
+ public static final String SCHEMATIC_CONF_LABEL_NAME_PROPERTY_VALUE = "schematic.labels";
+
+ /**
+ * Configuration file separator for schematic.label key.
+ */
+ public static final String CONFIGURATION_SEPARATOR = ",";
+
+ /**
+ * File separator.
+ */
+ public static final String FILE_SEPARATOR = "/";
+
+ /**
+ * Constructor.
+ */
+ private ConfigurationFileServices() {
+ }
+
+ /**
+ * Check if configuration file contains key with valid value.
+ *
+ * @param key
+ * String
+ * @return if configuration file contains key with valid value.
+ */
+ public static boolean isConfigurationPropertyValid(String key) {
+ return getConfigurationPropertyValue(key).isPresent();
+ }
+
+ /**
+ * Get the value corresponding to the key in configuration file, Optional.empty
+ * otherwise.
+ *
+ * @param key
+ * String
+ * @return the value corresponding to the key in configuration file.
+ */
+ public static Optional getConfigurationImagePropertyValue(String key) {
+ Optional properties = getConfigurationFileProperties();
+ if (properties.isPresent()) {
+ return getValidImageProperty(properties.get(), key);
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Get the value corresponding to the key in configuration file, Optional.empty
+ * otherwise.
+ *
+ * @param key
+ * String
+ * @return the value corresponding to the key in configuration file.
+ */
+ public static Optional getConfigurationPropertyValue(String key) {
+ Optional properties = getConfigurationFileProperties();
+ if (properties.isPresent()) {
+ return getProperty(properties.get(), key);
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Get properties from configuration file if exists.
+ *
+ * @return properties from Configuration file.
+ */
+ public static Optional getConfigurationFileProperties() {
+ // get configuration path from preferences.
+ String configurationFilePath = com.navalgroup.capella.schematic.ui.SchematicUIPlugin.getPlugin()
+ .getPreferenceStore().getString(SchematicPreferencePage.CONFIGURATION_FILE_PREF_ID);
+ if (configurationFilePath == null || configurationFilePath.isEmpty()) {
+ SchematicDesignPlugin.getPlugin()
+ .logWarning(Messages.ConfigurationFileService_NoConfigurationFileInPreference);
+ } else {
+ // try to load properties configuration file
+ final Properties properties = new Properties();
+ try {
+ final BufferedReader reader = Files.newBufferedReader(Paths.get(configurationFilePath));
+ properties.load(reader);
+ reader.close();
+ return Optional.ofNullable(properties);
+ } catch (IOException ioException) {
+ SchematicDesignPlugin.getPlugin()
+ .logError(String.format(Messages.ConfigurationFileService_CouldNotLoadConfigurationFile,
+ configurationFilePath.toString()), ioException);
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Check if property path is not null, is not empty and references an image.
+ *
+ * @param properties
+ * Properties
+ * @param key
+ * String
+ * @return if property path is not null, is not empty and references an image.
+ */
+ // CHECKSTYLE:OFF
+ private static Optional getValidImageProperty(Properties properties, String key) {
+ if (properties.containsKey(key)) {
+ String property = properties.getProperty(key);
+ if (property != null && !property.isEmpty()) {
+ File imageFile = WorkspaceFileResourceChangeListener.getInstance().getFileFromURI(property);
+ if (imageFile != null) {
+ Path imagePath = Paths.get(imageFile.getAbsolutePath());
+ if (Files.exists(imagePath) && Files.isRegularFile(imagePath)) {
+ if (!property.startsWith(FILE_SEPARATOR)) {
+ property = FILE_SEPARATOR + property;
+ }
+ return Optional.ofNullable(property);
+ }
+ } else {
+ SchematicDesignPlugin.getPlugin()
+ .logError(String.format(Messages.ConfigurationFileService_ImageFileNotFound, key));
+ }
+ } else {
+ SchematicDesignPlugin.getPlugin().logError(
+ String.format(Messages.ConfigurationFileService_WrongConfigurationPropertyValue, key));
+ }
+ } else {
+ SchematicDesignPlugin.getPlugin()
+ .logError(String.format(Messages.ConfigurationFileService_NoConfigurationPropertyValue, key));
+ }
+ return Optional.empty();
+ }
+ // CHECKSTYLE:ON
+
+ /**
+ * Get value property key or Optional.empty.
+ *
+ * @param properties
+ * Properties
+ * @param key
+ * String
+ * @return value property key or Optional.empty.
+ */
+ private static Optional getProperty(Properties properties, String key) {
+ if (properties.containsKey(key)) {
+ String property = properties.getProperty(key);
+ if (property != null && !property.isEmpty()) {
+ return Optional.ofNullable(property);
+ }
+ SchematicDesignPlugin.getPlugin()
+ .logError(String.format(Messages.ConfigurationFileService_WrongConfigurationPropertyValue, key));
+ } else {
+ SchematicDesignPlugin.getPlugin()
+ .logError(String.format(Messages.ConfigurationFileService_NoConfigurationPropertyValue, key));
+ }
+ return Optional.empty();
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/SchematicServices.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/SchematicServices.java
new file mode 100644
index 0000000..cdf2b0f
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/SchematicServices.java
@@ -0,0 +1,257 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.services;
+
+import java.util.Optional;
+
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.business.api.session.SessionManager;
+import org.eclipse.sirius.diagram.DDiagramElement;
+import org.polarsys.capella.common.data.modellingcore.AbstractType;
+import org.polarsys.capella.core.data.capellacore.CapellaElement;
+import org.polarsys.capella.core.data.capellacore.CapellacoreFactory;
+import org.polarsys.capella.core.data.capellacore.IntegerPropertyValue;
+import org.polarsys.capella.core.data.capellacore.StringPropertyValue;
+import org.polarsys.capella.core.data.cs.Part;
+import org.polarsys.capella.core.data.pa.PhysicalComponent;
+
+import com.navalgroup.capella.schematic.design.Messages;
+import com.navalgroup.capella.schematic.design.SchematicDesignPlugin;
+
+/**
+ * Services for Schematic.
+ *
+ * @author Nathalie Lepine
+ */
+public final class SchematicServices {
+
+ /**
+ * Property value key for image.
+ */
+ public static final String SCHEMATIC_IMAGE_NAME_PROPERTY_VALUE = "schematic.image";
+ /**
+ * Property value key for image position.
+ */
+ public static final String SCHEMATIC_IMAGE_POSITION_PROPERTY_VALUE = "schematic.image.position";
+
+ /**
+ * Property value key for RTPF.
+ */
+ public static final String RTPF_PROPERTY_VALUE = "RTPF";
+
+ /**
+ * Constructor.
+ */
+ private SchematicServices() {
+ }
+
+ /**
+ * Check if element has a string property value named "schematic.image". This
+ * value has to be defined in the mapping properties file.
+ *
+ * @param element
+ * CapellaElement
+ * @return if element has a valid string property value named "schematic.image"
+ */
+ public static Optional getSchematicImagePropertyValue(CapellaElement element) {
+ Optional schematicPropertyValue = Optional.empty();
+ // if part, search in abstract type
+ if (element instanceof Part) {
+ AbstractType type = ((Part) element).getAbstractType();
+ if (type instanceof CapellaElement) {
+ schematicPropertyValue = getSchematicImagePropertyValue((CapellaElement) type);
+ }
+ }
+ // search in capella element
+ if (!schematicPropertyValue.isPresent()) {
+ Optional propertyValue = getStringPropertyValueValue(element,
+ SCHEMATIC_IMAGE_NAME_PROPERTY_VALUE);
+ if (propertyValue.isPresent()) {
+ String value = propertyValue.get().getValue();
+ if (value != null && !value.isEmpty()) {
+ schematicPropertyValue = ConfigurationFileServices.getConfigurationImagePropertyValue(value);
+ }
+ }
+ }
+ return schematicPropertyValue;
+ }
+
+ /**
+ * Check if element references a physical component.
+ *
+ * @param element
+ * EObject
+ * @return if element references a physical component
+ */
+ public static boolean isSchematicElement(EObject element) {
+ if (element instanceof DDiagramElement) {
+ EObject target = ((DDiagramElement) element).getTarget();
+ // if part, search in abstract type
+ if (target instanceof Part) {
+ target = ((Part) target).getAbstractType();
+ }
+ return target instanceof PhysicalComponent;
+ }
+ return false;
+
+ }
+
+ /**
+ * Get StringPropertyValue with key 'key' applied to element if exists. Search
+ * in appliedPropertyValues and appliedPropertyValueGroups.
+ *
+ * @param element
+ * CapellaElement
+ * @param key
+ * String
+ * @return a StringPropertyValue with key 'key' applied to element if exists.
+ */
+ public static Optional getStringPropertyValueValue(CapellaElement element, String key) {
+ Optional propertyValue = element.getAppliedPropertyValues().stream()
+ .filter(StringPropertyValue.class::isInstance).map(StringPropertyValue.class::cast)
+ .filter(pv -> key.equalsIgnoreCase(pv.getName())).findFirst();
+ if (!propertyValue.isPresent()) {
+ propertyValue = element.getAppliedPropertyValueGroups().stream()
+ .map(group -> group.getAppliedPropertyValues()).filter(StringPropertyValue.class::isInstance)
+ .map(StringPropertyValue.class::cast).filter(pv -> key.equalsIgnoreCase(pv.getName())).findFirst();
+ }
+ return propertyValue;
+ }
+
+ /**
+ * Get IntegerPropertyValue with key 'key' applied to element if exists. Search
+ * in appliedPropertyValues and appliedPropertyValueGroups.
+ *
+ * @param element
+ * CapellaElement
+ * @param key
+ * String
+ * @return a IntegerPropertyValue with key 'key' applied to element if exists.
+ */
+ public static Optional getIntegerPropertyValueValue(CapellaElement element, String key) {
+ Optional propertyValue = element.getAppliedPropertyValues().stream()
+ .filter(IntegerPropertyValue.class::isInstance).map(IntegerPropertyValue.class::cast)
+ .filter(pv -> key.equalsIgnoreCase(pv.getName())).findFirst();
+ if (!propertyValue.isPresent()) {
+ propertyValue = element.getAppliedPropertyValueGroups().stream()
+ .map(group -> group.getAppliedPropertyValues()).filter(IntegerPropertyValue.class::isInstance)
+ .map(IntegerPropertyValue.class::cast).filter(pv -> key.equalsIgnoreCase(pv.getName())).findFirst();
+ }
+ return propertyValue;
+ }
+
+ /**
+ * Get RTPF property value value or empty.
+ *
+ * @param element
+ * CapellaElement
+ * @return RTPF property value value or empty.
+ */
+ public static String getRTPFLabel(CapellaElement element) {
+ Optional propertyValue = SchematicServices.getStringPropertyValueValue(element,
+ SchematicServices.RTPF_PROPERTY_VALUE);
+ if (propertyValue.isPresent()) {
+ String value = propertyValue.get().getValue();
+ if (value != null && !value.isEmpty()) {
+ return value;
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Get configuration file label property value value or empty.
+ *
+ * @param element
+ * CapellaElement
+ * @return configuration file label property value value or empty.
+ */
+ public static String getConfigurationLabel(CapellaElement element, String key) {
+ Optional propertyValue = SchematicServices.getStringPropertyValueValue(element, key);
+ if (propertyValue.isPresent()) {
+ String value = propertyValue.get().getValue();
+ if (value != null && !value.isEmpty()) {
+ return value;
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Create IntegerPropertyValue for image position.
+ *
+ * @param element
+ * CapellaElement
+ * @return IntegerPropertyValue for image position.
+ */
+ public static IntegerPropertyValue createPositionIntegerPropertyValue(CapellaElement element) {
+ IntegerPropertyValue pv = CapellacoreFactory.eINSTANCE.createIntegerPropertyValue();
+ pv.setName(SCHEMATIC_IMAGE_POSITION_PROPERTY_VALUE);
+ element.getOwnedPropertyValues().add(pv);
+ element.getAppliedPropertyValues().add(pv);
+ return pv;
+ }
+
+ /**
+ * Save image position in element property value.
+ *
+ * @param element
+ * CapellaElement
+ * @param position
+ */
+ public static void savePosition(CapellaElement element, int position) {
+ Session session = SessionManager.INSTANCE.getSession(element);
+ if (session == null) {
+ SchematicDesignPlugin.getPlugin().logError(Messages.SchematicService_NoSessionFound);
+ return;
+ }
+
+ Optional propertyValueValue = getIntegerPropertyValueValue(element,
+ SchematicServices.SCHEMATIC_IMAGE_POSITION_PROPERTY_VALUE);
+ RecordingCommand command = null;
+ // if back to initial image -> remove property value
+ if (PositionConstants.NORTH == position && propertyValueValue.isPresent()) {
+ command = new RecordingCommand(session.getTransactionalEditingDomain()) {
+
+ @Override
+ protected void doExecute() {
+ EcoreUtil.delete(propertyValueValue.get());
+
+ }
+ };
+ } else if (PositionConstants.NORTH != position) {
+ // create or update property value with new position
+ command = new RecordingCommand(session.getTransactionalEditingDomain()) {
+
+ @Override
+ protected void doExecute() {
+ IntegerPropertyValue positionPV;
+ if (!propertyValueValue.isPresent()) {
+ positionPV = SchematicServices.createPositionIntegerPropertyValue(element);
+ } else {
+ positionPV = propertyValueValue.get();
+ }
+ if (position != positionPV.getValue()) {
+ positionPV.setValue(position);
+ }
+
+ }
+ };
+ }
+ if (command != null) {
+ session.getTransactionalEditingDomain().getCommandStack().execute(command);
+ }
+
+ }
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/SchematicViewpointServices.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/SchematicViewpointServices.java
new file mode 100644
index 0000000..8c12733
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/services/SchematicViewpointServices.java
@@ -0,0 +1,393 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.services;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.sirius.business.api.logger.RuntimeLoggerManager;
+import org.eclipse.sirius.common.tools.api.interpreter.EvaluationException;
+import org.eclipse.sirius.common.tools.api.interpreter.IInterpreter;
+import org.eclipse.sirius.common.tools.api.interpreter.IInterpreterSiriusVariables;
+import org.eclipse.sirius.diagram.DDiagram;
+import org.eclipse.sirius.diagram.DDiagramElement;
+import org.eclipse.sirius.diagram.DDiagramElementContainer;
+import org.eclipse.sirius.diagram.DNode;
+import org.eclipse.sirius.diagram.DNodeContainer;
+import org.eclipse.sirius.diagram.business.api.query.DDiagramQuery;
+import org.eclipse.sirius.diagram.business.internal.metamodel.helper.MappingWithInterpreterHelper;
+import org.eclipse.sirius.diagram.description.ContainerMappingImport;
+import org.eclipse.sirius.diagram.description.DiagramElementMapping;
+import org.eclipse.sirius.diagram.description.EdgeMapping;
+import org.eclipse.sirius.diagram.description.EdgeMappingImport;
+import org.eclipse.sirius.diagram.description.IEdgeMapping;
+import org.eclipse.sirius.diagram.description.Layer;
+import org.eclipse.sirius.diagram.description.style.EdgeStyleDescription;
+import org.eclipse.sirius.viewpoint.DSemanticDecorator;
+import org.eclipse.sirius.viewpoint.SiriusPlugin;
+import org.eclipse.sirius.viewpoint.description.style.BasicLabelStyleDescription;
+import org.eclipse.sirius.viewpoint.description.style.StylePackage;
+import org.polarsys.capella.common.data.modellingcore.AbstractTypedElement;
+import org.polarsys.capella.core.data.capellacore.CapellaElement;
+import org.polarsys.capella.core.data.cs.Part;
+
+/**
+ * Services for Schematic viewpoint (odesign).
+ *
+ * @author Nathalie Lepine
+ */
+@SuppressWarnings("restriction")
+public final class SchematicViewpointServices {
+
+ /**
+ * Key for odesign workspace image path.
+ */
+ public static final String SCHEMATIC_WORKSPACE_IMAGE_PATH = "getImageFromPropertyValue";
+ /**
+ * Schematic layer id.
+ */
+ public static final String SCHEMATIC_LAYER_LABEL = "schematic.layer.image";
+ /**
+ * RTPF layer id.
+ */
+ public static final String SCHEMATIC_LAYER_LABEL_RTPF = "schematic.layer.label.rtpf";
+ /**
+ * Labels from configuration file layer id.
+ */
+ public static final String SCHEMATIC_LAYER_LABEL_CONFIGURATION_FILE = "schematic.layer.label.conf.file";
+
+ /**
+ * PC bordered mapping id.
+ */
+ public static final String PC_BORDERED_MAPPING_ID = "PAB_SCH_PC_Bordered";
+
+ /**
+ * Deployment bordered mapping id.
+ */
+ public static final String DEPLOYMENT_BORDERED_MAPPING_ID = "PAB_SCH_PAB_SCH_Deployment_Bordered";
+ /**
+ * PC mapping id.
+ */
+ public static final String PC_MAPPING_ID = "PAB_SCH_PC";
+
+ /**
+ * Deployment mapping id.
+ */
+ public static final String DEPLOYMENT_MAPPING_ID = "PAB_SCH_PAB_SCH_Deployment";
+
+ /**
+ * Separator for label suffixes.
+ */
+ private static final String LABEL_SEPARATOR = " - ";
+
+ /**
+ * Constructor.
+ */
+ private SchematicViewpointServices() {
+ }
+
+ /**
+ * Check if element has a string property value named "schematic.image". This
+ * value has to be defined in the configuration properties file.
+ *
+ * @param element
+ * CapellaElement
+ * @return if element has a valid string property value named "schematic.image"
+ */
+ public static boolean hasSchematicImagePropertyValue(CapellaElement element, DDiagramElement container) {
+ return getSchematicImagePropertyValue(element).isPresent() && !hasSchematicDNodeContainerChildren(container);
+ }
+
+ /**
+ * Check if DDiagramElement contains SchematicDNodeContainer.
+ *
+ * @param dde
+ * DDiagramElement
+ * @return if DDiagramElement contains SchematicDNodeContainer
+ */
+ public static boolean hasSchematicDNodeContainerChildren(DDiagramElement dde) {
+ DDiagramElement container = dde;
+ if (dde instanceof DNode && isSchematicBorderedNode((DNode) dde)
+ && dde.eContainer() instanceof DNodeContainer) {
+ container = (DNodeContainer) dde.eContainer();
+ }
+ return container instanceof DDiagramElementContainer && ((DDiagramElementContainer) container).getElements()
+ .stream().filter(DDiagramElementContainer.class::isInstance).findFirst().isPresent();
+ }
+
+ /**
+ * Check if dde is a schematic bordered node.
+ *
+ * @param dde
+ * DNode
+ * @return if dde is a schematic bordered node.
+ */
+ public static boolean isSchematicBorderedNode(DNode dde) {
+ return PC_BORDERED_MAPPING_ID.equals(dde.getActualMapping().getName())
+ || DEPLOYMENT_BORDERED_MAPPING_ID.equals(dde.getActualMapping().getName());
+ }
+
+ /**
+ * Check if element has a string property value named "schematic.image". This
+ * value has to be defined in the mapping properties file.
+ *
+ * @param element
+ * CapellaElement
+ * @return if element has a valid string property value named "schematic.image"
+ */
+ public static Optional getSchematicImagePropertyValue(CapellaElement element) {
+ return SchematicServices.getSchematicImagePropertyValue(element);
+ }
+
+ /**
+ * Compute RTPF label if exists.
+ *
+ * @param part
+ * Part
+ * @return part label with RTPF suffix if exists
+ */
+ public static String computeSchematicRTPFLabel(EObject element, DDiagramElement view) {
+ String label = "";
+
+ // if part has StringPropertyvalue with key RTPF, return value
+ if (element instanceof Part) {
+ // CHECKSTYLE:OFF
+ element = ((AbstractTypedElement) element).getAbstractType();
+ // CHECKSTYLE:ON
+ }
+ if (element instanceof CapellaElement) {
+ label = SchematicServices.getRTPFLabel((CapellaElement) element);
+ }
+ return label;
+ }
+
+ /**
+ * Compute element label with RTPF suffix if exists and RTPF layer is activated
+ * and suffixes defines in configuration file schematic.labels key.
+ *
+ * @param part
+ * Part
+ * @return element label with RTPF suffix if exists and RTPF layer is activated
+ * and suffixes defines in configuration file schematic.labels key.
+ */
+ public static String computeSchematicLabel(EObject element, DDiagramElement view) {
+ DDiagramElement dContainerView = view;
+ // test if borderedNode -> compute label from DNodeContainer parent
+ if (view.eContainer() instanceof DNodeContainer && isSchematicContainer((DNodeContainer) view.eContainer())) {
+ dContainerView = (DDiagramElement) view.eContainer();
+ }
+
+ String label = "";
+ // image + rtpf activated -> name + rtpf if exists
+ if (isSchematicLayerActivated(dContainerView.getParentDiagram())
+ && isRTPFLayerActivated(dContainerView.getParentDiagram())) {
+ String rtpfLabel = computeSchematicRTPFLabel(element, dContainerView);
+ label = getDDiagramElementLabel(dContainerView);
+ if (!rtpfLabel.isEmpty()) {
+ label += LABEL_SEPARATOR + rtpfLabel;
+ }
+ } else if (isRTPFLayerActivated(dContainerView.getParentDiagram())) {
+ // image deactivated + rtpf activated -> RTPF if exists else name
+ String rtpfLabel = computeSchematicRTPFLabel(element, dContainerView);
+ if (rtpfLabel.isEmpty()) {
+ label = getDDiagramElementLabel(dContainerView);
+ } else {
+ label = rtpfLabel;
+ }
+ } else {
+ // image activated + rtpf deactivated -> name
+ label = getDDiagramElementLabel(dContainerView);
+ }
+
+ if (isLabelsLayerActivated(dContainerView.getParentDiagram())) {
+ // get suffixes from configuration file
+ if (element instanceof Part) {
+ // CHECKSTYLE:OFF
+ element = ((AbstractTypedElement) element).getAbstractType();
+ // CHECKSTYLE:ON
+ }
+ if (element instanceof CapellaElement) {
+ label += getSchematicSuffixLabelFromConfigurationFile((CapellaElement) element);
+ }
+ }
+ return label;
+ }
+
+ /**
+ * Force return empty string.
+ *
+ * @param eObject
+ * EObject
+ * @return empty string
+ */
+ public String getEmptyString(EObject eObject) {
+ return "";
+ }
+
+ /**
+ * Check if container belongs to schematic layer.
+ *
+ * @param container
+ * DNodeContainer
+ * @return if container belongs to schematic layer.
+ */
+ public static boolean isSchematicContainer(DNodeContainer container) {
+ return PC_MAPPING_ID.equals(container.getActualMapping().getName())
+ || DEPLOYMENT_MAPPING_ID.equals(container.getActualMapping().getName());
+ }
+
+ /**
+ * Get Schematic suffix label from configuration file or empty.
+ *
+ * @param element
+ * CapellaElement
+ * @return Schematic suffix label from configuration file or empty.
+ */
+ public static String getSchematicSuffixLabelFromConfigurationFile(CapellaElement element) {
+ // get schematic.labels value from configuration file.
+ Optional configurationFileValue = ConfigurationFileServices
+ .getConfigurationPropertyValue(ConfigurationFileServices.SCHEMATIC_CONF_LABEL_NAME_PROPERTY_VALUE);
+ if (configurationFileValue.isPresent()) {
+ // format is XXX,YYY,ZZZ...
+ // Split, trim ang get all StringPropertyValue values. Separate them with
+ // LABEL_SEPARATOR.
+ String[] properties = configurationFileValue.get().split(ConfigurationFileServices.CONFIGURATION_SEPARATOR);
+ List result = Arrays.stream(properties).map(String::trim)
+ .map(key -> SchematicServices.getConfigurationLabel(element, key)).filter(s -> !s.isEmpty())
+ .collect(Collectors.toList());
+ if (!result.isEmpty()) {
+ return LABEL_SEPARATOR + result.stream().collect(Collectors.joining(LABEL_SEPARATOR));
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Return if RTPF layer is activated.
+ *
+ * @param dDiagram
+ * DDiagram
+ * @return if RTPF layer is activated.
+ */
+ private static boolean isRTPFLayerActivated(DDiagram dDiagram) {
+ Optional findFirst = new DDiagramQuery(dDiagram).getAllActivatedLayers().stream()
+ .filter(layer -> SchematicViewpointServices.SCHEMATIC_LAYER_LABEL_RTPF.equals(layer.getName()))
+ .findFirst();
+ return findFirst.isPresent();
+ }
+
+ /**
+ * Return if Schematic layer is activated.
+ *
+ * @param dDiagram
+ * DDiagram
+ * @return if Schematic layer is activated.
+ */
+ private static boolean isSchematicLayerActivated(DDiagram dDiagram) {
+ Optional findFirst = new DDiagramQuery(dDiagram).getAllActivatedLayers().stream()
+ .filter(layer -> SchematicViewpointServices.SCHEMATIC_LAYER_LABEL.equals(layer.getName())).findFirst();
+ return findFirst.isPresent();
+ }
+
+ /**
+ * Return if labels from configuration file layer is activated.
+ *
+ * @param dDiagram
+ * DDiagram
+ * @return if labels from configuration file layer is activated.
+ */
+ private static boolean isLabelsLayerActivated(DDiagram dDiagram) {
+ Optional findFirst = new DDiagramQuery(dDiagram).getAllActivatedLayers().stream().filter(
+ layer -> SchematicViewpointServices.SCHEMATIC_LAYER_LABEL_CONFIGURATION_FILE.equals(layer.getName()))
+ .findFirst();
+ return findFirst.isPresent();
+ }
+
+ /**
+ * Get parent imported mapping label from MappingImport.
+ *
+ * @param view
+ * DDiagramElement
+ * @return parent imported mapping label from MappingImport.
+ */
+ private static String getDDiagramElementLabel(DDiagramElement view) {
+ String label = "";
+ // find labelExpression in parent mapping and compute it with IInterpreter
+ // code from Sirius.
+ String styleLabelExpression = null;
+ IInterpreter interpreter = SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(view);
+ DDiagram parentDiagram = view.getParentDiagram();
+
+ styleLabelExpression = getContainerLabelExpression(view, interpreter, parentDiagram);
+
+ interpreter.setVariable(IInterpreterSiriusVariables.VIEW, view);
+ interpreter.setVariable(IInterpreterSiriusVariables.DIAGRAM, parentDiagram);
+ if (styleLabelExpression != null) {
+
+ try {
+ label = interpreter.evaluateString(view.getTarget(), styleLabelExpression);
+ } catch (final EvaluationException e) {
+ RuntimeLoggerManager.INSTANCE.error(view.getDiagramElementMapping(),
+ StylePackage.eINSTANCE.getBasicLabelStyleDescription_LabelExpression(), e);
+ }
+ }
+ interpreter.unSetVariable(IInterpreterSiriusVariables.VIEW);
+ interpreter.unSetVariable(IInterpreterSiriusVariables.DIAGRAM);
+ return label;
+ }
+
+ /**
+ * container view style label expression.
+ *
+ * @param view
+ * DDiagramElement
+ * @param interpreter
+ * IInterpreter
+ * @param parentDiagram
+ * DDiagram
+ * @return container view style label expression
+ */
+ public static String getContainerLabelExpression(DDiagramElement view, IInterpreter interpreter,
+ DDiagram parentDiagram) {
+ String styleLabelExpression = null;
+ DiagramElementMapping mapping = view.getDiagramElementMapping();
+ final DSemanticDecorator cContainer = (DSemanticDecorator) view.eContainer();
+ if (cContainer != null) {
+ if (mapping instanceof ContainerMappingImport) {
+ mapping = ((ContainerMappingImport) view.getDiagramElementMapping()).getImportedMapping();
+ BasicLabelStyleDescription style = (BasicLabelStyleDescription) new MappingWithInterpreterHelper(
+ interpreter).getBestStyleDescription(mapping, view.getTarget(), view, view, parentDiagram);
+ if (style != null) {
+ styleLabelExpression = style.getLabelExpression();
+ }
+ } else if (mapping instanceof EdgeMappingImport) {
+ IEdgeMapping edgeMapping = ((EdgeMappingImport) view.getDiagramElementMapping()).getImportedMapping();
+ if (edgeMapping instanceof EdgeMapping) {
+ EdgeStyleDescription style = (EdgeStyleDescription) MappingWithInterpreterHelper
+ .getDefaultStyleDescription((EdgeMapping) edgeMapping);
+ if (style != null && style.getCenterLabelStyleDescription() != null) {
+ styleLabelExpression = style.getCenterLabelStyleDescription().getLabelExpression();
+ }
+ }
+ } else if (mapping instanceof EdgeMapping) {
+ EdgeStyleDescription style = (EdgeStyleDescription) MappingWithInterpreterHelper
+ .getDefaultStyleDescription((EdgeMapping) mapping);
+ if (style != null && style.getCenterLabelStyleDescription() != null) {
+ styleLabelExpression = style.getCenterLabelStyleDescription().getLabelExpression();
+ }
+ }
+ }
+ return styleLabelExpression;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/AbstractImagePositionHandler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/AbstractImagePositionHandler.java
new file mode 100644
index 0000000..de1a322
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/AbstractImagePositionHandler.java
@@ -0,0 +1,65 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import java.util.Arrays;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.polarsys.capella.core.data.capellacore.CapellaElement;
+import org.polarsys.capella.core.data.cs.Part;
+
+import com.navalgroup.capella.schematic.design.images.editparts.AbstractSchematicDNodeContainerEditPart;
+import com.navalgroup.capella.schematic.design.services.SchematicServices;
+
+/**
+ * Action to change Container image position.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public abstract class AbstractImagePositionHandler extends AbstractHandler {
+
+ /**
+ * Rotate image to position.
+ *
+ * @param event
+ * ExecutionEvent
+ * @param position
+ * int
+ */
+ public void setPosition(ExecutionEvent event, int position) {
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof StructuredSelection) {
+ Arrays.asList(((StructuredSelection) selection).toArray()).forEach(editPart -> {
+ if (editPart instanceof AbstractSchematicDNodeContainerEditPart) {
+ // set graphical position
+ ((AbstractSchematicDNodeContainerEditPart) editPart).setPosition(position);
+
+ // save position on Capella element property value.
+ EObject semanticElement = ((AbstractSchematicDNodeContainerEditPart) editPart)
+ .resolveTargetSemanticElement();
+ if (semanticElement instanceof CapellaElement) {
+ // if part, search in abstract type
+ if (semanticElement instanceof Part) {
+ semanticElement = ((Part) semanticElement).getAbstractType();
+ }
+ SchematicServices.savePosition((CapellaElement) semanticElement, position);
+ }
+ }
+ });
+ }
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/BackToInitialPositionHandler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/BackToInitialPositionHandler.java
new file mode 100644
index 0000000..1eda802
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/BackToInitialPositionHandler.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Action to reinit the container image position.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class BackToInitialPositionHandler extends AbstractImagePositionHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ setPosition(event, PositionConstants.NORTH);
+ return null;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/HorizontalSymmetryHandler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/HorizontalSymmetryHandler.java
new file mode 100644
index 0000000..9d722c7
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/HorizontalSymmetryHandler.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Action to make an horizontal symmetry to the Container image.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class HorizontalSymmetryHandler extends AbstractImagePositionHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ setPosition(event, PositionConstants.HORIZONTAL);
+ return null;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate180Handler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate180Handler.java
new file mode 100644
index 0000000..e0a9846
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate180Handler.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Action to rotate Container with image 180 degrees.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class Rotate180Handler extends AbstractImagePositionHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ setPosition(event, PositionConstants.SOUTH);
+ return null;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate90LeftHandler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate90LeftHandler.java
new file mode 100644
index 0000000..c55a743
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate90LeftHandler.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Action to rotate Container with image 90 degrees left.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class Rotate90LeftHandler extends AbstractImagePositionHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ setPosition(event, PositionConstants.WEST);
+ return null;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate90RightHandler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate90RightHandler.java
new file mode 100644
index 0000000..39562f0
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/Rotate90RightHandler.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Action to rotate Container with image 90 degrees right.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class Rotate90RightHandler extends AbstractImagePositionHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ setPosition(event, PositionConstants.EAST);
+ return null;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/VerticalSymmetryHandler.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/VerticalSymmetryHandler.java
new file mode 100644
index 0000000..de060a8
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/handlers/VerticalSymmetryHandler.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Action to make a vertical symmetry to the Container image.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class VerticalSymmetryHandler extends AbstractImagePositionHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ setPosition(event, PositionConstants.VERTICAL);
+ return null;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/property/testers/IsSchematicEditPart.java b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/property/testers/IsSchematicEditPart.java
new file mode 100644
index 0000000..c99502f
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.design/src/com/navalgroup/capella/schematic/design/ui/property/testers/IsSchematicEditPart.java
@@ -0,0 +1,36 @@
+/******************************************************************************
+ * Copyright (c) 2021 Naval Group SA.
+ * All right reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ ******************************************************************************/
+package com.navalgroup.capella.schematic.design.ui.property.testers;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.sirius.diagram.DDiagramElement;
+import org.eclipse.sirius.diagram.WorkspaceImage;
+
+import com.navalgroup.capella.schematic.design.images.editparts.AbstractSchematicDNodeContainerEditPart;
+
+/**
+ * Test if selection is an AbstractSchematicDNodeContainerEditPart with WorkspaceImage style.
+ *
+ * @author Nathalie Lepine
+ *
+ */
+public class IsSchematicEditPart extends PropertyTester {
+
+ @Override
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof AbstractSchematicDNodeContainerEditPart) {
+ DDiagramElement diagramElement = ((AbstractSchematicDNodeContainerEditPart) receiver)
+ .resolveDiagramElement();
+ return diagramElement.getStyle() instanceof WorkspaceImage;
+ }
+ return false;
+ }
+
+}
diff --git a/plugins/com.navalgroup.capella.schematic.doc/.classpath b/plugins/com.navalgroup.capella.schematic.doc/.classpath
new file mode 100644
index 0000000..075009d
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/.classpath
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.doc/.gitignore b/plugins/com.navalgroup.capella.schematic.doc/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/plugins/com.navalgroup.capella.schematic.doc/.project b/plugins/com.navalgroup.capella.schematic.doc/.project
new file mode 100644
index 0000000..ae58e1e
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/.project
@@ -0,0 +1,34 @@
+
+
+ com.navalgroup.capella.schematic.doc
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ net.sf.eclipsecs.core.CheckstyleBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+ net.sf.eclipsecs.core.CheckstyleNature
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.doc/.settings/org.eclipse.core.resources.prefs b/plugins/com.navalgroup.capella.schematic.doc/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..0364b73
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//pages/index.html=UTF-8
+encoding//pages/user-guide.asciidoc=UTF-8
+encoding/=UTF-8
diff --git a/plugins/com.navalgroup.capella.schematic.doc/.settings/org.eclipse.jdt.core.prefs b/plugins/com.navalgroup.capella.schematic.doc/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/plugins/com.navalgroup.capella.schematic.doc/META-INF/MANIFEST.MF b/plugins/com.navalgroup.capella.schematic.doc/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..492f8fa
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: com.navalgroup.capella.schematic.doc;singleton:=true
+Bundle-Version: 1.1.0.qualifier
+Require-Bundle: org.eclipse.help
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: com.navalgroup.capella.schematic.doc
+Bundle-Vendor: %Bundle-Vendor
diff --git a/plugins/com.navalgroup.capella.schematic.doc/OSGI-INF/l10n/bundle.properties b/plugins/com.navalgroup.capella.schematic.doc/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000..dc9fce1
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,14 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+#Properties file for com.navalgroup.capella.schematic.doc
+
+Bundle-Vendor = Naval Group SA
+Bundle-Name = Capella Schematic Viewpoint Documentation
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.doc/about.html b/plugins/com.navalgroup.capella.schematic.doc/about.html
new file mode 100644
index 0000000..5eb1046
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/about.html
@@ -0,0 +1,36 @@
+
+
+
+
+About
+
+
+
About This Content
+
+
May 13, 2022
+
License
+
+
+ The Eclipse Foundation makes available all content in this plug-in
+ ("Content"). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 ("EPL"). A copy of the EPL is
+ available at http://www.eclipse.org/legal/epl-2.0.
+ For purposes of the EPL, "Program" will mean the Content.
+
+
+
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ ("Redistributor") and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at http://www.eclipse.org.
+
+
+
+
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.doc/build.properties b/plugins/com.navalgroup.capella.schematic.doc/build.properties
new file mode 100644
index 0000000..fd35f8f
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/build.properties
@@ -0,0 +1,17 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ toc.xml,\
+ pages/,\
+ OSGI-INF/,\
+ about.html
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/assets/css/stylesheet.css b/plugins/com.navalgroup.capella.schematic.doc/pages/assets/css/stylesheet.css
new file mode 100644
index 0000000..e5a8b63
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/pages/assets/css/stylesheet.css
@@ -0,0 +1,103 @@
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 18px;
+ margin-bottom: 24px;
+
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+p {
+ margin: 0 0 9px;
+}
+
+a {
+ color: #0088cc;
+ text-decoration: none;
+}
+a:hover {
+ color: #005580;
+ text-decoration: underline;
+}
+
+code {
+ border: none !important;
+ padding: 3px 4px;
+ font-family: Menlo, Monaco, "Courier New", monospace;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+code, pre {
+ color: #25587E;
+}
+pre {
+ display: block;
+ padding: 8.5px;
+ margin: 0 0 9px;
+ font-size: 12px;
+ line-height: 18px;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ white-space: pre;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+
+#title {
+ text-align: center;
+ font-size: 81px;
+ line-height: 1;
+ margin-bottom: 80px;
+}
+
+#description {
+ margin-bottom: 30px;
+}
+
+p.image {
+ text-align: center;
+}
+img.view-page-group1-6-0 {
+ max-width:50%;
+ max-height:50%;
+}
+img.language1-6-0 {
+ max-width:70%;
+ max-height:70%;
+}
+img.validation1-6-0 {
+ max-width:70%;
+ max-height:70%;
+}
+
+.label {
+ padding: 1px 3px 2px;
+ font-size: 9.75px;
+ font-weight: bold;
+ color: #ffffff;
+ text-transform: uppercase;
+ white-space: nowrap;
+ background-color: #bfbfbf;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.label-danger {
+ background-color: #c43c35;
+}
+.label-warning {
+ background-color: #f89406;
+}
+.label-success {
+ background-color: #46a546;
+}
+.label-info {
+ background-color: #62cffc;
+}
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/ImagePVProperties.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/ImagePVProperties.png
new file mode 100644
index 0000000..f654b9a
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/ImagePVProperties.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/actionPV.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/actionPV.png
new file mode 100644
index 0000000..626dada
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/actionPV.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/actionsTransformation.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/actionsTransformation.png
new file mode 100644
index 0000000..0a0a856
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/actionsTransformation.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithImagePV.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithImagePV.png
new file mode 100644
index 0000000..5f83f79
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithImagePV.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithLabels_PV.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithLabels_PV.png
new file mode 100644
index 0000000..09b42e8
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithLabels_PV.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithRTPFAndLabels_PV.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithRTPFAndLabels_PV.png
new file mode 100644
index 0000000..ab667a7
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithRTPFAndLabels_PV.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithRTPF_PV.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithRTPF_PV.png
new file mode 100644
index 0000000..c772cdd
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/componentWithRTPF_PV.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/configurationFilePreferences.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/configurationFilePreferences.png
new file mode 100644
index 0000000..db9890d
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/configurationFilePreferences.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exActions.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exActions.png
new file mode 100644
index 0000000..61d220c
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exActions.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentImage.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentImage.png
new file mode 100644
index 0000000..c0ef19c
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentImage.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentLabels.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentLabels.png
new file mode 100644
index 0000000..639e3dc
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentLabels.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentRTPF.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentRTPF.png
new file mode 100644
index 0000000..b86431c
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentRTPF.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentRTPFLabels.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentRTPFLabels.png
new file mode 100644
index 0000000..cdf05f7
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exComponentRTPFLabels.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exConfigurationFile.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exConfigurationFile.png
new file mode 100644
index 0000000..f65fe65
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exConfigurationFile.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/exLabelConfigurationFile.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exLabelConfigurationFile.png
new file mode 100644
index 0000000..f179b2a
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/exLabelConfigurationFile.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/importProject.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/importProject.png
new file mode 100644
index 0000000..717779e
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/importProject.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerLabelConf.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerLabelConf.png
new file mode 100644
index 0000000..b414453
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerLabelConf.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerRTPF.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerRTPF.png
new file mode 100644
index 0000000..353a8c5
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerRTPF.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerSchematic.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerSchematic.png
new file mode 100644
index 0000000..63ac04d
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/layerSchematic.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/tableLayersActivation.ods b/plugins/com.navalgroup.capella.schematic.doc/pages/images/tableLayersActivation.ods
new file mode 100644
index 0000000..ed0563f
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/tableLayersActivation.ods differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/tableLayersActivation.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/tableLayersActivation.png
new file mode 100644
index 0000000..f14d42e
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/tableLayersActivation.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/images/viewpointSelection.png b/plugins/com.navalgroup.capella.schematic.doc/pages/images/viewpointSelection.png
new file mode 100644
index 0000000..687f916
Binary files /dev/null and b/plugins/com.navalgroup.capella.schematic.doc/pages/images/viewpointSelection.png differ
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/index.html b/plugins/com.navalgroup.capella.schematic.doc/pages/index.html
new file mode 100644
index 0000000..a390cbc
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/pages/index.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+ Point de vue sur la schématique métier
+
+
+
+
Point de vue sur la schématique métier
+
+ Version 1.0.0 du point de vue sur la schématique métier.
+
+
+
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pages/user-guide.asciidoc b/plugins/com.navalgroup.capella.schematic.doc/pages/user-guide.asciidoc
new file mode 100644
index 0000000..2f0e011
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/pages/user-guide.asciidoc
@@ -0,0 +1,222 @@
+= Documentation utilisateur du point de vue sur la schématique métier
+Copyright (C) 2021 Naval Group. All Rights Reserved.
+:doctype: book
+:source-highlighter: rouge
+:listing-caption: Listing
+:toc:
+:toclevels: 4
+:sectnums:
+:icons: image
+
+== Définition[[definition]]
+
+Ce point de vue permet d'enrichir le diagramme de PAB de Capella avec trois layers qui :
+
+* affiche les composants physiques avec leurs schématiques métiers,
+* affiche le RTPF dans le label des composants et liens physiques,
+* affiche les valeurs définies par un fichier de configuration dans le label des composants et liens physiques.
+
+
+== Point de vue (viewpoint)[[viewpoint]]
+
+Pour utiliser ce point vue, il faut tout d'abord l'activer avec le menu clic droit sur un *.aird > _'Viewpoints Selection_'. Une boite de dialogue apparaît avec tous les points de vue disponibles, il faut cocher _'Schematic_'.
+
+image:images/viewpointSelection.png[align="center", pdfwidth='50%']
+
+
+=== Affichage de la schématique métier[[metier]]
+
+Pour activer le layer qui affiche les images métiers dans un PAB, il faut cliquer sur le bouton _'Layers_' de la tabbar du diagramme et choisir _'Schematic Name_'.
+
+image:images/layerSchematic.png[align="center", pdfwidth='50%']
+
+Ainsi, à l'activation de ce layer, un composant physique lié à une image, affichera une image à la place du rectangle de couleur. Seul un composant physique feuille d'un diagramme peut être affiché avec une image.
+
+image:images/exComponentImage.png[align="center", pdfwidth='50%']
+
+==== Où se trouvent les images ?
+
+Chaque utilisateur doit avoir les images sur son disque. En effet, pour une problématique de performance, il est fortement conseillé d'avoir les images sur le même support que celui de Capella.
+
+Les images doivent être contenues dans un projet du workspace. Chaque utilisateur devra avoir le même nom de projet avec la même arborescence d'images à l'intérieur. Dans Capella, on a la possibilité d'importer un projet où qu'il soit sur le disque. Cette action doit être faite une fois par workspace.
+
+Voici un exemple : sur le disque se trouve _'D:/MesImages_' qui est un projet Eclipse qui contient toutes les images. Il faut ensuite l'importer dans le workspace pour que le layer puisse utiliser ces images.
+
+Si les images sont mises à jour sur le réseau, elles devront être recopiées sur le disque de l'utilisateur et le projet du workspace doit être rafraîchi. Les diagrammes seront automatiquement mis à jour à leur prochaine ouverture.
+
+Pour importer le projet contenant les images, il faut aller dans le menu _'File > Import... > General > Existing Projects into workspace > Next_'. Ensuite, il faut sélectionner le projet sur le disque et décocher _'Copy projects into workspace_'. Enfin, cliquer sur Finish, le projet apparaît dans le workspace courant.
+
+image:images/importProject.png[align="center", pdfwidth='50%']
+
+
+WARNING: Le projet contenant les images doit être ouvert.
+
+==== Comment lier une image à un composant physique ?
+
+La détermination de l'image à utiliser pour chaque élément est calculée à partir d'informations positionnées dans les property values.
+
+Pour chaque composant physique où l'on veut afficher une image, il faut lui appliquer une property value de type String via la référence _'appliedPropertyValues_'. Cette property value doit être préalablement créée dans le modèle Capella et avoir son _'name_' et sa _'value_' renseignés via la vue Propriétés.
+Cette property value de type String aura :
+
+* le nom _'schematic.image_'
+* la valeur de la clé renseignée dans le fichier de configuration. La clé correspond à une seule image.
+
+image:images/componentWithImagePV.png[align="center", pdfwidth='50%']
+
+La correspondance entre la valeur de cette property value et les images à afficher est faite dans un fichier de configuration, un fichier de propriétés au format texte. Une propriété possède une clé et une valeur. La clé est la valeur renseignée dans la property value et la valeur est le chemin vers l'image depuis le projet du workspace.
+
+Voici un exemple : si un composant physique
+
+* possède un property value de type String _'schematic.image=moteur_'
+* et que le fichier de configuration contient la propriété _'moteur=MesImages/moteur.png_'
+* le composant physique sera affiché avec l'image _'MesImages/moteur.png_'
+
+==== Comment utiliser le fichier de configuration ?
+
+Le fichier de configuration est un fichier de propriétés au format texte avec l'extension _'.cfg_'. Une propriété possède une clé et une valeur, séparés par _'=_'.
+
+Ce fichier pourra être édité à volonté par les utilisateurs. Les images représentant les différents concepts métiers sont configurables sans nécessiter aucun développement additionnel. En parallèle, la bibliothèque des images métier peut être réalisée en autonomie par les utilisateurs.
+
+Voici un exemple de fichier de configuration :
+
+image:images/exConfigurationFile.png[align="center", pdfwidth='50%']
+
+Pour que le fichier de configuration soit pris en compte pour le chargement des images, il faut aller le renseigner dans les préférences, menu _'Window > Preferences > Capella > Schematic_' et saisir le chemin du fichier de configuration.
+
+image:images/configurationFilePreferences.png[align="center", pdfwidth='50%']
+
+WARNING: Si le chemin de l'image n'est pas valide, l'élément graphique Capella ne changera pas et restera un rectangle de couleur.
+
+Les images de la bibliothèque doivent être à la bonne taille car aucun ratio n'est appliqué dans la définition du style de l'image.
+
+Les formats d'image supportés sont _'jpg, png et svg_'. Pour information, une image jpg ou png avec une résolution de 96 ppp et une taille de 96x96 pixels s'affiche correctement sur le diagramme. Le fond de l'image doit être transparent pour que les liens et les ports arrivent jusqu'au dessin de l'image.
+
+Le fichier de configuration doit être encodé en _'UTF-8_'. Le chemin des images ne doit pas contenir de caractères interdits dans les noms de fichiers (<, >, : , " , |, ? ,*, saut de ligne) et le séparateur doit être le _'/_'.
+
+Une seul fichier de configuration peut être pris en compte pour la configuration de ce point de vue.
+
+==== Mise à jour de l'image
+
+L'utilisateur peut la valeur de la property value _'schematic.image'_ pour changer l'image. Toutefois, il faut une action utilisateur pour que l'image change dans le diagramme, soit :
+
+* rouvrir le diagramme,
+* désactiver et réactiver le layer des images,
+* redémarrer Capella (si les 2 premières actions ne fonctionnent pas).
+
+==== Affichage des labels
+
+Pour un souci de lisibilité, lorsque les images sont affichées dans le composant physique, les labels ne sont plus affichés à l'intérieur du noeud mais à l'extérieur. C'est en fait un noeud en bordure avec une image transparente qui affiche le label des composants. Il est par défaut positionné au nord de l'image. S'il n'y a pas de place au nord de l'image, le label sera affiché sur un autre bord. L'utilisateur peut aussi déplacer le label.
+
+
+WARNING: L'image et son label sont deux noeuds distincts -> les actions possibles sur le noeud du label ne seront pas les mêmes que celles disponibles sur l'image. Il faut donc bien sélectionner l'image et non son label pour travailler sur le composant.
+
+
+=== Affichage des RTPFs[[rtpf]]
+
+Pour activer le layer qui affiche les RTPFs dans un PAB, il faut cliquer sur le bouton _'Layers_' de la tabbar du diagramme et choisir _'Schematic RTPF_'.
+
+image:images/layerRTPF.png[align="center", pdfwidth='50%']
+
+Ainsi, à l'activation de ce layer, si un composant physique ou un lien physique possède la propriété RTPF, le label sera le RTPF (sans le nom). Si ce n'est pas le cas, le nom sera affiché.
+
+image:images/exComponentRTPF.png[align="center", pdfwidth='50%']
+
+
+==== Comment ajouter la propriété RTPF ?
+
+Cette propriété est calculée à partir d'informations positionnées sur les property values.
+
+Pour chaque composant physique / lien physique où l'on veut afficher le RTPF, il faut lui appliquer une property value de type String via la référence _'appliedPropertyValues_'. Cette property value doit être préalablement créée dans le modèle Capella et avoir son _'name_' et sa _'value_' renseignés via la vue Propriétés.
+Cette property value de type String aura :
+
+* le nom _'RTPF_'
+* la valeur du RTPF.
+
+image:images/componentWithRTPF_PV.png[align="center", pdfwidth='50%']
+
+=== Affichage des propriétés définies par le fichier de configuration[[labels]]
+
+Pour activer le layer qui affiche les données définies par le fichier de configuration dans un PAB, il faut cliquer sur le bouton _'Layers_' de la tabbar du diagramme et choisir _'Schematic Other Labels_'
+
+image:images/layerLabelConf.png[align="center", pdfwidth='50%']
+
+Ainsi, à l'activation de ce layer, un composant physique ou un lien physique qui a une ou plusieurs propriétés définies dans le fichier de configuration, affichera leurs valeurs en suffixe de son label.
+
+image:images/exComponentLabels.png[align="center", pdfwidth='50%']
+
+Le séparateur _' - _' n'est pas modifiable.
+
+==== Comment ajouter les propriétés ?
+
+Comme pour le layer RTPF, les propriétés sont calculées à partir des informations positionnées dans les property values.
+
+Pour chaque composant physique / lien physique où l'on veut afficher une propriété, il faut lui appliquer une property value de type String via la référence _'appliedPropertyValues_'. Cette property value doit être préalablement créée dans le modèle Capella et avoir son _'name_' et sa _'value_' renseignés via la vue Propriétés.
+Cette property value de type String aura :
+
+* le nom de la propriété : il doit être le même que celui renseigné dans le fichier de configuration,
+* la valeur de la propriété.
+
+Voici un exemple : si un composant physique
+
+* possède un property value de type String _'diametre=10mm_'
+* possède un property value de type String _'tension=5V_'
+* et que le fichier de configuration contient la propriété _'schematic.labels=diametre,tension_'
+* le label du composant physique sera suffixé par _'10mm_' et _'5V_'.
+
+image:images/componentWithLabels_PV.png[align="center", pdfwidth='50%']
+
+==== Comment utiliser le fichier de configuration ?
+
+Le fichier de configuration est le même que pour la configuration des images. C'est un fichier de propriétés au format texte avec l'extension _'.cfg_'. Une propriété possède une clé et une valeur, séparés par _'=_'.
+
+Ce fichier pourra être édité à volonté par les utilisateurs.
+
+Voici un exemple de fichier de configuration, les propriétés affichées dans le label sont définies par la clé _'schematic.labels_' et le séparateur des différentes propriétés à afficher doit être la _',_'.
+
+image:images/exLabelConfigurationFile.png[align="center", pdfwidth='50%']
+
+Pour que le fichier de configuration soit pris en compte, il faut aller le renseigner dans les préférences, menu _'Window > Preferences > Capella > Schematic_' et saisir le chemin du fichier de configuration.
+
+image:images/configurationFilePreferences.png[align="center", pdfwidth='50%']
+
+Le fichier de configuration doit être encodé en _'UTF-8_'.
+
+Une seul fichier de configuration peut être pris en compte pour la configuration des images et des labels dans ce point de vue.
+
+=== Activation des layers sur les labels[[layers]]
+
+Voici le comportement de l'affichage des labels en fonction des layers qui sont activés :
+
+image:images/tableLayersActivation.png[align="center", pdfwidth='50%']
+
+Voici un exemple avec les trois layers activés, _'Schematic Name_', _'Schematic RTPF_' et _'Schematic Other Labels_', le label sera le nom suffixé par toutes les valeurs des property values qui correspondent aux layers et qui sont appliquées à l'élément.
+
+image:images/componentWithRTPFAndLabels_PV.png[align="center", pdfwidth='50%']
+
+Le séparateur _' - _' n'est pas modifiable.
+
+=== Actions de transformation des images[[actions]]
+
+Des actions de transformation des images sont disponibles sur les images des composants physiques du layer _'Schematic Name_' :
+
+image:images/exActions.png[align="center", pdfwidth='50%']
+
+Voici ce que ça donne avec l'image du clapet :
+
+image:images/actionsTransformation.png[align="center", pdfwidth='50%']
+
+L'information de la position de l'image est stockée dans une property value dont le nom est _'schematic.image.position_'. Si celle-ci venait à être supprimée par l'utilisateur, l'image serait de nouveau affichée dans sa position de départ.
+
+image:images/actionPV.png[align="center", pdfwidth='50%']
+
+
+WARNING: La position de l'image est toujours calculée depuis l'image initiale. Ainsi, si l'utilisateur fait, par exemple, 2 fois de suite une rotation de 90 degrés, l'image restera positionné à 90 degrés, elle ne sera pas positionnée à 180°.
+
+
+WARNING: Les actions de transformation ne sont pas disponibles pour les images de type svg.
+
+
+WARNING: Les actions de transformation sont disponibles uniquement à partir de la sélection du noeud affichant l'image et ne sont pas disponibles à partir de la sélection du label.
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.doc/plugin.xml b/plugins/com.navalgroup.capella.schematic.doc/plugin.xml
new file mode 100644
index 0000000..7d4386b
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/plugin.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.doc/pom.xml b/plugins/com.navalgroup.capella.schematic.doc/pom.xml
new file mode 100644
index 0000000..49482bf
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/pom.xml
@@ -0,0 +1,80 @@
+
+
+
+
+ 4.0.0
+
+
+ com.navalgroup.capella.schematic
+ com.navalgroup.capella.schematic.parent
+ ../../
+ 1.1.0-SNAPSHOT
+
+
+ com.navalgroup.capella.schematic.doc
+ eclipse-plugin
+
+
+
+
+ org.asciidoctor
+ asciidoctor-maven-plugin
+ 2.1.0
+
+
+ output-html
+ generate-resources
+
+ process-asciidoc
+
+
+ html5
+
+ font
+
+
+
+
+
+ coderay
+
+ pages
+
+ .
+
+
+
+ org.eclipse.tycho
+ tycho-packaging-plugin
+
+
+
+
+ ${project.build.directory}/generated-docs
+ pages/
+
+ **/*.html
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.doc/toc.xml b/plugins/com.navalgroup.capella.schematic.doc/toc.xml
new file mode 100644
index 0000000..2c51747
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.doc/toc.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.ui/.classpath b/plugins/com.navalgroup.capella.schematic.ui/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.ui/.gitignore b/plugins/com.navalgroup.capella.schematic.ui/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/plugins/com.navalgroup.capella.schematic.ui/.project b/plugins/com.navalgroup.capella.schematic.ui/.project
new file mode 100644
index 0000000..49b0621
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/.project
@@ -0,0 +1,34 @@
+
+
+ com.navalgroup.capella.schematic.ui
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ net.sf.eclipsecs.core.CheckstyleBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+ net.sf.eclipsecs.core.CheckstyleNature
+
+
diff --git a/plugins/com.navalgroup.capella.schematic.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/com.navalgroup.capella.schematic.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/plugins/com.navalgroup.capella.schematic.ui/META-INF/MANIFEST.MF b/plugins/com.navalgroup.capella.schematic.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5ecb874
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Schematic UI
+Bundle-SymbolicName: com.navalgroup.capella.schematic.ui;singleton:=true
+Bundle-Version: 1.1.0.qualifier
+Bundle-Activator: com.navalgroup.capella.schematic.ui.SchematicUIPlugin$Implementation
+Bundle-Vendor: Naval Group
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.sirius.ext.base,
+ org.eclipse.emf.common.ui,
+ org.eclipse.emf.common
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: com.navalgroup.capella.schematic.ui
+Bundle-ActivationPolicy: lazy
+Export-Package: com.navalgroup.capella.schematic.ui,
+ com.navalgroup.capella.schematic.ui.preferences
diff --git a/plugins/com.navalgroup.capella.schematic.ui/OSGI-INF/l10n/bundle.properties b/plugins/com.navalgroup.capella.schematic.ui/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000..382c3a5
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,16 @@
+##############################################################################
+# Copyright (c) 2021 Naval Group SA.
+# All right reserved. This program and the accompanying materials are made
+# available under the terms of the Eclipse Public License 2.0
+# which is available at https://www.eclipse.org/legal/epl-2.0/
+#
+# Contributors:
+# Obeo - initial API and implementation
+##############################################################################
+
+Bundle-Vendor = Naval Group SA
+Bundle-Name = Capella Schematic Viewpoint UI
+
+SchematicPreferencePage_Title=Schematic Viewpoint Preferences
+SchematicPreferencePage_Description=Select a configuration file (*.cfg) for Schematic viewpoint.\nIt contains:\n\t* mappings between the value of 'schematic.image' property value and the image path on the disk\n\t* the list of property values keys which will be added to the PAB diagram labels.
+SchematicPreferencePage_ConfigurationFileLabel=Configuration file:
\ No newline at end of file
diff --git a/plugins/com.navalgroup.capella.schematic.ui/about.html b/plugins/com.navalgroup.capella.schematic.ui/about.html
new file mode 100644
index 0000000..5eb1046
--- /dev/null
+++ b/plugins/com.navalgroup.capella.schematic.ui/about.html
@@ -0,0 +1,36 @@
+
+
+
+
+About
+
+
+
About This Content
+
+
May 13, 2022
+
License
+
+
+ The Eclipse Foundation makes available all content in this plug-in
+ ("Content"). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 ("EPL"). A copy of the EPL is
+ available at http://www.eclipse.org/legal/epl-2.0.
+ For purposes of the EPL, "Program" will mean the Content.
+
+
+
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ ("Redistributor") and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at http://www.eclipse.org.
+