private JComponent buildLanguagePanel() {
		languageTextField = new JTextField();
		languageTextField.setEditable(false);
		languageTextField.setFocusable(false);

		languageButton = new BrowseButton();
		languageButton.addActionListener(e -> {
			SetLanguageDialog dialog = new SetLanguageDialog(plugin.getTool(), languageIDString,
				compilerIDString, "Select Program Architecture for File DataType Archive");
			LanguageID languageId = dialog.getLanguageDescriptionID();
			CompilerSpecID compilerSpecId = dialog.getCompilerSpecDescriptionID();
			if ((languageId == null) || (compilerSpecId == null)) {
				return;
			}

			String newLanguageIDString = languageId.getIdAsString();
			String newCompilerIDString = compilerSpecId.getIdAsString();

			if (!Objects.equals(newLanguageIDString, languageIDString) ||
				!Objects.equals(newCompilerIDString, compilerIDString)) {
				itemChanged();
			}

			languageIDString = newLanguageIDString;
			compilerIDString = newCompilerIDString;

			updateArchitectureDescription();
		});

		updateArchitectureDescription();

		languageButton.setName("Set Processor Architecture");
		Gui.registerFont(languageButton, Font.BOLD);

		JPanel panel = new JPanel(new BorderLayout());
		panel.add(languageTextField, BorderLayout.CENTER);
		panel.add(languageButton, BorderLayout.EAST);
		return panel;
	}
Dialog that shows files used for parsing C header files. The profile has a list of source header
files to parse, followed by parse options (compiler directives). Ghidra supplies a Windows
profile by default in core/parserprofiles. The user can do "save as" on this default profile to
create new profiles that will be written to the user's {@code <home>/userprofiles} directory. The
CParserPlugin creates this directory if it doesn't exist.
<p>
The data types resulting from the parse operation can either be added to the data type manager in
the current program, or written to an archive data file.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java