@Override
	public void dataTypeChanged(DataTypeManager dtm, DataTypePath path) {
		try {

			if (dtm != originalDTM) {
				throw new AssertException("Listener only supports original DTM");
			}

			if (!isLoaded()) {
				return;
			}

			// If we don't currently have any modifications that need applying and
			// the structure in the editor just changed, then show the changed
			// structure.
			if (path.equals(originalDataTypePath)) {
				if (consideringReplacedDataType) {
					return;
				}
				// Return if the original is already changing. Need this since there
				// can be multiple change notifications from a single data type update
				// event due to replaceWith(), setLastChangeTime() and
				// setLastChangeTimeInSource() each firing dataTypeChanged().
				if (originalIsChanging) {
					return;
				}
				originalIsChanging = true;
				try {
					if (hasChanges) {
						provider.show();
						String message = "<html>" +
							HTMLUtilities.escapeHTML(originalDataTypePath.getDataTypeName()) +
							" has changed outside the editor.<br>" +
							"Discard edits and reload the " + getTypeName() + "?";
						String title = "Reload " + getTypeName() + " Editor?";
						int response = OptionDialog.showYesNoDialogWithNoAsDefaultButton(
							provider.getComponent(), title, message);
						if (response == OptionDialog.OPTION_ONE) {
							load(getOriginalComposite());
						}
					}
					else {
						Composite changedComposite = getOriginalComposite();
						if ((changedComposite != null) &&
							!viewComposite.isEquivalent(changedComposite)) {
							load(getOriginalComposite());
							setStatus(viewComposite.getPathName() + " changed outside the editor.",
								false);
						}
					}
				}
				finally {
					originalIsChanging = false;
				}
			}
			else {
				// NOTE: There is the risk of a cascade of change notifications resulting in multiple
				// undo transactions for the viewDTM.  An editor save could generate quite a few with
				// potentially many types getting changed by one change.
				DataType changedDt = originalDTM.getDataType(path);
				if (!(changedDt instanceof DatabaseObject)) {
					return;
				}
				DataType viewDt =
					viewDTM.findMyDataTypeFromOriginalID(originalDTM.getID(changedDt));
				if (viewDt == null) {
					return;
				}
				try {
					viewDTM.withTransaction("Changed " + path, () -> {
						viewDTM.clearUndoOnChange();
						viewDTM.replaceDataType(viewDt, changedDt, true);
					});
				}
				catch (DataTypeDependencyException e) {
					throw new AssertException(e);
				}

				// Clear undo/redo stack to avoid inconsistency with originalDTM
				viewDTM.clearUndo();

				fireTableDataChanged();
				componentDataChanged();
			}
		}
		catch (ConcurrentModificationException e) {
			// do nothing, the delete will fix things later
		}
	}
Returns whether the selected component(s) can be moved down (to the next higher index).
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java