/**
 * @file oprof_start.h
 * The GUI start main class
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author Philippe Elie
 * @author John Levon
 */

#ifndef OPROF_START_H
#define OPROF_START_H

#include <vector>
#include <map>
#include <set>

#include "config.h"

#include "ui/oprof_start.base.h"
#include "oprof_start_config.h"

#include "op_events.h"

#ifndef QT3_SUPPORT
#define Q3ListViewItem QListViewItem
#endif

class QIntValidator;
class QListViewItem;
class QTimerEvent;

/// a struct describing a particular event type
struct op_event_descr {
	op_event_descr();

	/// bit mask of allowed counters
	uint counter_mask;
	/// hardware event number
	u32 val;
	/// unit mask values if applicable
	op_unit_mask const * unit;
	/// name of event
	std::string name;
	/// description of event
	std::string help_str;
	/// minimum counter value
	uint min_count;
};

class oprof_start : public oprof_start_base
{
	Q_OBJECT

public:
	oprof_start();

protected slots:
	/// select the kernel image filename
	void choose_kernel_filename();
	/// flush profiler
	void on_flush_profiler_data();
	/// start profiler
	void on_start_profiler();
	/// stop profiler
	void on_stop_profiler();
	/// events selection change
	void event_selected();
	/// the mouse is over an event
	void event_over(Q3ListViewItem *);
	/// state of separate_kernel_cb changed
	void on_separate_kernel_cb_changed(int);
	/// reset sample files
	void on_reset_sample_files();

	/// close the dialog
	void accept();

	/// WM hide event
	void closeEvent(QCloseEvent * e);

	/// timer event
	void timerEvent(QTimerEvent * e);

private:
	/// the counter combo has been activated
	void fill_events_listbox();

	/// fill the event details and gui setup
	void fill_events();

	/// find an event description by name
	op_event_descr const & locate_event(std::string const & name) const;

	/// update config on user change
	void record_selected_event_config();
	/// update config and validate
	bool record_config();

	/// calculate unit mask for given event and unit mask part
	void get_unit_mask_part(op_event_descr const & descr, uint num, bool selected, uint & mask);
	/// calculate unit mask for given event
	uint get_unit_mask(op_event_descr const & descr);
	/// set the unit mask widgets for given event
	void setup_unit_masks(op_event_descr const & descr);

	/// return the maximum perf counter value for the current cpu type
	uint max_perf_count() const;

	/// show an event's settings
	void display_event(op_event_descr const & descrp);

	/// hide unit mask widgets
	void hide_masks(void);

	/// read the events set in daemonrc
	void read_set_events();
	/// use the default event
	void setup_default_event();
	/// load the extra config file
	void load_config_file();
	/// save the config
	bool save_config();

	/// redraw the event list by changing icon status
	void draw_event_list();

	/// return true if item is selectable or already selected
	bool is_selectable_event(Q3ListViewItem * item);

	/// try to alloc counters for the selected_events
	bool alloc_selected_events() const;

	/// validator for event count
	QIntValidator* event_count_validator;

	/// all available events for this hardware
	std::vector<op_event_descr> v_events;

	/// current event configs for each counter
	typedef std::map<std::string, event_setting> event_setting_map;
	event_setting_map event_cfgs;

	/// The currently selected events. We must track this because
	/// with multiple selection listbox QT doesn't allow to know
	/// what is the last selected item. events_selected() update it
	std::set<Q3ListViewItem *> selected_events;
	Q3ListViewItem * current_event;

	/// current config
	config_setting config;

	/// the expansion of "~" directory
	std::string user_dir;

	/// CPU type
	op_cpu cpu_type;

	/// CPU speed in MHz
	double cpu_speed;

	/// total number of available HW counters
	uint op_nr_counters;

	/// Total number of samples for this run
	unsigned long total_nr_interrupts;
};

#endif // OPROF_START_H
