public static void showUnmodifiableArchiveErrorMessage(Component parent, String title,
			DataTypeManager dtm) {
		String msg;
		if (dtm instanceof ProgramBasedDataTypeManager) {
			msg = "The Program is not modifiable!\n";
		}
		else if (dtm instanceof FileArchiveBasedDataTypeManager) {
			msg = "The archive file is not modifiable!\nYou must open the archive for editing\n" +
				"before performing this operation.\n" + dtm.getName();
		}
		else if (dtm instanceof ProjectArchiveBasedDataTypeManager) {
			ProjectArchiveBasedDataTypeManager projectDtm =
				(ProjectArchiveBasedDataTypeManager) dtm;
			if (!projectDtm.isUpdatable() && !projectDtm.getDomainFile().canCheckout()) {
				msg = "The project archive is not modifiable!\n" + dtm.getName();
			}
			else {
				msg = "The project archive is not modifiable!\nYou must check out the archive\n" +
					"before performing this operation.\n" + dtm.getName();
			}
		}
		else {
			msg = "The Archive is not modifiable!\n";
		}
		Msg.showInfo(DataTypeUtils.class, parent, title, msg);
	}
Create a copy of the chain of data types that eventually lead to a named
data type.
<p>
Returns a {@link DataType#copy(DataTypeManager) copy()} of the first named data type found
in the pointer / array type chain, and returns an identical chain of pointer / arrays up to
the copied named type.

@param dataType data type to be copied
@param dtm data type manager
@return deep copy of dataType
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java