void undo() {
		if (undoStack.isEmpty()) {
			return;
		}

		endOutstandingStyleEdits();

		UndoableEdit item = undoStack.pop();
		redoStack.push(item);
		item.undo();

		// (see header note)
		if (item instanceof StyleCompoundEdit) {
			undo(); // call again to get a 'real' edit
		}
	}
Handles tracking undo and redo events.   Clients may wish to hold on to this class in order
to clear the undo/redo queue.

<p><b><u>Style Edits</u></b><br>
{@link JTextPane}s allow for styles (color, bold, etc) to be applied to their text.  The
default undo/redo events may arrive singly, not in bulk.   Thus, when the user presses undo, 
each style change is undo, one at a time.   This is intuitive when the user controls the 
application of style.  However, when style is applied programmatically, it can be odd to 
see that the user-type text does not change, but just the coloring applied to that text.
<p>
To address this issue, this class takes the approach of combining all style edits into a 
single bulk edit.  Then, as the user presses undo, all style edits can be removed together, as
well as any neighboring text edits.   <b>Put simply, this class tracks style edits such 
that an undo operation will undo all style changes, as well as a single text edit.</b>
Ghidra/Framework/Docking/src/main/java/docking/UndoRedoKeeper.java