<div dir="ltr"><div><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><p class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted" style="font-family:monospace">Hi everyone,</span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span><span class="gmail-ng-star-inserted">This week was a masterclass in UI architecture and debugging within the VCL</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">framework. The journey took us from a promising but flawed experiment to a</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">foundational success: we now have a stable, working Object Browser UI,</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">populated with live UNO API data for the first time.</span></span></span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span><span class="gmail-ng-star-inserted">This is a major milestone. The browser is no longer a concept; it's a real,</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">functioning tool within the IDE.</span></span></span></p><p class="gmail-ng-star-inserted"><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0" style="font-family:monospace"></span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span><span class="gmail-ng-star-inserted">Gerrit Patch: </span><a target="_blank" href="https://www.google.com/url?sa=E&q=https%3A%2F%2Fgerrit.libreoffice.org%2Fc%2Fcore%2F%2B%2F186822" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">https://gerrit.libreoffice.org/c/core/+/186822</span></span></a><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">Live UI Screenshot: </span><a target="_blank" href="https://www.google.com/url?sa=E&q=https%3A%2F%2Fbug-attachments.documentfoundation.org%2Fattachment.cgi%3Fid%3D201567" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">https://bug-attachments.documentfoundation.org/attachment.cgi?id=201567</span></span></a><br></span></span></p><p class="gmail-ng-star-inserted"><br></p><p class="gmail-ng-star-inserted"><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0" style="font-family:monospace"></span></p><p class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted" style="font-family:monospace"><font size="4">== The Experiment: The "Shell-Managed" Splitter Architecture ==</font></span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span><span class="gmail-ng-star-inserted">Our journey this week began with crucial feedback from Jonathan Clark on</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">the stability of the Object Browser. His reports of docking issues, crashes,</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">and the dreaded </span><span class="gmail-inline-code gmail-ng-star-inserted"><No Module></span><span class="gmail-ng-star-inserted"> error pointed to a deep architectural issue.</span></span></span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span><span class="gmail-ng-star-inserted">My initial approach to fix this was to make the Object Browser a global tool</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">managed directly by the </span><span class="gmail-inline-code gmail-ng-star-inserted">basctl::Shell</span><span class="gmail-ng-star-inserted">, using a </span><span class="gmail-inline-code gmail-ng-star-inserted">Splitter</span><span class="gmail-ng-star-inserted"> to manage the</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">layout. The premise was logical, but in practice, it was fighting the VCL</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">framework.</span></span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0" style="font-family:monospace"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">The experiment failed. The root cause was a fundamental conflict over layout</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">control. We had two "managers"—the persistent </span><span class="gmail-inline-code gmail-ng-star-inserted">Shell</span><span class="gmail-ng-star-inserted"> and the transient</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">ModulWindowLayout</span><span class="gmail-ng-star-inserted">—trying to control sibling windows. This created a race</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">condition that corrupted the IDE's state.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Here is a flowchart of the flawed experiment and what we learned from it:<br><br></span></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"></span></p><div class="gmail-syntax-highlighted-code"><pre><code><span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------------------------------------------+</span>
<span class="gmail-hljs-operator">|</span> The Flawed Experiment: Competing Layout Managers <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------------------------------------------+</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> basctl::Shell <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator"><</span><span class="gmail-hljs-comment">--- Manager #1 (Persistent) |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> (Owns ObjectBrowser) <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">------------+-------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> (Tries <span class="gmail-hljs-keyword">to</span> <span class="gmail-hljs-operator">|</span> (Owns Layout) <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> position OB) <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> v <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">------------------+ +-------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> ObjectBrowser <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> ModulWindowLayout <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator"><</span><span class="gmail-hljs-comment">--- Manager #2 (Transient)</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">------------------+ | (Owns ObjectCatalog) | |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">^</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-----------+-------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> (Tries <span class="gmail-hljs-keyword">to</span> <span class="gmail_default"> </span><span class="gmail-hljs-operator">|</span> (Positions Catalog) <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> position Catalog) <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> v <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-----------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">----------------> | ObjectCatalog | |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-----------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> LEARNING: <span class="gmail-hljs-keyword">Having</span> two managers <span class="gmail-hljs-keyword">for</span> sibling windows creates a <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> race condition. We were fighting the framework. This approach <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> was fundamentally unstable <span class="gmail-hljs-keyword">and</span> had <span class="gmail-hljs-keyword">to</span> be abandoned. <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------------------------------------------+</span></code>
<br><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">The lesson was clear: instead of fighting the framework, we must work with</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">it. I made the strategic decision to </span><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">revert the Splitter changes</span></span></strong><span class="gmail-ng-star-inserted">, go back</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">to a clean state, and pursue a simpler, more robust solution.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted"><font size="4">== The Solution: A Return to First Principles ==</font></span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">The new plan was to make the Object Browser a first-class citizen of the</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">ModulWindowLayout</span><span class="gmail-ng-star-inserted">, forcing it to follow the exact same lifecycle rules</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">as the stable, time-tested </span><span class="gmail-inline-code gmail-ng-star-inserted">ObjectCatalog</span><span class="gmail-ng-star-inserted">.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">This new architecture has a single, unambiguous line of control, which has</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">resolved all stability, docking, and state corruption issues.</span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><div class="gmail-syntax-highlighted-code"><pre><code><span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------------------------------------------+</span>
<span class="gmail-hljs-operator">|</span> The Stable Solution: A Single, Authoritative Layout Manager <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------------------------------------------+</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> basctl::Shell <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">------------+-------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> (Owns) v <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail_default"> </span>ModulWindowLayout <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator"><</span><span class="gmail-hljs-comment">--- The ONLY Manager</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">------------+------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> (Manages <span class="gmail-hljs-keyword">ALL</span> its children) <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-------------------+-------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail_default"> </span> <span class="gmail-hljs-operator">|</span> <span class="gmail_default"> </span><span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> v <span class="gmail_default"> </span>v <span class="gmail_default"> </span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------+ +-------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> ObjectCatalog <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail_default"> </span>ObjectBrowser <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------+ +-------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> LEARNING: <span class="gmail-hljs-keyword">By</span> giving <span class="gmail-hljs-keyword">one</span> Layout <span class="gmail-hljs-keyword">full</span> ownership <span class="gmail-hljs-keyword">and</span> control, the <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> component lifecycles <span class="gmail-hljs-keyword">are</span> synchronized. Docking <span class="gmail-hljs-keyword">and</span> other events <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-keyword">are</span> now handled correctly <span class="gmail-hljs-keyword">by</span> a single, authoritative system. <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">--------------------------------------------------------------------+</span></code>
</pre></div></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><p class="gmail-ng-star-inserted"><font size="4"><span style="font-family:tahoma,sans-serif"><span class="gmail-ng-star-inserted">== A Deeper Dive: Q&A on This Week's Architecture ==</span></span></font></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">For those who want the technical details, here is the code-validated proof</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">of the new architecture. The patchset is comprehensive, modifying over 20</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">files across the build system (</span><span class="gmail-inline-code gmail-ng-star-inserted">.mk</span><span class="gmail-ng-star-inserted">), UI definitions (</span><span class="gmail-inline-code gmail-ng-star-inserted">.ui</span><span class="gmail-ng-star-inserted">, </span><span class="gmail-inline-code gmail-ng-star-inserted">.xml</span><span class="gmail-ng-star-inserted">),</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">slot definitions (</span><span class="gmail-inline-code gmail-ng-star-inserted">.hrc</span><span class="gmail-ng-star-inserted">, </span><span class="gmail-inline-code gmail-ng-star-inserted">.sdi</span><span class="gmail-ng-star-inserted">), and core C++ logic (</span><span class="gmail-inline-code gmail-ng-star-inserted">.hxx</span><span class="gmail-ng-star-inserted">, </span><span class="gmail-inline-code gmail-ng-star-inserted">.cxx</span><span class="gmail-ng-star-inserted">).</span></span></p><p class="gmail-ng-star-inserted"><span><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Q1: How can we prove both components are managed by the same layout?</span></span></strong><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">A: The proof is in </span><span class="gmail-inline-code gmail-ng-star-inserted">basctl/source/basicide/baside2.cxx</span><span class="gmail-ng-star-inserted">. The method</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">ModulWindowLayout::OnFirstSize()</span><span class="gmail-ng-star-inserted"> is called once to set up child windows.</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">The </span><span class="gmail-inline-code gmail-ng-star-inserted">diff</span><span class="gmail-ng-star-inserted"> clearly shows both are added as left-side panels:</span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><pre><code><span class="gmail-hljs-comment"><i>// In ModulWindowLayout::OnFirstSize()</i></span>
<span class="gmail-hljs-built_in">void</span> ModulWindowLayout::<span class="gmail-hljs-function"><span class="gmail-hljs-title">OnFirstSize</span>(<span class="gmail-hljs-params">...</span>)</span>
{
AddToLeft(&rObjectCatalog, ...);
AddToLeft(GetShell()->GetObjectBrowser(), ...);
<span class="gmail-hljs-comment">// ...</span>
}</code></pre></span><br><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">This confirms they are siblings managed by the same engine, which is the</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">key to fixing the docking and stability bugs.</span></span></p><p class="gmail-ng-star-inserted"><span><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Q2: What are the </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">exact</span></span></span><span class="gmail-ng-star-inserted"> differences in UI management?</span></span></strong><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">A: This is a key architectural choice. While managed by the same layout,</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">their </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">ownership</span></span></span><span class="gmail-ng-star-inserted"> and </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">access patterns</span></span></span><span class="gmail-ng-star-inserted"> differ significantly.</span></span></p></span><br><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><pre><code>┌───────────┬──────────────────────────────────┬──────────────────────────────────┐
│ <b>Aspect</b> │ <b>Object Catalog (Legacy)</b> │ <b>Object Browser (<span class="gmail-hljs-keyword">New</span>)</b> │
├───────────┼──────────────────────────────────┼──────────────────────────────────┤
│ Ownership │ Owned directly <span class="gmail-hljs-keyword">by</span> the │ Owned <span class="gmail-hljs-keyword">by</span> `basctl::Shell` <span class="gmail-hljs-keyword">as</span> a │
│ │ `ModulWindowLayout`. │ `VclPtr` member. │
<font size="2">│ │ │ │</font>
│ Access │ Accessed <span class="gmail-hljs-keyword">as</span> a direct <span class="gmail-hljs-keyword">member</span> │ Accessed via a getter: │
│ │ reference: `rObjectCatalog`. │ `GetShell()<span class="gmail-hljs-operator">-</span><span class="gmail-hljs-operator">></span>GetObject<span class="gmail-hljs-operator">-</span>` │
│ │ │ `Browser()`. │
│ │ │ │
│ Coupling │ Tightly Coupled: The layout<span class="gmail-hljs-string">'s │ Loosely Coupled: The layout is │
│ │ constructor requires the catalog.│ a consumer of the Shell'</span>s │
│ │ │ service; it doesn<span class="gmail-hljs-string">'t own it. │
└───────────┴──────────────────────────────────┴──────────────────────────────────┘</span></code></pre></span><b><u>Code Proof of Difference:</u></b><br><br> <b>Catalog (Tightly Coupled):</b> basctl/source/inc/baside2.hxx shows the<br> layout requires the catalog in its constructor.</pre></div></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0" style="font-family:monospace"><pre><code><span class="gmail-hljs-comment"><span class="gmail_default"> </span><span class="gmail_default"> </span><i>// in ModulWindowLayout class</i></span>
<span class="gmail-hljs-keyword"><span class="gmail_default"> </span><span class="gmail_default"> </span>private</span>:
<span class="gmail_default"> </span> <span class="gmail_default"> </span>ObjectCatalog& rObjectCatalog; <span class="gmail-hljs-comment"><i>// Direct member reference</i></span>
<span class="gmail-hljs-keyword"><span class="gmail_default"> </span>pub<span class="gmail_default"></span>lic</span>:
<span class="gmail_default"> </span><span class="gmail_default"> </span>ModulWindowLayout (..., ObjectCatalog& rCat, ...);</code></pre></span><span class="gmail_default" style="font-family:monospace"> </span><span style="font-family:monospace"><b>Browser (Loosely Coupled):</b> basctl/source/inc/basidesh.hxx shows<br><span class="gmail_default"> </span>the Shell owns the browser pointer.</span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0" style="font-family:monospace"><pre><code><span class="gmail-hljs-comment"><span class="gmail_default"> </span><i>// in Shell class</i></span>
<span class="gmail-hljs-keyword"><span class="gmail_default"> </span>private</span>:
<span class="gmail_default"> </span> VclPtr<ObjectBrowser> m_pObjectBrowser; <span class="gmail-hljs-comment"><i>// Shell owns the browser</i></span>
<span class="gmail-hljs-keyword"><span class="gmail_default"> </span>public</span>:
<span class="gmail_default"> </span><span class="gmail-hljs-function">ObjectBrowser* <span class="gmail-hljs-title">GetObjectBrowser</span><span class="gmail-hljs-params">()</span> <span class="gmail-hljs-keyword">const</span></span>;</code></pre></span><span style="font-family:monospace">This loosely-coupled design allows us to integrate a major new feature<br>without changing the constructor of a complex, mature class<br>(ModulWindowLayout), which is a safer and more maintainable approach.<br><br><b>Q3: How do we know the live data connection is real?</b><br>A: The patch introduces idedataprovider.cxx. Its <u>GetTopLevelNodes()</u><br>function explicitly calls ScriptDocument::getAllScriptDocuments() and sets<br>up the "UNO APIs" root. The objectbrowser.cxx then calls this provider<br>in its <u>RefreshUI()</u> and <u>OnNodeExpand()</u> methods, proving the clear link<br>between the live UNO runtime and the UI.<br><br><font size="4">== Strategic Intel: The Long-Term Vision ==</font><br><br>This week, Jonathan's guidance ("we have to eventually get rid of the object<br>catalog") helped clarify the project's long-term vision. When combined with<br>the initial prompt from tdf#165785 ("Please note that this is different<br>from: Object catalog"), a clear, two-phase strategy emerges.<br><br>Think of it like building a new workshop next to an old shed:<br><br> <b>Phase 1 (GSoC - Coexistence)</b>: Build the new "workshop" (Object<br> Browser) and make it live stably alongside the old "shed"<br> (ObjectCatalog). Don't touch the old one, just build the new one right.<br><br> <b>Phase 2 (Post-GSoC - Replacement)</b>: Once the new workshop is fully<br> equipped and can do everything the old shed did (and more), we can<br> demolish the shed.<br><br>This means our goal for GSoC is not to replace the catalog, but to build<br>a superior tool that can replace it in the future.</span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span class="gmail-ng-star-inserted"><font size="4">== The Future: A Proposal fo</font></span><span class="gmail-ng-star-inserted"><font size="4">r a <span class="gmail_default">Better</span> UX<span class="gmail_default">?</span> </font></span><span class="gmail-ng-star-inserted"><font size="4">==</font></span></span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span><span class="gmail-ng-star-inserted">The lesson from our reverted Splitter experiment was that managing two</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">competing side panels is complex. This makes the proposal for a </span><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">unified,</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">tabbed UI</span></span></strong><span class="gmail-ng-star-inserted"> even more compelling. It <span class="gmail_default">could be a possible</span> solution for the</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">"coexistence" phase because it solves the layout problem by placing both</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">components in a single containe</span></span><span><span class="gmail-ng-star-inserted">r.<span class="gmail_default"> That is we do not have to select from View</span></span></span></span></p><p class="gmail-ng-star-inserted"><span style="font-family:monospace"><span class="gmail-ng-star-inserted"><b>Conceptual UI Mockup for Discussion:</b></span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><div class="gmail-syntax-highlighted-code"><pre><code><span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-------------------------------------------------+</span>
<span class="gmail-hljs-operator">|</span> [ Object Catalog ] [ Object Browser ] <span class="gmail-hljs-operator"><</span><span class="gmail-hljs-comment">--- Tabs |</span>
<span class="gmail-hljs-operator">+</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">=</span><span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-keyword">Left</span> Pane (Content <span class="gmail-hljs-keyword">of</span> the selected tab) <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">---------------------------------------------+ |</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> If "Object Catalog" <span class="gmail-hljs-keyword">is</span> active, this shows <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> the existing project navigation tree. <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> If "Object Browser" <span class="gmail-hljs-keyword">is</span> active, this shows <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span> our <span class="gmail-hljs-keyword">new</span>, powerful introspection UI. <span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">|</span>
<span class="gmail-hljs-operator">|</span> <span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">---------------------------------------------+ |</span>
<span class="gmail-hljs-operator">+</span><span class="gmail-hljs-comment">-------------------------------------------------+</span></code>
</pre></div></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Wh<span style="font-family:monospace">at are the community's thoughts on pursuing this tabbed design as the</span></span><span style="font-family:monospace"><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">next <span class="gmail_default">future </span>step<span class="gmail_default">. Do we need to do this</span>?</span></span></span></strong></span><p></p><span class="gmail-router-outlet-wrapper gmail-ng-tns-c1830241081-0"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted" style="font-family:monospace">This week was a <span class="gmail_default">test</span> of the idea that sometimes you have to build</span><span style="font-family:monospace"><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">something, see it fail, and understand </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">why</span></span></span><span class="gmail-ng-star-inserted"> it failed to find a truly</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">robust solution. I'm excited to finally move forward on populating the rest</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">of the browser with rich data.</span></span></span></p></span></div><div><br></div><div><span style="font-family:monospace"><b><br></b></span></div><div><div class="gmail_default"><b style="font-family:monospace">I have also added a txt file in case the diagrams format went off direction.</b></div><span style="font-family:monospace"><b><br></b></span></div><div><br></div><div><div><span style="font-family:monospace"><b>W<span class="gmail_default">eek 1 mail -</span></b></span></div><div><span style="font-family:monospace"><a href="https://lists.freedesktop.org/archives/libreoffice/2025-May/093264.html" target="_blank">https://lists.freedesktop.org/archives/libreoffice/2025-May/093264.html</a></span></div><div><span style="font-family:monospace"><br></span></div><div><div class="gmail_default"><span style="font-family:monospace"><b>Week 2 and 3 mail -</b></span></div><div class="gmail_default"><span style="font-family:monospace"><a href="https://lists.freedesktop.org/archives/libreoffice/2025-June/093362.html" target="_blank">https://lists.freedesktop.org/archives/libreoffice/2025-June/093362.html</a></span></div><div class="gmail_default"><span style="font-family:monospace"><br></span></div><div class="gmail_default"><span style="font-family:monospace"><b>Week 4 mail(Thread) -</b></span></div><span style="font-family:monospace"><a href="https://lists.freedesktop.org/archives/libreoffice/2025-June/093392.html" target="_blank">https://lists.freedesktop.org/archives/libreoffice/2025-June/093392.html</a><br><br></span></div><div><b><span class="gmail_default" style="font-family:monospace">Week 5 mail -</span></b></div><div><span style="font-family:monospace"><a href="https://lists.freedesktop.org/archives/libreoffice/2025-June/093443.html">https://lists.freedesktop.org/archives/libreoffice/2025-June/093443.html</a></span></div><br clear="all"></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><span style="font-family:monospace"><b>Regards,</b></span></div><div><span style="font-family:monospace;color:rgb(153,0,255)"><b>Devansh</b></span><br></div></div></div></div>