xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision a52cb321)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
31da177e4SLinus Torvalds  * Released under the terms of the GNU GPL v2.0.
41da177e4SLinus Torvalds  */
51da177e4SLinus Torvalds 
6133c5f7cSAlexander Stein #include <qglobal.h>
7133c5f7cSAlexander Stein 
8b1f8a45bSBoris Barbulovski #include <QMainWindow>
9041fbdc2SBoris Barbulovski #include <QList>
10924bbb53SBoris Barbulovski #include <qtextbrowser.h>
1185eaf28aSBoris Barbulovski #include <QAction>
12bea00771SBoris Barbulovski #include <QFileDialog>
1376bede87SBoris Barbulovski #include <QMenu>
14133c5f7cSAlexander Stein 
15133c5f7cSAlexander Stein #include <qapplication.h>
168d90c97eSMarkus Heidelberg #include <qdesktopwidget.h>
171da177e4SLinus Torvalds #include <qtoolbar.h>
1843bf612aSRoman Zippel #include <qlayout.h>
191da177e4SLinus Torvalds #include <qsplitter.h>
201da177e4SLinus Torvalds #include <qlineedit.h>
2143bf612aSRoman Zippel #include <qlabel.h>
2243bf612aSRoman Zippel #include <qpushbutton.h>
231da177e4SLinus Torvalds #include <qmenubar.h>
241da177e4SLinus Torvalds #include <qmessagebox.h>
251da177e4SLinus Torvalds #include <qregexp.h>
26133c5f7cSAlexander Stein #include <qevent.h>
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds #include <stdlib.h>
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds #include "lkc.h"
311da177e4SLinus Torvalds #include "qconf.h"
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds #include "qconf.moc"
341da177e4SLinus Torvalds #include "images.c"
351da177e4SLinus Torvalds 
363b9fa093SArnaldo Carvalho de Melo #ifdef _
373b9fa093SArnaldo Carvalho de Melo # undef _
383b9fa093SArnaldo Carvalho de Melo # define _ qgettext
393b9fa093SArnaldo Carvalho de Melo #endif
403b9fa093SArnaldo Carvalho de Melo 
411da177e4SLinus Torvalds static QApplication *configApp;
427fc925fdSRoman Zippel static ConfigSettings *configSettings;
431da177e4SLinus Torvalds 
4485eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
453b354c55SKarsten Wiese 
463b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str)
473b9fa093SArnaldo Carvalho de Melo {
483b9fa093SArnaldo Carvalho de Melo 	return QString::fromLocal8Bit(gettext(str));
493b9fa093SArnaldo Carvalho de Melo }
503b9fa093SArnaldo Carvalho de Melo 
513b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const QString& str)
523b9fa093SArnaldo Carvalho de Melo {
5368ccb7efSBoris Barbulovski 	return QString::fromLocal8Bit(gettext(str.toLatin1()));
543b9fa093SArnaldo Carvalho de Melo }
553b9fa093SArnaldo Carvalho de Melo 
5600d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
5700d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
5800d4f8fcSBen Hutchings {
5900d4f8fcSBen Hutchings }
6000d4f8fcSBen Hutchings 
611da177e4SLinus Torvalds /**
621da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
631da177e4SLinus Torvalds  */
64041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
651da177e4SLinus Torvalds {
66041fbdc2SBoris Barbulovski 	QList<int> result;
6768ccb7efSBoris Barbulovski 	QStringList entryList = value(key).toStringList();
681da177e4SLinus Torvalds 	QStringList::Iterator it;
69c1f96f09SLi Zefan 
701da177e4SLinus Torvalds 	for (it = entryList.begin(); it != entryList.end(); ++it)
711da177e4SLinus Torvalds 		result.push_back((*it).toInt());
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds 	return result;
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds /**
771da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
781da177e4SLinus Torvalds  */
79041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
801da177e4SLinus Torvalds {
811da177e4SLinus Torvalds 	QStringList stringList;
82041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
851da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
8668ccb7efSBoris Barbulovski 	setValue(key, stringList);
8759e56440SBoris Barbulovski 
8868ccb7efSBoris Barbulovski 	return true;
891da177e4SLinus Torvalds }
901da177e4SLinus Torvalds 
9159e56440SBoris Barbulovski 
9259e56440SBoris Barbulovski /*
9359e56440SBoris Barbulovski  * set the new data
9459e56440SBoris Barbulovski  * TODO check the value
9559e56440SBoris Barbulovski  */
9659e56440SBoris Barbulovski void ConfigItem::okRename(int col)
9759e56440SBoris Barbulovski {
9859e56440SBoris Barbulovski }
9959e56440SBoris Barbulovski 
10059e56440SBoris Barbulovski /*
10159e56440SBoris Barbulovski  * update the displayed of a menu entry
10259e56440SBoris Barbulovski  */
10359e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
10459e56440SBoris Barbulovski {
105d5d973c3SBoris Barbulovski 	ConfigList* list;
106d5d973c3SBoris Barbulovski 	struct symbol* sym;
107d5d973c3SBoris Barbulovski 	struct property *prop;
108d5d973c3SBoris Barbulovski 	QString prompt;
109d5d973c3SBoris Barbulovski 	int type;
110d5d973c3SBoris Barbulovski 	tristate expr;
111d5d973c3SBoris Barbulovski 
112d5d973c3SBoris Barbulovski 	list = listView();
113d5d973c3SBoris Barbulovski 	if (goParent) {
114d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, list->menuBackPix);
115d5d973c3SBoris Barbulovski 		prompt = "..";
116d5d973c3SBoris Barbulovski 		goto set_prompt;
117d5d973c3SBoris Barbulovski 	}
118d5d973c3SBoris Barbulovski 
119d5d973c3SBoris Barbulovski 	sym = menu->sym;
120d5d973c3SBoris Barbulovski 	prop = menu->prompt;
121d5d973c3SBoris Barbulovski 	prompt = _(menu_get_prompt(menu));
122d5d973c3SBoris Barbulovski 
123d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
124d5d973c3SBoris Barbulovski 	case P_MENU:
125d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
126d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
127d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
128d5d973c3SBoris Barbulovski 			 */
129d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
130d5d973c3SBoris Barbulovski 				break;
131d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->menuPix);
132d5d973c3SBoris Barbulovski 		} else {
133d5d973c3SBoris Barbulovski 			if (sym)
134d5d973c3SBoris Barbulovski 				break;
135d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
136d5d973c3SBoris Barbulovski 		}
137d5d973c3SBoris Barbulovski 		goto set_prompt;
138d5d973c3SBoris Barbulovski 	case P_COMMENT:
139d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, QIcon());
140d5d973c3SBoris Barbulovski 		goto set_prompt;
141d5d973c3SBoris Barbulovski 	default:
142d5d973c3SBoris Barbulovski 		;
143d5d973c3SBoris Barbulovski 	}
144d5d973c3SBoris Barbulovski 	if (!sym)
145d5d973c3SBoris Barbulovski 		goto set_prompt;
146d5d973c3SBoris Barbulovski 
147d5d973c3SBoris Barbulovski 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
148d5d973c3SBoris Barbulovski 
149d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
150d5d973c3SBoris Barbulovski 	switch (type) {
151d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
152d5d973c3SBoris Barbulovski 	case S_TRISTATE:
153d5d973c3SBoris Barbulovski 		char ch;
154d5d973c3SBoris Barbulovski 
155d5d973c3SBoris Barbulovski 		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
156d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
157d5d973c3SBoris Barbulovski 			setText(noColIdx, QString::null);
158d5d973c3SBoris Barbulovski 			setText(modColIdx, QString::null);
159d5d973c3SBoris Barbulovski 			setText(yesColIdx, QString::null);
160d5d973c3SBoris Barbulovski 			break;
161d5d973c3SBoris Barbulovski 		}
162d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
163d5d973c3SBoris Barbulovski 		switch (expr) {
164d5d973c3SBoris Barbulovski 		case yes:
165d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
166d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceYesPix);
167d5d973c3SBoris Barbulovski 			else
168d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolYesPix);
169d5d973c3SBoris Barbulovski 			setText(yesColIdx, "Y");
170d5d973c3SBoris Barbulovski 			ch = 'Y';
171d5d973c3SBoris Barbulovski 			break;
172d5d973c3SBoris Barbulovski 		case mod:
173d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->symbolModPix);
174d5d973c3SBoris Barbulovski 			setText(modColIdx, "M");
175d5d973c3SBoris Barbulovski 			ch = 'M';
176d5d973c3SBoris Barbulovski 			break;
177d5d973c3SBoris Barbulovski 		default:
178d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
179d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceNoPix);
180d5d973c3SBoris Barbulovski 			else
181d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolNoPix);
182d5d973c3SBoris Barbulovski 			setText(noColIdx, "N");
183d5d973c3SBoris Barbulovski 			ch = 'N';
184d5d973c3SBoris Barbulovski 			break;
185d5d973c3SBoris Barbulovski 		}
186d5d973c3SBoris Barbulovski 		if (expr != no)
187d5d973c3SBoris Barbulovski 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
188d5d973c3SBoris Barbulovski 		if (expr != mod)
189d5d973c3SBoris Barbulovski 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
190d5d973c3SBoris Barbulovski 		if (expr != yes)
191d5d973c3SBoris Barbulovski 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
192d5d973c3SBoris Barbulovski 
193d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
194d5d973c3SBoris Barbulovski 		break;
195d5d973c3SBoris Barbulovski 	case S_INT:
196d5d973c3SBoris Barbulovski 	case S_HEX:
197d5d973c3SBoris Barbulovski 	case S_STRING:
198d5d973c3SBoris Barbulovski 		const char* data;
199d5d973c3SBoris Barbulovski 
200d5d973c3SBoris Barbulovski 		data = sym_get_string_value(sym);
201d5d973c3SBoris Barbulovski 
202d5d973c3SBoris Barbulovski 		//int i = list->mapIdx(dataColIdx);
203d5d973c3SBoris Barbulovski 		//if (i >= 0)
204d5d973c3SBoris Barbulovski 		//	setRenameEnabled(i, true);
205d5d973c3SBoris Barbulovski 		setText(dataColIdx, data);
206d5d973c3SBoris Barbulovski 		if (type == S_STRING)
207d5d973c3SBoris Barbulovski 			prompt = QString("%1: %2").arg(prompt).arg(data);
208d5d973c3SBoris Barbulovski 		else
209d5d973c3SBoris Barbulovski 			prompt = QString("(%2) %1").arg(prompt).arg(data);
210d5d973c3SBoris Barbulovski 		break;
211d5d973c3SBoris Barbulovski 	}
212d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
213d5d973c3SBoris Barbulovski 		prompt += _(" (NEW)");
214d5d973c3SBoris Barbulovski set_prompt:
215d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
21659e56440SBoris Barbulovski }
21759e56440SBoris Barbulovski 
21859e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
21959e56440SBoris Barbulovski {
220d5d973c3SBoris Barbulovski 	ConfigItem* i;
221d5d973c3SBoris Barbulovski 
222d5d973c3SBoris Barbulovski 	visible = v;
223d5d973c3SBoris Barbulovski 	if (!menu)
224d5d973c3SBoris Barbulovski 		return;
225d5d973c3SBoris Barbulovski 
226d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
227d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
228d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
229d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
230d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
231d5d973c3SBoris Barbulovski 			i->updateMenu();
232d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
233d5d973c3SBoris Barbulovski 		updateMenu();
23459e56440SBoris Barbulovski }
23559e56440SBoris Barbulovski 
23659e56440SBoris Barbulovski 
2371019f1a5SBoris Barbulovski /*
2381019f1a5SBoris Barbulovski  * construct a menu entry
2391019f1a5SBoris Barbulovski  */
2401019f1a5SBoris Barbulovski void ConfigItem::init(void)
2411019f1a5SBoris Barbulovski {
242d5d973c3SBoris Barbulovski 	if (menu) {
243d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
244d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
245d5d973c3SBoris Barbulovski 		menu->data = this;
246d5d973c3SBoris Barbulovski 
247d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
248d5d973c3SBoris Barbulovski 			setExpanded(true);
249d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
250d5d973c3SBoris Barbulovski 	}
251d5d973c3SBoris Barbulovski 	updateMenu();
2521019f1a5SBoris Barbulovski }
2531019f1a5SBoris Barbulovski 
2541019f1a5SBoris Barbulovski /*
2551019f1a5SBoris Barbulovski  * destruct a menu entry
2561019f1a5SBoris Barbulovski  */
2571019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2581019f1a5SBoris Barbulovski {
259d5d973c3SBoris Barbulovski 	if (menu) {
260d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
261d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
262d5d973c3SBoris Barbulovski 			if (*ip == this) {
263d5d973c3SBoris Barbulovski 				*ip = nextItem;
264d5d973c3SBoris Barbulovski 				break;
265d5d973c3SBoris Barbulovski 			}
266d5d973c3SBoris Barbulovski 		}
267d5d973c3SBoris Barbulovski 	}
2681019f1a5SBoris Barbulovski }
2691019f1a5SBoris Barbulovski 
27043bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
27143bf612aSRoman Zippel 	: Parent(parent)
27243bf612aSRoman Zippel {
273c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
27443bf612aSRoman Zippel }
27543bf612aSRoman Zippel 
2761019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i)
2771da177e4SLinus Torvalds {
2781da177e4SLinus Torvalds 	item = i;
279d5d973c3SBoris Barbulovski 	if (sym_get_string_value(item->menu->sym))
280d5d973c3SBoris Barbulovski 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
281d5d973c3SBoris Barbulovski 	else
282d5d973c3SBoris Barbulovski 		setText(QString::null);
2831da177e4SLinus Torvalds 	Parent::show();
2841da177e4SLinus Torvalds 	setFocus();
2851da177e4SLinus Torvalds }
2861da177e4SLinus Torvalds 
2871da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2881da177e4SLinus Torvalds {
2891da177e4SLinus Torvalds 	switch (e->key()) {
290fbb86374SMarkus Heidelberg 	case Qt::Key_Escape:
2911da177e4SLinus Torvalds 		break;
292fbb86374SMarkus Heidelberg 	case Qt::Key_Return:
293fbb86374SMarkus Heidelberg 	case Qt::Key_Enter:
294d5d973c3SBoris Barbulovski 		sym_set_string_value(item->menu->sym, text().toLatin1());
2951da177e4SLinus Torvalds 		parent()->updateList(item);
2961da177e4SLinus Torvalds 		break;
2971da177e4SLinus Torvalds 	default:
2981da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
2991da177e4SLinus Torvalds 		return;
3001da177e4SLinus Torvalds 	}
3011da177e4SLinus Torvalds 	e->accept();
3021da177e4SLinus Torvalds 	parent()->list->setFocus();
3031da177e4SLinus Torvalds 	hide();
3041da177e4SLinus Torvalds }
3051da177e4SLinus Torvalds 
3061019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name)
30759e56440SBoris Barbulovski 	: Parent(p),
30859e56440SBoris Barbulovski 	  updateAll(false),
30959e56440SBoris Barbulovski 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
31059e56440SBoris Barbulovski 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
31159e56440SBoris Barbulovski 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
31259e56440SBoris Barbulovski 	  showName(false), showRange(false), showData(false), optMode(normalOpt),
31359e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3141019f1a5SBoris Barbulovski {
315d5d973c3SBoris Barbulovski 	int i;
316d5d973c3SBoris Barbulovski 
317d5d973c3SBoris Barbulovski 	setObjectName(name);
318d5d973c3SBoris Barbulovski 	setSortingEnabled(-1);
319d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
320d5d973c3SBoris Barbulovski 
321a52cb321SBoris Barbulovski 	setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value"));
322a52cb321SBoris Barbulovski 
323c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(itemSelectionChanged(void)),
324d5d973c3SBoris Barbulovski 		SLOT(updateSelection(void)));
325d5d973c3SBoris Barbulovski 
326d5d973c3SBoris Barbulovski 	if (name) {
327d5d973c3SBoris Barbulovski 		configSettings->beginGroup(name);
328d5d973c3SBoris Barbulovski 		showName = configSettings->value("/showName", false).toBool();
329d5d973c3SBoris Barbulovski 		showRange = configSettings->value("/showRange", false).toBool();
330d5d973c3SBoris Barbulovski 		showData = configSettings->value("/showData", false).toBool();
331d5d973c3SBoris Barbulovski 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
332d5d973c3SBoris Barbulovski 		configSettings->endGroup();
333d5d973c3SBoris Barbulovski 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
334d5d973c3SBoris Barbulovski 	}
335d5d973c3SBoris Barbulovski 
336d5d973c3SBoris Barbulovski 	addColumn(promptColIdx);
337d5d973c3SBoris Barbulovski 
338d5d973c3SBoris Barbulovski 	reinit();
339d5d973c3SBoris Barbulovski }
340d5d973c3SBoris Barbulovski 
341d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu)
342d5d973c3SBoris Barbulovski {
343d5d973c3SBoris Barbulovski 	if (optMode == normalOpt && menu_is_visible(menu))
344d5d973c3SBoris Barbulovski 		return false;
345d5d973c3SBoris Barbulovski 	if (optMode == promptOpt && menu_has_prompt(menu))
346d5d973c3SBoris Barbulovski 		return false;
347d5d973c3SBoris Barbulovski 	if (optMode == allOpt)
348d5d973c3SBoris Barbulovski 		return false;
349d5d973c3SBoris Barbulovski 	return true;
3501019f1a5SBoris Barbulovski }
35159e56440SBoris Barbulovski 
35259e56440SBoris Barbulovski void ConfigList::reinit(void)
35359e56440SBoris Barbulovski {
354d5d973c3SBoris Barbulovski 	removeColumn(dataColIdx);
355d5d973c3SBoris Barbulovski 	removeColumn(yesColIdx);
356d5d973c3SBoris Barbulovski 	removeColumn(modColIdx);
357d5d973c3SBoris Barbulovski 	removeColumn(noColIdx);
358d5d973c3SBoris Barbulovski 	removeColumn(nameColIdx);
359d5d973c3SBoris Barbulovski 
360d5d973c3SBoris Barbulovski 	if (showName)
361d5d973c3SBoris Barbulovski 		addColumn(nameColIdx);
362d5d973c3SBoris Barbulovski 	if (showRange) {
363d5d973c3SBoris Barbulovski 		addColumn(noColIdx);
364d5d973c3SBoris Barbulovski 		addColumn(modColIdx);
365d5d973c3SBoris Barbulovski 		addColumn(yesColIdx);
366d5d973c3SBoris Barbulovski 	}
367d5d973c3SBoris Barbulovski 	if (showData)
368d5d973c3SBoris Barbulovski 		addColumn(dataColIdx);
369d5d973c3SBoris Barbulovski 
370d5d973c3SBoris Barbulovski 	updateListAll();
37159e56440SBoris Barbulovski }
37259e56440SBoris Barbulovski 
37359e56440SBoris Barbulovski void ConfigList::saveSettings(void)
37459e56440SBoris Barbulovski {
375d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
376d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
377d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
378d5d973c3SBoris Barbulovski 		configSettings->setValue("/showRange", showRange);
379d5d973c3SBoris Barbulovski 		configSettings->setValue("/showData", showData);
380d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
381d5d973c3SBoris Barbulovski 		configSettings->endGroup();
382d5d973c3SBoris Barbulovski 	}
38359e56440SBoris Barbulovski }
38459e56440SBoris Barbulovski 
38559e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu)
38659e56440SBoris Barbulovski {
387d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)menu->data;
388d5d973c3SBoris Barbulovski 
389d5d973c3SBoris Barbulovski 	for (; item; item = item->nextItem) {
390d5d973c3SBoris Barbulovski 		if (this == item->listView())
391d5d973c3SBoris Barbulovski 			break;
392d5d973c3SBoris Barbulovski 	}
393d5d973c3SBoris Barbulovski 
394d5d973c3SBoris Barbulovski 	return item;
39559e56440SBoris Barbulovski }
39659e56440SBoris Barbulovski 
39759e56440SBoris Barbulovski void ConfigList::updateSelection(void)
39859e56440SBoris Barbulovski {
399d5d973c3SBoris Barbulovski 	struct menu *menu;
400d5d973c3SBoris Barbulovski 	enum prop_type type;
401d5d973c3SBoris Barbulovski 
402d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
403d5d973c3SBoris Barbulovski 	if (!item)
404d5d973c3SBoris Barbulovski 		return;
405d5d973c3SBoris Barbulovski 
406d5d973c3SBoris Barbulovski 	menu = item->menu;
407d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
408d5d973c3SBoris Barbulovski 	if (!menu)
409d5d973c3SBoris Barbulovski 		return;
410d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
411d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
412d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
41359e56440SBoris Barbulovski }
41459e56440SBoris Barbulovski 
41559e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item)
41659e56440SBoris Barbulovski {
417d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
418d5d973c3SBoris Barbulovski 
419d5d973c3SBoris Barbulovski 	if (!rootEntry) {
420d5d973c3SBoris Barbulovski 		if (mode != listMode)
421d5d973c3SBoris Barbulovski 			goto update;
422d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
423d5d973c3SBoris Barbulovski 		ConfigItem* item;
424d5d973c3SBoris Barbulovski 
425d5d973c3SBoris Barbulovski 		while (*it) {
426d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
427d5d973c3SBoris Barbulovski 			if (!item->menu)
428d5d973c3SBoris Barbulovski 				continue;
429d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
430d5d973c3SBoris Barbulovski 
431d5d973c3SBoris Barbulovski 			++it;
432d5d973c3SBoris Barbulovski 		}
433d5d973c3SBoris Barbulovski 		return;
434d5d973c3SBoris Barbulovski 	}
435d5d973c3SBoris Barbulovski 
436d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
437d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
438d5d973c3SBoris Barbulovski 		item = firstChild();
439d5d973c3SBoris Barbulovski 		if (!item)
440d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
441d5d973c3SBoris Barbulovski 		last = item;
442d5d973c3SBoris Barbulovski 	}
443d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
444d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
445d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : firstChild();
446d5d973c3SBoris Barbulovski 		if (!item)
447d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
448d5d973c3SBoris Barbulovski 		else
449d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
450d5d973c3SBoris Barbulovski 
451d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
452d5d973c3SBoris Barbulovski 		update();
453d5d973c3SBoris Barbulovski 		return;
454d5d973c3SBoris Barbulovski 	}
455d5d973c3SBoris Barbulovski update:
456d5d973c3SBoris Barbulovski 	updateMenuList(this, rootEntry);
457d5d973c3SBoris Barbulovski 	update();
45859e56440SBoris Barbulovski }
45959e56440SBoris Barbulovski 
46059e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
46159e56440SBoris Barbulovski {
462d5d973c3SBoris Barbulovski 	struct symbol* sym;
463d5d973c3SBoris Barbulovski 	int type;
464d5d973c3SBoris Barbulovski 	tristate oldval;
465d5d973c3SBoris Barbulovski 
466d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
467d5d973c3SBoris Barbulovski 	if (!sym)
468d5d973c3SBoris Barbulovski 		return;
469d5d973c3SBoris Barbulovski 
470d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
471d5d973c3SBoris Barbulovski 	switch (type) {
472d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
473d5d973c3SBoris Barbulovski 	case S_TRISTATE:
474d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
475d5d973c3SBoris Barbulovski 
476d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
477d5d973c3SBoris Barbulovski 			return;
478d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
479d5d973c3SBoris Barbulovski 			item->setExpanded(true);
480d5d973c3SBoris Barbulovski 		parent()->updateList(item);
481d5d973c3SBoris Barbulovski 		break;
482d5d973c3SBoris Barbulovski 	}
48359e56440SBoris Barbulovski }
48459e56440SBoris Barbulovski 
48559e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
48659e56440SBoris Barbulovski {
487d5d973c3SBoris Barbulovski 	struct symbol* sym;
488d5d973c3SBoris Barbulovski 	struct menu* menu;
489d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
490d5d973c3SBoris Barbulovski 
491d5d973c3SBoris Barbulovski 	menu = item->menu;
492d5d973c3SBoris Barbulovski 	if (!menu)
493d5d973c3SBoris Barbulovski 		return;
494d5d973c3SBoris Barbulovski 	sym = menu->sym;
495d5d973c3SBoris Barbulovski 	if (!sym) {
496d5d973c3SBoris Barbulovski 		if (item->menu->list)
497d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
498d5d973c3SBoris Barbulovski 		return;
499d5d973c3SBoris Barbulovski 	}
500d5d973c3SBoris Barbulovski 
501d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
502d5d973c3SBoris Barbulovski 	switch (type) {
503d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
504d5d973c3SBoris Barbulovski 	case S_TRISTATE:
505d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
506d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
507d5d973c3SBoris Barbulovski 		if (item->menu->list) {
508d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
509d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
510d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
511d5d973c3SBoris Barbulovski 				item->setExpanded(true);
512d5d973c3SBoris Barbulovski 		}
513d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
514d5d973c3SBoris Barbulovski 			parent()->updateList(item);
515d5d973c3SBoris Barbulovski 		break;
516d5d973c3SBoris Barbulovski 	case S_INT:
517d5d973c3SBoris Barbulovski 	case S_HEX:
518d5d973c3SBoris Barbulovski 	case S_STRING:
519d5d973c3SBoris Barbulovski 		break;
520d5d973c3SBoris Barbulovski 	}
52159e56440SBoris Barbulovski }
52259e56440SBoris Barbulovski 
52359e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
52459e56440SBoris Barbulovski {
525d5d973c3SBoris Barbulovski 	enum prop_type type;
526d5d973c3SBoris Barbulovski 
527d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
528d5d973c3SBoris Barbulovski 		return;
529d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
530d5d973c3SBoris Barbulovski 	if (type != P_MENU)
531d5d973c3SBoris Barbulovski 		return;
532d5d973c3SBoris Barbulovski 	updateMenuList(this, 0);
533d5d973c3SBoris Barbulovski 	rootEntry = menu;
534d5d973c3SBoris Barbulovski 	updateListAll();
535d5d973c3SBoris Barbulovski 	if (currentItem()) {
536d5d973c3SBoris Barbulovski 		currentItem()->setSelected(hasFocus());
537d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
538d5d973c3SBoris Barbulovski 	}
53959e56440SBoris Barbulovski }
54059e56440SBoris Barbulovski 
54159e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
54259e56440SBoris Barbulovski {
543d5d973c3SBoris Barbulovski 	ConfigItem* item;
544d5d973c3SBoris Barbulovski 	struct menu *oldroot;
545d5d973c3SBoris Barbulovski 
546d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
547d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
548d5d973c3SBoris Barbulovski 		return;
549d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
550d5d973c3SBoris Barbulovski 
551d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
552d5d973c3SBoris Barbulovski 	while (*it) {
553d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
554d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
555d5d973c3SBoris Barbulovski 			setCurrentItem(item);
556d5d973c3SBoris Barbulovski 			scrollToItem(item);
557d5d973c3SBoris Barbulovski 			break;
558d5d973c3SBoris Barbulovski 		}
559d5d973c3SBoris Barbulovski 
560d5d973c3SBoris Barbulovski 		++it;
561d5d973c3SBoris Barbulovski 	}
56259e56440SBoris Barbulovski }
56359e56440SBoris Barbulovski 
56459e56440SBoris Barbulovski /*
56559e56440SBoris Barbulovski  * update all the children of a menu entry
56659e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
56759e56440SBoris Barbulovski  *
56859e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
56959e56440SBoris Barbulovski  * menu: entry to be updated
57059e56440SBoris Barbulovski  */
57159e56440SBoris Barbulovski template <class P>
57259e56440SBoris Barbulovski void ConfigList::updateMenuList(P* parent, struct menu* menu)
57359e56440SBoris Barbulovski {
574d5d973c3SBoris Barbulovski 	struct menu* child;
575d5d973c3SBoris Barbulovski 	ConfigItem* item;
576d5d973c3SBoris Barbulovski 	ConfigItem* last;
577d5d973c3SBoris Barbulovski 	bool visible;
578d5d973c3SBoris Barbulovski 	enum prop_type type;
579d5d973c3SBoris Barbulovski 
580d5d973c3SBoris Barbulovski 	if (!menu) {
581d5d973c3SBoris Barbulovski 		return;
582d5d973c3SBoris Barbulovski 	}
583d5d973c3SBoris Barbulovski 
584d5d973c3SBoris Barbulovski 	last = parent->firstChild();
585d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
586d5d973c3SBoris Barbulovski 		last = 0;
587d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
588d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
589d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
590d5d973c3SBoris Barbulovski 
591d5d973c3SBoris Barbulovski 		switch (mode) {
592d5d973c3SBoris Barbulovski 		case menuMode:
593d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
594d5d973c3SBoris Barbulovski 				goto hide;
595d5d973c3SBoris Barbulovski 			break;
596d5d973c3SBoris Barbulovski 		case symbolMode:
597d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
598d5d973c3SBoris Barbulovski 				goto hide;
599d5d973c3SBoris Barbulovski 			break;
600d5d973c3SBoris Barbulovski 		default:
601d5d973c3SBoris Barbulovski 			break;
602d5d973c3SBoris Barbulovski 		}
603d5d973c3SBoris Barbulovski 
604d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
605d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
606d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
607d5d973c3SBoris Barbulovski 				continue;
608d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
609d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
610d5d973c3SBoris Barbulovski 			else
611d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
612d5d973c3SBoris Barbulovski 
613d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
614d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
615d5d973c3SBoris Barbulovski 			else
616d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
617d5d973c3SBoris Barbulovski 			last = item;
618d5d973c3SBoris Barbulovski 			continue;
619d5d973c3SBoris Barbulovski 		}
620d5d973c3SBoris Barbulovski 	hide:
621d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
622d5d973c3SBoris Barbulovski 			last = parent->firstChild();
623d5d973c3SBoris Barbulovski 			if (last == item)
624d5d973c3SBoris Barbulovski 				last = 0;
625d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
626d5d973c3SBoris Barbulovski 				last = last->nextSibling();
627d5d973c3SBoris Barbulovski 			delete item;
628d5d973c3SBoris Barbulovski 		}
629d5d973c3SBoris Barbulovski 	}
63059e56440SBoris Barbulovski }
63159e56440SBoris Barbulovski 
63259e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
63359e56440SBoris Barbulovski {
634d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
635d5d973c3SBoris Barbulovski 	ConfigItem* item;
636d5d973c3SBoris Barbulovski 	struct menu *menu;
637d5d973c3SBoris Barbulovski 	enum prop_type type;
638d5d973c3SBoris Barbulovski 
639d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
640d5d973c3SBoris Barbulovski 		emit parentSelected();
641d5d973c3SBoris Barbulovski 		ev->accept();
642d5d973c3SBoris Barbulovski 		return;
64359e56440SBoris Barbulovski 	}
64459e56440SBoris Barbulovski 
645d5d973c3SBoris Barbulovski 	if (!i) {
646d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
647d5d973c3SBoris Barbulovski 		return;
648d5d973c3SBoris Barbulovski 	}
649d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
650d5d973c3SBoris Barbulovski 
651d5d973c3SBoris Barbulovski 	switch (ev->key()) {
652d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
653d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
654d5d973c3SBoris Barbulovski 		if (item->goParent) {
655d5d973c3SBoris Barbulovski 			emit parentSelected();
656d5d973c3SBoris Barbulovski 			break;
657d5d973c3SBoris Barbulovski 		}
658d5d973c3SBoris Barbulovski 		menu = item->menu;
659d5d973c3SBoris Barbulovski 		if (!menu)
660d5d973c3SBoris Barbulovski 			break;
661d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
662d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
663d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
664d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
665d5d973c3SBoris Barbulovski 			break;
666d5d973c3SBoris Barbulovski 		}
667d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
668d5d973c3SBoris Barbulovski 		changeValue(item);
669d5d973c3SBoris Barbulovski 		break;
670d5d973c3SBoris Barbulovski 	case Qt::Key_N:
671d5d973c3SBoris Barbulovski 		setValue(item, no);
672d5d973c3SBoris Barbulovski 		break;
673d5d973c3SBoris Barbulovski 	case Qt::Key_M:
674d5d973c3SBoris Barbulovski 		setValue(item, mod);
675d5d973c3SBoris Barbulovski 		break;
676d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
677d5d973c3SBoris Barbulovski 		setValue(item, yes);
678d5d973c3SBoris Barbulovski 		break;
679d5d973c3SBoris Barbulovski 	default:
680d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
681d5d973c3SBoris Barbulovski 		return;
682d5d973c3SBoris Barbulovski 	}
683d5d973c3SBoris Barbulovski 	ev->accept();
68459e56440SBoris Barbulovski }
68559e56440SBoris Barbulovski 
686d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
68759e56440SBoris Barbulovski {
688d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
689d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
690d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
69159e56440SBoris Barbulovski }
69259e56440SBoris Barbulovski 
693d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
69459e56440SBoris Barbulovski {
695d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
696d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
697d5d973c3SBoris Barbulovski 	struct menu *menu;
698d5d973c3SBoris Barbulovski 	enum prop_type ptype;
699d5d973c3SBoris Barbulovski 	QIcon icon;
700d5d973c3SBoris Barbulovski 	int idx, x;
701d5d973c3SBoris Barbulovski 
702d5d973c3SBoris Barbulovski 	if (!item)
703d5d973c3SBoris Barbulovski 		goto skip;
704d5d973c3SBoris Barbulovski 
705d5d973c3SBoris Barbulovski 	menu = item->menu;
706d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
707d5d973c3SBoris Barbulovski 	idx = header()->sectionPosition(x);
708d5d973c3SBoris Barbulovski 	switch (idx) {
709d5d973c3SBoris Barbulovski 	case promptColIdx:
710d5d973c3SBoris Barbulovski 		icon = item->pixmap(promptColIdx);
711d5d973c3SBoris Barbulovski 		break;
712d5d973c3SBoris Barbulovski 	case noColIdx:
713d5d973c3SBoris Barbulovski 		setValue(item, no);
714d5d973c3SBoris Barbulovski 		break;
715d5d973c3SBoris Barbulovski 	case modColIdx:
716d5d973c3SBoris Barbulovski 		setValue(item, mod);
717d5d973c3SBoris Barbulovski 		break;
718d5d973c3SBoris Barbulovski 	case yesColIdx:
719d5d973c3SBoris Barbulovski 		setValue(item, yes);
720d5d973c3SBoris Barbulovski 		break;
721d5d973c3SBoris Barbulovski 	case dataColIdx:
722d5d973c3SBoris Barbulovski 		changeValue(item);
723d5d973c3SBoris Barbulovski 		break;
72459e56440SBoris Barbulovski 	}
72559e56440SBoris Barbulovski 
726d5d973c3SBoris Barbulovski skip:
727d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
728d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
729d5d973c3SBoris Barbulovski }
730d5d973c3SBoris Barbulovski 
731d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
73259e56440SBoris Barbulovski {
733d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
734d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
735d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
736d5d973c3SBoris Barbulovski }
737d5d973c3SBoris Barbulovski 
738d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
739d5d973c3SBoris Barbulovski {
740d5d973c3SBoris Barbulovski 	QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport).
741d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
742d5d973c3SBoris Barbulovski 	struct menu *menu;
743d5d973c3SBoris Barbulovski 	enum prop_type ptype;
744d5d973c3SBoris Barbulovski 
745d5d973c3SBoris Barbulovski 	if (!item)
746d5d973c3SBoris Barbulovski 		goto skip;
747d5d973c3SBoris Barbulovski 	if (item->goParent) {
748d5d973c3SBoris Barbulovski 		emit parentSelected();
749d5d973c3SBoris Barbulovski 		goto skip;
750d5d973c3SBoris Barbulovski 	}
751d5d973c3SBoris Barbulovski 	menu = item->menu;
752d5d973c3SBoris Barbulovski 	if (!menu)
753d5d973c3SBoris Barbulovski 		goto skip;
754d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
755d5d973c3SBoris Barbulovski 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
756d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
757d5d973c3SBoris Barbulovski 	else if (menu->sym)
758d5d973c3SBoris Barbulovski 		changeValue(item);
759d5d973c3SBoris Barbulovski 
760d5d973c3SBoris Barbulovski skip:
761d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
762d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
76359e56440SBoris Barbulovski }
76459e56440SBoris Barbulovski 
76559e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
76659e56440SBoris Barbulovski {
767d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
768d5d973c3SBoris Barbulovski 
769d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
770d5d973c3SBoris Barbulovski 
771d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
772d5d973c3SBoris Barbulovski 	if (item) {
773d5d973c3SBoris Barbulovski 		item->setSelected(true);
774d5d973c3SBoris Barbulovski 		menu = item->menu;
775d5d973c3SBoris Barbulovski 	}
776d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
77759e56440SBoris Barbulovski }
77859e56440SBoris Barbulovski 
77959e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
78059e56440SBoris Barbulovski {
781d5d973c3SBoris Barbulovski 	if (e->y() <= header()->geometry().bottom()) {
782d5d973c3SBoris Barbulovski 		if (!headerPopup) {
783d5d973c3SBoris Barbulovski 			QAction *action;
784d5d973c3SBoris Barbulovski 
785d5d973c3SBoris Barbulovski 			headerPopup = new QMenu(this);
786d5d973c3SBoris Barbulovski 			action = new QAction(_("Show Name"), this);
787d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
788d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
789d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowName(bool)));
790d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showNameChanged(bool)),
791d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
792d5d973c3SBoris Barbulovski 			  action->setChecked(showName);
793d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
794d5d973c3SBoris Barbulovski 			action = new QAction(_("Show Range"), this);
795d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
796d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
797d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowRange(bool)));
798d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
799d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
800d5d973c3SBoris Barbulovski 			  action->setChecked(showRange);
801d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
802d5d973c3SBoris Barbulovski 			action = new QAction(_("Show Data"), this);
803d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
804d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
805d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowData(bool)));
806d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showDataChanged(bool)),
807d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
808d5d973c3SBoris Barbulovski 			  action->setChecked(showData);
809d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
810d5d973c3SBoris Barbulovski 		}
811d5d973c3SBoris Barbulovski 		headerPopup->exec(e->globalPos());
812d5d973c3SBoris Barbulovski 		e->accept();
813d5d973c3SBoris Barbulovski 	} else
814d5d973c3SBoris Barbulovski 		e->ignore();
81559e56440SBoris Barbulovski }
81659e56440SBoris Barbulovski 
8171da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
81839a4897cSLi Zefan QAction *ConfigView::showNormalAction;
81939a4897cSLi Zefan QAction *ConfigView::showAllAction;
82039a4897cSLi Zefan QAction *ConfigView::showPromptAction;
8211da177e4SLinus Torvalds 
8227fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
82368ccb7efSBoris Barbulovski 	: Parent(parent)
8241da177e4SLinus Torvalds {
8259bd36ed3SBoris Barbulovski 	setObjectName(name);
82629a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
82792298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
82829a70168SBoris Barbulovski 
8291019f1a5SBoris Barbulovski 	list = new ConfigList(this);
83029a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
8311da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
8321da177e4SLinus Torvalds 	lineEdit->hide();
83329a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
8341da177e4SLinus Torvalds 
8351da177e4SLinus Torvalds 	this->nextView = viewList;
8361da177e4SLinus Torvalds 	viewList = this;
8371da177e4SLinus Torvalds }
8381da177e4SLinus Torvalds 
8391da177e4SLinus Torvalds ConfigView::~ConfigView(void)
8401da177e4SLinus Torvalds {
8411da177e4SLinus Torvalds 	ConfigView** vp;
8421da177e4SLinus Torvalds 
8431da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
8441da177e4SLinus Torvalds 		if (*vp == this) {
8451da177e4SLinus Torvalds 			*vp = nextView;
8461da177e4SLinus Torvalds 			break;
8471da177e4SLinus Torvalds 		}
8481da177e4SLinus Torvalds 	}
8491da177e4SLinus Torvalds }
8501da177e4SLinus Torvalds 
85139a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act)
8527fc925fdSRoman Zippel {
853d5d973c3SBoris Barbulovski 	if (act == showNormalAction)
854d5d973c3SBoris Barbulovski 		list->optMode = normalOpt;
855d5d973c3SBoris Barbulovski 	else if (act == showAllAction)
856d5d973c3SBoris Barbulovski 		list->optMode = allOpt;
857d5d973c3SBoris Barbulovski 	else
858d5d973c3SBoris Barbulovski 		list->optMode = promptOpt;
859d5d973c3SBoris Barbulovski 
860d5d973c3SBoris Barbulovski 	list->updateListAll();
8617fc925fdSRoman Zippel }
8627fc925fdSRoman Zippel 
8637fc925fdSRoman Zippel void ConfigView::setShowName(bool b)
8647fc925fdSRoman Zippel {
865d5d973c3SBoris Barbulovski 	if (list->showName != b) {
866d5d973c3SBoris Barbulovski 		list->showName = b;
867d5d973c3SBoris Barbulovski 		list->reinit();
868d5d973c3SBoris Barbulovski 		emit showNameChanged(b);
869d5d973c3SBoris Barbulovski 	}
8707fc925fdSRoman Zippel }
8717fc925fdSRoman Zippel 
8727fc925fdSRoman Zippel void ConfigView::setShowRange(bool b)
8737fc925fdSRoman Zippel {
874d5d973c3SBoris Barbulovski 	if (list->showRange != b) {
875d5d973c3SBoris Barbulovski 		list->showRange = b;
876d5d973c3SBoris Barbulovski 		list->reinit();
877d5d973c3SBoris Barbulovski 		emit showRangeChanged(b);
878d5d973c3SBoris Barbulovski 	}
8797fc925fdSRoman Zippel }
8807fc925fdSRoman Zippel 
8817fc925fdSRoman Zippel void ConfigView::setShowData(bool b)
8827fc925fdSRoman Zippel {
883d5d973c3SBoris Barbulovski 	if (list->showData != b) {
884d5d973c3SBoris Barbulovski 		list->showData = b;
885d5d973c3SBoris Barbulovski 		list->reinit();
886d5d973c3SBoris Barbulovski 		emit showDataChanged(b);
887d5d973c3SBoris Barbulovski 	}
888d5d973c3SBoris Barbulovski }
889d5d973c3SBoris Barbulovski 
890d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
891d5d973c3SBoris Barbulovski {
892d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
893d5d973c3SBoris Barbulovski 
894d5d973c3SBoris Barbulovski 	while (*it) {
895d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
896d5d973c3SBoris Barbulovski 
897d5d973c3SBoris Barbulovski 		++it;
898d5d973c3SBoris Barbulovski 	}
8997fc925fdSRoman Zippel }
9007fc925fdSRoman Zippel 
9011019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item)
9027fc925fdSRoman Zippel {
903d5d973c3SBoris Barbulovski 	ConfigView* v;
904d5d973c3SBoris Barbulovski 
905d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
906d5d973c3SBoris Barbulovski 		v->list->updateList(item);
9071da177e4SLinus Torvalds }
9081da177e4SLinus Torvalds 
9091da177e4SLinus Torvalds void ConfigView::updateListAll(void)
9101da177e4SLinus Torvalds {
911d5d973c3SBoris Barbulovski 	ConfigView* v;
912d5d973c3SBoris Barbulovski 
913d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
914d5d973c3SBoris Barbulovski 		v->list->updateListAll();
9151da177e4SLinus Torvalds }
9161da177e4SLinus Torvalds 
91743bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
91868ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
9191da177e4SLinus Torvalds {
920d5d973c3SBoris Barbulovski 	setObjectName(name);
921d5d973c3SBoris Barbulovski 
922d5d973c3SBoris Barbulovski 
923d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
924d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
92568ccb7efSBoris Barbulovski 		_showDebug = configSettings->value("/showDebug", false).toBool();
9267fc925fdSRoman Zippel 		configSettings->endGroup();
9277fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
9287fc925fdSRoman Zippel 	}
9297fc925fdSRoman Zippel }
9307fc925fdSRoman Zippel 
9317fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
9327fc925fdSRoman Zippel {
933d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
934d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
935d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
936d5d973c3SBoris Barbulovski 		configSettings->endGroup();
937d5d973c3SBoris Barbulovski 	}
9381da177e4SLinus Torvalds }
9391da177e4SLinus Torvalds 
94043bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
9411da177e4SLinus Torvalds {
94243bf612aSRoman Zippel 	if (_showDebug != b) {
94343bf612aSRoman Zippel 		_showDebug = b;
944133c5f7cSAlexander Stein 		if (_menu)
94543bf612aSRoman Zippel 			menuInfo();
946ab45d190SRoman Zippel 		else if (sym)
947ab45d190SRoman Zippel 			symbolInfo();
94843bf612aSRoman Zippel 		emit showDebugChanged(b);
9491da177e4SLinus Torvalds 	}
9501da177e4SLinus Torvalds }
9511da177e4SLinus Torvalds 
95243bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
9531da177e4SLinus Torvalds {
954133c5f7cSAlexander Stein 	if (_menu == m)
955b65a47e1SRoman Zippel 		return;
956133c5f7cSAlexander Stein 	_menu = m;
9576fa1da8eSRoman Zippel 	sym = NULL;
958133c5f7cSAlexander Stein 	if (!_menu)
95943bf612aSRoman Zippel 		clear();
9606fa1da8eSRoman Zippel 	else
96143bf612aSRoman Zippel 		menuInfo();
9621da177e4SLinus Torvalds }
9631da177e4SLinus Torvalds 
964ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
965ab45d190SRoman Zippel {
966ab45d190SRoman Zippel 	QString str;
967ab45d190SRoman Zippel 
968ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
969ab45d190SRoman Zippel 	str += print_filter(sym->name);
970ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
971ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
972ab45d190SRoman Zippel 	str += "<br>visibility: ";
973ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
974ab45d190SRoman Zippel 	str += "<br>";
975ab45d190SRoman Zippel 	str += debug_info(sym);
976ab45d190SRoman Zippel 
977ab45d190SRoman Zippel 	setText(str);
978ab45d190SRoman Zippel }
979ab45d190SRoman Zippel 
98043bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
9811da177e4SLinus Torvalds {
9821da177e4SLinus Torvalds 	struct symbol* sym;
9831da177e4SLinus Torvalds 	QString head, debug, help;
98443bf612aSRoman Zippel 
985133c5f7cSAlexander Stein 	sym = _menu->sym;
9861da177e4SLinus Torvalds 	if (sym) {
987133c5f7cSAlexander Stein 		if (_menu->prompt) {
9881da177e4SLinus Torvalds 			head += "<big><b>";
989133c5f7cSAlexander Stein 			head += print_filter(_(_menu->prompt->text));
9901da177e4SLinus Torvalds 			head += "</b></big>";
9911da177e4SLinus Torvalds 			if (sym->name) {
9921da177e4SLinus Torvalds 				head += " (";
993ab45d190SRoman Zippel 				if (showDebug())
994ab45d190SRoman Zippel 					head += QString().sprintf("<a href=\"s%p\">", sym);
99543bf612aSRoman Zippel 				head += print_filter(sym->name);
996ab45d190SRoman Zippel 				if (showDebug())
997ab45d190SRoman Zippel 					head += "</a>";
9981da177e4SLinus Torvalds 				head += ")";
9991da177e4SLinus Torvalds 			}
10001da177e4SLinus Torvalds 		} else if (sym->name) {
10011da177e4SLinus Torvalds 			head += "<big><b>";
1002ab45d190SRoman Zippel 			if (showDebug())
1003ab45d190SRoman Zippel 				head += QString().sprintf("<a href=\"s%p\">", sym);
100443bf612aSRoman Zippel 			head += print_filter(sym->name);
1005ab45d190SRoman Zippel 			if (showDebug())
1006ab45d190SRoman Zippel 				head += "</a>";
10071da177e4SLinus Torvalds 			head += "</b></big>";
10081da177e4SLinus Torvalds 		}
10091da177e4SLinus Torvalds 		head += "<br><br>";
10101da177e4SLinus Torvalds 
101143bf612aSRoman Zippel 		if (showDebug())
101243bf612aSRoman Zippel 			debug = debug_info(sym);
101343bf612aSRoman Zippel 
1014d74c15f3SCheng Renquan 		struct gstr help_gstr = str_new();
1015133c5f7cSAlexander Stein 		menu_get_ext_help(_menu, &help_gstr);
1016d74c15f3SCheng Renquan 		help = print_filter(str_get(&help_gstr));
1017d74c15f3SCheng Renquan 		str_free(&help_gstr);
1018133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
101943bf612aSRoman Zippel 		head += "<big><b>";
1020133c5f7cSAlexander Stein 		head += print_filter(_(_menu->prompt->text));
102143bf612aSRoman Zippel 		head += "</b></big><br><br>";
102243bf612aSRoman Zippel 		if (showDebug()) {
1023133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
102443bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
1025133c5f7cSAlexander Stein 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
102643bf612aSRoman Zippel 				debug += "<br><br>";
102743bf612aSRoman Zippel 			}
102843bf612aSRoman Zippel 		}
102943bf612aSRoman Zippel 	}
103043bf612aSRoman Zippel 	if (showDebug())
1031133c5f7cSAlexander Stein 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
103243bf612aSRoman Zippel 
103343bf612aSRoman Zippel 	setText(head + debug + help);
103443bf612aSRoman Zippel }
103543bf612aSRoman Zippel 
103643bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
103743bf612aSRoman Zippel {
103843bf612aSRoman Zippel 	QString debug;
103943bf612aSRoman Zippel 
10401da177e4SLinus Torvalds 	debug += "type: ";
10411da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
10421da177e4SLinus Torvalds 	if (sym_is_choice(sym))
10431da177e4SLinus Torvalds 		debug += " (choice)";
10441da177e4SLinus Torvalds 	debug += "<br>";
10451da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
10461da177e4SLinus Torvalds 		debug += "reverse dep: ";
10471da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
10481da177e4SLinus Torvalds 		debug += "<br>";
10491da177e4SLinus Torvalds 	}
10501da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
10511da177e4SLinus Torvalds 		switch (prop->type) {
10521da177e4SLinus Torvalds 		case P_PROMPT:
10531da177e4SLinus Torvalds 		case P_MENU:
1054ab45d190SRoman Zippel 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
10553b9fa093SArnaldo Carvalho de Melo 			debug += print_filter(_(prop->text));
1056ab45d190SRoman Zippel 			debug += "</a><br>";
10571da177e4SLinus Torvalds 			break;
10581da177e4SLinus Torvalds 		case P_DEFAULT:
105993449082SRoman Zippel 		case P_SELECT:
106093449082SRoman Zippel 		case P_RANGE:
106193449082SRoman Zippel 		case P_ENV:
106293449082SRoman Zippel 			debug += prop_get_type_name(prop->type);
106393449082SRoman Zippel 			debug += ": ";
10641da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
10651da177e4SLinus Torvalds 			debug += "<br>";
10661da177e4SLinus Torvalds 			break;
10671da177e4SLinus Torvalds 		case P_CHOICE:
10681da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
10691da177e4SLinus Torvalds 				debug += "choice: ";
10701da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
10711da177e4SLinus Torvalds 				debug += "<br>";
10721da177e4SLinus Torvalds 			}
10731da177e4SLinus Torvalds 			break;
10741da177e4SLinus Torvalds 		default:
10751da177e4SLinus Torvalds 			debug += "unknown property: ";
10761da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
10771da177e4SLinus Torvalds 			debug += "<br>";
10781da177e4SLinus Torvalds 		}
10791da177e4SLinus Torvalds 		if (prop->visible.expr) {
10801da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
10811da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
10821da177e4SLinus Torvalds 			debug += "<br>";
10831da177e4SLinus Torvalds 		}
10841da177e4SLinus Torvalds 	}
10851da177e4SLinus Torvalds 	debug += "<br>";
108643bf612aSRoman Zippel 
108743bf612aSRoman Zippel 	return debug;
10881da177e4SLinus Torvalds }
10891da177e4SLinus Torvalds 
109043bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
109143bf612aSRoman Zippel {
109243bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
109343bf612aSRoman Zippel 	QString res = str;
109468ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
109568ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
109643bf612aSRoman Zippel 		case '<':
109743bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
109843bf612aSRoman Zippel 			i += 4;
109943bf612aSRoman Zippel 			break;
110043bf612aSRoman Zippel 		case '>':
110143bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
110243bf612aSRoman Zippel 			i += 4;
110343bf612aSRoman Zippel 			break;
110443bf612aSRoman Zippel 		case '&':
110543bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
110643bf612aSRoman Zippel 			i += 5;
110743bf612aSRoman Zippel 			break;
110843bf612aSRoman Zippel 		case '"':
110943bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
111043bf612aSRoman Zippel 			i += 6;
111143bf612aSRoman Zippel 			break;
111243bf612aSRoman Zippel 		case '\n':
111343bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
111443bf612aSRoman Zippel 			i += 4;
111543bf612aSRoman Zippel 			break;
11161da177e4SLinus Torvalds 		}
11171da177e4SLinus Torvalds 	}
111843bf612aSRoman Zippel 	return res;
11191da177e4SLinus Torvalds }
112043bf612aSRoman Zippel 
1121ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
112243bf612aSRoman Zippel {
1123ab45d190SRoman Zippel 	QString* text = reinterpret_cast<QString*>(data);
1124ab45d190SRoman Zippel 	QString str2 = print_filter(str);
1125ab45d190SRoman Zippel 
1126ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1127ab45d190SRoman Zippel 		*text += QString().sprintf("<a href=\"s%p\">", sym);
1128ab45d190SRoman Zippel 		*text += str2;
1129ab45d190SRoman Zippel 		*text += "</a>";
1130ab45d190SRoman Zippel 	} else
1131ab45d190SRoman Zippel 		*text += str2;
113243bf612aSRoman Zippel }
113343bf612aSRoman Zippel 
1134924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
11357fc925fdSRoman Zippel {
1136924bbb53SBoris Barbulovski 	QMenu* popup = Parent::createStandardContextMenu(pos);
113785eaf28aSBoris Barbulovski 	QAction* action = new QAction(_("Show Debug Info"), popup);
113868ccb7efSBoris Barbulovski 	  action->setCheckable(true);
11397fc925fdSRoman Zippel 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
11407fc925fdSRoman Zippel 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
11419c86235aSBoris Barbulovski 	  action->setChecked(showDebug());
1142924bbb53SBoris Barbulovski 	popup->addSeparator();
114368ccb7efSBoris Barbulovski 	popup->addAction(action);
11447fc925fdSRoman Zippel 	return popup;
11457fc925fdSRoman Zippel }
11467fc925fdSRoman Zippel 
1147924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
11487fc925fdSRoman Zippel {
1149924bbb53SBoris Barbulovski 	Parent::contextMenuEvent(e);
11507fc925fdSRoman Zippel }
11517fc925fdSRoman Zippel 
115263431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
115368ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
115443bf612aSRoman Zippel {
1155d5d973c3SBoris Barbulovski 	setObjectName(name);
115668ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
115743bf612aSRoman Zippel 
115868ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
115968ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
116068ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
116168ccb7efSBoris Barbulovski 	QHBoxLayout* layout2 = new QHBoxLayout(0);
116268ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
116368ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1164c21a2d95SEGRY Gabor 	layout2->addWidget(new QLabel(_("Find:"), this));
116543bf612aSRoman Zippel 	editField = new QLineEdit(this);
116643bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
116743bf612aSRoman Zippel 	layout2->addWidget(editField);
1168c21a2d95SEGRY Gabor 	searchButton = new QPushButton(_("Search"), this);
116968ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
117043bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
117143bf612aSRoman Zippel 	layout2->addWidget(searchButton);
117243bf612aSRoman Zippel 	layout1->addLayout(layout2);
117343bf612aSRoman Zippel 
11747fc925fdSRoman Zippel 	split = new QSplitter(this);
11757298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
11767fc925fdSRoman Zippel 	list = new ConfigView(split, name);
1177d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
11787fc925fdSRoman Zippel 	info = new ConfigInfoView(split, name);
117943bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
118043bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
118163431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
118263431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
118363431e75SMarco Costalba 
118443bf612aSRoman Zippel 	layout1->addWidget(split);
11857fc925fdSRoman Zippel 
11867fc925fdSRoman Zippel 	if (name) {
118768ccb7efSBoris Barbulovski 		QVariant x, y;
118868ccb7efSBoris Barbulovski 		int width, height;
11897fc925fdSRoman Zippel 		bool ok;
11907fc925fdSRoman Zippel 
11917fc925fdSRoman Zippel 		configSettings->beginGroup(name);
119268ccb7efSBoris Barbulovski 		width = configSettings->value("/window width", parent->width() / 2).toInt();
119368ccb7efSBoris Barbulovski 		height = configSettings->value("/window height", parent->height() / 2).toInt();
11947fc925fdSRoman Zippel 		resize(width, height);
119568ccb7efSBoris Barbulovski 		x = configSettings->value("/window x");
119668ccb7efSBoris Barbulovski 		y = configSettings->value("/window y");
119768ccb7efSBoris Barbulovski 		if ((x.isValid())&&(y.isValid()))
119868ccb7efSBoris Barbulovski 			move(x.toInt(), y.toInt());
1199041fbdc2SBoris Barbulovski 		QList<int> sizes = configSettings->readSizes("/split", &ok);
12007fc925fdSRoman Zippel 		if (ok)
12017fc925fdSRoman Zippel 			split->setSizes(sizes);
12027fc925fdSRoman Zippel 		configSettings->endGroup();
12037fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
12047fc925fdSRoman Zippel 	}
12057fc925fdSRoman Zippel }
12067fc925fdSRoman Zippel 
12077fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
12087fc925fdSRoman Zippel {
1209d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1210d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1211d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1212d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1213d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1214d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1215d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1216d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1217d5d973c3SBoris Barbulovski 	}
121843bf612aSRoman Zippel }
121943bf612aSRoman Zippel 
122043bf612aSRoman Zippel void ConfigSearchWindow::search(void)
122143bf612aSRoman Zippel {
1222d5d973c3SBoris Barbulovski 	struct symbol **p;
1223d5d973c3SBoris Barbulovski 	struct property *prop;
1224d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1225d5d973c3SBoris Barbulovski 
1226d5d973c3SBoris Barbulovski 	free(result);
1227d5d973c3SBoris Barbulovski 	list->list->clear();
1228d5d973c3SBoris Barbulovski 	info->clear();
1229d5d973c3SBoris Barbulovski 
1230d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1231d5d973c3SBoris Barbulovski 	if (!result)
1232d5d973c3SBoris Barbulovski 		return;
1233d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1234d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1235d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1236d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1237d5d973c3SBoris Barbulovski 	}
123843bf612aSRoman Zippel }
123943bf612aSRoman Zippel 
124043bf612aSRoman Zippel /*
124143bf612aSRoman Zippel  * Construct the complete config widget
124243bf612aSRoman Zippel  */
124343bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1244f12aa704SRoman Zippel 	: searchWindow(0)
124543bf612aSRoman Zippel {
124643bf612aSRoman Zippel 	QMenuBar* menu;
124792119937SBoris Barbulovski 	bool ok = true;
124868ccb7efSBoris Barbulovski 	QVariant x, y;
124968ccb7efSBoris Barbulovski 	int width, height;
1250a54bb701SRandy Dunlap 	char title[256];
125143bf612aSRoman Zippel 
12528d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
12530954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
12540954828fSArnaud Lacombe 		rootmenu.prompt->text,
125576a136c4SMichal Marek 		""
125676a136c4SMichal Marek 		);
125768ccb7efSBoris Barbulovski 	setWindowTitle(title);
125843bf612aSRoman Zippel 
125968ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
126068ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
126143bf612aSRoman Zippel 	resize(width, height);
126268ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
126368ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
126468ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
126568ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
126643bf612aSRoman Zippel 
126743bf612aSRoman Zippel 	split1 = new QSplitter(this);
12687298b936SMarkus Heidelberg 	split1->setOrientation(Qt::Horizontal);
126943bf612aSRoman Zippel 	setCentralWidget(split1);
127043bf612aSRoman Zippel 
12717fc925fdSRoman Zippel 	menuView = new ConfigView(split1, "menu");
127243bf612aSRoman Zippel 	menuList = menuView->list;
127343bf612aSRoman Zippel 
127443bf612aSRoman Zippel 	split2 = new QSplitter(split1);
12757298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
127643bf612aSRoman Zippel 
127743bf612aSRoman Zippel 	// create config tree
12787fc925fdSRoman Zippel 	configView = new ConfigView(split2, "config");
127943bf612aSRoman Zippel 	configList = configView->list;
128043bf612aSRoman Zippel 
12817fc925fdSRoman Zippel 	helpText = new ConfigInfoView(split2, "help");
128268ccb7efSBoris Barbulovski 	//helpText->setTextFormat(Qt::RichText);
128343bf612aSRoman Zippel 
128443bf612aSRoman Zippel 	setTabOrder(configList, helpText);
128543bf612aSRoman Zippel 	configList->setFocus();
128643bf612aSRoman Zippel 
128743bf612aSRoman Zippel 	menu = menuBar();
1288b1f8a45bSBoris Barbulovski 	toolBar = new QToolBar("Tools", this);
128929a70168SBoris Barbulovski 	addToolBar(toolBar);
129043bf612aSRoman Zippel 
129185eaf28aSBoris Barbulovski 	backAction = new QAction(QPixmap(xpm_back), _("Back"), this);
129292119937SBoris Barbulovski 	  connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
129368ccb7efSBoris Barbulovski 	  backAction->setEnabled(false);
129485eaf28aSBoris Barbulovski 	QAction *quitAction = new QAction(_("&Quit"), this);
129585eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
129692119937SBoris Barbulovski 	  connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
129785eaf28aSBoris Barbulovski 	QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this);
129885eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
129992119937SBoris Barbulovski 	  connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
130085eaf28aSBoris Barbulovski 	saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this);
130185eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
130292119937SBoris Barbulovski 	  connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
13033b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
13043b354c55SKarsten Wiese 	// Set saveAction's initial state
13053b354c55SKarsten Wiese 	conf_changed();
130685eaf28aSBoris Barbulovski 	QAction *saveAsAction = new QAction(_("Save &As..."), this);
130792119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
130885eaf28aSBoris Barbulovski 	QAction *searchAction = new QAction(_("&Find"), this);
130985eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
131092119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1311780505e3SBoris Barbulovski 	singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this);
131268ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
131392119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1314780505e3SBoris Barbulovski 	splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this);
131568ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
131692119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1317780505e3SBoris Barbulovski 	fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this);
131868ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
131992119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
132043bf612aSRoman Zippel 
132185eaf28aSBoris Barbulovski 	QAction *showNameAction = new QAction(_("Show Name"), this);
132268ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
13237fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
13249c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
132585eaf28aSBoris Barbulovski 	QAction *showRangeAction = new QAction(_("Show Range"), this);
132668ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
13277fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
132885eaf28aSBoris Barbulovski 	QAction *showDataAction = new QAction(_("Show Data"), this);
132968ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
13307fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
133139a4897cSLi Zefan 
133239a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
133368ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
133492119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
133539a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
133692119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
133739a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
133839a4897cSLi Zefan 
1339133c5f7cSAlexander Stein 	configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
1340133c5f7cSAlexander Stein 	configView->showAllAction = new QAction(_("Show All Options"), optGroup);
1341133c5f7cSAlexander Stein 	configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
134268ccb7efSBoris Barbulovski 	configView->showNormalAction->setCheckable(true);
134368ccb7efSBoris Barbulovski 	configView->showAllAction->setCheckable(true);
134468ccb7efSBoris Barbulovski 	configView->showPromptAction->setCheckable(true);
134539a4897cSLi Zefan 
134685eaf28aSBoris Barbulovski 	QAction *showDebugAction = new QAction( _("Show Debug Info"), this);
134768ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
134843bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
13499c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
135043bf612aSRoman Zippel 
135185eaf28aSBoris Barbulovski 	QAction *showIntroAction = new QAction( _("Introduction"), this);
135292119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
135385eaf28aSBoris Barbulovski 	QAction *showAboutAction = new QAction( _("About"), this);
135492119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
135543bf612aSRoman Zippel 
135643bf612aSRoman Zippel 	// init tool bar
135768ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
135843bf612aSRoman Zippel 	toolBar->addSeparator();
135968ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
136068ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
136143bf612aSRoman Zippel 	toolBar->addSeparator();
136268ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
136368ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
136468ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
136543bf612aSRoman Zippel 
136643bf612aSRoman Zippel 	// create config menu
136768ccb7efSBoris Barbulovski 	QMenu* config = menu->addMenu(_("&File"));
136868ccb7efSBoris Barbulovski 	config->addAction(loadAction);
136968ccb7efSBoris Barbulovski 	config->addAction(saveAction);
137068ccb7efSBoris Barbulovski 	config->addAction(saveAsAction);
137176bede87SBoris Barbulovski 	config->addSeparator();
137268ccb7efSBoris Barbulovski 	config->addAction(quitAction);
137343bf612aSRoman Zippel 
137466e7c723SShlomi Fish 	// create edit menu
137568ccb7efSBoris Barbulovski 	QMenu* editMenu = menu->addMenu(_("&Edit"));
137668ccb7efSBoris Barbulovski 	editMenu->addAction(searchAction);
137766e7c723SShlomi Fish 
137843bf612aSRoman Zippel 	// create options menu
137968ccb7efSBoris Barbulovski 	QMenu* optionMenu = menu->addMenu(_("&Option"));
138068ccb7efSBoris Barbulovski 	optionMenu->addAction(showNameAction);
138168ccb7efSBoris Barbulovski 	optionMenu->addAction(showRangeAction);
138268ccb7efSBoris Barbulovski 	optionMenu->addAction(showDataAction);
138376bede87SBoris Barbulovski 	optionMenu->addSeparator();
138468ccb7efSBoris Barbulovski 	optionMenu->addActions(optGroup->actions());
138576bede87SBoris Barbulovski 	optionMenu->addSeparator();
138643bf612aSRoman Zippel 
138743bf612aSRoman Zippel 	// create help menu
138876bede87SBoris Barbulovski 	menu->addSeparator();
138968ccb7efSBoris Barbulovski 	QMenu* helpMenu = menu->addMenu(_("&Help"));
139068ccb7efSBoris Barbulovski 	helpMenu->addAction(showIntroAction);
139168ccb7efSBoris Barbulovski 	helpMenu->addAction(showAboutAction);
139243bf612aSRoman Zippel 
1393d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1394d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1395d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1396d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1397d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1398d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1399d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1400d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1401d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1402d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1403d5d973c3SBoris Barbulovski 
1404d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1405d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1406d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1407d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1408d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1409d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1410b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1411b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
141243bf612aSRoman Zippel 
141368ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
141443bf612aSRoman Zippel 	if (listMode == "single")
141543bf612aSRoman Zippel 		showSingleView();
141643bf612aSRoman Zippel 	else if (listMode == "full")
141743bf612aSRoman Zippel 		showFullView();
141843bf612aSRoman Zippel 	else /*if (listMode == "split")*/
141943bf612aSRoman Zippel 		showSplitView();
142043bf612aSRoman Zippel 
142143bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1422041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
142343bf612aSRoman Zippel 	if (ok)
142443bf612aSRoman Zippel 		split1->setSizes(sizes);
142543bf612aSRoman Zippel 
14267fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
142743bf612aSRoman Zippel 	if (ok)
142843bf612aSRoman Zippel 		split2->setSizes(sizes);
142943bf612aSRoman Zippel }
143043bf612aSRoman Zippel 
14311da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
14321da177e4SLinus Torvalds {
143368ccb7efSBoris Barbulovski 	QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname());
14341da177e4SLinus Torvalds 	if (s.isNull())
14351da177e4SLinus Torvalds 		return;
14363b9fa093SArnaldo Carvalho de Melo 	if (conf_read(QFile::encodeName(s)))
1437c21a2d95SEGRY Gabor 		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
14381da177e4SLinus Torvalds 	ConfigView::updateListAll();
14391da177e4SLinus Torvalds }
14401da177e4SLinus Torvalds 
1441bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
14421da177e4SLinus Torvalds {
1443bac6aa86SMichal Marek 	if (conf_write(NULL)) {
1444c21a2d95SEGRY Gabor 		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
1445bac6aa86SMichal Marek 		return false;
1446bac6aa86SMichal Marek 	}
1447bac6aa86SMichal Marek 	return true;
14481da177e4SLinus Torvalds }
14491da177e4SLinus Torvalds 
14501da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
14511da177e4SLinus Torvalds {
145268ccb7efSBoris Barbulovski 	QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname());
14531da177e4SLinus Torvalds 	if (s.isNull())
14541da177e4SLinus Torvalds 		return;
1455d49e4687SArnaud Lacombe 	saveConfig();
14561da177e4SLinus Torvalds }
14571da177e4SLinus Torvalds 
145843bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
145943bf612aSRoman Zippel {
146043bf612aSRoman Zippel 	if (!searchWindow)
14617fc925fdSRoman Zippel 		searchWindow = new ConfigSearchWindow(this, "search");
146243bf612aSRoman Zippel 	searchWindow->show();
146343bf612aSRoman Zippel }
146443bf612aSRoman Zippel 
14651da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu)
14661da177e4SLinus Torvalds {
1467d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
1468d5d973c3SBoris Barbulovski 	if (configList->rootEntry->parent == &rootmenu)
1469d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1470d5d973c3SBoris Barbulovski 	else
1471d5d973c3SBoris Barbulovski 		backAction->setEnabled(true);
14721da177e4SLinus Torvalds }
14731da177e4SLinus Torvalds 
1474b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1475b65a47e1SRoman Zippel {
1476d5d973c3SBoris Barbulovski 	struct menu *parent;
1477d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1478d5d973c3SBoris Barbulovski 	ConfigItem* item;
1479d5d973c3SBoris Barbulovski 
1480d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1481d5d973c3SBoris Barbulovski 		return;
1482d5d973c3SBoris Barbulovski 
1483d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1484d5d973c3SBoris Barbulovski 	case singleMode:
1485d5d973c3SBoris Barbulovski 		list = configList;
1486d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1487d5d973c3SBoris Barbulovski 		if (!parent)
1488d5d973c3SBoris Barbulovski 			return;
1489d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1490d5d973c3SBoris Barbulovski 		break;
1491d5d973c3SBoris Barbulovski 	case symbolMode:
1492d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1493d5d973c3SBoris Barbulovski 			configList->setRootMenu(menu);
1494d5d973c3SBoris Barbulovski 			configList->clearSelection();
1495d5d973c3SBoris Barbulovski 			list = menuList;
1496d5d973c3SBoris Barbulovski 		} else {
1497d5d973c3SBoris Barbulovski 			list = configList;
1498d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1499d5d973c3SBoris Barbulovski 			if (!parent)
1500d5d973c3SBoris Barbulovski 				return;
1501d5d973c3SBoris Barbulovski 			item = menuList->findConfigItem(parent);
1502d5d973c3SBoris Barbulovski 			if (item) {
1503d5d973c3SBoris Barbulovski 				item->setSelected(true);
1504d5d973c3SBoris Barbulovski 				menuList->scrollToItem(item);
1505d5d973c3SBoris Barbulovski 			}
1506d5d973c3SBoris Barbulovski 			list->setRootMenu(parent);
1507d5d973c3SBoris Barbulovski 		}
1508d5d973c3SBoris Barbulovski 		break;
1509d5d973c3SBoris Barbulovski 	case fullMode:
1510d5d973c3SBoris Barbulovski 		list = configList;
1511d5d973c3SBoris Barbulovski 		break;
1512d5d973c3SBoris Barbulovski 	default:
1513d5d973c3SBoris Barbulovski 		break;
1514d5d973c3SBoris Barbulovski 	}
1515d5d973c3SBoris Barbulovski 
1516d5d973c3SBoris Barbulovski 	if (list) {
1517d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1518d5d973c3SBoris Barbulovski 		if (item) {
1519d5d973c3SBoris Barbulovski 			item->setSelected(true);
1520d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1521d5d973c3SBoris Barbulovski 			list->setFocus();
1522d5d973c3SBoris Barbulovski 		}
1523d5d973c3SBoris Barbulovski 	}
1524b65a47e1SRoman Zippel }
1525b65a47e1SRoman Zippel 
15261da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
15271da177e4SLinus Torvalds {
1528d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1529d5d973c3SBoris Barbulovski 		configList->clearSelection();
15301da177e4SLinus Torvalds }
15311da177e4SLinus Torvalds 
15321da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
15331da177e4SLinus Torvalds {
1534d5d973c3SBoris Barbulovski 	ConfigItem* item;
1535d5d973c3SBoris Barbulovski 
1536d5d973c3SBoris Barbulovski 	configList->setParentMenu();
1537d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1538d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1539d5d973c3SBoris Barbulovski 	item = (ConfigItem*)menuList->selectedItems().first();
1540d5d973c3SBoris Barbulovski 	while (item) {
1541d5d973c3SBoris Barbulovski 		if (item->menu == configList->rootEntry) {
1542d5d973c3SBoris Barbulovski 			item->setSelected(true);
1543d5d973c3SBoris Barbulovski 			break;
1544d5d973c3SBoris Barbulovski 		}
1545d5d973c3SBoris Barbulovski 		item = (ConfigItem*)item->parent();
1546d5d973c3SBoris Barbulovski 	}
15471da177e4SLinus Torvalds }
15481da177e4SLinus Torvalds 
15491da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
15501da177e4SLinus Torvalds {
1551780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1552780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1553780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1554780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1555780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1556780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1557780505e3SBoris Barbulovski 
15581da177e4SLinus Torvalds 	menuView->hide();
1559d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1560d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1561d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1562d5d973c3SBoris Barbulovski 		configList->updateListAll();
1563d5d973c3SBoris Barbulovski 	else
1564d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
15651da177e4SLinus Torvalds 	configList->setFocus();
15661da177e4SLinus Torvalds }
15671da177e4SLinus Torvalds 
15681da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
15691da177e4SLinus Torvalds {
1570780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1571780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1572780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1573780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1574780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1575780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1576780505e3SBoris Barbulovski 
1577d5d973c3SBoris Barbulovski 	configList->mode = symbolMode;
1578d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1579d5d973c3SBoris Barbulovski 		configList->updateListAll();
1580d5d973c3SBoris Barbulovski 	else
1581d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1582d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1583d5d973c3SBoris Barbulovski 	configApp->processEvents();
1584d5d973c3SBoris Barbulovski 	menuList->mode = menuMode;
1585d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1586d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
15871da177e4SLinus Torvalds 	menuView->show();
15881da177e4SLinus Torvalds 	menuList->setFocus();
15891da177e4SLinus Torvalds }
15901da177e4SLinus Torvalds 
15911da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
15921da177e4SLinus Torvalds {
1593780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1594780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1595780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1596780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1597780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1598780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1599780505e3SBoris Barbulovski 
16001da177e4SLinus Torvalds 	menuView->hide();
1601d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1602d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1603d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1604d5d973c3SBoris Barbulovski 		configList->updateListAll();
1605d5d973c3SBoris Barbulovski 	else
1606d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
16071da177e4SLinus Torvalds 	configList->setFocus();
16081da177e4SLinus Torvalds }
16091da177e4SLinus Torvalds 
16101da177e4SLinus Torvalds /*
16111da177e4SLinus Torvalds  * ask for saving configuration before quitting
16121da177e4SLinus Torvalds  * TODO ask only when something changed
16131da177e4SLinus Torvalds  */
16141da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
16151da177e4SLinus Torvalds {
1616b3214293SKarsten Wiese 	if (!conf_get_changed()) {
16171da177e4SLinus Torvalds 		e->accept();
16181da177e4SLinus Torvalds 		return;
16191da177e4SLinus Torvalds 	}
1620c21a2d95SEGRY Gabor 	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
16211da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1622c21a2d95SEGRY Gabor 	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
1623c21a2d95SEGRY Gabor 	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
1624c21a2d95SEGRY Gabor 	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
16251da177e4SLinus Torvalds 	switch (mb.exec()) {
16261da177e4SLinus Torvalds 	case QMessageBox::Yes:
1627bac6aa86SMichal Marek 		if (saveConfig())
1628bac6aa86SMichal Marek 			e->accept();
1629bac6aa86SMichal Marek 		else
1630bac6aa86SMichal Marek 			e->ignore();
1631bac6aa86SMichal Marek 		break;
16321da177e4SLinus Torvalds 	case QMessageBox::No:
16331da177e4SLinus Torvalds 		e->accept();
16341da177e4SLinus Torvalds 		break;
16351da177e4SLinus Torvalds 	case QMessageBox::Cancel:
16361da177e4SLinus Torvalds 		e->ignore();
16371da177e4SLinus Torvalds 		break;
16381da177e4SLinus Torvalds 	}
16391da177e4SLinus Torvalds }
16401da177e4SLinus Torvalds 
16411da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
16421da177e4SLinus Torvalds {
1643652cf982SArnaud Lacombe 	static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
16441da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
16451da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
16461da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
16471da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
16481da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
16491da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
16501da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
16511da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
16521da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1653c21a2d95SEGRY Gabor 		"which you can then match by examining other options.\n\n");
16541da177e4SLinus Torvalds 
16551da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
16561da177e4SLinus Torvalds }
16571da177e4SLinus Torvalds 
16581da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
16591da177e4SLinus Torvalds {
1660c21a2d95SEGRY Gabor 	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n"
1661c21a2d95SEGRY Gabor 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
16621da177e4SLinus Torvalds 
16631da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
16641da177e4SLinus Torvalds }
16651da177e4SLinus Torvalds 
16661da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
16671da177e4SLinus Torvalds {
166868ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
166968ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
167068ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
167168ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
16721da177e4SLinus Torvalds 
16731da177e4SLinus Torvalds 	QString entry;
1674d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1675d5d973c3SBoris Barbulovski 	case singleMode :
1676d5d973c3SBoris Barbulovski 		entry = "single";
1677d5d973c3SBoris Barbulovski 		break;
16781da177e4SLinus Torvalds 
1679d5d973c3SBoris Barbulovski 	case symbolMode :
1680d5d973c3SBoris Barbulovski 		entry = "split";
1681d5d973c3SBoris Barbulovski 		break;
1682d5d973c3SBoris Barbulovski 
1683d5d973c3SBoris Barbulovski 	case fullMode :
1684d5d973c3SBoris Barbulovski 		entry = "full";
1685d5d973c3SBoris Barbulovski 		break;
1686d5d973c3SBoris Barbulovski 
1687d5d973c3SBoris Barbulovski 	default:
1688d5d973c3SBoris Barbulovski 		break;
1689d5d973c3SBoris Barbulovski 	}
169068ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
16911da177e4SLinus Torvalds 
16927fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
16937fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
16941da177e4SLinus Torvalds }
16951da177e4SLinus Torvalds 
16963b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
16973b354c55SKarsten Wiese {
16983b354c55SKarsten Wiese 	if (saveAction)
16993b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
17003b354c55SKarsten Wiese }
17013b354c55SKarsten Wiese 
17021da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
17031da177e4SLinus Torvalds {
17041da177e4SLinus Torvalds 	struct menu *child;
17051da177e4SLinus Torvalds 	static int menu_cnt = 0;
17061da177e4SLinus Torvalds 
17071da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
17081da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
17091da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
17101da177e4SLinus Torvalds 			menu_cnt++;
17111da177e4SLinus Torvalds 			fixup_rootmenu(child);
17121da177e4SLinus Torvalds 			menu_cnt--;
17131da177e4SLinus Torvalds 		} else if (!menu_cnt)
17141da177e4SLinus Torvalds 			fixup_rootmenu(child);
17151da177e4SLinus Torvalds 	}
17161da177e4SLinus Torvalds }
17171da177e4SLinus Torvalds 
17181da177e4SLinus Torvalds static const char *progname;
17191da177e4SLinus Torvalds 
17201da177e4SLinus Torvalds static void usage(void)
17211da177e4SLinus Torvalds {
172268ccb7efSBoris Barbulovski 	printf(_("%s [-s] <config>\n").toLatin1().constData(), progname);
17231da177e4SLinus Torvalds 	exit(0);
17241da177e4SLinus Torvalds }
17251da177e4SLinus Torvalds 
17261da177e4SLinus Torvalds int main(int ac, char** av)
17271da177e4SLinus Torvalds {
17281da177e4SLinus Torvalds 	ConfigMainWindow* v;
17291da177e4SLinus Torvalds 	const char *name;
17301da177e4SLinus Torvalds 
17313b9fa093SArnaldo Carvalho de Melo 	bindtextdomain(PACKAGE, LOCALEDIR);
17323b9fa093SArnaldo Carvalho de Melo 	textdomain(PACKAGE);
17333b9fa093SArnaldo Carvalho de Melo 
17341da177e4SLinus Torvalds 	progname = av[0];
17351da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
17361da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
17371da177e4SLinus Torvalds 		switch (av[1][1]) {
17380a1f00a1SMichal Marek 		case 's':
17390a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
17400a1f00a1SMichal Marek 			break;
17411da177e4SLinus Torvalds 		case 'h':
17421da177e4SLinus Torvalds 		case '?':
17431da177e4SLinus Torvalds 			usage();
17441da177e4SLinus Torvalds 		}
17451da177e4SLinus Torvalds 		name = av[2];
17461da177e4SLinus Torvalds 	} else
17471da177e4SLinus Torvalds 		name = av[1];
17481da177e4SLinus Torvalds 	if (!name)
17491da177e4SLinus Torvalds 		usage();
17501da177e4SLinus Torvalds 
17511da177e4SLinus Torvalds 	conf_parse(name);
17521da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
17531da177e4SLinus Torvalds 	conf_read(NULL);
17541da177e4SLinus Torvalds 	//zconfdump(stdout);
17551da177e4SLinus Torvalds 
17567fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
17577fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
17581da177e4SLinus Torvalds 	v = new ConfigMainWindow();
17591da177e4SLinus Torvalds 
17601da177e4SLinus Torvalds 	//zconfdump(stdout);
17611da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
17621da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
176343bf612aSRoman Zippel 	v->show();
17641da177e4SLinus Torvalds 	configApp->exec();
17651da177e4SLinus Torvalds 
17667fc925fdSRoman Zippel 	configSettings->endGroup();
17677fc925fdSRoman Zippel 	delete configSettings;
17687fc925fdSRoman Zippel 
17691da177e4SLinus Torvalds 	return 0;
17701da177e4SLinus Torvalds }
1771