Errors in saved xml files

I am saving my docking layout to an XML file and reading it in with

((CControl)dockControl).getResources().readXML(layout);

For the most part this works perfectly. However, once in a while i get an erroneous dockable in my layout. I have noticed that when this happens i get the following in my XML file:

<child>
	<layout factory="delegate_DefaultDockableFactory"/>
	<children ignore="false"/>
</child>

If i remove those “empty” child nodes, then the erroneous dockables go away. Can someone tell me how to avoid getting these? I have not yet discovered a repeatable way to get them. And if not, any suggestion on how to remove them programmatically would be appreciated. I can always remove them from the XML programmatically just before reading in the file, but that just seems ugly.

  1. CControl already has a method „readXML“, no need to call „getResources“ :slight_smile:
  2. I have to think about the empty Dockable. But you might want to check, that no „new DefaultDockableFactory“ is written anywhere in your code. I’ll write again once I did some testing for myself.

A factory whose name starts with “delegate_” is a “backup factory”, they are mostly generated automatically. “DefaultDockableFactory” especially is one of the default backup factories that are always present.

  • Properly wired CDockables are not linked to the DefaultDockableFactory. However when they are not registered at a CControl they might present a link to the DefaultDockableFactory. You could find out if this happens by setting a breakpoint in “DefaultMultipleCDockable.setControlAccess”. If this method is called with “null” as an argument, does the layout get corrupted afterwards?

  • Maybe it is a multi threading issue? Can you be certain that any reading or writing of the layout (and all other interactions with the framework) is only done in the EDT (the UI-thread)?

  • Maybe you have some piece of code that stores the layout while a Dockable is modified? This could happen if you have a listener like a “CControlListener” that stores the layout. While the listener is executed the framework might be in a state that is not 100% legal.

For now these are all the ideas I have. Let me know if anything helps (or not). Knowing more about your application would also be nice, because right now I cannot reproduce this bug.

I have set a breakpoint in DefaultMultipleCDockable. If i catch something i will let you know. I have a feeling that it might have to do with an exception getting thrown during my “creation” cycle. Meaning that a panel is being setup and before it gets added to the CControl an exception happens. At this point the dockable would still exist but would not be properly registered. So if that happens, what is the correct course of action. Is there some sort of “dispose” method i should be calling against it?

On another note, assuming i am not able to find the culprit, can you think of any good way to find these things after i load my layout? So that i can somehow kill them before the UI gets stood up? When i look in the CControl with the debugger i don’t see any sign of them.

One of the methods of „CControl“ like „removeDockable“ would be the closest thing to a dispose method.

Not having exception would probably be good too :wink:

Could you please send me an entire xml file of a corrupted layout? It might give me more ideas on what could be going wrong (don’t get your hopes up).

As for fixing a layout. Just updating the xml is fine for me, but DockingFrames offers some methods to read and modify the file too. The example below only works with version 1.1.2_19d, which I uploaded a few minutes ago. (Yes, I did find a nasty bug when trying to write the example).
The application makes use of the „perspective“ API, which is just a wrapper around the content read from the XML file.

    public static void main( String[] args ) throws IOException {
        // buildFile();

        EventQueue.invokeLater( () -> {
            try {
                // setup the CControl and other stuff
                JFrame frame = new JFrame();
                CControl control = new CControl( frame );
                control.setMissingStrategy( MissingCDockableStrategy.STORE );

                frame.add( control.getContentArea() );

                DefaultSingleCDockable da = new DefaultSingleCDockable( "Aaa" );
                control.addDockable( da );

                DefaultSingleCDockable db = new DefaultSingleCDockable( "Bbb" );
                control.addDockable( db );

                DefaultSingleCDockable dc = new DefaultSingleCDockable( "Ccc" );
                control.addDockable( dc );

                // we read a corrupted layout from "test.xml" and write the cleaned version back to "out.xml"
                try( FileReader in = new FileReader( new File( "test.xml" ) );
                        FileWriter out = new FileWriter( new File( "out.xml" ) ) ) {
                    
                    XElement input = XIO.read( in );
                    
                    // loading the data without affecting the CControl.
                    CControlPerspectiveBlop perspectives = control.getPerspectives().readAllXML( input );

                    // represents the layout that was shown when the file was stored 
                    CPerspective perspective = perspectives.getPerspective();

                    // iterate over all elements, find the corrupted entries
                    Iterator<PerspectiveElement> elements = perspective.elements();
                    while( elements.hasNext() ) {
                        PerspectiveElement next = elements.next();
                        // all instances of DefaultDockablePerspective are corrupted entries
                        if( next instanceof DefaultDockablePerspective ) {
                            // removing them from their parent will delete them from the layout
                            DefaultDockablePerspective evil = (DefaultDockablePerspective) next;
                            evil.getParent().remove( evil );
                        }
                    }
                    
                    // apply the fixed perspective
                    perspectives.setPerspective( perspective );
                    
                    // write the settings back to some xml file
                    XElement output = new XElement( input.getName() );
                    perspectives.writeXML( output );
                    XIO.write( output, out );
                }

                frame.setBounds( 20, 20, 800, 800 );
                frame.setVisible( true );
                control.readXML( new File( "out.xml" ) );
                // control.readXML( new File( "test.xml" ) );
            } catch( IOException e ) {
                throw new RuntimeException( e );
            }
        } );

    }
