<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Pyramidion: a framework for domain-specific editors</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Yann</forename><surname>Le Goff</surname></persName>
							<email>yann.legoff1@univ-brest.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory" key="lab1">Lab-STICC</orgName>
								<orgName type="laboratory" key="lab2">UMR 6285</orgName>
								<orgName type="institution" key="instit1">Univ. Brest</orgName>
								<orgName type="institution" key="instit2">CNRS</orgName>
								<address>
									<postCode>F-29200</postCode>
									<settlement>Brest</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution">THALES Defense Mission Systems France -Etablissement de Brest</orgName>
								<address>
									<addrLine>10 Avenue de la 1&apos;ere DFL</addrLine>
									<postCode>29200</postCode>
									<settlement>Brest</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Pierre</forename><surname>Laborde</surname></persName>
							<email>pierre.laborde@fr.thalesgroup.com</email>
							<affiliation key="aff1">
								<orgName type="institution">THALES Defense Mission Systems France -Etablissement de Brest</orgName>
								<address>
									<addrLine>10 Avenue de la 1&apos;ere DFL</addrLine>
									<postCode>29200</postCode>
									<settlement>Brest</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Alain</forename><surname>Plantec</surname></persName>
							<email>alain.plantec@univ-brest.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory" key="lab1">Lab-STICC</orgName>
								<orgName type="laboratory" key="lab2">UMR 6285</orgName>
								<orgName type="institution" key="instit1">Univ. Brest</orgName>
								<orgName type="institution" key="instit2">CNRS</orgName>
								<address>
									<postCode>F-29200</postCode>
									<settlement>Brest</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Éric</forename><surname>Le Pors</surname></persName>
							<email>eric.lepors@fr.thalesgroup.com</email>
							<affiliation key="aff1">
								<orgName type="institution">THALES Defense Mission Systems France -Etablissement de Brest</orgName>
								<address>
									<addrLine>10 Avenue de la 1&apos;ere DFL</addrLine>
									<postCode>29200</postCode>
									<settlement>Brest</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Pyramidion: a framework for domain-specific editors</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">5D10F3CDCBE35AC235B3770836A15C96</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T18:10+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Smalltalk</term>
					<term>Pharo</term>
					<term>domain-specific editor</term>
					<term>GUI builder</term>
					<term>UI</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Developing User Interfaces (UI) for software can be tedious without tools to visualize, modify and test. A Graphical User Interface (GUI) builder could simplify the development process of an UI. In this paper we present Pyramidion, a framework to implement domain-specific editor to show and modify the properties of any objects. We used Pyramidion to generate Pyramid, a GUI builder that can modify the properties of graphical elements that compose an UI. In this paper we will present the general concept behind Pyramidion through the example of Pyramid.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>In an industrial context, a prototype is a serious application that contains the interfaces of the final product. At Thales Defense Mission System (DMS), our prototypes are used during demonstration in front of end-users to benefit from their feedbacks, to experiment new ideas and finally to validate the design <ref type="bibr" target="#b0">[1]</ref>. Real-time modifications of a prototype are often done during demonstrations to immediately take into account the suggestions of end-users and directly validate the new modification with them, improving the quality of the solution. Thus, we need tools to minimize the cost of such a change. Typically, a GUI builder can help.</p><p>In this paper we present Pyramidion. Pyramidion consists in a framework to implement domainspecific editor to show and modify the structure and the properties of a collection of objects. With Pyramidion new features of an editor are implemented through a plugin pattern. Such a feature can be a domain-specific editing functionality or a transversal functionality such as undo-redo or serialization.</p><p>We use Pyramidion to implement Pyramid, our GUI builder for Pharo 1 and the Bloc UI library 2 . At Thales DMS, we use Pyramid either to create new views from scratch or to change existing projects views. We also use Pyramid to change dynamically our GUI during presentations without stopping the running application.</p><p>In this paper, we present the following contributions: the definition of a domain-specific editor in Section 2, an example of a domain-specific editor in Section 3, the Pyramidion core architecture in Section 4, how we implemented Pyramidion in Pharo in Section 5, pyramid, the GUI builder created with Pyramidion in Section 6, related works in Section 7, finally we conclude the paper in Section 8.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Definition of a Domain Specific Editor</head><p>A domain-specific editor is an application that helps a user to modify or to create a domain-specific model composed of domain-specific objects. Improving software can be long and tedious <ref type="bibr" target="#b1">[2]</ref> without a good understanding of its structure. An editor with a dedicated UI to modify the different objects of the model can be faster than a text-based one and can help unexperimented users to better understand the domain in which they are working <ref type="bibr" target="#b2">[3]</ref>.</p><p>We developed Pyramidion, a framework to create domain-specific editors. Pyramidion reduces the effort the developers need to make to create a working editor for a specific-domain. They have to specify the accessors and mutators of the model, the associated views, and the needed editor behaviors for the specific-domain.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Example of a domain-specific editor</head><p>Figure <ref type="figure">1</ref> shows a domain-specific editor view for creating and editing a traffic light view. The traffic light view is composed of graphical elements. A graphical element is an object that can be rendered as a 2D representation on the screen. All 2D graphics libraries aim to instantiate and configure graphic elements. Considering object-oriented libraries, a graphical element is modeled as a Composite. Each graphic element has properties for its size, its shape, its background color, etc.</p><p>The domain-specific model of the figure <ref type="figure">1</ref> is composed of graphical elements and their properties. The domain-specific editor of the figure 1 displays multiple representations of the same domain-specific model. The editor is composed of 3 panels:</p><p>• On the left (1), a panel that is made of tabs, currently there is one tab named Tree. It shows a kind of inspector for the graphic element tree that is manipulated by the domain-specific editor; the inspector allows the user to select one or several elements of this tree; • On the center (not numbered), a panel to render the traffic light (the domain model view) and the current selection. Any valid change in the graphic element tree is rendered on this panel; • On the right (3), a panel also made of multiple tabs; the tab named Visuals is selected. The associated panel contains a specific editor for the background color property of the currently selected graphic element (2); In order to edit a particular property (e.g. the background color) of a graphical element inside a tree, a user first selects the targeted graphic element in the tree inspector. Then the property views are updated according to the selected graphic element. Finally, the user can use the specific editor for the background color property to see the current color of the selected elements and change its value. Therefore, a domain-specific editor is made of 3 subsystems:</p><p>• Panel Builder Manager, to modify and extend the user interface of the editor.</p><p>• Selection System, to select the elements inside a tree of elements. • Command System, to view and update the properties of the selected elements.  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Pyramidion architecture</head><p>The architecture of Pyramidion is based on the use of plugins. The architecture is shown in Figure <ref type="figure" target="#fig_1">2</ref>. In the context of Pyramidion, a plugin is programmed as a class to add specific features to a domain-specific editor. All plugins of a specific editor are managed by a builder. Then, a specific editor consists in a builder and a set of plugins. Any plugin can interact with the 3 subsystems of the specific editor: the Panel Builder Manager, the Selection System and the Command System (in grey in Figure <ref type="figure" target="#fig_1">2</ref>).</p><p>For the example in section 3 we need 3 plugins:</p><p>• MainUIPlugin, a plugin to describe the different panels of the UI of our editor.</p><p>• TreePlugin, a plugin to select the graphical elements.</p><p>• BackgroundPlugin, a plugin to display and modify the current value of the background.</p><p>Figure <ref type="figure" target="#fig_2">3</ref> presents a part of the build sequence of the example. The builder implements three phases for the building of a specific editor: (1) the configuration phase, (2) the view modification phase and (3) the editor building phase. Each phase is runned on all registered plugins. Regarding the traffic light example :</p><p>• During the configuration phase, MainUIPlugin creates a new instance of PanelBuilderManager (create (phase 1) in the Figure <ref type="figure" target="#fig_2">3</ref>) and inject it as default value inside the builder (modify (phase 1) in the Figure <ref type="figure" target="#fig_2">3</ref>). • During the view modification phase, all plugin can modify the PanelBuilderManager of the builder (extend (phase 2) in the Figure <ref type="figure" target="#fig_2">3</ref>). The TreePlugin and the BackgroundPlugin use the new PanelBuilderManager to modify the view of the editor. The TreePlugin adds a tree inspector view to show the graphical element tree (number 1 and 2 in Figure <ref type="figure">1</ref>). The BackgroundPlugin adds a specific editor to show and modify the background of a graphical element (number 3 in Figure <ref type="figure">1</ref>). • During the editor building phase the builder creates the editor with the PanelBuilderManager (create (phase 3) in the Figure <ref type="figure" target="#fig_2">3</ref>). The editor is composed of the PanelBuilderManager created by the MainUIPlugin, a Selection System created by the editor and a Command System also created by the editor. The plugins can use any of the subsystems of the editor (extend (phase 3) in the Figure <ref type="figure" target="#fig_2">3</ref>). The TreePlugin uses the Selection System to update the current selection.</p><p>The BackgroundPlugin uses the Selection System to access the current selection and the Command System to modify the graphical elements.</p><p>Each phase running consists in the sending of a specific message by the builder to its registered plugins. Therefore a plugin class must implement 3 methods: #configureBuilder: for the configuration phase, #addPanelOn: for the panel adding phase and #connectOn: for finalization of the editor building. The next sections describe how the builder uses theses 3 plugins to construct the domain specific editor.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1.">Configuration of the builder and creating the view of the editor</head><p>The view of a domain-specific editor is composed of widgets. The widgets are: the buttons, the lists, the panels, the textfields, the menus etc. The users will use the widgets to see and modify the domainspecific model or to use transversal capabilities (like the undo-redo). Pyramidion uses the widgets of the system to display the UI of the domain-specific editors. The Widget Adaptaters are used as adapters between the widgets of the system and the Pyramidion editor.</p><p>The Widget Adaptaters are created by the plugins using the Panel Builders of the Panel Builders Manager (see Figure <ref type="figure" target="#fig_3">4</ref>). Then they are added to the Panel Builder that created them.</p><p>The Panel Builders Manager contains multiple Panel Builders. Each Panel Builder assembles the different widgets inside the Widget Adaptaters to form a panel. Panel Builders Manager uses the panels (that contains the different widgets) to create the view of the editors.</p><p>There are different types of Panel Builder. Each type of Panel Builder depends on the necessary widget types to create the domain-specific editor. If developers want to add a new widget type for its editors, they will have to create a dedicated Panel Builder that creates those new widgets and assembles them in a panel. For our current use of Pyramidion, 4 different Panel Builders are defined :</p><p>• Notebook, where each widget is a new view inside a tab. • Buttons bar, where each widget is a button. • Single panel, where only one widget corresponding to a view is displayed.</p><p>• Menu, where each widget is a menu item or a group of menu items.</p><p>The method #configureBuilder: of the plugins is used by the builder to configure itself (see phase 1 in Figure <ref type="figure" target="#fig_2">3</ref>). Any plugin can change the default Panel Builders Manager of the builder, it also have to define the different Panel Builders that will be used to create the editor.</p><p>The #addPanelOn: of the plugins is used by the builder to create new widget Adaptaters during phase 2 in Figure <ref type="figure" target="#fig_2">3</ref>. Any plugin can add any number of widget Adaptaters to the different Panel Builders. The Widget Adaptater comes with a priority value used when multiple widget Adapters want to be added on the same Panel Builders. The priority value will be used to define the order of the widgets on the Panel Builders. This priority value is an arbitrary value defined by the developer of the plugin. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>In our example</head><p>The Panel Builders Manager is created by the MainUIPlugin during the configuration phase (see Figure <ref type="figure" target="#fig_2">3</ref>). The Panel Builders Manager has two Notebook Panel Builders to add the widget Adaptaters created by the two other plugins.</p><p>The TreePlugin adds a tree inspector view to display and select the different graphical elements (see number 1 in Figure <ref type="figure">1</ref>). The BackgroundPlugin adds a specific editor for colors to display and modify the background of selected graphical element (see number 3 in Figure <ref type="figure">1</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.">Connect to the subsystems of the editor</head><p>The method #connectEditor: is used by the Pyramidion builder to link the different subsystems of the domain-specific editor to the plugins (see Figure <ref type="figure" target="#fig_2">3</ref>).</p><p>The TreePlugin will have to update its content and its selection accordingly to the selection system contents and selection. It will also have to change the selection system when the user select a new element in the UI.</p><p>The BackgroundPlugin will have to connect to the selection system to display the correct information according to the current selection. It will have to also connect to the command executor (see Figure <ref type="figure" target="#fig_4">5</ref>) system to be able to modify the background of the selected graphical elements.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.1.">The selection system</head><p>Access to all the elements of the domain-specific model is necessary to allow the users to understand the structure of the elements and the global properties of the model. Access to a specific subgroup of elements of the model is also necessary to see and modify the detail of the model. Therefore, a domain-specific editor must have 2 collections of objects:</p><p>• The first level elements, that represent all the roots of the current domain-specific model.</p><p>• The current selection, that represent a subpart of the domain-specific model.</p><p>In the Figure <ref type="figure">1</ref> at number 1, the element named A has 3 children named B, C and D. We can see on number 2 that the element D is selected. The first level elements is a list that contains the element A and the current selection is a list that contains the element D.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>How plugins are dynamically linked ?</head><p>The first level elements and the current selection are both observable collections. When a modification is made to one of them, a signal is sent to all the objects that observe them. Any plugin can register as an observer of the first level elements or the current selection.</p><p>This observer/observable pattern is used by the BackgroundPlugin to update the displayed properties panel when the current selection changes (see number 3 in Figure <ref type="figure">1</ref>). The TreePlugin can modify the current selection collection and therefore trigger the signal to all the observers of the current selection.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.2.">Object modification mechanism</head><p>We call property the association of a command and an input as depicted in the Figure <ref type="figure" target="#fig_4">5</ref>.</p><p>The input is a kind of specific editor that are used to display and modify the values of the selected objects. In Figure <ref type="figure">1</ref>, the element D is selected. The element D has a green background. We can see the property for the background is present and display the green value (number 3 on the figure).</p><p>The command is used to retreive the value of the properties to be displayed in the input, mutate the selected objects (change the value of the object) and decide if the input should be visible to the users. For example, we do not want to display the input to change the text of a graphical element if no element in the selection is a text element.</p><p>Display the value of the property. When the current selection is updated, each object of the selection is tested by the verification method (#canBeUsedOn) of the command of each property:</p><p>• If the verification methods return false for all selected elements, then the property is not displayed. • If only one method return true, then the input for this element is displayed (single selection on Figure <ref type="figure" target="#fig_5">6</ref>). • If multiple methods return true, then the property create multiple inputs (multi selection on Figure <ref type="figure" target="#fig_5">6</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Change the value of the property.</head><p>The command is used to mutate the selected objects when the users interact with the inputs of the properties. The input contains a callback that will use the command on the commands executor with the new value of the input as arguments for the command (see the method #useCommandOn of the Command Executor in the Figure <ref type="figure" target="#fig_4">5</ref>). The commands executor can be extended by any plugin to add behavior before or after the execution of the command.  Using a builder to create the inputs. The selection system allows the multi-selection of elements as depicted in Figure <ref type="figure" target="#fig_5">6</ref>. The property uses an input builder that creates the different inputs when one element is selected or in multi-selection. The input builder take an input class and an input model to create the inputs and their associated callbacks. There are different types of input class: one for the strings, one for the numbers, one for the colors, one for a boolean value, etc. Some inputs can be used in different context (like in the Figure <ref type="figure" target="#fig_7">7</ref>). For example the position property and the size property expect a Point as an argument, but this point represents two different concepts. The position is a coordinate x and y on the screen, the size is a height and a width. To specialized the Point Input we used the associated input model (Point Input Model) to help the users to better understand what is the property they are interacting with.  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Single Selection Multi Selection</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Implementation of Pyramidion</head><p>We validate the Pyramidion architecture by implementing it in Pharo<ref type="foot" target="#foot_0">3</ref> , a Smalltalk inspired language. Smalltalk allows the modification of the model at runtime and gives the possibility to the users to see each incremental modification. Therefore it reduces the cost of validation. Pharo is a full Integrated Development Environment (IDE) with plenty of support tools like inspectors and debuggers The editors created with Pyramidion can benefit from these tools.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>The plugins in Pharo</head><p>To create a plugin in our implementation of Pyramidion in Pharo, we use Traits <ref type="bibr" target="#b3">[4]</ref>. The developers create a new class that implements the trait TPyramidPlugin. The TPyramidPlugin adds to the class the necessary methods for the Pyramidion builder. By default, the trait has no behavior inside the methods. If the developers want their plugins to do something, they have to override the different methods used by the builder.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Yann Le Goff et al. CEUR Workshop Proceedings</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>1-11</head><p>A singleton to centralize all plugins To facilitate the creation of editors by the builder, we created a system to register all plugins into a singleton. The singleton centralizes all the plugins and creates a builder with all the plugins ready to be installed. Therefore, the developers only have to register their plugins to the singleton only one time, and use the builder of the singleton to create an editor. We use the initialization method of the meta-class of the plugins to register them automatically when the class is created in the Pharo image. For example, we can use this behavior to automatically add new plugins after loading the package that contains the plugins from a Git repository.</p><p>The Spec2 library to make the UI We chose to use the Spec2 library <ref type="bibr" target="#b4">[5]</ref> to make the UI of our editors. Spec2 is the default UI library of Pharo. All the widgets of the Widget Adaptaters and the panels created by the Panel Builders are created using the Spec2 library.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.">Validation</head><p>We developed a GUI builder with Pyramidion in Pharo. Some of the plugins we developed offer transversal capabilities and can be used in different domains. This is the case for:</p><p>• The serialization plugin that allows us to save the current model modifications.</p><p>• The historialization plugin keeps the state of the elements before the modification allowing the developers to undo their modifications. • The playground plugin that creates a Pharo Playground inside the editor.</p><p>We will present Pyramid, our GUI builder for Bloc in Section 6.1. We will present a selection of the transversal plugins we created in Section 6.2. We used Pyramidion to develop Pyramid<ref type="foot" target="#foot_1">4</ref> : a GUI builder for Pharo. Pyramid is based on Bloc, a UI library for Pharo. Pyramid allows us to modify the properties of BlElements, the graphical elements of Bloc. The Figure <ref type="figure" target="#fig_8">8</ref> shows an example of Bloc graphical elements assembled to create a 3D effect. The dynamic graphical feedback that Pyramid enables makes developing such a complex view easier than writing the script in a workspace, running it, and then observing the result multiple times.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.1.">Pyramid: a GUI builder with Pyramidion</head><p>Developers can use Bloc to develop beautiful and complex applications <ref type="bibr" target="#b0">[1]</ref>. When we started the development of Pyramid in 2023, the source code of Bloc underwent important changes. We used the plugin-based architecture to develop Pyramid with one feature corresponding to one plugin. Therefore when one of our features became obsolete because of the changes in the source code of Bloc, we only had to update a single plugin.</p><p>The default version of Pyramid is composed of 16 plugins. There are multiple plugins for the properties, there are plugins for the WYSIWYG (What You See Is What You Get) view, etc. At Thales DMS, we created other plugins for our specific needs. For example, we have a plugin to import designs from Figma<ref type="foot" target="#foot_2">5</ref> into Pyramid.</p><p>Generally, a GUI builder can only modify applications created with the GUI builder <ref type="bibr" target="#b2">[3]</ref>. The live environment of Pharo allows us to modify the UI of any Bloc applications in real time and not only applications created with Pyramid. For example, users could be interacting with a UI developed in Bloc. While interacting with the UI, users change the current state of the application. We can use Pyramid to stop the user interactions and open the current UI inside Pyramid. Pyramid can be used to modify the UI while keeping the state of the application. When Pyramid is closed, we allow users to interact with the UI again. The UI will retain the modifications made with Pyramid.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.2.">Transversal plugins</head><p>We developed multiple transversal plugins that can be used in different domain-specific editors. Currently, the transversal plugins are used by Pyramid. We will see the serialization plugin, the historialization plugin, and the playground plugin.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>The serialization plugin</head><p>The serialization allows the users to save their current modifications. The serialization plugin will use the first level elements of the selection system as an entry point to generate a string that can be used to recreate similar objects. We chose to use Ston <ref type="bibr" target="#b5">[6,</ref><ref type="bibr">Chapter 9]</ref> as the support for the serialization.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>The historialization plugin</head><p>The historialization is important because it is one of the most used commands in other IDE <ref type="bibr" target="#b6">[7]</ref>. The historialization plugin extends the command executor to add behavior before and after the execution of the commands. The plugin will create a memento of the state of the objects before the execution of the command and afterward. The mementos are used to restore the state of the objects.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>The playground plugin</head><p>The playground allows to add a Pharo playground in any domain-specific editor. The playground of Pharo allows to send any message to any object. It is a possible entry point to connect any tools of Pharo to the domain-specific model. It can also be used to modify any properties that are not already developed in the domain-specific editor.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.">Related works</head><p>Domain-specific tools Moldable debugger <ref type="bibr" target="#b7">[8]</ref> proposes a domain-specific framework for debugger. The moldable debugger allows developers to create domain-specific extensions to their debuggers to resolve domain-specific problems. Pyramidion can be used to understand, modify, and create a new domain-specific model. The debugging capability of Pyramidion is limited but Pyramidion can be used with the other tools available in Pharo, like the debugger. The moldable debugger can move seamlessly from one domain to another thanks to its user interface and its activation predicate for domain-specific tasks, our approach can also adapt its UI for different domain properties.</p><p>The Eclipse platform<ref type="foot" target="#foot_3">6</ref> allows the integration of domain-specific tools. The Eclipse platform developer chooses which tools are installed. With Pyramidion, the developer also chooses which plugins are installed. The Eclipse platform offers different levels of integration <ref type="bibr" target="#b9">[9]</ref>. Some tools will interact with the Eclipse platform through data sharing. Others will offer dedicated API. Finally, some can modify the UI of the Eclipse IDE, respond to a change in the selection, and even respond to an event created by other tools. Pyramidion has only one level of integration, corresponding to the UI integration. <ref type="bibr" target="#b10">[10]</ref> is a language and a framework used to create a graphical editor for structured data and code. Pyramidion can also modify structured data but currently, it has not been tested to modify code. Citrus can be used to define models and behaviors of applications. We would like Pyramid to do the same soon. Our implementation of Pyramidion does not define a new language but uses an already specified one, the Pharo language.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>GUI builders Citrus</head><p>Amulet <ref type="bibr" target="#b11">[11]</ref> is a development environment to create GUI. Like Pyramidion, Amulet allows the modifications of graphical objects at runtime. Unlike Pyramid, Amulet also allows the modifications of the behaviors of the application. Amulet provides the developer debugging tools: an inspector and a debugger. In Pyramid, we created plugins to access the already present debugging tools inside the Pharo environment. In Pyramid, we have access to the Pharo inspector and the Pharo playground. From the inspector, we can set breakpoints and object-centric breakpoints 7 .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8.">Conclusion and Future Works</head><p>We developed Pyramidion, a plugin-based framework that allows developers to create their domainspecific editors. The plugin-based architecture simplifies the development process and permits the reuse of some of the defined behavior between really different domains. We then used Pyramidion to create Pyramid, a GUI builder in Pharo.</p><p>As discussed in the previous sections, Pyramid cannot modify the behavior of the user interface and dynamic widgets. But thanks to the Pyramidion framework, it will be easier to add new functionality to Pyramid. This would allow Pyramid to create or modify complete applications at runtime with a dedicated UI, allowing us to prototype more quickly.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>1 2 3 Figure 1 :</head><label>131</label><figDesc>Figure 1: A Pyramidion specific editor of a traffic light view</figDesc><graphic coords="2,96.01,445.00,403.22,138.77" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: The class model of the architecture of Pyramidion.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3:The build sequence of the builder and 3 associated plugins.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Figure 4 :</head><label>4</label><figDesc>Figure 4: Architecture of the panel builders manager.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 5 :</head><label>5</label><figDesc>Figure 5: Architecture of the Properties Manager. The hashed part correspond to the class needed for the example in Figure 7.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Figure 6 :</head><label>6</label><figDesc>Figure 6: Example of the multi-selection on the property view.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>Figure 7 :</head><label>7</label><figDesc>Figure 7: Implementation of 2 properties using the same input class.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_8"><head>Figure 8 :</head><label>8</label><figDesc>Figure 8: Example of a Pyramid editor.</figDesc><graphic coords="8,102.85,444.74,389.58,170.08" type="bitmap" /></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_0">Pharo website on: https://pharo.org/. Accessed on 25/05/2024</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_1">Pyramid open source repository on: https://github.com/OpenSmock/Pyramid. Accessed on 25/05/2024</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_2">Figma website on: https://www.figma.com/. Accessed on 25/05/2024</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="6" xml:id="foot_3">Eclipse website: https://eclipseide.org/. Accessed on 10/08/2024</note>
		</body>
		<back>

			<div type="availability">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>https://pharo.org/ 2 Bloc open source repository on: https://github.com/pharo-graphics/Bloc. Accessed on 21/05/2024</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Laborde</surname></persName>
		</author>
		<author>
			<persName><forename type="first">É</forename><surname>Le Pors</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><forename type="middle">Le</forename><surname>Goff</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Plantec</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Costiou</surname></persName>
		</author>
		<title level="m">Ergonomic evaluations of human-machine interfaces in the defense business: an example of a collaborative maritime surveillance system</title>
				<imprint>
			<date type="published" when="2024">2024</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Mental models and software maintenance</title>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">C</forename><surname>Littman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Pinto</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Letovsky</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Soloway</surname></persName>
		</author>
		<idno type="DOI">10.1016/0164-1212(87)90033-1</idno>
		<ptr target="https://linkinghub.elsevier.com/retrieve/pii/0164121287900331.doi:10.1016/0164-1212(87)90033-1" />
	</analytic>
	<monogr>
		<title level="j">Journal of Systems and Software</title>
		<imprint>
			<biblScope unit="volume">7</biblScope>
			<biblScope unit="page" from="341" to="355" />
			<date type="published" when="1987">1987</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<title level="m" type="main">Software development in ada and motif using a gui builder</title>
		<author>
			<persName><forename type="first">A</forename><surname>Ply</surname></persName>
		</author>
		<idno type="DOI">10.1109/NAECON.1996.517696</idno>
		<imprint>
			<date type="published" when="1996">1996</date>
			<biblScope unit="volume">2</biblScope>
			<biblScope unit="page" from="505" to="510" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Traits: A mechanism for fine-grained reuse</title>
		<author>
			<persName><forename type="first">S</forename><surname>Ducasse</surname></persName>
		</author>
		<author>
			<persName><forename type="first">O</forename><surname>Nierstrasz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Schärli</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Wuyts</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">P</forename><surname>Black</surname></persName>
		</author>
		<idno type="DOI">10.1145/1119479.1119483</idno>
		<ptr target="https://dl.acm.org/doi/10.1145/1119479.1119483.doi:10.1145/1119479.1119483" />
	</analytic>
	<monogr>
		<title level="j">ACM Transactions on Programming Languages and Systems</title>
		<imprint>
			<biblScope unit="volume">28</biblScope>
			<biblScope unit="page" from="331" to="388" />
			<date type="published" when="2006">2006</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<author>
			<persName><forename type="first">J</forename><surname>Fabry</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Ducasse</surname></persName>
		</author>
		<idno>OCLC: 1021885954</idno>
		<title level="m">The Spec UI framework</title>
				<meeting><address><addrLine>Kehrsatz; Switzerland</addrLine></address></meeting>
		<imprint>
			<publisher>Square Bracket Associates</publisher>
			<date type="published" when="2017">2017</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<author>
			<persName><forename type="first">D</forename><surname>Cassou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Ducasse</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Fabresse</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Fabry</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Van Caekenbergh</surname></persName>
		</author>
		<idno>OCLC: 1151080859</idno>
		<title level="m">Enterprise Pharo a Web Perspective</title>
				<imprint>
			<publisher>Square Bracket Associates</publisher>
			<date type="published" when="2016">2016</date>
		</imprint>
	</monogr>
	<note>Place of publication not identified</note>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">How are Java software developers using the Eclipse IDE?</title>
		<author>
			<persName><forename type="first">G</forename><surname>Murphy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Kersten</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Findlater</surname></persName>
		</author>
		<idno type="DOI">10.1109/MS.2006.105</idno>
		<ptr target="https://ieeexplore.ieee.org/document/1657944/.doi:10.1109/MS.2006.105" />
	</analytic>
	<monogr>
		<title level="j">IEEE Software</title>
		<imprint>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="page" from="76" to="83" />
			<date type="published" when="2006">2006</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">The Moldable Debugger: A Framework for Developing Domain-Specific Debuggers</title>
		<author>
			<persName><forename type="first">A</forename><surname>Chiş</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Gîrba</surname></persName>
		</author>
		<author>
			<persName><forename type="first">O</forename><surname>Nierstrasz</surname></persName>
		</author>
		<ptr target="https://thepharo.dev/2020/07/16/object-centric-breakpoints-a-tutorial/" />
	</analytic>
	<monogr>
		<title level="m">Software Language 7 Object-centric debugging on Pharo</title>
				<editor>
			<persName><forename type="first">B</forename><surname>Combemale</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">D</forename><forename type="middle">J</forename><surname>Pearce</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">O</forename><surname>Barais</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">J</forename><forename type="middle">J</forename><surname>Vinju</surname></persName>
		</editor>
		<imprint>
			<date type="published" when="2024-08-10">10/08/2024</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<title/>
		<idno type="DOI">10.1007/978-3-319-11245-9_6</idno>
		<ptr target="http://link.springer.com/10.1007/978-3-319-11245-9_6.doi:10.1007/978-3-319-11245-9_6" />
		<imprint>
			<date type="published" when="2014">2014</date>
			<publisher>Springer International Publishing</publisher>
			<biblScope unit="volume">8706</biblScope>
			<biblScope unit="page" from="102" to="121" />
			<pubPlace>Cham</pubPlace>
		</imprint>
		<respStmt>
			<orgName>Engineering</orgName>
		</respStmt>
	</monogr>
	<note>Lecture Notes in Computer Science</note>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<author>
			<persName><forename type="first">J</forename><surname>Amsden</surname></persName>
		</author>
		<title level="m">Levels of integration: Five ways you can integrate with the eclipse platform</title>
				<imprint>
			<date type="published" when="2001">2001</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Citrus: a language and toolkit for simplifying the creation of structured editors for code and data</title>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">J</forename><surname>Ko</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">A</forename><surname>Myers</surname></persName>
		</author>
		<idno type="DOI">10.1145/1095034.1095037</idno>
		<ptr target="https://dl.acm.org/doi/10.1145/1095034.1095037.doi:10.1145/1095034.1095037" />
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 18th annual ACM symposium on User interface software and technology</title>
				<meeting>the 18th annual ACM symposium on User interface software and technology<address><addrLine>Seattle WA USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="3" to="12" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">The Amulet environment: new models for effective user interface software development</title>
		<author>
			<persName><forename type="first">B</forename><surname>Myers</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Mcdaniel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Miller</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Ferrency</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Faulring</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Kyle</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Mickish</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Klimovitski</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Doane</surname></persName>
		</author>
		<idno type="DOI">10.1109/32.601073</idno>
		<ptr target="http://ieeexplore.ieee.org/document/601073/.doi:10.1109/32.601073" />
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on Software Engineering</title>
		<imprint>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="page" from="347" to="365" />
			<date type="published" when="1997">1997</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
