private void showMergePanel(final ListingMergePanel listingPanel,
			final String userDefinedPropertyName, final Address addr) {
		this.propertyName = userDefinedPropertyName;
		this.currentAddress = addr;
		try {
			final ChangeListener changeListener = new ChangeListener() {
				@Override
				public void stateChanged(ChangeEvent e) {
					conflictOption = conflictPanel.getSelectedOptions();
					if (conflictOption == ASK_USER) {
						if (mergeManager != null) {
							mergeManager.setApplyEnabled(false);
						}
						return;
					}
					if (mergeManager != null) {
						mergeManager.clearStatusText();
					}
					merge(UserDefinedPropertyMerger.this.propertyName,
						UserDefinedPropertyMerger.this.currentAddress, conflictOption);
					if (mergeManager != null) {
						mergeManager.setApplyEnabled(true);
					}
				}
			};
			SwingUtilities.invokeAndWait(new Runnable() {
				@Override
				public void run() {
					setupConflictsPanel(listingPanel, UserDefinedPropertyMerger.this.propertyName,
						UserDefinedPropertyMerger.this.currentAddress, changeListener);
				}
			});
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					listingPanel.clearAllBackgrounds();
					listingPanel.paintAllBackgrounds(new AddressSet(addr, addr));
				}
			});
		}
		catch (InterruptedException e) {
		}
		catch (InvocationTargetException e) {
		}
		if (mergeManager != null) {
			mergeManager.setApplyEnabled(false);
			mergeManager.showListingMergePanel(currentAddress);
		}
		// block until the user either cancels or hits the "Apply" button
		// on the merge dialog...
	}
Creates and displays a user defined property conflict to the user.
@param listingPanel the listing merge panel
@param userDefinedPropertyName the name of the property
@param addr the address of the conflict
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/UserDefinedPropertyMerger.java