private void showConflictPanel(final ListingMergePanel listingPanel, final int conflictType,
			final int choice, final String conflictTypeText) throws CancelledException {

		try {
			final ChangeListener changeListener = new ChangeListener() {
				@Override
				public void stateChanged(ChangeEvent e) {
					clearResolveInfo();
					int chosenConflictOption = SymbolMerger.this.conflictPanel.getSelectedOptions();
					if (chosenConflictOption == ASK_USER) {
						if (mergeManager != null) {
							mergeManager.setApplyEnabled(false);
						}
						return;
					}
					if (mergeManager != null) {
						mergeManager.clearStatusText();
					}
					try {
						mergeConflict(conflictType, chosenConflictOption);
						if (mergeManager != null) {
							mergeManager.setApplyEnabled(true);
						}
					}
					catch (Exception e1) {
						String msg = "Failed to resolve symbol '" +
							((currentSymbol != null) ? currentSymbol.getName(true) : "") + "'.";
						Msg.showError(this, null, "Resolve Symbol Error", msg, e1);
					}
					showResolveInfo();
				}
			};
			SwingUtilities.invokeAndWait(new Runnable() {
				@Override
				public void run() {
					getConflictPanel(conflictType, changeListener);
					if (conflictPanel != null) {
						listingPanel.setBottomComponent(conflictPanel);
					}
					else {
						listingPanel.setBottomComponent(emptyConflictPanel);
					}
				}
			});
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					listingPanel.clearAllBackgrounds();
					if (SymbolMerger.this.currentBackgroundSet != null) {
						listingPanel.paintAllBackgrounds(SymbolMerger.this.currentBackgroundSet);
					}
				}
			});
		}
		catch (InterruptedException e) {
			Msg.error(this, "Couldn't display Symbol Merger conflict panel. " + e.getMessage());
			return;
		}
		catch (InvocationTargetException e) {
			Msg.error(this, "Couldn't display Symbol Merger conflict panel. " + e.getMessage());
			return;
		}
		if (listingMergePanel != null) {
			conflictInfoPanel.setConflictInfo(conflictNum, totalConflicts);
		}
		if (mergeManager != null) {
			if (conflictPanel == null) {
				// conflict no longer exists.
				return;
			}
			mergeManager.setApplyEnabled(false);

			boolean useForAll = (choice != ASK_USER);
			conflictPanel.setUseForAll(useForAll);
			conflictPanel.setConflictType(conflictTypeText);

			mergeManager.showListingMergePanel(currentAddress);
		}
		// block until the user either cancels or hits the "Apply" button
		// on the merge dialog...
		// when the "Apply" button is hit, get the user's selection
		// and continue.

		conflictOption = conflictPanel.getSelectedOptions();
		if (conflictOption == CANCELED) {
			throw new CancelledException();
		}
		processDeferredRemoves(currentMonitor);
	}
Checks to see if there is a symbol in the otherProgram that conflicts
with the indicated symbol. A conflict can be one of these types:
1) a symbol other than label or function that has the same name and 
namespace as another non label or function.
2) a symbol at the same address with the same name and namespace.

@param program the program that contains the specified symbol
@param symbol the symbol (Can be original, latest, or my.)
@param otherProgram the program to be checked for a conflicting symbol
@param saveConflict if true this will also save the conflict for processing or in
some cases automatically process the conflict.
@return true if there is a symbol name conflict
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/SymbolMerger.java