1 „Gefällt mir“

Here you go:

<?xml version='1.0'?>
<!-- delegate_DefaultDockableFactory seems to be a bad tag -->
<config>
	<resources>
		<resource name="dock.ui.ThemeMap">
			<key>eclipse</key>
		</resource>
		<resource name="ccontrol.frontend">
			<frontend>
				<current>
					<base>
						<roots>
							<root name="external">
								<layout factory="predefined">
									<replacement id="rootexternal"/>
									<delegate id="delegate_CommonDockStationFactory">
										<root>true</root>
										<content delegate="screen dock">
											<placeholders>
												<version>0</version>
												<format>dock.PlaceholderList</format>
											</placeholders>
										</content>
									</delegate>
								</layout>
								<adjacent>
									<layout factory="dock.RootStationAdjacentFactory">
										<type>dock.CExternalizeArea</type>
									</layout>
								</adjacent>
								<children ignore="false"/>
							</root>
							<root name="east">
								<layout factory="predefined">
									<replacement id="rooteast"/>
									<delegate id="delegate_CommonDockStationFactory">
										<root>true</root>
										<content delegate="flap dock">
											<window auto="true" direction="WEST"/>
											<placeholders>
												<version>0</version>
												<format>dock.PlaceholderList</format>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\22\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">225</item>
													<item key="dock.index" type="i">0</item>
													<item key="dock.id" type="i">0</item>
													<item key="dock.placeholder" type="s">dock.multi.\22\ dockables</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\7\ dockables</placeholder>
														<placeholder>dock.multi.\19\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">200</item>
													<item key="dock.index" type="i">1</item>
													<item key="dock.id" type="i">1</item>
													<item key="dock.placeholder" type="s">dock.multi.\19\ dockables</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\21\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">258</item>
													<item key="dock.index" type="i">2</item>
													<item key="dock.id" type="i">2</item>
													<item key="dock.placeholder" type="s">dock.multi.\21\ dockables</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\2\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">164</item>
													<item key="dock.index" type="i">3</item>
													<item key="dock.id" type="i">3</item>
													<item key="dock.placeholder" type="s">dock.multi.\2\ dockables</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
											</placeholders>
										</content>
									</delegate>
								</layout>
								<adjacent>
									<layout factory="dock.RootStationAdjacentFactory">
										<type>dock.CMinimizeArea</type>
									</layout>
								</adjacent>
								<children ignore="false">
									<child>
										<layout factory="delegate_dockables" placeholder="dock.multi.\22\ dockables">
											<id>22 dockables</id>
											<multiple>
												<dockableId>gov.raptor.core.view.gui.propertiespanel.PropertiesPanel</dockableId>
											</multiple>
										</layout>
										<children ignore="false"/>
									</child>
									<child>
										<layout factory="delegate_dockables" placeholder="dock.multi.\19\ dockables">
											<id>19 dockables</id>
											<multiple>
												<dockableId>gov.raptor.core.view.gui.eventlog.EventLogPanel</dockableId>
											</multiple>
										</layout>
										<children ignore="false"/>
									</child>
									<child>
										<layout factory="delegate_dockables" placeholder="dock.multi.\21\ dockables">
											<id>21 dockables</id>
											<multiple>
												<dockableId>gov.raptor.core.view.gui.mapobjectmanager.AlarmsManagerPanel</dockableId>
											</multiple>
										</layout>
										<children ignore="false"/>
									</child>
									<child>
										<layout factory="delegate_dockables" placeholder="dock.multi.\2\ dockables">
											<id>2 dockables</id>
											<multiple>
												<dockableId>3e85c645-9e60-40c8-b8cd-f1d99bc403f6</dockableId>
											</multiple>
										</layout>
										<children ignore="false"/>
									</child>
								</children>
							</root>
							<root name="south">
								<layout factory="predefined">
									<replacement id="rootsouth"/>
									<delegate id="delegate_CommonDockStationFactory">
										<root>true</root>
										<content delegate="flap dock">
											<window auto="true" direction="NORTH"/>
											<placeholders>
												<version>0</version>
												<format>dock.PlaceholderList</format>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\7\ dockables</placeholder>
														<placeholder>dock.multi.\2\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">100</item>
													<item key="dock.index" type="i">0</item>
													<item key="dock.id" type="i">0</item>
													<item key="dock.placeholder" type="s">dock.multi.\7\ dockables</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\8\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">120</item>
													<item key="dock.index" type="i">1</item>
													<item key="dock.id" type="i">1</item>
													<item key="dock.placeholder" type="s">dock.multi.\8\ dockables</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
											</placeholders>
										</content>
									</delegate>
								</layout>
								<adjacent>
									<layout factory="dock.RootStationAdjacentFactory">
										<type>dock.CMinimizeArea</type>
									</layout>
								</adjacent>
								<children ignore="false">
									<child>
										<layout factory="delegate_dockables" placeholder="dock.multi.\7\ dockables">
											<id>7 dockables</id>
											<multiple>
												<dockableId>gov.raptor.core.systemmessage.SystemMessagesView</dockableId>
											</multiple>
										</layout>
										<children ignore="false"/>
									</child>
									<child>
										<layout factory="delegate_dockables" placeholder="dock.multi.\8\ dockables">
											<id>8 dockables</id>
											<multiple>
												<dockableId>gov.raptor.core.playback.ui.PlaybackView</dockableId>
											</multiple>
										</layout>
										<children ignore="false"/>
									</child>
								</children>
							</root>
							<root name="center">
								<layout factory="predefined" placeholder="dock.single.center">
									<replacement id="rootcenter"/>
									<delegate id="delegate_CommonDockStationFactory">
										<id>center</id>
										<root>true</root>
										<content delegate="SplitDockStationFactory">
											<fullscreen-action>false</fullscreen-action>
											<node nodeId="1499117442651" orientation="HORIZONTAL" divider="0.11299126637554585">
												<leaf id="-1" nodeId="1499117442647">
													<placeholders>
														<placeholder>dock.multi.\2\ dockables</placeholder>
													</placeholders>
												</leaf>
												<node nodeId="1499117607587" orientation="HORIZONTAL" divider="0.14792576419213974">
													<leaf id="-1" nodeId="1499117607585">
														<placeholders>
															<placeholder>dock.multi.\3\ dockables</placeholder>
														</placeholders>
													</leaf>
													<node nodeId="1506970082651" orientation="HORIZONTAL" divider="0.1588557516737675">
														<leaf id="-1" nodeId="1506970082649">
															<placeholders>
																<placeholder>dock.multi.\19\ dockables</placeholder>
																<placeholder>dock.multi.\9\ dockables</placeholder>
															</placeholders>
														</leaf>
														<node nodeId="1506970984860" orientation="HORIZONTAL" divider="0.5">
															<leaf id="0" nodeId="1499117400980">
																<placeholders>
																	<placeholder>dock.multi.\0\ globes</placeholder>
																	<placeholder>dock.multi.\13\ dockables</placeholder>
																	<placeholder>dock.multi.\23\ dockables</placeholder>
																	<placeholder>dock.multi.\16\ dockables</placeholder>
																	<placeholder>dock.multi.\0\ dockables</placeholder>
																</placeholders>
																<placeholder-map>
																	<version>0</version>
																	<format>dock.PlaceholderList</format>
																	<entry>
																		<key shared="false">
																			<placeholder>dock.multi.\0\ globes</placeholder>
																		</key>
																		<item key="convert" type="b">true</item>
																		<item key="convert-keys" type="a"/>
																	</entry>
																</placeholder-map>
															</leaf>
															<leaf id="-1" nodeId="1506970984858">
																<placeholders>
																	<placeholder>dock.multi.\5\ dockables</placeholder>
																</placeholders>
															</leaf>
														</node>
													</node>
												</node>
											</node>
										</content>
									</delegate>
								</layout>
								<adjacent>
									<layout factory="dock.RootStationAdjacentFactory">
										<type>dock.CGridArea</type>
									</layout>
								</adjacent>
								<children ignore="false">
									<child>
										<layout factory="delegate_StackDockStationFactory">
											<selected>0</selected>
											<placeholders>
												<version>0</version>
												<format>dock.PlaceholderList</format>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\0\ globes</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
													</item>
													<item key="dock.index" type="i">0</item>
													<item key="dock.id" type="i">0</item>
													<item key="dock.placeholder" type="s">dock.multi.\0\ globes</item>
												</entry>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\23\ dockables</placeholder>
													</key>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">placeholder</item>
													</item>
													<item key="dock.index" type="i">1</item>
													<item key="dock.id" type="i">1</item>
													<item key="dock.placeholder" type="s">dock.multi.\23\ dockables</item>
												</entry>
											</placeholders>
										</layout>
										<children ignore="false">
											<child>
												<layout factory="delegate_globes" placeholder="dock.multi.\0\ globes">
													<id>0 globes</id>
													<multiple>
														<globeId>1</globeId>
														<description>Camera Eye</description>
														<owner>User</owner>
														<latitude>37.99999999999999</latitude>
														<longitude>-105.00000000000006</longitude>
														<elevation>0.0</elevation>
														<heading>0.0</heading>
														<pitch>0.0</pitch>
														<zoom>1.907E7</zoom>
													</multiple>
												</layout>
												<children ignore="false"/>
											</child>
											<child>
												<layout factory="delegate_dockables" placeholder="dock.multi.\23\ dockables">
													<id>23 dockables</id>
													<multiple>
														<dockableId>Seraph Target App UI - 42</dockableId>
													</multiple>
												</layout>
												<children ignore="false"/>
											</child>
										</children>
									</child>
								</children>
							</root>
							<root name="west">
								<layout factory="predefined">
									<replacement id="rootwest"/>
									<delegate id="delegate_CommonDockStationFactory">
										<root>true</root>
										<content delegate="flap dock">
											<window auto="true" direction="EAST"/>
											<placeholders>
												<version>0</version>
												<format>dock.PlaceholderList</format>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\7\ dockables</placeholder>
													</key>
												</entry>
												<entry>
													<key shared="false"/>
													<item key="convert" type="b">true</item>
													<item key="convert-keys" type="a">
														<item type="s">size</item>
														<item type="s">index</item>
														<item type="s">id</item>
														<item type="s">hold</item>
													</item>
													<item key="dock.size" type="i">271</item>
													<item key="dock.index" type="i">0</item>
													<item key="dock.id" type="i">0</item>
													<item key="dock.hold" type="b">false</item>
												</entry>
												<entry>
													<key shared="false">
														<placeholder>dock.multi.\8\ dockables</placeholder>
													</key>
												</entry>
											</placeholders>
										</content>
									</delegate>
								</layout>
								<adjacent>
									<layout factory="dock.RootStationAdjacentFactory">
										<type>dock.CMinimizeArea</type>
									</layout>
								</adjacent>
								<children ignore="false">
									<child>
										<layout factory="delegate_DefaultDockableFactory"/>
										<children ignore="false"/>
									</child>
								</children>
							</root>
						</roots>
						<children/>
					</base>
					<modes>
						<dockables>
							<entry id="multi 8 dockables" current="dock.mode.minimized">
								<history>
									<mode>dock.mode.minimized</mode>
								</history>
								<properties>
									<property id="dock.mode.minimized">
										<mode>dock.mode.minimized</mode>
										<root>south</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="flap dock">
												<index>3</index>
												<holding>false</holding>
												<size>120</size>
												<placeholder>dock.multi.\8\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 21 dockables" current="dock.mode.minimized">
								<history>
									<mode>dock.mode.minimized</mode>
								</history>
								<properties>
									<property id="dock.mode.minimized">
										<mode>dock.mode.minimized</mode>
										<root>east</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="flap dock">
												<index>4</index>
												<holding>false</holding>
												<size>258</size>
												<placeholder>dock.multi.\21\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 0 globes" current="dock.mode.normal">
								<history>
									<mode>dock.mode.normal</mode>
								</history>
								<properties>
									<property id="dock.mode.normal">
										<mode>dock.mode.normal</mode>
										<root>center</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="SplitDockPlaceholderProperty">
												<placeholder>dock.multi.\0\ globes</placeholder>
												<backup-path>
													<node location="RIGHT" size="0.8870087336244541" id="1499117442651"/>
													<node location="RIGHT" size="0.8520742358078602" id="1499117607587"/>
													<leaf id="1499117400980"/>
												</backup-path>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 7 dockables" current="dock.mode.minimized">
								<history>
									<mode>dock.mode.minimized</mode>
								</history>
								<properties>
									<property id="dock.mode.minimized">
										<mode>dock.mode.minimized</mode>
										<root>east</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="flap dock">
												<index>1</index>
												<holding>false</holding>
												<size>200</size>
												<placeholder>dock.multi.\7\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 2 dockables" current="dock.mode.minimized">
								<history>
									<mode>dock.mode.minimized</mode>
								</history>
								<properties>
									<property id="dock.mode.minimized">
										<mode>dock.mode.minimized</mode>
										<root>south</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="flap dock">
												<index>0</index>
												<holding>false</holding>
												<size>100</size>
												<placeholder>dock.multi.\2\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 23 dockables" current="dock.mode.normal">
								<history>
									<mode>dock.mode.normal</mode>
								</history>
								<properties>
									<property id="dock.mode.normal">
										<mode>dock.mode.normal</mode>
										<root>center</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="SplitDockPlaceholderProperty">
												<placeholder>dock.multi.\23\ dockables</placeholder>
												<backup-path>
													<leaf id="1506971378593"/>
												</backup-path>
											</property>
											<property factory="StackDockPropertyFactory">
												<index>1</index>
												<placeholder>dock.multi.\23\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 22 dockables" current="dock.mode.minimized">
								<history>
									<mode>dock.mode.minimized</mode>
								</history>
								<properties>
									<property id="dock.mode.minimized">
										<mode>dock.mode.minimized</mode>
										<root>east</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="flap dock">
												<index>5</index>
												<holding>false</holding>
												<size>225</size>
												<placeholder>dock.multi.\22\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
							<entry id="multi 19 dockables" current="dock.mode.minimized">
								<history>
									<mode>dock.mode.minimized</mode>
								</history>
								<properties>
									<property id="dock.mode.minimized">
										<mode>dock.mode.minimized</mode>
										<root>east</root>
										<applicationDefined>false</applicationDefined>
										<location>
											<property factory="flap dock">
												<index>2</index>
												<holding>false</holding>
												<size>200</size>
												<placeholder>dock.multi.\19\ dockables</placeholder>
											</property>
										</location>
									</property>
								</properties>
							</entry>
						</dockables>
						<modes>
							<entry id="dock.mode.maximized"/>
						</modes>
					</modes>
				</current>
			</frontend>
		</resource>
		<resource name="ccontrol.preferences"/>
	</resources>
	<closed>
		<panel dockableId="gov.raptor.core.view.gui.ContextSearchPanel"/>
		<panel dockableId="gov.raptor.core.view.gui.files.FileTransferPanel"/>
		<panel dockableId="gov.raptor.core.view.gui.r2d2.R2D2Panel"/>
		<panel dockableId="gov.raptor.core.view.gui.DevicesPanel"/>
		<panel dockableId="Position Converter"/>
		<panel dockableId="DF Preferences App Panel"/>
		<panel dockableId="gov.raptor.core.view.gui.files.FilesPanel"/>
		<panel dockableId="Seraph Emitter App Panel"/>
		<panel dockableId="DF Control App Panel"/>
		<panel dockableId="gov.raptor.core.view.gui.connections.ConnectionsPanel"/>
		<panel dockableId="gov.raptor.core.view.gui.apps.AppsPanel"/>
		<panel dockableId="CDMA Channel Hash Functions"/>
		<panel dockableId="BSID Calculator"/>
		<panel dockableId="gov.raptor.core.view.gui.explorer.view.MainExplorerPanel"/>
		<panel dockableId="gov.raptor.core.view.gui.IconPanel"/>
		<panel dockableId="gov.raptor.core.view.gui.layers.viewmanager.LayerViewPanel"/>
		<panel dockableId="gov.raptor.core.media.gui.MediaExplorerPanel"/>
	</closed>
</config>

Did not help much. Well it tells that the empty Dockable was properly added to a parent station - but that does not help at all.

I was not able to reproduce the issue, but I have an idea how we could find more information. We catch the offending Dockable that causes all the issues by stopping the application at the moment when the DefaultDockableFactory is accessed.

There are two places where we might find that object:

  1. Add a breakpoint to DefaultDockableFactory.getLayout, it should get the offender as the first argument.

– or –

  1. Add a breakpoint to “DockSituation.getFactory”. Make it a conditional breakpoint, that stops if the “id” contains “DefaultDockableFactory”
  2. If the breakpoint is hit, head up the stacktrace until you find the “DockElement” from which the id was read. Usually that’s only one or two steps.

What kind of Dockable is that “DockElement”. Is it really a DefaultDockable? Is it a subclass? Is it one of yours? Is it a “CommonDockable” and does it point to a an “AbstractCDockable” with the field “control” set?