private Component buildControlPanel() {
		JPanel controlPanel = new JPanel();
		BoxLayout controlLayout = new BoxLayout(controlPanel, BoxLayout.Y_AXIS);
		controlPanel.setLayout(controlLayout);
		JPanel infoPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
		infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		JPanel buttonPanel = new JPanel();
		FlowLayout buttonPanelLayout = new FlowLayout(FlowLayout.CENTER);
		buttonPanel.setLayout(buttonPanelLayout);

		JButton readXMLButton = new JButton("Read XML Files");
		readXMLButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				GhidraFileChooser fileChooser = new GhidraFileChooser(component);
				fileChooser.setFileSelectionMode(GhidraFileChooserMode.DIRECTORIES_ONLY);
				fileChooser.setTitle("Select Directory Containing XML Files");
				String baseDir = Preferences.getProperty(PATTERN_INFO_DIR);
				if (baseDir != null) {
					File dir = new File(baseDir);
					if (dir.isDirectory()) {
						fileChooser.setCurrentDirectory(dir);
					}
				}
				File xmlDir = fileChooser.getSelectedFile();
				fileChooser.dispose();
				if (xmlDir == null) {
					return;
				}
				Preferences.setProperty(PATTERN_INFO_DIR, xmlDir.getAbsolutePath());
				Preferences.store();
				patternReader = new FileBitPatternInfoReader(xmlDir, component);
				if (patternReader.getDataGatheringParams() == null) {
					Msg.showWarn(this, component, "Missing Data Gathering Parameters",
						"No Data Gathering Parameters Read");
					return;
				}
				dataSourceField.setText(xmlDir.getAbsolutePath());
				updatePanel();
			}

		});
		buttonPanel.add(readXMLButton);

		JButton mineProgramButton = new JButton(EXPLORE_FUNCTION_PATTERNS_TEXT);
		mineProgramButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Program program = plugin.getCurrentProgram();
				if (program == null) {
					Msg.showWarn(this, component, "Current program null", "Please open a program");
				}
				else {
					DataGatheringParamsDialog paramDialog =
						new DataGatheringParamsDialog(DATA_GATHERING_TEXT, component);
					if (paramDialog.isCanceled) {
						return;
					}
					DataGatheringParams params = paramDialog.getDataGatheringParams();
					dataSourceField.setText(program.getName());
					patternReader = new FileBitPatternInfoReader(program, params, component);
					updatePanel();
					tabbedPane.setSelectedIndex(FIRST_INSTRUCTION_PANEL_INDEX);
				}

			}
		});
		buttonPanel.add(mineProgramButton);

		JPanel dataInfoPanel = new JPanel();
		PairLayout pairLayout = new PairLayout();
		dataInfoPanel.setLayout(pairLayout);

		dataInfoPanel.add(new GLabel(DATA_SOURCE_FIELD_LABEL));
		dataSourceField = new JTextField(70);
		dataSourceField.setEditable(false);
		dataInfoPanel.add(dataSourceField);

		dataInfoPanel.add(new GLabel(NUM_FUNCS_FIELD_LABEL));
		numFunctionsField = new JTextField(10);
		numFunctionsField.setEditable(false);
		dataInfoPanel.add(numFunctionsField);

		dataInfoPanel.add(new GLabel(NUM_FILES_FIELD_LABEL));
		numFilesField = new JTextField(10);
		numFilesField.setEditable(false);
		dataInfoPanel.add(numFilesField);

		JPanel instructionInfoPanel = new JPanel();
		PairLayout instructionLayout = new PairLayout();
		instructionInfoPanel.setLayout(instructionLayout);

		instructionInfoPanel.add(new GLabel(FIRST_INSTRUCTIONS_LABEL));
		firstInstructionsField = new JTextField(10);
		firstInstructionsField.setEditable(false);
		instructionInfoPanel.add(firstInstructionsField);

		instructionInfoPanel.add(new GLabel(PRE_INSTRUCTIONS_LABEL));
		preInstructionsField = new JTextField(10);
		preInstructionsField.setEditable(false);
		instructionInfoPanel.add(preInstructionsField);

		instructionInfoPanel.add(new GLabel(RETURN_INSTRUCTIONS_LABEL));
		returnInstructionsField = new JTextField(10);
		returnInstructionsField.setEditable(false);
		instructionInfoPanel.add(returnInstructionsField);

		JPanel bytesInfoPanel = new JPanel();
		PairLayout bytesLayout = new PairLayout();
		bytesInfoPanel.setLayout(bytesLayout);

		bytesInfoPanel.add(new GLabel(FIRST_BYTES_LABEL));
		firstBytesField = new JTextField(10);
		firstBytesField.setEditable(false);
		bytesInfoPanel.add(firstBytesField);

		bytesInfoPanel.add(new GLabel(PRE_BYTES_LABEL));
		preBytesField = new JTextField(10);
		preBytesField.setEditable(false);
		bytesInfoPanel.add(preBytesField);

		bytesInfoPanel.add(new GLabel(RETURN_BYTES_LABEL));
		returnBytesField = new JTextField(10);
		returnBytesField.setEditable(false);
		bytesInfoPanel.add(returnBytesField);

		infoPanel.add(instructionInfoPanel);
		infoPanel.add(bytesInfoPanel);
		infoPanel.add(dataInfoPanel);

		controlPanel.add(infoPanel);
		controlPanel.add(buttonPanel);
		return controlPanel;
	}
@param plugin plugin associated with provider
Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/FunctionBitPatternsMainProvider.java