private static void doWaitForTree(GTree gTree) {

		waitForSwing();
		boolean didWait = false;
		int waitTime = 0;
		while (gTree.isBusy()) {
			didWait = true;
			waitTime += sleep(DEFAULT_WAIT_DELAY);

			if (waitTime >= DEFAULT_WAIT_TIMEOUT) {
				createStackTraceForAllThreads(); // this may help debug indecent table models
				throw new AssertException("Timed out waiting for tree to load");
			}
		}
		waitForSwing();

		if (didWait) {
			// The logic here is that if we ever had to wait for the tree, then some other events
			// may have been buffered while we were allowing the work to happen.  Just to be sure
			// that there are no buffered actions, lets try to wait again.  If things are really
			// settled down, then the extra call to wait should not have any effect.  This 'try
			// again' approach is an effort to catch update calls that can be schedule by actions
			// from the Swing thread, which the test thread does not handle flawlessly.
			waitForTree(gTree);
		}
	}
Returns a pretty-print string of all found windows that are showing, nesting by
parent-child relationship.

@return the result string
Ghidra/Framework/Docking/src/main/java/docking/test/AbstractDockingTest.java