xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision 43bf612a)
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 
61da177e4SLinus Torvalds #include <qapplication.h>
71da177e4SLinus Torvalds #include <qmainwindow.h>
81da177e4SLinus Torvalds #include <qtoolbar.h>
943bf612aSRoman Zippel #include <qlayout.h>
101da177e4SLinus Torvalds #include <qvbox.h>
111da177e4SLinus Torvalds #include <qsplitter.h>
121da177e4SLinus Torvalds #include <qlistview.h>
1343bf612aSRoman Zippel #include <qtextbrowser.h>
141da177e4SLinus Torvalds #include <qlineedit.h>
1543bf612aSRoman Zippel #include <qlabel.h>
1643bf612aSRoman Zippel #include <qpushbutton.h>
171da177e4SLinus Torvalds #include <qmenubar.h>
181da177e4SLinus Torvalds #include <qmessagebox.h>
191da177e4SLinus Torvalds #include <qaction.h>
201da177e4SLinus Torvalds #include <qheader.h>
211da177e4SLinus Torvalds #include <qfiledialog.h>
2243bf612aSRoman Zippel #include <qdragobject.h>
231da177e4SLinus Torvalds #include <qregexp.h>
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds #include <stdlib.h>
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds #include "lkc.h"
281da177e4SLinus Torvalds #include "qconf.h"
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds #include "qconf.moc"
311da177e4SLinus Torvalds #include "images.c"
321da177e4SLinus Torvalds 
333b9fa093SArnaldo Carvalho de Melo #ifdef _
343b9fa093SArnaldo Carvalho de Melo # undef _
353b9fa093SArnaldo Carvalho de Melo # define _ qgettext
363b9fa093SArnaldo Carvalho de Melo #endif
373b9fa093SArnaldo Carvalho de Melo 
381da177e4SLinus Torvalds static QApplication *configApp;
391da177e4SLinus Torvalds 
403b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str)
413b9fa093SArnaldo Carvalho de Melo {
423b9fa093SArnaldo Carvalho de Melo 	return QString::fromLocal8Bit(gettext(str));
433b9fa093SArnaldo Carvalho de Melo }
443b9fa093SArnaldo Carvalho de Melo 
453b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const QString& str)
463b9fa093SArnaldo Carvalho de Melo {
473b9fa093SArnaldo Carvalho de Melo 	return QString::fromLocal8Bit(gettext(str.latin1()));
483b9fa093SArnaldo Carvalho de Melo }
493b9fa093SArnaldo Carvalho de Melo 
501da177e4SLinus Torvalds ConfigSettings::ConfigSettings()
511da177e4SLinus Torvalds 	: showAll(false), showName(false), showRange(false), showData(false)
521da177e4SLinus Torvalds {
531da177e4SLinus Torvalds }
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds #if QT_VERSION >= 300
561da177e4SLinus Torvalds /**
571da177e4SLinus Torvalds  * Reads the list column settings from the application settings.
581da177e4SLinus Torvalds  */
591da177e4SLinus Torvalds void ConfigSettings::readListSettings()
601da177e4SLinus Torvalds {
611da177e4SLinus Torvalds 	showAll = readBoolEntry("/kconfig/qconf/showAll", false);
621da177e4SLinus Torvalds 	showName = readBoolEntry("/kconfig/qconf/showName", false);
631da177e4SLinus Torvalds 	showRange = readBoolEntry("/kconfig/qconf/showRange", false);
641da177e4SLinus Torvalds 	showData = readBoolEntry("/kconfig/qconf/showData", false);
651da177e4SLinus Torvalds }
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds /**
681da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
691da177e4SLinus Torvalds  */
701da177e4SLinus Torvalds QValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
711da177e4SLinus Torvalds {
721da177e4SLinus Torvalds 	QValueList<int> result;
731da177e4SLinus Torvalds 	QStringList entryList = readListEntry(key, ok);
741da177e4SLinus Torvalds 	if (ok) {
751da177e4SLinus Torvalds 		QStringList::Iterator it;
761da177e4SLinus Torvalds 		for (it = entryList.begin(); it != entryList.end(); ++it)
771da177e4SLinus Torvalds 			result.push_back((*it).toInt());
781da177e4SLinus Torvalds 	}
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds 	return result;
811da177e4SLinus Torvalds }
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds /**
841da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
851da177e4SLinus Torvalds  */
861da177e4SLinus Torvalds bool ConfigSettings::writeSizes(const QString& key, const QValueList<int>& value)
871da177e4SLinus Torvalds {
881da177e4SLinus Torvalds 	QStringList stringList;
891da177e4SLinus Torvalds 	QValueList<int>::ConstIterator it;
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
921da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
931da177e4SLinus Torvalds 	return writeEntry(key, stringList);
941da177e4SLinus Torvalds }
951da177e4SLinus Torvalds #endif
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds /*
991da177e4SLinus Torvalds  * update all the children of a menu entry
1001da177e4SLinus Torvalds  *   removes/adds the entries from the parent widget as necessary
1011da177e4SLinus Torvalds  *
1021da177e4SLinus Torvalds  * parent: either the menu list widget or a menu entry widget
1031da177e4SLinus Torvalds  * menu: entry to be updated
1041da177e4SLinus Torvalds  */
1051da177e4SLinus Torvalds template <class P>
1061da177e4SLinus Torvalds void ConfigList::updateMenuList(P* parent, struct menu* menu)
1071da177e4SLinus Torvalds {
1081da177e4SLinus Torvalds 	struct menu* child;
1091da177e4SLinus Torvalds 	ConfigItem* item;
1101da177e4SLinus Torvalds 	ConfigItem* last;
1111da177e4SLinus Torvalds 	bool visible;
1121da177e4SLinus Torvalds 	enum prop_type type;
1131da177e4SLinus Torvalds 
1141da177e4SLinus Torvalds 	if (!menu) {
1151da177e4SLinus Torvalds 		while ((item = parent->firstChild()))
1161da177e4SLinus Torvalds 			delete item;
1171da177e4SLinus Torvalds 		return;
1181da177e4SLinus Torvalds 	}
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds 	last = parent->firstChild();
1211da177e4SLinus Torvalds 	if (last && !last->goParent)
1221da177e4SLinus Torvalds 		last = 0;
1231da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
1241da177e4SLinus Torvalds 		item = last ? last->nextSibling() : parent->firstChild();
1251da177e4SLinus Torvalds 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
1261da177e4SLinus Torvalds 
1271da177e4SLinus Torvalds 		switch (mode) {
1281da177e4SLinus Torvalds 		case menuMode:
1291da177e4SLinus Torvalds 			if (!(child->flags & MENU_ROOT))
1301da177e4SLinus Torvalds 				goto hide;
1311da177e4SLinus Torvalds 			break;
1321da177e4SLinus Torvalds 		case symbolMode:
1331da177e4SLinus Torvalds 			if (child->flags & MENU_ROOT)
1341da177e4SLinus Torvalds 				goto hide;
1351da177e4SLinus Torvalds 			break;
1361da177e4SLinus Torvalds 		default:
1371da177e4SLinus Torvalds 			break;
1381da177e4SLinus Torvalds 		}
1391da177e4SLinus Torvalds 
1401da177e4SLinus Torvalds 		visible = menu_is_visible(child);
1411da177e4SLinus Torvalds 		if (showAll || visible) {
1421da177e4SLinus Torvalds 			if (!item || item->menu != child)
1431da177e4SLinus Torvalds 				item = new ConfigItem(parent, last, child, visible);
1441da177e4SLinus Torvalds 			else
1451da177e4SLinus Torvalds 				item->testUpdateMenu(visible);
1461da177e4SLinus Torvalds 
1471da177e4SLinus Torvalds 			if (mode == fullMode || mode == menuMode || type != P_MENU)
1481da177e4SLinus Torvalds 				updateMenuList(item, child);
1491da177e4SLinus Torvalds 			else
1501da177e4SLinus Torvalds 				updateMenuList(item, 0);
1511da177e4SLinus Torvalds 			last = item;
1521da177e4SLinus Torvalds 			continue;
1531da177e4SLinus Torvalds 		}
1541da177e4SLinus Torvalds 	hide:
1551da177e4SLinus Torvalds 		if (item && item->menu == child) {
1561da177e4SLinus Torvalds 			last = parent->firstChild();
1571da177e4SLinus Torvalds 			if (last == item)
1581da177e4SLinus Torvalds 				last = 0;
1591da177e4SLinus Torvalds 			else while (last->nextSibling() != item)
1601da177e4SLinus Torvalds 				last = last->nextSibling();
1611da177e4SLinus Torvalds 			delete item;
1621da177e4SLinus Torvalds 		}
1631da177e4SLinus Torvalds 	}
1641da177e4SLinus Torvalds }
1651da177e4SLinus Torvalds 
1661da177e4SLinus Torvalds #if QT_VERSION >= 300
1671da177e4SLinus Torvalds /*
1681da177e4SLinus Torvalds  * set the new data
1691da177e4SLinus Torvalds  * TODO check the value
1701da177e4SLinus Torvalds  */
1711da177e4SLinus Torvalds void ConfigItem::okRename(int col)
1721da177e4SLinus Torvalds {
1731da177e4SLinus Torvalds 	Parent::okRename(col);
1741da177e4SLinus Torvalds 	sym_set_string_value(menu->sym, text(dataColIdx).latin1());
1751da177e4SLinus Torvalds }
1761da177e4SLinus Torvalds #endif
1771da177e4SLinus Torvalds 
1781da177e4SLinus Torvalds /*
1791da177e4SLinus Torvalds  * update the displayed of a menu entry
1801da177e4SLinus Torvalds  */
1811da177e4SLinus Torvalds void ConfigItem::updateMenu(void)
1821da177e4SLinus Torvalds {
1831da177e4SLinus Torvalds 	ConfigList* list;
1841da177e4SLinus Torvalds 	struct symbol* sym;
1851da177e4SLinus Torvalds 	struct property *prop;
1861da177e4SLinus Torvalds 	QString prompt;
1871da177e4SLinus Torvalds 	int type;
1881da177e4SLinus Torvalds 	tristate expr;
1891da177e4SLinus Torvalds 
1901da177e4SLinus Torvalds 	list = listView();
1911da177e4SLinus Torvalds 	if (goParent) {
1921da177e4SLinus Torvalds 		setPixmap(promptColIdx, list->menuBackPix);
1931da177e4SLinus Torvalds 		prompt = "..";
1941da177e4SLinus Torvalds 		goto set_prompt;
1951da177e4SLinus Torvalds 	}
1961da177e4SLinus Torvalds 
1971da177e4SLinus Torvalds 	sym = menu->sym;
1981da177e4SLinus Torvalds 	prop = menu->prompt;
1993b9fa093SArnaldo Carvalho de Melo 	prompt = QString::fromLocal8Bit(menu_get_prompt(menu));
2001da177e4SLinus Torvalds 
2011da177e4SLinus Torvalds 	if (prop) switch (prop->type) {
2021da177e4SLinus Torvalds 	case P_MENU:
2031da177e4SLinus Torvalds 		if (list->mode == singleMode || list->mode == symbolMode) {
2041da177e4SLinus Torvalds 			/* a menuconfig entry is displayed differently
2051da177e4SLinus Torvalds 			 * depending whether it's at the view root or a child.
2061da177e4SLinus Torvalds 			 */
2071da177e4SLinus Torvalds 			if (sym && list->rootEntry == menu)
2081da177e4SLinus Torvalds 				break;
2091da177e4SLinus Torvalds 			setPixmap(promptColIdx, list->menuPix);
2101da177e4SLinus Torvalds 		} else {
2111da177e4SLinus Torvalds 			if (sym)
2121da177e4SLinus Torvalds 				break;
2131da177e4SLinus Torvalds 			setPixmap(promptColIdx, 0);
2141da177e4SLinus Torvalds 		}
2151da177e4SLinus Torvalds 		goto set_prompt;
2161da177e4SLinus Torvalds 	case P_COMMENT:
2171da177e4SLinus Torvalds 		setPixmap(promptColIdx, 0);
2181da177e4SLinus Torvalds 		goto set_prompt;
2191da177e4SLinus Torvalds 	default:
2201da177e4SLinus Torvalds 		;
2211da177e4SLinus Torvalds 	}
2221da177e4SLinus Torvalds 	if (!sym)
2231da177e4SLinus Torvalds 		goto set_prompt;
2241da177e4SLinus Torvalds 
2253b9fa093SArnaldo Carvalho de Melo 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
2261da177e4SLinus Torvalds 
2271da177e4SLinus Torvalds 	type = sym_get_type(sym);
2281da177e4SLinus Torvalds 	switch (type) {
2291da177e4SLinus Torvalds 	case S_BOOLEAN:
2301da177e4SLinus Torvalds 	case S_TRISTATE:
2311da177e4SLinus Torvalds 		char ch;
2321da177e4SLinus Torvalds 
2331da177e4SLinus Torvalds 		if (!sym_is_changable(sym) && !list->showAll) {
2341da177e4SLinus Torvalds 			setPixmap(promptColIdx, 0);
2353b9fa093SArnaldo Carvalho de Melo 			setText(noColIdx, QString::null);
2363b9fa093SArnaldo Carvalho de Melo 			setText(modColIdx, QString::null);
2373b9fa093SArnaldo Carvalho de Melo 			setText(yesColIdx, QString::null);
2381da177e4SLinus Torvalds 			break;
2391da177e4SLinus Torvalds 		}
2401da177e4SLinus Torvalds 		expr = sym_get_tristate_value(sym);
2411da177e4SLinus Torvalds 		switch (expr) {
2421da177e4SLinus Torvalds 		case yes:
2431da177e4SLinus Torvalds 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
2441da177e4SLinus Torvalds 				setPixmap(promptColIdx, list->choiceYesPix);
2451da177e4SLinus Torvalds 			else
2461da177e4SLinus Torvalds 				setPixmap(promptColIdx, list->symbolYesPix);
2471da177e4SLinus Torvalds 			setText(yesColIdx, "Y");
2481da177e4SLinus Torvalds 			ch = 'Y';
2491da177e4SLinus Torvalds 			break;
2501da177e4SLinus Torvalds 		case mod:
2511da177e4SLinus Torvalds 			setPixmap(promptColIdx, list->symbolModPix);
2521da177e4SLinus Torvalds 			setText(modColIdx, "M");
2531da177e4SLinus Torvalds 			ch = 'M';
2541da177e4SLinus Torvalds 			break;
2551da177e4SLinus Torvalds 		default:
2561da177e4SLinus Torvalds 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
2571da177e4SLinus Torvalds 				setPixmap(promptColIdx, list->choiceNoPix);
2581da177e4SLinus Torvalds 			else
2591da177e4SLinus Torvalds 				setPixmap(promptColIdx, list->symbolNoPix);
2601da177e4SLinus Torvalds 			setText(noColIdx, "N");
2611da177e4SLinus Torvalds 			ch = 'N';
2621da177e4SLinus Torvalds 			break;
2631da177e4SLinus Torvalds 		}
2641da177e4SLinus Torvalds 		if (expr != no)
2651da177e4SLinus Torvalds 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
2661da177e4SLinus Torvalds 		if (expr != mod)
2671da177e4SLinus Torvalds 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
2681da177e4SLinus Torvalds 		if (expr != yes)
2691da177e4SLinus Torvalds 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
2701da177e4SLinus Torvalds 
2711da177e4SLinus Torvalds 		setText(dataColIdx, QChar(ch));
2721da177e4SLinus Torvalds 		break;
2731da177e4SLinus Torvalds 	case S_INT:
2741da177e4SLinus Torvalds 	case S_HEX:
2751da177e4SLinus Torvalds 	case S_STRING:
2761da177e4SLinus Torvalds 		const char* data;
2771da177e4SLinus Torvalds 
2781da177e4SLinus Torvalds 		data = sym_get_string_value(sym);
2793b9fa093SArnaldo Carvalho de Melo 
2801da177e4SLinus Torvalds #if QT_VERSION >= 300
2811da177e4SLinus Torvalds 		int i = list->mapIdx(dataColIdx);
2821da177e4SLinus Torvalds 		if (i >= 0)
2831da177e4SLinus Torvalds 			setRenameEnabled(i, TRUE);
2841da177e4SLinus Torvalds #endif
2851da177e4SLinus Torvalds 		setText(dataColIdx, data);
2861da177e4SLinus Torvalds 		if (type == S_STRING)
2873b9fa093SArnaldo Carvalho de Melo 			prompt = QString("%1: %2").arg(prompt).arg(data);
2881da177e4SLinus Torvalds 		else
2893b9fa093SArnaldo Carvalho de Melo 			prompt = QString("(%2) %1").arg(prompt).arg(data);
2901da177e4SLinus Torvalds 		break;
2911da177e4SLinus Torvalds 	}
2921da177e4SLinus Torvalds 	if (!sym_has_value(sym) && visible)
2931da177e4SLinus Torvalds 		prompt += " (NEW)";
2941da177e4SLinus Torvalds set_prompt:
2951da177e4SLinus Torvalds 	setText(promptColIdx, prompt);
2961da177e4SLinus Torvalds }
2971da177e4SLinus Torvalds 
2981da177e4SLinus Torvalds void ConfigItem::testUpdateMenu(bool v)
2991da177e4SLinus Torvalds {
3001da177e4SLinus Torvalds 	ConfigItem* i;
3011da177e4SLinus Torvalds 
3021da177e4SLinus Torvalds 	visible = v;
3031da177e4SLinus Torvalds 	if (!menu)
3041da177e4SLinus Torvalds 		return;
3051da177e4SLinus Torvalds 
3061da177e4SLinus Torvalds 	sym_calc_value(menu->sym);
3071da177e4SLinus Torvalds 	if (menu->flags & MENU_CHANGED) {
3081da177e4SLinus Torvalds 		/* the menu entry changed, so update all list items */
3091da177e4SLinus Torvalds 		menu->flags &= ~MENU_CHANGED;
3101da177e4SLinus Torvalds 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
3111da177e4SLinus Torvalds 			i->updateMenu();
3121da177e4SLinus Torvalds 	} else if (listView()->updateAll)
3131da177e4SLinus Torvalds 		updateMenu();
3141da177e4SLinus Torvalds }
3151da177e4SLinus Torvalds 
3161da177e4SLinus Torvalds void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align)
3171da177e4SLinus Torvalds {
3181da177e4SLinus Torvalds 	ConfigList* list = listView();
3191da177e4SLinus Torvalds 
3201da177e4SLinus Torvalds 	if (visible) {
3211da177e4SLinus Torvalds 		if (isSelected() && !list->hasFocus() && list->mode == menuMode)
3221da177e4SLinus Torvalds 			Parent::paintCell(p, list->inactivedColorGroup, column, width, align);
3231da177e4SLinus Torvalds 		else
3241da177e4SLinus Torvalds 			Parent::paintCell(p, cg, column, width, align);
3251da177e4SLinus Torvalds 	} else
3261da177e4SLinus Torvalds 		Parent::paintCell(p, list->disabledColorGroup, column, width, align);
3271da177e4SLinus Torvalds }
3281da177e4SLinus Torvalds 
3291da177e4SLinus Torvalds /*
3301da177e4SLinus Torvalds  * construct a menu entry
3311da177e4SLinus Torvalds  */
3321da177e4SLinus Torvalds void ConfigItem::init(void)
3331da177e4SLinus Torvalds {
3341da177e4SLinus Torvalds 	if (menu) {
3351da177e4SLinus Torvalds 		ConfigList* list = listView();
3361da177e4SLinus Torvalds 		nextItem = (ConfigItem*)menu->data;
3371da177e4SLinus Torvalds 		menu->data = this;
3381da177e4SLinus Torvalds 
3391da177e4SLinus Torvalds 		if (list->mode != fullMode)
3401da177e4SLinus Torvalds 			setOpen(TRUE);
3411da177e4SLinus Torvalds 		sym_calc_value(menu->sym);
3421da177e4SLinus Torvalds 	}
3431da177e4SLinus Torvalds 	updateMenu();
3441da177e4SLinus Torvalds }
3451da177e4SLinus Torvalds 
3461da177e4SLinus Torvalds /*
3471da177e4SLinus Torvalds  * destruct a menu entry
3481da177e4SLinus Torvalds  */
3491da177e4SLinus Torvalds ConfigItem::~ConfigItem(void)
3501da177e4SLinus Torvalds {
3511da177e4SLinus Torvalds 	if (menu) {
3521da177e4SLinus Torvalds 		ConfigItem** ip = (ConfigItem**)&menu->data;
3531da177e4SLinus Torvalds 		for (; *ip; ip = &(*ip)->nextItem) {
3541da177e4SLinus Torvalds 			if (*ip == this) {
3551da177e4SLinus Torvalds 				*ip = nextItem;
3561da177e4SLinus Torvalds 				break;
3571da177e4SLinus Torvalds 			}
3581da177e4SLinus Torvalds 		}
3591da177e4SLinus Torvalds 	}
3601da177e4SLinus Torvalds }
3611da177e4SLinus Torvalds 
36243bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
36343bf612aSRoman Zippel 	: Parent(parent)
36443bf612aSRoman Zippel {
36543bf612aSRoman Zippel 	connect(this, SIGNAL(lostFocus()), SLOT(hide()));
36643bf612aSRoman Zippel }
36743bf612aSRoman Zippel 
3681da177e4SLinus Torvalds void ConfigLineEdit::show(ConfigItem* i)
3691da177e4SLinus Torvalds {
3701da177e4SLinus Torvalds 	item = i;
3711da177e4SLinus Torvalds 	if (sym_get_string_value(item->menu->sym))
3723b9fa093SArnaldo Carvalho de Melo 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
3731da177e4SLinus Torvalds 	else
3743b9fa093SArnaldo Carvalho de Melo 		setText(QString::null);
3751da177e4SLinus Torvalds 	Parent::show();
3761da177e4SLinus Torvalds 	setFocus();
3771da177e4SLinus Torvalds }
3781da177e4SLinus Torvalds 
3791da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
3801da177e4SLinus Torvalds {
3811da177e4SLinus Torvalds 	switch (e->key()) {
3821da177e4SLinus Torvalds 	case Key_Escape:
3831da177e4SLinus Torvalds 		break;
3841da177e4SLinus Torvalds 	case Key_Return:
3851da177e4SLinus Torvalds 	case Key_Enter:
3861da177e4SLinus Torvalds 		sym_set_string_value(item->menu->sym, text().latin1());
3871da177e4SLinus Torvalds 		parent()->updateList(item);
3881da177e4SLinus Torvalds 		break;
3891da177e4SLinus Torvalds 	default:
3901da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
3911da177e4SLinus Torvalds 		return;
3921da177e4SLinus Torvalds 	}
3931da177e4SLinus Torvalds 	e->accept();
3941da177e4SLinus Torvalds 	parent()->list->setFocus();
3951da177e4SLinus Torvalds 	hide();
3961da177e4SLinus Torvalds }
3971da177e4SLinus Torvalds 
39843bf612aSRoman Zippel ConfigList::ConfigList(ConfigView* p, ConfigSettings* configSettings)
39943bf612aSRoman Zippel 	: Parent(p),
4001da177e4SLinus Torvalds 	  updateAll(false),
4011da177e4SLinus Torvalds 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
4021da177e4SLinus Torvalds 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
4031da177e4SLinus Torvalds 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
4041da177e4SLinus Torvalds 	  showAll(false), showName(false), showRange(false), showData(false),
4051da177e4SLinus Torvalds 	  rootEntry(0)
4061da177e4SLinus Torvalds {
4071da177e4SLinus Torvalds 	int i;
4081da177e4SLinus Torvalds 
4091da177e4SLinus Torvalds 	setSorting(-1);
4101da177e4SLinus Torvalds 	setRootIsDecorated(TRUE);
4111da177e4SLinus Torvalds 	disabledColorGroup = palette().active();
4121da177e4SLinus Torvalds 	disabledColorGroup.setColor(QColorGroup::Text, palette().disabled().text());
4131da177e4SLinus Torvalds 	inactivedColorGroup = palette().active();
4141da177e4SLinus Torvalds 	inactivedColorGroup.setColor(QColorGroup::Highlight, palette().disabled().highlight());
4151da177e4SLinus Torvalds 
4161da177e4SLinus Torvalds 	connect(this, SIGNAL(selectionChanged(void)),
4171da177e4SLinus Torvalds 		SLOT(updateSelection(void)));
4181da177e4SLinus Torvalds 
4191da177e4SLinus Torvalds 	if (configSettings) {
4201da177e4SLinus Torvalds 		showAll = configSettings->showAll;
4211da177e4SLinus Torvalds 		showName = configSettings->showName;
4221da177e4SLinus Torvalds 		showRange = configSettings->showRange;
4231da177e4SLinus Torvalds 		showData = configSettings->showData;
4241da177e4SLinus Torvalds 	}
4251da177e4SLinus Torvalds 
4261da177e4SLinus Torvalds 	for (i = 0; i < colNr; i++)
4271da177e4SLinus Torvalds 		colMap[i] = colRevMap[i] = -1;
4281da177e4SLinus Torvalds 	addColumn(promptColIdx, "Option");
4291da177e4SLinus Torvalds 
4301da177e4SLinus Torvalds 	reinit();
4311da177e4SLinus Torvalds }
4321da177e4SLinus Torvalds 
4331da177e4SLinus Torvalds void ConfigList::reinit(void)
4341da177e4SLinus Torvalds {
4351da177e4SLinus Torvalds 	removeColumn(dataColIdx);
4361da177e4SLinus Torvalds 	removeColumn(yesColIdx);
4371da177e4SLinus Torvalds 	removeColumn(modColIdx);
4381da177e4SLinus Torvalds 	removeColumn(noColIdx);
4391da177e4SLinus Torvalds 	removeColumn(nameColIdx);
4401da177e4SLinus Torvalds 
4411da177e4SLinus Torvalds 	if (showName)
4421da177e4SLinus Torvalds 		addColumn(nameColIdx, "Name");
4431da177e4SLinus Torvalds 	if (showRange) {
4441da177e4SLinus Torvalds 		addColumn(noColIdx, "N");
4451da177e4SLinus Torvalds 		addColumn(modColIdx, "M");
4461da177e4SLinus Torvalds 		addColumn(yesColIdx, "Y");
4471da177e4SLinus Torvalds 	}
4481da177e4SLinus Torvalds 	if (showData)
4491da177e4SLinus Torvalds 		addColumn(dataColIdx, "Value");
4501da177e4SLinus Torvalds 
4511da177e4SLinus Torvalds 	updateListAll();
4521da177e4SLinus Torvalds }
4531da177e4SLinus Torvalds 
4541da177e4SLinus Torvalds void ConfigList::updateSelection(void)
4551da177e4SLinus Torvalds {
4561da177e4SLinus Torvalds 	struct menu *menu;
4571da177e4SLinus Torvalds 	enum prop_type type;
4581da177e4SLinus Torvalds 
4591da177e4SLinus Torvalds 	ConfigItem* item = (ConfigItem*)selectedItem();
4601da177e4SLinus Torvalds 	if (!item)
4611da177e4SLinus Torvalds 		return;
4621da177e4SLinus Torvalds 
4631da177e4SLinus Torvalds 	menu = item->menu;
46443bf612aSRoman Zippel 	emit menuChanged(menu);
4651da177e4SLinus Torvalds 	if (!menu)
4661da177e4SLinus Torvalds 		return;
4671da177e4SLinus Torvalds 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
4681da177e4SLinus Torvalds 	if (mode == menuMode && type == P_MENU)
4691da177e4SLinus Torvalds 		emit menuSelected(menu);
4701da177e4SLinus Torvalds }
4711da177e4SLinus Torvalds 
4721da177e4SLinus Torvalds void ConfigList::updateList(ConfigItem* item)
4731da177e4SLinus Torvalds {
4741da177e4SLinus Torvalds 	ConfigItem* last = 0;
4751da177e4SLinus Torvalds 
47643bf612aSRoman Zippel 	if (!rootEntry) {
47743bf612aSRoman Zippel 		if (mode != listMode)
4781da177e4SLinus Torvalds 			goto update;
47943bf612aSRoman Zippel 		QListViewItemIterator it(this);
48043bf612aSRoman Zippel 		ConfigItem* item;
48143bf612aSRoman Zippel 
48243bf612aSRoman Zippel 		for (; it.current(); ++it) {
48343bf612aSRoman Zippel 			item = (ConfigItem*)it.current();
48443bf612aSRoman Zippel 			if (!item->menu)
48543bf612aSRoman Zippel 				continue;
48643bf612aSRoman Zippel 			item->testUpdateMenu(menu_is_visible(item->menu));
48743bf612aSRoman Zippel 		}
48843bf612aSRoman Zippel 		return;
48943bf612aSRoman Zippel 	}
4901da177e4SLinus Torvalds 
4911da177e4SLinus Torvalds 	if (rootEntry != &rootmenu && (mode == singleMode ||
4921da177e4SLinus Torvalds 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
4931da177e4SLinus Torvalds 		item = firstChild();
4941da177e4SLinus Torvalds 		if (!item)
4951da177e4SLinus Torvalds 			item = new ConfigItem(this, 0, true);
4961da177e4SLinus Torvalds 		last = item;
4971da177e4SLinus Torvalds 	}
4981da177e4SLinus Torvalds 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
4991da177e4SLinus Torvalds 	    rootEntry->sym && rootEntry->prompt) {
5001da177e4SLinus Torvalds 		item = last ? last->nextSibling() : firstChild();
5011da177e4SLinus Torvalds 		if (!item)
5021da177e4SLinus Torvalds 			item = new ConfigItem(this, last, rootEntry, true);
5031da177e4SLinus Torvalds 		else
5041da177e4SLinus Torvalds 			item->testUpdateMenu(true);
5051da177e4SLinus Torvalds 
5061da177e4SLinus Torvalds 		updateMenuList(item, rootEntry);
5071da177e4SLinus Torvalds 		triggerUpdate();
5081da177e4SLinus Torvalds 		return;
5091da177e4SLinus Torvalds 	}
5101da177e4SLinus Torvalds update:
5111da177e4SLinus Torvalds 	updateMenuList(this, rootEntry);
5121da177e4SLinus Torvalds 	triggerUpdate();
5131da177e4SLinus Torvalds }
5141da177e4SLinus Torvalds 
5151da177e4SLinus Torvalds void ConfigList::setAllOpen(bool open)
5161da177e4SLinus Torvalds {
5171da177e4SLinus Torvalds 	QListViewItemIterator it(this);
5181da177e4SLinus Torvalds 
5191da177e4SLinus Torvalds 	for (; it.current(); it++)
5201da177e4SLinus Torvalds 		it.current()->setOpen(open);
5211da177e4SLinus Torvalds }
5221da177e4SLinus Torvalds 
5231da177e4SLinus Torvalds void ConfigList::setValue(ConfigItem* item, tristate val)
5241da177e4SLinus Torvalds {
5251da177e4SLinus Torvalds 	struct symbol* sym;
5261da177e4SLinus Torvalds 	int type;
5271da177e4SLinus Torvalds 	tristate oldval;
5281da177e4SLinus Torvalds 
5291da177e4SLinus Torvalds 	sym = item->menu ? item->menu->sym : 0;
5301da177e4SLinus Torvalds 	if (!sym)
5311da177e4SLinus Torvalds 		return;
5321da177e4SLinus Torvalds 
5331da177e4SLinus Torvalds 	type = sym_get_type(sym);
5341da177e4SLinus Torvalds 	switch (type) {
5351da177e4SLinus Torvalds 	case S_BOOLEAN:
5361da177e4SLinus Torvalds 	case S_TRISTATE:
5371da177e4SLinus Torvalds 		oldval = sym_get_tristate_value(sym);
5381da177e4SLinus Torvalds 
5391da177e4SLinus Torvalds 		if (!sym_set_tristate_value(sym, val))
5401da177e4SLinus Torvalds 			return;
5411da177e4SLinus Torvalds 		if (oldval == no && item->menu->list)
5421da177e4SLinus Torvalds 			item->setOpen(TRUE);
5431da177e4SLinus Torvalds 		parent()->updateList(item);
5441da177e4SLinus Torvalds 		break;
5451da177e4SLinus Torvalds 	}
5461da177e4SLinus Torvalds }
5471da177e4SLinus Torvalds 
5481da177e4SLinus Torvalds void ConfigList::changeValue(ConfigItem* item)
5491da177e4SLinus Torvalds {
5501da177e4SLinus Torvalds 	struct symbol* sym;
5511da177e4SLinus Torvalds 	struct menu* menu;
5521da177e4SLinus Torvalds 	int type, oldexpr, newexpr;
5531da177e4SLinus Torvalds 
5541da177e4SLinus Torvalds 	menu = item->menu;
5551da177e4SLinus Torvalds 	if (!menu)
5561da177e4SLinus Torvalds 		return;
5571da177e4SLinus Torvalds 	sym = menu->sym;
5581da177e4SLinus Torvalds 	if (!sym) {
5591da177e4SLinus Torvalds 		if (item->menu->list)
5601da177e4SLinus Torvalds 			item->setOpen(!item->isOpen());
5611da177e4SLinus Torvalds 		return;
5621da177e4SLinus Torvalds 	}
5631da177e4SLinus Torvalds 
5641da177e4SLinus Torvalds 	type = sym_get_type(sym);
5651da177e4SLinus Torvalds 	switch (type) {
5661da177e4SLinus Torvalds 	case S_BOOLEAN:
5671da177e4SLinus Torvalds 	case S_TRISTATE:
5681da177e4SLinus Torvalds 		oldexpr = sym_get_tristate_value(sym);
5691da177e4SLinus Torvalds 		newexpr = sym_toggle_tristate_value(sym);
5701da177e4SLinus Torvalds 		if (item->menu->list) {
5711da177e4SLinus Torvalds 			if (oldexpr == newexpr)
5721da177e4SLinus Torvalds 				item->setOpen(!item->isOpen());
5731da177e4SLinus Torvalds 			else if (oldexpr == no)
5741da177e4SLinus Torvalds 				item->setOpen(TRUE);
5751da177e4SLinus Torvalds 		}
5761da177e4SLinus Torvalds 		if (oldexpr != newexpr)
5771da177e4SLinus Torvalds 			parent()->updateList(item);
5781da177e4SLinus Torvalds 		break;
5791da177e4SLinus Torvalds 	case S_INT:
5801da177e4SLinus Torvalds 	case S_HEX:
5811da177e4SLinus Torvalds 	case S_STRING:
5821da177e4SLinus Torvalds #if QT_VERSION >= 300
5831da177e4SLinus Torvalds 		if (colMap[dataColIdx] >= 0)
5841da177e4SLinus Torvalds 			item->startRename(colMap[dataColIdx]);
5851da177e4SLinus Torvalds 		else
5861da177e4SLinus Torvalds #endif
5871da177e4SLinus Torvalds 			parent()->lineEdit->show(item);
5881da177e4SLinus Torvalds 		break;
5891da177e4SLinus Torvalds 	}
5901da177e4SLinus Torvalds }
5911da177e4SLinus Torvalds 
5921da177e4SLinus Torvalds void ConfigList::setRootMenu(struct menu *menu)
5931da177e4SLinus Torvalds {
5941da177e4SLinus Torvalds 	enum prop_type type;
5951da177e4SLinus Torvalds 
5961da177e4SLinus Torvalds 	if (rootEntry == menu)
5971da177e4SLinus Torvalds 		return;
5981da177e4SLinus Torvalds 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
5991da177e4SLinus Torvalds 	if (type != P_MENU)
6001da177e4SLinus Torvalds 		return;
6011da177e4SLinus Torvalds 	updateMenuList(this, 0);
6021da177e4SLinus Torvalds 	rootEntry = menu;
6031da177e4SLinus Torvalds 	updateListAll();
6041da177e4SLinus Torvalds 	setSelected(currentItem(), hasFocus());
6051da177e4SLinus Torvalds }
6061da177e4SLinus Torvalds 
6071da177e4SLinus Torvalds void ConfigList::setParentMenu(void)
6081da177e4SLinus Torvalds {
6091da177e4SLinus Torvalds 	ConfigItem* item;
6101da177e4SLinus Torvalds 	struct menu *oldroot;
6111da177e4SLinus Torvalds 
6121da177e4SLinus Torvalds 	oldroot = rootEntry;
6131da177e4SLinus Torvalds 	if (rootEntry == &rootmenu)
6141da177e4SLinus Torvalds 		return;
6151da177e4SLinus Torvalds 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
6161da177e4SLinus Torvalds 
6171da177e4SLinus Torvalds 	QListViewItemIterator it(this);
6181da177e4SLinus Torvalds 	for (; (item = (ConfigItem*)it.current()); it++) {
6191da177e4SLinus Torvalds 		if (item->menu == oldroot) {
6201da177e4SLinus Torvalds 			setCurrentItem(item);
6211da177e4SLinus Torvalds 			ensureItemVisible(item);
6221da177e4SLinus Torvalds 			break;
6231da177e4SLinus Torvalds 		}
6241da177e4SLinus Torvalds 	}
6251da177e4SLinus Torvalds }
6261da177e4SLinus Torvalds 
6271da177e4SLinus Torvalds void ConfigList::keyPressEvent(QKeyEvent* ev)
6281da177e4SLinus Torvalds {
6291da177e4SLinus Torvalds 	QListViewItem* i = currentItem();
6301da177e4SLinus Torvalds 	ConfigItem* item;
6311da177e4SLinus Torvalds 	struct menu *menu;
6321da177e4SLinus Torvalds 	enum prop_type type;
6331da177e4SLinus Torvalds 
63443bf612aSRoman Zippel 	if (ev->key() == Key_Escape && mode != fullMode && mode != listMode) {
6351da177e4SLinus Torvalds 		emit parentSelected();
6361da177e4SLinus Torvalds 		ev->accept();
6371da177e4SLinus Torvalds 		return;
6381da177e4SLinus Torvalds 	}
6391da177e4SLinus Torvalds 
6401da177e4SLinus Torvalds 	if (!i) {
6411da177e4SLinus Torvalds 		Parent::keyPressEvent(ev);
6421da177e4SLinus Torvalds 		return;
6431da177e4SLinus Torvalds 	}
6441da177e4SLinus Torvalds 	item = (ConfigItem*)i;
6451da177e4SLinus Torvalds 
6461da177e4SLinus Torvalds 	switch (ev->key()) {
6471da177e4SLinus Torvalds 	case Key_Return:
6481da177e4SLinus Torvalds 	case Key_Enter:
6491da177e4SLinus Torvalds 		if (item->goParent) {
6501da177e4SLinus Torvalds 			emit parentSelected();
6511da177e4SLinus Torvalds 			break;
6521da177e4SLinus Torvalds 		}
6531da177e4SLinus Torvalds 		menu = item->menu;
6541da177e4SLinus Torvalds 		if (!menu)
6551da177e4SLinus Torvalds 			break;
6561da177e4SLinus Torvalds 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
6571da177e4SLinus Torvalds 		if (type == P_MENU && rootEntry != menu &&
6581da177e4SLinus Torvalds 		    mode != fullMode && mode != menuMode) {
6591da177e4SLinus Torvalds 			emit menuSelected(menu);
6601da177e4SLinus Torvalds 			break;
6611da177e4SLinus Torvalds 		}
6621da177e4SLinus Torvalds 	case Key_Space:
6631da177e4SLinus Torvalds 		changeValue(item);
6641da177e4SLinus Torvalds 		break;
6651da177e4SLinus Torvalds 	case Key_N:
6661da177e4SLinus Torvalds 		setValue(item, no);
6671da177e4SLinus Torvalds 		break;
6681da177e4SLinus Torvalds 	case Key_M:
6691da177e4SLinus Torvalds 		setValue(item, mod);
6701da177e4SLinus Torvalds 		break;
6711da177e4SLinus Torvalds 	case Key_Y:
6721da177e4SLinus Torvalds 		setValue(item, yes);
6731da177e4SLinus Torvalds 		break;
6741da177e4SLinus Torvalds 	default:
6751da177e4SLinus Torvalds 		Parent::keyPressEvent(ev);
6761da177e4SLinus Torvalds 		return;
6771da177e4SLinus Torvalds 	}
6781da177e4SLinus Torvalds 	ev->accept();
6791da177e4SLinus Torvalds }
6801da177e4SLinus Torvalds 
6811da177e4SLinus Torvalds void ConfigList::contentsMousePressEvent(QMouseEvent* e)
6821da177e4SLinus Torvalds {
6831da177e4SLinus Torvalds 	//QPoint p(contentsToViewport(e->pos()));
6841da177e4SLinus Torvalds 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
6851da177e4SLinus Torvalds 	Parent::contentsMousePressEvent(e);
6861da177e4SLinus Torvalds }
6871da177e4SLinus Torvalds 
6881da177e4SLinus Torvalds void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e)
6891da177e4SLinus Torvalds {
6901da177e4SLinus Torvalds 	QPoint p(contentsToViewport(e->pos()));
6911da177e4SLinus Torvalds 	ConfigItem* item = (ConfigItem*)itemAt(p);
6921da177e4SLinus Torvalds 	struct menu *menu;
6931da177e4SLinus Torvalds 	enum prop_type ptype;
6941da177e4SLinus Torvalds 	const QPixmap* pm;
6951da177e4SLinus Torvalds 	int idx, x;
6961da177e4SLinus Torvalds 
6971da177e4SLinus Torvalds 	if (!item)
6981da177e4SLinus Torvalds 		goto skip;
6991da177e4SLinus Torvalds 
7001da177e4SLinus Torvalds 	menu = item->menu;
7011da177e4SLinus Torvalds 	x = header()->offset() + p.x();
7021da177e4SLinus Torvalds 	idx = colRevMap[header()->sectionAt(x)];
7031da177e4SLinus Torvalds 	switch (idx) {
7041da177e4SLinus Torvalds 	case promptColIdx:
7051da177e4SLinus Torvalds 		pm = item->pixmap(promptColIdx);
7061da177e4SLinus Torvalds 		if (pm) {
7071da177e4SLinus Torvalds 			int off = header()->sectionPos(0) + itemMargin() +
7081da177e4SLinus Torvalds 				treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0));
7091da177e4SLinus Torvalds 			if (x >= off && x < off + pm->width()) {
7101da177e4SLinus Torvalds 				if (item->goParent) {
7111da177e4SLinus Torvalds 					emit parentSelected();
7121da177e4SLinus Torvalds 					break;
7131da177e4SLinus Torvalds 				} else if (!menu)
7141da177e4SLinus Torvalds 					break;
7151da177e4SLinus Torvalds 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
7161da177e4SLinus Torvalds 				if (ptype == P_MENU && rootEntry != menu &&
7171da177e4SLinus Torvalds 				    mode != fullMode && mode != menuMode)
7181da177e4SLinus Torvalds 					emit menuSelected(menu);
7191da177e4SLinus Torvalds 				else
7201da177e4SLinus Torvalds 					changeValue(item);
7211da177e4SLinus Torvalds 			}
7221da177e4SLinus Torvalds 		}
7231da177e4SLinus Torvalds 		break;
7241da177e4SLinus Torvalds 	case noColIdx:
7251da177e4SLinus Torvalds 		setValue(item, no);
7261da177e4SLinus Torvalds 		break;
7271da177e4SLinus Torvalds 	case modColIdx:
7281da177e4SLinus Torvalds 		setValue(item, mod);
7291da177e4SLinus Torvalds 		break;
7301da177e4SLinus Torvalds 	case yesColIdx:
7311da177e4SLinus Torvalds 		setValue(item, yes);
7321da177e4SLinus Torvalds 		break;
7331da177e4SLinus Torvalds 	case dataColIdx:
7341da177e4SLinus Torvalds 		changeValue(item);
7351da177e4SLinus Torvalds 		break;
7361da177e4SLinus Torvalds 	}
7371da177e4SLinus Torvalds 
7381da177e4SLinus Torvalds skip:
7391da177e4SLinus Torvalds 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
7401da177e4SLinus Torvalds 	Parent::contentsMouseReleaseEvent(e);
7411da177e4SLinus Torvalds }
7421da177e4SLinus Torvalds 
7431da177e4SLinus Torvalds void ConfigList::contentsMouseMoveEvent(QMouseEvent* e)
7441da177e4SLinus Torvalds {
7451da177e4SLinus Torvalds 	//QPoint p(contentsToViewport(e->pos()));
7461da177e4SLinus Torvalds 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
7471da177e4SLinus Torvalds 	Parent::contentsMouseMoveEvent(e);
7481da177e4SLinus Torvalds }
7491da177e4SLinus Torvalds 
7501da177e4SLinus Torvalds void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
7511da177e4SLinus Torvalds {
7521da177e4SLinus Torvalds 	QPoint p(contentsToViewport(e->pos()));
7531da177e4SLinus Torvalds 	ConfigItem* item = (ConfigItem*)itemAt(p);
7541da177e4SLinus Torvalds 	struct menu *menu;
7551da177e4SLinus Torvalds 	enum prop_type ptype;
7561da177e4SLinus Torvalds 
7571da177e4SLinus Torvalds 	if (!item)
7581da177e4SLinus Torvalds 		goto skip;
7591da177e4SLinus Torvalds 	if (item->goParent) {
7601da177e4SLinus Torvalds 		emit parentSelected();
7611da177e4SLinus Torvalds 		goto skip;
7621da177e4SLinus Torvalds 	}
7631da177e4SLinus Torvalds 	menu = item->menu;
7641da177e4SLinus Torvalds 	if (!menu)
7651da177e4SLinus Torvalds 		goto skip;
7661da177e4SLinus Torvalds 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
7671da177e4SLinus Torvalds 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
7681da177e4SLinus Torvalds 		emit menuSelected(menu);
7691da177e4SLinus Torvalds 	else if (menu->sym)
7701da177e4SLinus Torvalds 		changeValue(item);
7711da177e4SLinus Torvalds 
7721da177e4SLinus Torvalds skip:
7731da177e4SLinus Torvalds 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
7741da177e4SLinus Torvalds 	Parent::contentsMouseDoubleClickEvent(e);
7751da177e4SLinus Torvalds }
7761da177e4SLinus Torvalds 
7771da177e4SLinus Torvalds void ConfigList::focusInEvent(QFocusEvent *e)
7781da177e4SLinus Torvalds {
7791da177e4SLinus Torvalds 	Parent::focusInEvent(e);
7801da177e4SLinus Torvalds 
7811da177e4SLinus Torvalds 	QListViewItem* item = currentItem();
7821da177e4SLinus Torvalds 	if (!item)
7831da177e4SLinus Torvalds 		return;
7841da177e4SLinus Torvalds 
7851da177e4SLinus Torvalds 	setSelected(item, TRUE);
7861da177e4SLinus Torvalds 	emit gotFocus();
7871da177e4SLinus Torvalds }
7881da177e4SLinus Torvalds 
7891da177e4SLinus Torvalds ConfigView* ConfigView::viewList;
7901da177e4SLinus Torvalds 
79143bf612aSRoman Zippel ConfigView::ConfigView(QWidget* parent, ConfigSettings *configSettings)
7921da177e4SLinus Torvalds 	: Parent(parent)
7931da177e4SLinus Torvalds {
79443bf612aSRoman Zippel 	list = new ConfigList(this, configSettings);
7951da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
7961da177e4SLinus Torvalds 	lineEdit->hide();
7971da177e4SLinus Torvalds 
7981da177e4SLinus Torvalds 	this->nextView = viewList;
7991da177e4SLinus Torvalds 	viewList = this;
8001da177e4SLinus Torvalds }
8011da177e4SLinus Torvalds 
8021da177e4SLinus Torvalds ConfigView::~ConfigView(void)
8031da177e4SLinus Torvalds {
8041da177e4SLinus Torvalds 	ConfigView** vp;
8051da177e4SLinus Torvalds 
8061da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
8071da177e4SLinus Torvalds 		if (*vp == this) {
8081da177e4SLinus Torvalds 			*vp = nextView;
8091da177e4SLinus Torvalds 			break;
8101da177e4SLinus Torvalds 		}
8111da177e4SLinus Torvalds 	}
8121da177e4SLinus Torvalds }
8131da177e4SLinus Torvalds 
8141da177e4SLinus Torvalds void ConfigView::updateList(ConfigItem* item)
8151da177e4SLinus Torvalds {
8161da177e4SLinus Torvalds 	ConfigView* v;
8171da177e4SLinus Torvalds 
8181da177e4SLinus Torvalds 	for (v = viewList; v; v = v->nextView)
8191da177e4SLinus Torvalds 		v->list->updateList(item);
8201da177e4SLinus Torvalds }
8211da177e4SLinus Torvalds 
8221da177e4SLinus Torvalds void ConfigView::updateListAll(void)
8231da177e4SLinus Torvalds {
8241da177e4SLinus Torvalds 	ConfigView* v;
8251da177e4SLinus Torvalds 
8261da177e4SLinus Torvalds 	for (v = viewList; v; v = v->nextView)
8271da177e4SLinus Torvalds 		v->list->updateListAll();
8281da177e4SLinus Torvalds }
8291da177e4SLinus Torvalds 
83043bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
83143bf612aSRoman Zippel 	: Parent(parent, name), menu(0)
8321da177e4SLinus Torvalds {
8331da177e4SLinus Torvalds }
8341da177e4SLinus Torvalds 
83543bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
8361da177e4SLinus Torvalds {
83743bf612aSRoman Zippel 	if (_showDebug != b) {
83843bf612aSRoman Zippel 		_showDebug = b;
83943bf612aSRoman Zippel 		if (menu)
84043bf612aSRoman Zippel 			menuInfo();
84143bf612aSRoman Zippel 		emit showDebugChanged(b);
8421da177e4SLinus Torvalds 	}
8431da177e4SLinus Torvalds }
8441da177e4SLinus Torvalds 
84543bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
8461da177e4SLinus Torvalds {
84743bf612aSRoman Zippel 	menu = m;
84843bf612aSRoman Zippel 	if (!menu)
84943bf612aSRoman Zippel 		clear();
85043bf612aSRoman Zippel 	else
85143bf612aSRoman Zippel 		menuInfo();
8521da177e4SLinus Torvalds }
8531da177e4SLinus Torvalds 
85443bf612aSRoman Zippel void ConfigInfoView::setSource(const QString& name)
85543bf612aSRoman Zippel {
85643bf612aSRoman Zippel 	const char *p = name.latin1();
85743bf612aSRoman Zippel 
85843bf612aSRoman Zippel 	menu = NULL;
85943bf612aSRoman Zippel 
86043bf612aSRoman Zippel 	switch (p[0]) {
86143bf612aSRoman Zippel 	case 'm':
86243bf612aSRoman Zippel 		if (sscanf(p, "m%p", &menu) == 1)
86343bf612aSRoman Zippel 			menuInfo();
86443bf612aSRoman Zippel 		break;
86543bf612aSRoman Zippel 	}
86643bf612aSRoman Zippel }
86743bf612aSRoman Zippel 
86843bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
8691da177e4SLinus Torvalds {
8701da177e4SLinus Torvalds 	struct symbol* sym;
8711da177e4SLinus Torvalds 	QString head, debug, help;
87243bf612aSRoman Zippel 
8731da177e4SLinus Torvalds 	sym = menu->sym;
8741da177e4SLinus Torvalds 	if (sym) {
8751da177e4SLinus Torvalds 		if (menu->prompt) {
8761da177e4SLinus Torvalds 			head += "<big><b>";
8773b9fa093SArnaldo Carvalho de Melo 			head += print_filter(_(menu->prompt->text));
8781da177e4SLinus Torvalds 			head += "</b></big>";
8791da177e4SLinus Torvalds 			if (sym->name) {
8801da177e4SLinus Torvalds 				head += " (";
88143bf612aSRoman Zippel 				head += print_filter(sym->name);
8821da177e4SLinus Torvalds 				head += ")";
8831da177e4SLinus Torvalds 			}
8841da177e4SLinus Torvalds 		} else if (sym->name) {
8851da177e4SLinus Torvalds 			head += "<big><b>";
88643bf612aSRoman Zippel 			head += print_filter(sym->name);
8871da177e4SLinus Torvalds 			head += "</b></big>";
8881da177e4SLinus Torvalds 		}
8891da177e4SLinus Torvalds 		head += "<br><br>";
8901da177e4SLinus Torvalds 
89143bf612aSRoman Zippel 		if (showDebug())
89243bf612aSRoman Zippel 			debug = debug_info(sym);
89343bf612aSRoman Zippel 
89443bf612aSRoman Zippel 		help = print_filter(_(sym->help));
89543bf612aSRoman Zippel 	} else if (menu->prompt) {
89643bf612aSRoman Zippel 		head += "<big><b>";
89743bf612aSRoman Zippel 		head += print_filter(_(menu->prompt->text));
89843bf612aSRoman Zippel 		head += "</b></big><br><br>";
89943bf612aSRoman Zippel 		if (showDebug()) {
90043bf612aSRoman Zippel 			if (menu->prompt->visible.expr) {
90143bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
90243bf612aSRoman Zippel 				expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
90343bf612aSRoman Zippel 				debug += "<br><br>";
90443bf612aSRoman Zippel 			}
90543bf612aSRoman Zippel 		}
90643bf612aSRoman Zippel 	}
90743bf612aSRoman Zippel 	if (showDebug())
90843bf612aSRoman Zippel 		debug += QString().sprintf("defined at %s:%d<br><br>", menu->file->name, menu->lineno);
90943bf612aSRoman Zippel 
91043bf612aSRoman Zippel 	setText(head + debug + help);
91143bf612aSRoman Zippel }
91243bf612aSRoman Zippel 
91343bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
91443bf612aSRoman Zippel {
91543bf612aSRoman Zippel 	QString debug;
91643bf612aSRoman Zippel 
9171da177e4SLinus Torvalds 	debug += "type: ";
9181da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
9191da177e4SLinus Torvalds 	if (sym_is_choice(sym))
9201da177e4SLinus Torvalds 		debug += " (choice)";
9211da177e4SLinus Torvalds 	debug += "<br>";
9221da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
9231da177e4SLinus Torvalds 		debug += "reverse dep: ";
9241da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
9251da177e4SLinus Torvalds 		debug += "<br>";
9261da177e4SLinus Torvalds 	}
9271da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
9281da177e4SLinus Torvalds 		switch (prop->type) {
9291da177e4SLinus Torvalds 		case P_PROMPT:
9301da177e4SLinus Torvalds 		case P_MENU:
9311da177e4SLinus Torvalds 			debug += "prompt: ";
9323b9fa093SArnaldo Carvalho de Melo 			debug += print_filter(_(prop->text));
9331da177e4SLinus Torvalds 			debug += "<br>";
9341da177e4SLinus Torvalds 			break;
9351da177e4SLinus Torvalds 		case P_DEFAULT:
9361da177e4SLinus Torvalds 			debug += "default: ";
9371da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
9381da177e4SLinus Torvalds 			debug += "<br>";
9391da177e4SLinus Torvalds 			break;
9401da177e4SLinus Torvalds 		case P_CHOICE:
9411da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
9421da177e4SLinus Torvalds 				debug += "choice: ";
9431da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
9441da177e4SLinus Torvalds 				debug += "<br>";
9451da177e4SLinus Torvalds 			}
9461da177e4SLinus Torvalds 			break;
9471da177e4SLinus Torvalds 		case P_SELECT:
9481da177e4SLinus Torvalds 			debug += "select: ";
9491da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
9501da177e4SLinus Torvalds 			debug += "<br>";
9511da177e4SLinus Torvalds 			break;
9521da177e4SLinus Torvalds 		case P_RANGE:
9531da177e4SLinus Torvalds 			debug += "range: ";
9541da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
9551da177e4SLinus Torvalds 			debug += "<br>";
9561da177e4SLinus Torvalds 			break;
9571da177e4SLinus Torvalds 		default:
9581da177e4SLinus Torvalds 			debug += "unknown property: ";
9591da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
9601da177e4SLinus Torvalds 			debug += "<br>";
9611da177e4SLinus Torvalds 		}
9621da177e4SLinus Torvalds 		if (prop->visible.expr) {
9631da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
9641da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
9651da177e4SLinus Torvalds 			debug += "<br>";
9661da177e4SLinus Torvalds 		}
9671da177e4SLinus Torvalds 	}
9681da177e4SLinus Torvalds 	debug += "<br>";
96943bf612aSRoman Zippel 
97043bf612aSRoman Zippel 	return debug;
9711da177e4SLinus Torvalds }
9721da177e4SLinus Torvalds 
97343bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
97443bf612aSRoman Zippel {
97543bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
97643bf612aSRoman Zippel 	QString res = str;
97743bf612aSRoman Zippel 	for (int i = 0; (i = res.find(re, i)) >= 0;) {
97843bf612aSRoman Zippel 		switch (res[i].latin1()) {
97943bf612aSRoman Zippel 		case '<':
98043bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
98143bf612aSRoman Zippel 			i += 4;
98243bf612aSRoman Zippel 			break;
98343bf612aSRoman Zippel 		case '>':
98443bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
98543bf612aSRoman Zippel 			i += 4;
98643bf612aSRoman Zippel 			break;
98743bf612aSRoman Zippel 		case '&':
98843bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
98943bf612aSRoman Zippel 			i += 5;
99043bf612aSRoman Zippel 			break;
99143bf612aSRoman Zippel 		case '"':
99243bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
99343bf612aSRoman Zippel 			i += 6;
99443bf612aSRoman Zippel 			break;
99543bf612aSRoman Zippel 		case '\n':
99643bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
99743bf612aSRoman Zippel 			i += 4;
99843bf612aSRoman Zippel 			break;
9991da177e4SLinus Torvalds 		}
10001da177e4SLinus Torvalds 	}
100143bf612aSRoman Zippel 	return res;
10021da177e4SLinus Torvalds }
100343bf612aSRoman Zippel 
100443bf612aSRoman Zippel void ConfigInfoView::expr_print_help(void *data, const char *str)
100543bf612aSRoman Zippel {
100643bf612aSRoman Zippel 	reinterpret_cast<QString*>(data)->append(print_filter(str));
100743bf612aSRoman Zippel }
100843bf612aSRoman Zippel 
100943bf612aSRoman Zippel ConfigSearchWindow::ConfigSearchWindow(QWidget* parent)
101043bf612aSRoman Zippel 	: Parent(parent), result(NULL)
101143bf612aSRoman Zippel {
101243bf612aSRoman Zippel 	setCaption("Search Config");
101343bf612aSRoman Zippel 
101443bf612aSRoman Zippel 	QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6);
101543bf612aSRoman Zippel 	QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6);
101643bf612aSRoman Zippel 	layout2->addWidget(new QLabel("Find:", this));
101743bf612aSRoman Zippel 	editField = new QLineEdit(this);
101843bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
101943bf612aSRoman Zippel 	layout2->addWidget(editField);
102043bf612aSRoman Zippel 	searchButton = new QPushButton("Search", this);
102143bf612aSRoman Zippel 	searchButton->setAutoDefault(FALSE);
102243bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
102343bf612aSRoman Zippel 	layout2->addWidget(searchButton);
102443bf612aSRoman Zippel 	layout1->addLayout(layout2);
102543bf612aSRoman Zippel 
102643bf612aSRoman Zippel 	QSplitter* split = new QSplitter(this);
102743bf612aSRoman Zippel 	split->setOrientation(QSplitter::Vertical);
102843bf612aSRoman Zippel 	list = new ConfigView(split, NULL);
102943bf612aSRoman Zippel 	list->list->mode = listMode;
103043bf612aSRoman Zippel 	info = new ConfigInfoView(split);
103143bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
103243bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
103343bf612aSRoman Zippel 	layout1->addWidget(split);
103443bf612aSRoman Zippel }
103543bf612aSRoman Zippel 
103643bf612aSRoman Zippel void ConfigSearchWindow::search(void)
103743bf612aSRoman Zippel {
103843bf612aSRoman Zippel 	struct symbol **p;
103943bf612aSRoman Zippel 	struct property *prop;
104043bf612aSRoman Zippel 	ConfigItem *lastItem = NULL;
104143bf612aSRoman Zippel 
104243bf612aSRoman Zippel 	free(result);
104343bf612aSRoman Zippel 	list->list->clear();
104443bf612aSRoman Zippel 
104543bf612aSRoman Zippel 	result = sym_re_search(editField->text().latin1());
104643bf612aSRoman Zippel 	if (!result)
104743bf612aSRoman Zippel 		return;
104843bf612aSRoman Zippel 	for (p = result; *p; p++) {
104943bf612aSRoman Zippel 		for_all_prompts((*p), prop)
105043bf612aSRoman Zippel 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
105143bf612aSRoman Zippel 						  menu_is_visible(prop->menu));
105243bf612aSRoman Zippel 	}
105343bf612aSRoman Zippel }
105443bf612aSRoman Zippel 
105543bf612aSRoman Zippel /*
105643bf612aSRoman Zippel  * Construct the complete config widget
105743bf612aSRoman Zippel  */
105843bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
105943bf612aSRoman Zippel {
106043bf612aSRoman Zippel 	QMenuBar* menu;
106143bf612aSRoman Zippel 	bool ok, showDebug;
106243bf612aSRoman Zippel 	int x, y, width, height;
106343bf612aSRoman Zippel 
106443bf612aSRoman Zippel 	QWidget *d = configApp->desktop();
106543bf612aSRoman Zippel 
106643bf612aSRoman Zippel 	ConfigSettings* configSettings = new ConfigSettings();
106743bf612aSRoman Zippel #if QT_VERSION >= 300
106843bf612aSRoman Zippel 	width = configSettings->readNumEntry("/kconfig/qconf/window width", d->width() - 64);
106943bf612aSRoman Zippel 	height = configSettings->readNumEntry("/kconfig/qconf/window height", d->height() - 64);
107043bf612aSRoman Zippel 	resize(width, height);
107143bf612aSRoman Zippel 	x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok);
107243bf612aSRoman Zippel 	if (ok)
107343bf612aSRoman Zippel 		y = configSettings->readNumEntry("/kconfig/qconf/window y", 0, &ok);
107443bf612aSRoman Zippel 	if (ok)
107543bf612aSRoman Zippel 		move(x, y);
107643bf612aSRoman Zippel 	showDebug = configSettings->readBoolEntry("/kconfig/qconf/showDebug", false);
107743bf612aSRoman Zippel 
107843bf612aSRoman Zippel 	// read list settings into configSettings, will be used later for ConfigList setup
107943bf612aSRoman Zippel 	configSettings->readListSettings();
108043bf612aSRoman Zippel #else
108143bf612aSRoman Zippel 	width = d->width() - 64;
108243bf612aSRoman Zippel 	height = d->height() - 64;
108343bf612aSRoman Zippel 	resize(width, height);
108443bf612aSRoman Zippel 	showDebug = false;
108543bf612aSRoman Zippel #endif
108643bf612aSRoman Zippel 
108743bf612aSRoman Zippel 	split1 = new QSplitter(this);
108843bf612aSRoman Zippel 	split1->setOrientation(QSplitter::Horizontal);
108943bf612aSRoman Zippel 	setCentralWidget(split1);
109043bf612aSRoman Zippel 
109143bf612aSRoman Zippel 	menuView = new ConfigView(split1, configSettings);
109243bf612aSRoman Zippel 	menuList = menuView->list;
109343bf612aSRoman Zippel 
109443bf612aSRoman Zippel 	split2 = new QSplitter(split1);
109543bf612aSRoman Zippel 	split2->setOrientation(QSplitter::Vertical);
109643bf612aSRoman Zippel 
109743bf612aSRoman Zippel 	// create config tree
109843bf612aSRoman Zippel 	configView = new ConfigView(split2, configSettings);
109943bf612aSRoman Zippel 	configList = configView->list;
110043bf612aSRoman Zippel 
110143bf612aSRoman Zippel 	helpText = new ConfigInfoView(split2);
110243bf612aSRoman Zippel 	helpText->setTextFormat(Qt::RichText);
110343bf612aSRoman Zippel 	helpText->setShowDebug(showDebug);
110443bf612aSRoman Zippel 
110543bf612aSRoman Zippel 	setTabOrder(configList, helpText);
110643bf612aSRoman Zippel 	configList->setFocus();
110743bf612aSRoman Zippel 
110843bf612aSRoman Zippel 	menu = menuBar();
110943bf612aSRoman Zippel 	toolBar = new QToolBar("Tools", this);
111043bf612aSRoman Zippel 
111143bf612aSRoman Zippel 	backAction = new QAction("Back", QPixmap(xpm_back), "Back", 0, this);
111243bf612aSRoman Zippel 	  connect(backAction, SIGNAL(activated()), SLOT(goBack()));
111343bf612aSRoman Zippel 	  backAction->setEnabled(FALSE);
111443bf612aSRoman Zippel 	QAction *quitAction = new QAction("Quit", "&Quit", CTRL+Key_Q, this);
111543bf612aSRoman Zippel 	  connect(quitAction, SIGNAL(activated()), SLOT(close()));
111643bf612aSRoman Zippel 	QAction *loadAction = new QAction("Load", QPixmap(xpm_load), "&Load", CTRL+Key_L, this);
111743bf612aSRoman Zippel 	  connect(loadAction, SIGNAL(activated()), SLOT(loadConfig()));
111843bf612aSRoman Zippel 	QAction *saveAction = new QAction("Save", QPixmap(xpm_save), "&Save", CTRL+Key_S, this);
111943bf612aSRoman Zippel 	  connect(saveAction, SIGNAL(activated()), SLOT(saveConfig()));
112043bf612aSRoman Zippel 	QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this);
112143bf612aSRoman Zippel 	  connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
112243bf612aSRoman Zippel 	QAction *searchAction = new QAction("Search", "&Search", CTRL+Key_F, this);
112343bf612aSRoman Zippel 	  connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
112443bf612aSRoman Zippel 	QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this);
112543bf612aSRoman Zippel 	  connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
112643bf612aSRoman Zippel 	QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this);
112743bf612aSRoman Zippel 	  connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView()));
112843bf612aSRoman Zippel 	QAction *fullViewAction = new QAction("Full View", QPixmap(xpm_tree_view), "Full View", 0, this);
112943bf612aSRoman Zippel 	  connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView()));
113043bf612aSRoman Zippel 
113143bf612aSRoman Zippel 	QAction *showNameAction = new QAction(NULL, "Show Name", 0, this);
113243bf612aSRoman Zippel 	  showNameAction->setToggleAction(TRUE);
113343bf612aSRoman Zippel 	  showNameAction->setOn(configList->showName);
113443bf612aSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), SLOT(setShowName(bool)));
113543bf612aSRoman Zippel 	QAction *showRangeAction = new QAction(NULL, "Show Range", 0, this);
113643bf612aSRoman Zippel 	  showRangeAction->setToggleAction(TRUE);
113743bf612aSRoman Zippel 	  showRangeAction->setOn(configList->showRange);
113843bf612aSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), SLOT(setShowRange(bool)));
113943bf612aSRoman Zippel 	QAction *showDataAction = new QAction(NULL, "Show Data", 0, this);
114043bf612aSRoman Zippel 	  showDataAction->setToggleAction(TRUE);
114143bf612aSRoman Zippel 	  showDataAction->setOn(configList->showData);
114243bf612aSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), SLOT(setShowData(bool)));
114343bf612aSRoman Zippel 	QAction *showAllAction = new QAction(NULL, "Show All Options", 0, this);
114443bf612aSRoman Zippel 	  showAllAction->setToggleAction(TRUE);
114543bf612aSRoman Zippel 	  showAllAction->setOn(configList->showAll);
114643bf612aSRoman Zippel 	  connect(showAllAction, SIGNAL(toggled(bool)), SLOT(setShowAll(bool)));
114743bf612aSRoman Zippel 	QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this);
114843bf612aSRoman Zippel 	  showDebugAction->setToggleAction(TRUE);
114943bf612aSRoman Zippel 	  showDebugAction->setOn(showDebug);
115043bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
115143bf612aSRoman Zippel 	  connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool)));
115243bf612aSRoman Zippel 
115343bf612aSRoman Zippel 	QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this);
115443bf612aSRoman Zippel 	  connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro()));
115543bf612aSRoman Zippel 	QAction *showAboutAction = new QAction(NULL, "About", 0, this);
115643bf612aSRoman Zippel 	  connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout()));
115743bf612aSRoman Zippel 
115843bf612aSRoman Zippel 	// init tool bar
115943bf612aSRoman Zippel 	backAction->addTo(toolBar);
116043bf612aSRoman Zippel 	toolBar->addSeparator();
116143bf612aSRoman Zippel 	loadAction->addTo(toolBar);
116243bf612aSRoman Zippel 	saveAction->addTo(toolBar);
116343bf612aSRoman Zippel 	toolBar->addSeparator();
116443bf612aSRoman Zippel 	singleViewAction->addTo(toolBar);
116543bf612aSRoman Zippel 	splitViewAction->addTo(toolBar);
116643bf612aSRoman Zippel 	fullViewAction->addTo(toolBar);
116743bf612aSRoman Zippel 
116843bf612aSRoman Zippel 	// create config menu
116943bf612aSRoman Zippel 	QPopupMenu* config = new QPopupMenu(this);
117043bf612aSRoman Zippel 	menu->insertItem("&File", config);
117143bf612aSRoman Zippel 	loadAction->addTo(config);
117243bf612aSRoman Zippel 	saveAction->addTo(config);
117343bf612aSRoman Zippel 	saveAsAction->addTo(config);
117443bf612aSRoman Zippel 	config->insertSeparator();
117543bf612aSRoman Zippel 	searchAction->addTo(config);
117643bf612aSRoman Zippel 	config->insertSeparator();
117743bf612aSRoman Zippel 	quitAction->addTo(config);
117843bf612aSRoman Zippel 
117943bf612aSRoman Zippel 	// create options menu
118043bf612aSRoman Zippel 	QPopupMenu* optionMenu = new QPopupMenu(this);
118143bf612aSRoman Zippel 	menu->insertItem("&Option", optionMenu);
118243bf612aSRoman Zippel 	showNameAction->addTo(optionMenu);
118343bf612aSRoman Zippel 	showRangeAction->addTo(optionMenu);
118443bf612aSRoman Zippel 	showDataAction->addTo(optionMenu);
118543bf612aSRoman Zippel 	optionMenu->insertSeparator();
118643bf612aSRoman Zippel 	showAllAction->addTo(optionMenu);
118743bf612aSRoman Zippel 	showDebugAction->addTo(optionMenu);
118843bf612aSRoman Zippel 
118943bf612aSRoman Zippel 	// create help menu
119043bf612aSRoman Zippel 	QPopupMenu* helpMenu = new QPopupMenu(this);
119143bf612aSRoman Zippel 	menu->insertSeparator();
119243bf612aSRoman Zippel 	menu->insertItem("&Help", helpMenu);
119343bf612aSRoman Zippel 	showIntroAction->addTo(helpMenu);
119443bf612aSRoman Zippel 	showAboutAction->addTo(helpMenu);
119543bf612aSRoman Zippel 
119643bf612aSRoman Zippel 	connect(configList, SIGNAL(menuChanged(struct menu *)),
119743bf612aSRoman Zippel 		helpText, SLOT(setInfo(struct menu *)));
119843bf612aSRoman Zippel 	connect(configList, SIGNAL(menuSelected(struct menu *)),
119943bf612aSRoman Zippel 		SLOT(changeMenu(struct menu *)));
120043bf612aSRoman Zippel 	connect(configList, SIGNAL(parentSelected()),
120143bf612aSRoman Zippel 		SLOT(goBack()));
120243bf612aSRoman Zippel 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
120343bf612aSRoman Zippel 		helpText, SLOT(setInfo(struct menu *)));
120443bf612aSRoman Zippel 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
120543bf612aSRoman Zippel 		SLOT(changeMenu(struct menu *)));
120643bf612aSRoman Zippel 
120743bf612aSRoman Zippel 	connect(configList, SIGNAL(gotFocus(void)),
120843bf612aSRoman Zippel 		SLOT(listFocusChanged(void)));
120943bf612aSRoman Zippel 	connect(menuList, SIGNAL(gotFocus(void)),
121043bf612aSRoman Zippel 		SLOT(listFocusChanged(void)));
121143bf612aSRoman Zippel 
121243bf612aSRoman Zippel #if QT_VERSION >= 300
121343bf612aSRoman Zippel 	QString listMode = configSettings->readEntry("/kconfig/qconf/listMode", "symbol");
121443bf612aSRoman Zippel 	if (listMode == "single")
121543bf612aSRoman Zippel 		showSingleView();
121643bf612aSRoman Zippel 	else if (listMode == "full")
121743bf612aSRoman Zippel 		showFullView();
121843bf612aSRoman Zippel 	else /*if (listMode == "split")*/
121943bf612aSRoman Zippel 		showSplitView();
122043bf612aSRoman Zippel 
122143bf612aSRoman Zippel 	// UI setup done, restore splitter positions
122243bf612aSRoman Zippel 	QValueList<int> sizes = configSettings->readSizes("/kconfig/qconf/split1", &ok);
122343bf612aSRoman Zippel 	if (ok)
122443bf612aSRoman Zippel 		split1->setSizes(sizes);
122543bf612aSRoman Zippel 
122643bf612aSRoman Zippel 	sizes = configSettings->readSizes("/kconfig/qconf/split2", &ok);
122743bf612aSRoman Zippel 	if (ok)
122843bf612aSRoman Zippel 		split2->setSizes(sizes);
122943bf612aSRoman Zippel #else
123043bf612aSRoman Zippel 	showSplitView();
123143bf612aSRoman Zippel #endif
123243bf612aSRoman Zippel 	delete configSettings;
123343bf612aSRoman Zippel }
123443bf612aSRoman Zippel 
123543bf612aSRoman Zippel /*
123643bf612aSRoman Zippel  * display a new help entry as soon as a new menu entry is selected
123743bf612aSRoman Zippel  */
123843bf612aSRoman Zippel void ConfigMainWindow::setHelp(QListViewItem* item)
123943bf612aSRoman Zippel {
124043bf612aSRoman Zippel 	struct symbol* sym;
124143bf612aSRoman Zippel 	struct menu* menu = 0;
124243bf612aSRoman Zippel 
124343bf612aSRoman Zippel 	if (item)
124443bf612aSRoman Zippel 		menu = ((ConfigItem*)item)->menu;
124543bf612aSRoman Zippel 	helpText->setInfo(menu);
12461da177e4SLinus Torvalds }
12471da177e4SLinus Torvalds 
12481da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
12491da177e4SLinus Torvalds {
12501da177e4SLinus Torvalds 	QString s = QFileDialog::getOpenFileName(".config", NULL, this);
12511da177e4SLinus Torvalds 	if (s.isNull())
12521da177e4SLinus Torvalds 		return;
12533b9fa093SArnaldo Carvalho de Melo 	if (conf_read(QFile::encodeName(s)))
12541da177e4SLinus Torvalds 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
12551da177e4SLinus Torvalds 	ConfigView::updateListAll();
12561da177e4SLinus Torvalds }
12571da177e4SLinus Torvalds 
12581da177e4SLinus Torvalds void ConfigMainWindow::saveConfig(void)
12591da177e4SLinus Torvalds {
12601da177e4SLinus Torvalds 	if (conf_write(NULL))
12611da177e4SLinus Torvalds 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
12621da177e4SLinus Torvalds }
12631da177e4SLinus Torvalds 
12641da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
12651da177e4SLinus Torvalds {
12661da177e4SLinus Torvalds 	QString s = QFileDialog::getSaveFileName(".config", NULL, this);
12671da177e4SLinus Torvalds 	if (s.isNull())
12681da177e4SLinus Torvalds 		return;
12693b9fa093SArnaldo Carvalho de Melo 	if (conf_write(QFile::encodeName(s)))
12701da177e4SLinus Torvalds 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
12711da177e4SLinus Torvalds }
12721da177e4SLinus Torvalds 
127343bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
127443bf612aSRoman Zippel {
127543bf612aSRoman Zippel 	if (!searchWindow)
127643bf612aSRoman Zippel 		searchWindow = new ConfigSearchWindow(this);
127743bf612aSRoman Zippel 	searchWindow->show();
127843bf612aSRoman Zippel }
127943bf612aSRoman Zippel 
12801da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu)
12811da177e4SLinus Torvalds {
12821da177e4SLinus Torvalds 	configList->setRootMenu(menu);
12831da177e4SLinus Torvalds 	backAction->setEnabled(TRUE);
12841da177e4SLinus Torvalds }
12851da177e4SLinus Torvalds 
12861da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
12871da177e4SLinus Torvalds {
12881da177e4SLinus Torvalds 	if (menuList->hasFocus()) {
12891da177e4SLinus Torvalds 		if (menuList->mode == menuMode)
12901da177e4SLinus Torvalds 			configList->clearSelection();
12911da177e4SLinus Torvalds 		setHelp(menuList->selectedItem());
12921da177e4SLinus Torvalds 	} else if (configList->hasFocus()) {
12931da177e4SLinus Torvalds 		setHelp(configList->selectedItem());
12941da177e4SLinus Torvalds 	}
12951da177e4SLinus Torvalds }
12961da177e4SLinus Torvalds 
12971da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
12981da177e4SLinus Torvalds {
12991da177e4SLinus Torvalds 	ConfigItem* item;
13001da177e4SLinus Torvalds 
13011da177e4SLinus Torvalds 	configList->setParentMenu();
13021da177e4SLinus Torvalds 	if (configList->rootEntry == &rootmenu)
13031da177e4SLinus Torvalds 		backAction->setEnabled(FALSE);
13041da177e4SLinus Torvalds 	item = (ConfigItem*)menuList->selectedItem();
13051da177e4SLinus Torvalds 	while (item) {
13061da177e4SLinus Torvalds 		if (item->menu == configList->rootEntry) {
13071da177e4SLinus Torvalds 			menuList->setSelected(item, TRUE);
13081da177e4SLinus Torvalds 			break;
13091da177e4SLinus Torvalds 		}
13101da177e4SLinus Torvalds 		item = (ConfigItem*)item->parent();
13111da177e4SLinus Torvalds 	}
13121da177e4SLinus Torvalds }
13131da177e4SLinus Torvalds 
13141da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
13151da177e4SLinus Torvalds {
13161da177e4SLinus Torvalds 	menuView->hide();
13171da177e4SLinus Torvalds 	menuList->setRootMenu(0);
13181da177e4SLinus Torvalds 	configList->mode = singleMode;
13191da177e4SLinus Torvalds 	if (configList->rootEntry == &rootmenu)
13201da177e4SLinus Torvalds 		configList->updateListAll();
13211da177e4SLinus Torvalds 	else
13221da177e4SLinus Torvalds 		configList->setRootMenu(&rootmenu);
13231da177e4SLinus Torvalds 	configList->setAllOpen(TRUE);
13241da177e4SLinus Torvalds 	configList->setFocus();
13251da177e4SLinus Torvalds }
13261da177e4SLinus Torvalds 
13271da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
13281da177e4SLinus Torvalds {
13291da177e4SLinus Torvalds 	configList->mode = symbolMode;
13301da177e4SLinus Torvalds 	if (configList->rootEntry == &rootmenu)
13311da177e4SLinus Torvalds 		configList->updateListAll();
13321da177e4SLinus Torvalds 	else
13331da177e4SLinus Torvalds 		configList->setRootMenu(&rootmenu);
13341da177e4SLinus Torvalds 	configList->setAllOpen(TRUE);
13351da177e4SLinus Torvalds 	configApp->processEvents();
13361da177e4SLinus Torvalds 	menuList->mode = menuMode;
13371da177e4SLinus Torvalds 	menuList->setRootMenu(&rootmenu);
13381da177e4SLinus Torvalds 	menuList->setAllOpen(TRUE);
13391da177e4SLinus Torvalds 	menuView->show();
13401da177e4SLinus Torvalds 	menuList->setFocus();
13411da177e4SLinus Torvalds }
13421da177e4SLinus Torvalds 
13431da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
13441da177e4SLinus Torvalds {
13451da177e4SLinus Torvalds 	menuView->hide();
13461da177e4SLinus Torvalds 	menuList->setRootMenu(0);
13471da177e4SLinus Torvalds 	configList->mode = fullMode;
13481da177e4SLinus Torvalds 	if (configList->rootEntry == &rootmenu)
13491da177e4SLinus Torvalds 		configList->updateListAll();
13501da177e4SLinus Torvalds 	else
13511da177e4SLinus Torvalds 		configList->setRootMenu(&rootmenu);
13521da177e4SLinus Torvalds 	configList->setAllOpen(FALSE);
13531da177e4SLinus Torvalds 	configList->setFocus();
13541da177e4SLinus Torvalds }
13551da177e4SLinus Torvalds 
13561da177e4SLinus Torvalds void ConfigMainWindow::setShowAll(bool b)
13571da177e4SLinus Torvalds {
13581da177e4SLinus Torvalds 	if (configList->showAll == b)
13591da177e4SLinus Torvalds 		return;
13601da177e4SLinus Torvalds 	configList->showAll = b;
13611da177e4SLinus Torvalds 	configList->updateListAll();
13621da177e4SLinus Torvalds 	menuList->showAll = b;
13631da177e4SLinus Torvalds 	menuList->updateListAll();
13641da177e4SLinus Torvalds }
13651da177e4SLinus Torvalds 
13661da177e4SLinus Torvalds void ConfigMainWindow::setShowName(bool b)
13671da177e4SLinus Torvalds {
13681da177e4SLinus Torvalds 	if (configList->showName == b)
13691da177e4SLinus Torvalds 		return;
13701da177e4SLinus Torvalds 	configList->showName = b;
13711da177e4SLinus Torvalds 	configList->reinit();
13721da177e4SLinus Torvalds 	menuList->showName = b;
13731da177e4SLinus Torvalds 	menuList->reinit();
13741da177e4SLinus Torvalds }
13751da177e4SLinus Torvalds 
13761da177e4SLinus Torvalds void ConfigMainWindow::setShowRange(bool b)
13771da177e4SLinus Torvalds {
13781da177e4SLinus Torvalds 	if (configList->showRange == b)
13791da177e4SLinus Torvalds 		return;
13801da177e4SLinus Torvalds 	configList->showRange = b;
13811da177e4SLinus Torvalds 	configList->reinit();
13821da177e4SLinus Torvalds 	menuList->showRange = b;
13831da177e4SLinus Torvalds 	menuList->reinit();
13841da177e4SLinus Torvalds }
13851da177e4SLinus Torvalds 
13861da177e4SLinus Torvalds void ConfigMainWindow::setShowData(bool b)
13871da177e4SLinus Torvalds {
13881da177e4SLinus Torvalds 	if (configList->showData == b)
13891da177e4SLinus Torvalds 		return;
13901da177e4SLinus Torvalds 	configList->showData = b;
13911da177e4SLinus Torvalds 	configList->reinit();
13921da177e4SLinus Torvalds 	menuList->showData = b;
13931da177e4SLinus Torvalds 	menuList->reinit();
13941da177e4SLinus Torvalds }
13951da177e4SLinus Torvalds 
13961da177e4SLinus Torvalds /*
13971da177e4SLinus Torvalds  * ask for saving configuration before quitting
13981da177e4SLinus Torvalds  * TODO ask only when something changed
13991da177e4SLinus Torvalds  */
14001da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
14011da177e4SLinus Torvalds {
14021da177e4SLinus Torvalds 	if (!sym_change_count) {
14031da177e4SLinus Torvalds 		e->accept();
14041da177e4SLinus Torvalds 		return;
14051da177e4SLinus Torvalds 	}
14061da177e4SLinus Torvalds 	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
14071da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
14081da177e4SLinus Torvalds 	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
14091da177e4SLinus Torvalds 	mb.setButtonText(QMessageBox::No, "&Discard Changes");
14101da177e4SLinus Torvalds 	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
14111da177e4SLinus Torvalds 	switch (mb.exec()) {
14121da177e4SLinus Torvalds 	case QMessageBox::Yes:
14131da177e4SLinus Torvalds 		conf_write(NULL);
14141da177e4SLinus Torvalds 	case QMessageBox::No:
14151da177e4SLinus Torvalds 		e->accept();
14161da177e4SLinus Torvalds 		break;
14171da177e4SLinus Torvalds 	case QMessageBox::Cancel:
14181da177e4SLinus Torvalds 		e->ignore();
14191da177e4SLinus Torvalds 		break;
14201da177e4SLinus Torvalds 	}
14211da177e4SLinus Torvalds }
14221da177e4SLinus Torvalds 
14231da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
14241da177e4SLinus Torvalds {
14251da177e4SLinus Torvalds 	static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n"
14261da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
14271da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
14281da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
14291da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
14301da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
14311da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
14321da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
14331da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
14341da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
14351da177e4SLinus Torvalds 		"which you can then match by examining other options.\n\n";
14361da177e4SLinus Torvalds 
14371da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
14381da177e4SLinus Torvalds }
14391da177e4SLinus Torvalds 
14401da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
14411da177e4SLinus Torvalds {
14421da177e4SLinus Torvalds 	static char str[] = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n"
14431da177e4SLinus Torvalds 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
14441da177e4SLinus Torvalds 
14451da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
14461da177e4SLinus Torvalds }
14471da177e4SLinus Torvalds 
14481da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
14491da177e4SLinus Torvalds {
14501da177e4SLinus Torvalds #if QT_VERSION >= 300
14511da177e4SLinus Torvalds 	ConfigSettings *configSettings = new ConfigSettings;
14521da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/window x", pos().x());
14531da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/window y", pos().y());
14541da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/window width", size().width());
14551da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/window height", size().height());
14561da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/showName", configList->showName);
14571da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/showRange", configList->showRange);
14581da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/showData", configList->showData);
14591da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/showAll", configList->showAll);
146043bf612aSRoman Zippel 	configSettings->writeEntry("/kconfig/qconf/showDebug", helpText->showDebug());
14611da177e4SLinus Torvalds 
14621da177e4SLinus Torvalds 	QString entry;
14631da177e4SLinus Torvalds 	switch(configList->mode) {
14641da177e4SLinus Torvalds 	case singleMode :
14651da177e4SLinus Torvalds 		entry = "single";
14661da177e4SLinus Torvalds 		break;
14671da177e4SLinus Torvalds 
14681da177e4SLinus Torvalds 	case symbolMode :
14691da177e4SLinus Torvalds 		entry = "split";
14701da177e4SLinus Torvalds 		break;
14711da177e4SLinus Torvalds 
14721da177e4SLinus Torvalds 	case fullMode :
14731da177e4SLinus Torvalds 		entry = "full";
14741da177e4SLinus Torvalds 		break;
14751da177e4SLinus Torvalds 	}
14761da177e4SLinus Torvalds 	configSettings->writeEntry("/kconfig/qconf/listMode", entry);
14771da177e4SLinus Torvalds 
14781da177e4SLinus Torvalds 	configSettings->writeSizes("/kconfig/qconf/split1", split1->sizes());
14791da177e4SLinus Torvalds 	configSettings->writeSizes("/kconfig/qconf/split2", split2->sizes());
14801da177e4SLinus Torvalds 
14811da177e4SLinus Torvalds 	delete configSettings;
14821da177e4SLinus Torvalds #endif
14831da177e4SLinus Torvalds }
14841da177e4SLinus Torvalds 
14851da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
14861da177e4SLinus Torvalds {
14871da177e4SLinus Torvalds 	struct menu *child;
14881da177e4SLinus Torvalds 	static int menu_cnt = 0;
14891da177e4SLinus Torvalds 
14901da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
14911da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
14921da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
14931da177e4SLinus Torvalds 			menu_cnt++;
14941da177e4SLinus Torvalds 			fixup_rootmenu(child);
14951da177e4SLinus Torvalds 			menu_cnt--;
14961da177e4SLinus Torvalds 		} else if (!menu_cnt)
14971da177e4SLinus Torvalds 			fixup_rootmenu(child);
14981da177e4SLinus Torvalds 	}
14991da177e4SLinus Torvalds }
15001da177e4SLinus Torvalds 
15011da177e4SLinus Torvalds static const char *progname;
15021da177e4SLinus Torvalds 
15031da177e4SLinus Torvalds static void usage(void)
15041da177e4SLinus Torvalds {
15051da177e4SLinus Torvalds 	printf("%s <config>\n", progname);
15061da177e4SLinus Torvalds 	exit(0);
15071da177e4SLinus Torvalds }
15081da177e4SLinus Torvalds 
15091da177e4SLinus Torvalds int main(int ac, char** av)
15101da177e4SLinus Torvalds {
15111da177e4SLinus Torvalds 	ConfigMainWindow* v;
15121da177e4SLinus Torvalds 	const char *name;
15131da177e4SLinus Torvalds 
15143b9fa093SArnaldo Carvalho de Melo 	bindtextdomain(PACKAGE, LOCALEDIR);
15153b9fa093SArnaldo Carvalho de Melo 	textdomain(PACKAGE);
15163b9fa093SArnaldo Carvalho de Melo 
15171da177e4SLinus Torvalds #ifndef LKC_DIRECT_LINK
15181da177e4SLinus Torvalds 	kconfig_load();
15191da177e4SLinus Torvalds #endif
15201da177e4SLinus Torvalds 
15211da177e4SLinus Torvalds 	progname = av[0];
15221da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
15231da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
15241da177e4SLinus Torvalds 		switch (av[1][1]) {
15251da177e4SLinus Torvalds 		case 'h':
15261da177e4SLinus Torvalds 		case '?':
15271da177e4SLinus Torvalds 			usage();
15281da177e4SLinus Torvalds 		}
15291da177e4SLinus Torvalds 		name = av[2];
15301da177e4SLinus Torvalds 	} else
15311da177e4SLinus Torvalds 		name = av[1];
15321da177e4SLinus Torvalds 	if (!name)
15331da177e4SLinus Torvalds 		usage();
15341da177e4SLinus Torvalds 
15351da177e4SLinus Torvalds 	conf_parse(name);
15361da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
15371da177e4SLinus Torvalds 	conf_read(NULL);
15381da177e4SLinus Torvalds 	//zconfdump(stdout);
15391da177e4SLinus Torvalds 
15401da177e4SLinus Torvalds 	v = new ConfigMainWindow();
15411da177e4SLinus Torvalds 
15421da177e4SLinus Torvalds 	//zconfdump(stdout);
154343bf612aSRoman Zippel 	configApp->setMainWidget(v);
15441da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
15451da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
154643bf612aSRoman Zippel 	v->show();
15471da177e4SLinus Torvalds 	configApp->exec();
15481da177e4SLinus Torvalds 
15491da177e4SLinus Torvalds 	return 0;
15501da177e4SLinus Torvalds }
1551