List<ComponentPlaceholder> restoreFromXML(Element rootNodeElement) {
		invalid = true;
		detachChild();
		setLastFocusedProviderInWindow(null);   // clear out stale last focused provider
		List<DetachedWindowNode> copy = new ArrayList<>(detachedWindows);
		detachedWindows.clear();
		for (DetachedWindowNode windowNode : copy) {
			notifyWindowRemoved(windowNode);
			windowNode.disconnect();
		}

		int x = Integer.parseInt(rootNodeElement.getAttributeValue("X_POS"));
		int y = Integer.parseInt(rootNodeElement.getAttributeValue("Y_POS"));
		int width = Integer.parseInt(rootNodeElement.getAttributeValue("WIDTH"));
		int height = Integer.parseInt(rootNodeElement.getAttributeValue("HEIGHT"));
		int extendedState = Integer.parseInt(rootNodeElement.getAttributeValue("EX_STATE"));
		JFrame frame = windowWrapper.getParentFrame();
		Rectangle bounds = new Rectangle(x, y, width, height);
		WindowUtilities.ensureOnScreen(frame, bounds);
		frame.setBounds(bounds);
		windowWrapper.setLastBounds(bounds);

		Swing.runLater(() -> {
			// On some systems setting the bounds will interfere with setting the extended state. 
			// Run this later to ensure the extended state is applied after setting the bounds.  
			// Executing in this order allows the bounds we set above to be used when the user
			// transitions out of the maximized state.
			frame.setExtendedState(extendedState);
		});

		List<ComponentPlaceholder> restoredPlaceholders = new ArrayList<>();
		Iterator<?> elementIterator = rootNodeElement.getChildren().iterator();
		while (elementIterator.hasNext()) {
			Element elem = (Element) elementIterator.next();

			if (elem.getName().equals("WINDOW_NODE")) {
				Node node = new DetachedWindowNode(elem, winMgr, this, dropTargetFactory,
					restoredPlaceholders);
				DetachedWindowNode windowNode = (DetachedWindowNode) node;
				detachedWindows.add(windowNode);
				notifyWindowAdded(windowNode);
			}
			else {
				child = processChildElement(elem, winMgr, this, restoredPlaceholders);
			}
		}

		return restoredPlaceholders;
	}
Restores the component hierarchy from the given XML JDOM element.
<p>
The process of restoring from xml will create new {@link ComponentPlaceholder}s that will be
used to replace any existing matching placeholders.  This allows the already loaded default
placeholders to be replaced by the previously saved configuration.

@param rootNodeElement the XML from which to restore the state.
@return the newly created placeholders
Ghidra/Framework/Docking/src/main/java/docking/RootNode.java