xref: /openbmc/u-boot/scripts/kconfig/qconf.cc (revision 9b5f0b1d)
10a9064fbSMasahiro Yamada /*
20a9064fbSMasahiro Yamada  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
30a9064fbSMasahiro Yamada  * Released under the terms of the GNU GPL v2.0.
40a9064fbSMasahiro Yamada  */
50a9064fbSMasahiro Yamada 
60a9064fbSMasahiro Yamada #include <qglobal.h>
70a9064fbSMasahiro Yamada 
80a9064fbSMasahiro Yamada #if QT_VERSION < 0x040000
90a9064fbSMasahiro Yamada #include <stddef.h>
100a9064fbSMasahiro Yamada #include <qmainwindow.h>
110a9064fbSMasahiro Yamada #include <qvbox.h>
120a9064fbSMasahiro Yamada #include <qvaluelist.h>
130a9064fbSMasahiro Yamada #include <qtextbrowser.h>
140a9064fbSMasahiro Yamada #include <qaction.h>
150a9064fbSMasahiro Yamada #include <qheader.h>
160a9064fbSMasahiro Yamada #include <qfiledialog.h>
170a9064fbSMasahiro Yamada #include <qdragobject.h>
180a9064fbSMasahiro Yamada #include <qpopupmenu.h>
190a9064fbSMasahiro Yamada #else
200a9064fbSMasahiro Yamada #include <q3mainwindow.h>
210a9064fbSMasahiro Yamada #include <q3vbox.h>
220a9064fbSMasahiro Yamada #include <q3valuelist.h>
230a9064fbSMasahiro Yamada #include <q3textbrowser.h>
240a9064fbSMasahiro Yamada #include <q3action.h>
250a9064fbSMasahiro Yamada #include <q3header.h>
260a9064fbSMasahiro Yamada #include <q3filedialog.h>
270a9064fbSMasahiro Yamada #include <q3dragobject.h>
280a9064fbSMasahiro Yamada #include <q3popupmenu.h>
290a9064fbSMasahiro Yamada #endif
300a9064fbSMasahiro Yamada 
310a9064fbSMasahiro Yamada #include <qapplication.h>
320a9064fbSMasahiro Yamada #include <qdesktopwidget.h>
330a9064fbSMasahiro Yamada #include <qtoolbar.h>
340a9064fbSMasahiro Yamada #include <qlayout.h>
350a9064fbSMasahiro Yamada #include <qsplitter.h>
360a9064fbSMasahiro Yamada #include <qlineedit.h>
370a9064fbSMasahiro Yamada #include <qlabel.h>
380a9064fbSMasahiro Yamada #include <qpushbutton.h>
390a9064fbSMasahiro Yamada #include <qmenubar.h>
400a9064fbSMasahiro Yamada #include <qmessagebox.h>
410a9064fbSMasahiro Yamada #include <qregexp.h>
420a9064fbSMasahiro Yamada #include <qevent.h>
430a9064fbSMasahiro Yamada 
440a9064fbSMasahiro Yamada #include <stdlib.h>
450a9064fbSMasahiro Yamada 
460a9064fbSMasahiro Yamada #include "lkc.h"
470a9064fbSMasahiro Yamada #include "qconf.h"
480a9064fbSMasahiro Yamada 
490a9064fbSMasahiro Yamada #include "qconf.moc"
500a9064fbSMasahiro Yamada #include "images.c"
510a9064fbSMasahiro Yamada 
520a9064fbSMasahiro Yamada #ifdef _
530a9064fbSMasahiro Yamada # undef _
540a9064fbSMasahiro Yamada # define _ qgettext
550a9064fbSMasahiro Yamada #endif
560a9064fbSMasahiro Yamada 
570a9064fbSMasahiro Yamada static QApplication *configApp;
580a9064fbSMasahiro Yamada static ConfigSettings *configSettings;
590a9064fbSMasahiro Yamada 
600a9064fbSMasahiro Yamada Q3Action *ConfigMainWindow::saveAction;
610a9064fbSMasahiro Yamada 
620a9064fbSMasahiro Yamada static inline QString qgettext(const char* str)
630a9064fbSMasahiro Yamada {
640a9064fbSMasahiro Yamada 	return QString::fromLocal8Bit(gettext(str));
650a9064fbSMasahiro Yamada }
660a9064fbSMasahiro Yamada 
670a9064fbSMasahiro Yamada static inline QString qgettext(const QString& str)
680a9064fbSMasahiro Yamada {
690a9064fbSMasahiro Yamada 	return QString::fromLocal8Bit(gettext(str.latin1()));
700a9064fbSMasahiro Yamada }
710a9064fbSMasahiro Yamada 
720a9064fbSMasahiro Yamada ConfigSettings::ConfigSettings()
730a9064fbSMasahiro Yamada 	: QSettings("kernel.org", "qconf")
740a9064fbSMasahiro Yamada {
750a9064fbSMasahiro Yamada }
760a9064fbSMasahiro Yamada 
770a9064fbSMasahiro Yamada /**
780a9064fbSMasahiro Yamada  * Reads a list of integer values from the application settings.
790a9064fbSMasahiro Yamada  */
800a9064fbSMasahiro Yamada Q3ValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
810a9064fbSMasahiro Yamada {
820a9064fbSMasahiro Yamada 	Q3ValueList<int> result;
830a9064fbSMasahiro Yamada 	QStringList entryList = readListEntry(key, ok);
840a9064fbSMasahiro Yamada 	QStringList::Iterator it;
850a9064fbSMasahiro Yamada 
860a9064fbSMasahiro Yamada 	for (it = entryList.begin(); it != entryList.end(); ++it)
870a9064fbSMasahiro Yamada 		result.push_back((*it).toInt());
880a9064fbSMasahiro Yamada 
890a9064fbSMasahiro Yamada 	return result;
900a9064fbSMasahiro Yamada }
910a9064fbSMasahiro Yamada 
920a9064fbSMasahiro Yamada /**
930a9064fbSMasahiro Yamada  * Writes a list of integer values to the application settings.
940a9064fbSMasahiro Yamada  */
950a9064fbSMasahiro Yamada bool ConfigSettings::writeSizes(const QString& key, const Q3ValueList<int>& value)
960a9064fbSMasahiro Yamada {
970a9064fbSMasahiro Yamada 	QStringList stringList;
980a9064fbSMasahiro Yamada 	Q3ValueList<int>::ConstIterator it;
990a9064fbSMasahiro Yamada 
1000a9064fbSMasahiro Yamada 	for (it = value.begin(); it != value.end(); ++it)
1010a9064fbSMasahiro Yamada 		stringList.push_back(QString::number(*it));
1020a9064fbSMasahiro Yamada 	return writeEntry(key, stringList);
1030a9064fbSMasahiro Yamada }
1040a9064fbSMasahiro Yamada 
1050a9064fbSMasahiro Yamada 
1060a9064fbSMasahiro Yamada /*
1070a9064fbSMasahiro Yamada  * set the new data
1080a9064fbSMasahiro Yamada  * TODO check the value
1090a9064fbSMasahiro Yamada  */
1100a9064fbSMasahiro Yamada void ConfigItem::okRename(int col)
1110a9064fbSMasahiro Yamada {
1120a9064fbSMasahiro Yamada 	Parent::okRename(col);
1130a9064fbSMasahiro Yamada 	sym_set_string_value(menu->sym, text(dataColIdx).latin1());
1140a9064fbSMasahiro Yamada 	listView()->updateList(this);
1150a9064fbSMasahiro Yamada }
1160a9064fbSMasahiro Yamada 
1170a9064fbSMasahiro Yamada /*
1180a9064fbSMasahiro Yamada  * update the displayed of a menu entry
1190a9064fbSMasahiro Yamada  */
1200a9064fbSMasahiro Yamada void ConfigItem::updateMenu(void)
1210a9064fbSMasahiro Yamada {
1220a9064fbSMasahiro Yamada 	ConfigList* list;
1230a9064fbSMasahiro Yamada 	struct symbol* sym;
1240a9064fbSMasahiro Yamada 	struct property *prop;
1250a9064fbSMasahiro Yamada 	QString prompt;
1260a9064fbSMasahiro Yamada 	int type;
1270a9064fbSMasahiro Yamada 	tristate expr;
1280a9064fbSMasahiro Yamada 
1290a9064fbSMasahiro Yamada 	list = listView();
1300a9064fbSMasahiro Yamada 	if (goParent) {
1310a9064fbSMasahiro Yamada 		setPixmap(promptColIdx, list->menuBackPix);
1320a9064fbSMasahiro Yamada 		prompt = "..";
1330a9064fbSMasahiro Yamada 		goto set_prompt;
1340a9064fbSMasahiro Yamada 	}
1350a9064fbSMasahiro Yamada 
1360a9064fbSMasahiro Yamada 	sym = menu->sym;
1370a9064fbSMasahiro Yamada 	prop = menu->prompt;
1380a9064fbSMasahiro Yamada 	prompt = _(menu_get_prompt(menu));
1390a9064fbSMasahiro Yamada 
1400a9064fbSMasahiro Yamada 	if (prop) switch (prop->type) {
1410a9064fbSMasahiro Yamada 	case P_MENU:
1420a9064fbSMasahiro Yamada 		if (list->mode == singleMode || list->mode == symbolMode) {
1430a9064fbSMasahiro Yamada 			/* a menuconfig entry is displayed differently
1440a9064fbSMasahiro Yamada 			 * depending whether it's at the view root or a child.
1450a9064fbSMasahiro Yamada 			 */
1460a9064fbSMasahiro Yamada 			if (sym && list->rootEntry == menu)
1470a9064fbSMasahiro Yamada 				break;
1480a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, list->menuPix);
1490a9064fbSMasahiro Yamada 		} else {
1500a9064fbSMasahiro Yamada 			if (sym)
1510a9064fbSMasahiro Yamada 				break;
1520a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, 0);
1530a9064fbSMasahiro Yamada 		}
1540a9064fbSMasahiro Yamada 		goto set_prompt;
1550a9064fbSMasahiro Yamada 	case P_COMMENT:
1560a9064fbSMasahiro Yamada 		setPixmap(promptColIdx, 0);
1570a9064fbSMasahiro Yamada 		goto set_prompt;
1580a9064fbSMasahiro Yamada 	default:
1590a9064fbSMasahiro Yamada 		;
1600a9064fbSMasahiro Yamada 	}
1610a9064fbSMasahiro Yamada 	if (!sym)
1620a9064fbSMasahiro Yamada 		goto set_prompt;
1630a9064fbSMasahiro Yamada 
1640a9064fbSMasahiro Yamada 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
1650a9064fbSMasahiro Yamada 
1660a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
1670a9064fbSMasahiro Yamada 	switch (type) {
1680a9064fbSMasahiro Yamada 	case S_BOOLEAN:
1690a9064fbSMasahiro Yamada 	case S_TRISTATE:
1700a9064fbSMasahiro Yamada 		char ch;
1710a9064fbSMasahiro Yamada 
1720a9064fbSMasahiro Yamada 		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
1730a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, 0);
1740a9064fbSMasahiro Yamada 			setText(noColIdx, QString::null);
1750a9064fbSMasahiro Yamada 			setText(modColIdx, QString::null);
1760a9064fbSMasahiro Yamada 			setText(yesColIdx, QString::null);
1770a9064fbSMasahiro Yamada 			break;
1780a9064fbSMasahiro Yamada 		}
1790a9064fbSMasahiro Yamada 		expr = sym_get_tristate_value(sym);
1800a9064fbSMasahiro Yamada 		switch (expr) {
1810a9064fbSMasahiro Yamada 		case yes:
1820a9064fbSMasahiro Yamada 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1830a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->choiceYesPix);
1840a9064fbSMasahiro Yamada 			else
1850a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->symbolYesPix);
1860a9064fbSMasahiro Yamada 			setText(yesColIdx, "Y");
1870a9064fbSMasahiro Yamada 			ch = 'Y';
1880a9064fbSMasahiro Yamada 			break;
1890a9064fbSMasahiro Yamada 		case mod:
1900a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, list->symbolModPix);
1910a9064fbSMasahiro Yamada 			setText(modColIdx, "M");
1920a9064fbSMasahiro Yamada 			ch = 'M';
1930a9064fbSMasahiro Yamada 			break;
1940a9064fbSMasahiro Yamada 		default:
1950a9064fbSMasahiro Yamada 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1960a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->choiceNoPix);
1970a9064fbSMasahiro Yamada 			else
1980a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->symbolNoPix);
1990a9064fbSMasahiro Yamada 			setText(noColIdx, "N");
2000a9064fbSMasahiro Yamada 			ch = 'N';
2010a9064fbSMasahiro Yamada 			break;
2020a9064fbSMasahiro Yamada 		}
2030a9064fbSMasahiro Yamada 		if (expr != no)
2040a9064fbSMasahiro Yamada 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
2050a9064fbSMasahiro Yamada 		if (expr != mod)
2060a9064fbSMasahiro Yamada 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
2070a9064fbSMasahiro Yamada 		if (expr != yes)
2080a9064fbSMasahiro Yamada 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
2090a9064fbSMasahiro Yamada 
2100a9064fbSMasahiro Yamada 		setText(dataColIdx, QChar(ch));
2110a9064fbSMasahiro Yamada 		break;
2120a9064fbSMasahiro Yamada 	case S_INT:
2130a9064fbSMasahiro Yamada 	case S_HEX:
2140a9064fbSMasahiro Yamada 	case S_STRING:
2150a9064fbSMasahiro Yamada 		const char* data;
2160a9064fbSMasahiro Yamada 
2170a9064fbSMasahiro Yamada 		data = sym_get_string_value(sym);
2180a9064fbSMasahiro Yamada 
2190a9064fbSMasahiro Yamada 		int i = list->mapIdx(dataColIdx);
2200a9064fbSMasahiro Yamada 		if (i >= 0)
2210a9064fbSMasahiro Yamada 			setRenameEnabled(i, TRUE);
2220a9064fbSMasahiro Yamada 		setText(dataColIdx, data);
2230a9064fbSMasahiro Yamada 		if (type == S_STRING)
2240a9064fbSMasahiro Yamada 			prompt = QString("%1: %2").arg(prompt).arg(data);
2250a9064fbSMasahiro Yamada 		else
2260a9064fbSMasahiro Yamada 			prompt = QString("(%2) %1").arg(prompt).arg(data);
2270a9064fbSMasahiro Yamada 		break;
2280a9064fbSMasahiro Yamada 	}
2290a9064fbSMasahiro Yamada 	if (!sym_has_value(sym) && visible)
2300a9064fbSMasahiro Yamada 		prompt += _(" (NEW)");
2310a9064fbSMasahiro Yamada set_prompt:
2320a9064fbSMasahiro Yamada 	setText(promptColIdx, prompt);
2330a9064fbSMasahiro Yamada }
2340a9064fbSMasahiro Yamada 
2350a9064fbSMasahiro Yamada void ConfigItem::testUpdateMenu(bool v)
2360a9064fbSMasahiro Yamada {
2370a9064fbSMasahiro Yamada 	ConfigItem* i;
2380a9064fbSMasahiro Yamada 
2390a9064fbSMasahiro Yamada 	visible = v;
2400a9064fbSMasahiro Yamada 	if (!menu)
2410a9064fbSMasahiro Yamada 		return;
2420a9064fbSMasahiro Yamada 
2430a9064fbSMasahiro Yamada 	sym_calc_value(menu->sym);
2440a9064fbSMasahiro Yamada 	if (menu->flags & MENU_CHANGED) {
2450a9064fbSMasahiro Yamada 		/* the menu entry changed, so update all list items */
2460a9064fbSMasahiro Yamada 		menu->flags &= ~MENU_CHANGED;
2470a9064fbSMasahiro Yamada 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
2480a9064fbSMasahiro Yamada 			i->updateMenu();
2490a9064fbSMasahiro Yamada 	} else if (listView()->updateAll)
2500a9064fbSMasahiro Yamada 		updateMenu();
2510a9064fbSMasahiro Yamada }
2520a9064fbSMasahiro Yamada 
2530a9064fbSMasahiro Yamada void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align)
2540a9064fbSMasahiro Yamada {
2550a9064fbSMasahiro Yamada 	ConfigList* list = listView();
2560a9064fbSMasahiro Yamada 
2570a9064fbSMasahiro Yamada 	if (visible) {
2580a9064fbSMasahiro Yamada 		if (isSelected() && !list->hasFocus() && list->mode == menuMode)
2590a9064fbSMasahiro Yamada 			Parent::paintCell(p, list->inactivedColorGroup, column, width, align);
2600a9064fbSMasahiro Yamada 		else
2610a9064fbSMasahiro Yamada 			Parent::paintCell(p, cg, column, width, align);
2620a9064fbSMasahiro Yamada 	} else
2630a9064fbSMasahiro Yamada 		Parent::paintCell(p, list->disabledColorGroup, column, width, align);
2640a9064fbSMasahiro Yamada }
2650a9064fbSMasahiro Yamada 
2660a9064fbSMasahiro Yamada /*
2670a9064fbSMasahiro Yamada  * construct a menu entry
2680a9064fbSMasahiro Yamada  */
2690a9064fbSMasahiro Yamada void ConfigItem::init(void)
2700a9064fbSMasahiro Yamada {
2710a9064fbSMasahiro Yamada 	if (menu) {
2720a9064fbSMasahiro Yamada 		ConfigList* list = listView();
2730a9064fbSMasahiro Yamada 		nextItem = (ConfigItem*)menu->data;
2740a9064fbSMasahiro Yamada 		menu->data = this;
2750a9064fbSMasahiro Yamada 
2760a9064fbSMasahiro Yamada 		if (list->mode != fullMode)
2770a9064fbSMasahiro Yamada 			setOpen(TRUE);
2780a9064fbSMasahiro Yamada 		sym_calc_value(menu->sym);
2790a9064fbSMasahiro Yamada 	}
2800a9064fbSMasahiro Yamada 	updateMenu();
2810a9064fbSMasahiro Yamada }
2820a9064fbSMasahiro Yamada 
2830a9064fbSMasahiro Yamada /*
2840a9064fbSMasahiro Yamada  * destruct a menu entry
2850a9064fbSMasahiro Yamada  */
2860a9064fbSMasahiro Yamada ConfigItem::~ConfigItem(void)
2870a9064fbSMasahiro Yamada {
2880a9064fbSMasahiro Yamada 	if (menu) {
2890a9064fbSMasahiro Yamada 		ConfigItem** ip = (ConfigItem**)&menu->data;
2900a9064fbSMasahiro Yamada 		for (; *ip; ip = &(*ip)->nextItem) {
2910a9064fbSMasahiro Yamada 			if (*ip == this) {
2920a9064fbSMasahiro Yamada 				*ip = nextItem;
2930a9064fbSMasahiro Yamada 				break;
2940a9064fbSMasahiro Yamada 			}
2950a9064fbSMasahiro Yamada 		}
2960a9064fbSMasahiro Yamada 	}
2970a9064fbSMasahiro Yamada }
2980a9064fbSMasahiro Yamada 
2990a9064fbSMasahiro Yamada ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
3000a9064fbSMasahiro Yamada 	: Parent(parent)
3010a9064fbSMasahiro Yamada {
3020a9064fbSMasahiro Yamada 	connect(this, SIGNAL(lostFocus()), SLOT(hide()));
3030a9064fbSMasahiro Yamada }
3040a9064fbSMasahiro Yamada 
3050a9064fbSMasahiro Yamada void ConfigLineEdit::show(ConfigItem* i)
3060a9064fbSMasahiro Yamada {
3070a9064fbSMasahiro Yamada 	item = i;
3080a9064fbSMasahiro Yamada 	if (sym_get_string_value(item->menu->sym))
3090a9064fbSMasahiro Yamada 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
3100a9064fbSMasahiro Yamada 	else
3110a9064fbSMasahiro Yamada 		setText(QString::null);
3120a9064fbSMasahiro Yamada 	Parent::show();
3130a9064fbSMasahiro Yamada 	setFocus();
3140a9064fbSMasahiro Yamada }
3150a9064fbSMasahiro Yamada 
3160a9064fbSMasahiro Yamada void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
3170a9064fbSMasahiro Yamada {
3180a9064fbSMasahiro Yamada 	switch (e->key()) {
3190a9064fbSMasahiro Yamada 	case Qt::Key_Escape:
3200a9064fbSMasahiro Yamada 		break;
3210a9064fbSMasahiro Yamada 	case Qt::Key_Return:
3220a9064fbSMasahiro Yamada 	case Qt::Key_Enter:
3230a9064fbSMasahiro Yamada 		sym_set_string_value(item->menu->sym, text().latin1());
3240a9064fbSMasahiro Yamada 		parent()->updateList(item);
3250a9064fbSMasahiro Yamada 		break;
3260a9064fbSMasahiro Yamada 	default:
3270a9064fbSMasahiro Yamada 		Parent::keyPressEvent(e);
3280a9064fbSMasahiro Yamada 		return;
3290a9064fbSMasahiro Yamada 	}
3300a9064fbSMasahiro Yamada 	e->accept();
3310a9064fbSMasahiro Yamada 	parent()->list->setFocus();
3320a9064fbSMasahiro Yamada 	hide();
3330a9064fbSMasahiro Yamada }
3340a9064fbSMasahiro Yamada 
3350a9064fbSMasahiro Yamada ConfigList::ConfigList(ConfigView* p, const char *name)
3360a9064fbSMasahiro Yamada 	: Parent(p, name),
3370a9064fbSMasahiro Yamada 	  updateAll(false),
3380a9064fbSMasahiro Yamada 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
3390a9064fbSMasahiro Yamada 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
3400a9064fbSMasahiro Yamada 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
3410a9064fbSMasahiro Yamada 	  showName(false), showRange(false), showData(false), optMode(normalOpt),
3420a9064fbSMasahiro Yamada 	  rootEntry(0), headerPopup(0)
3430a9064fbSMasahiro Yamada {
3440a9064fbSMasahiro Yamada 	int i;
3450a9064fbSMasahiro Yamada 
3460a9064fbSMasahiro Yamada 	setSorting(-1);
3470a9064fbSMasahiro Yamada 	setRootIsDecorated(TRUE);
3480a9064fbSMasahiro Yamada 	disabledColorGroup = palette().active();
3490a9064fbSMasahiro Yamada 	disabledColorGroup.setColor(QColorGroup::Text, palette().disabled().text());
3500a9064fbSMasahiro Yamada 	inactivedColorGroup = palette().active();
3510a9064fbSMasahiro Yamada 	inactivedColorGroup.setColor(QColorGroup::Highlight, palette().disabled().highlight());
3520a9064fbSMasahiro Yamada 
3530a9064fbSMasahiro Yamada 	connect(this, SIGNAL(selectionChanged(void)),
3540a9064fbSMasahiro Yamada 		SLOT(updateSelection(void)));
3550a9064fbSMasahiro Yamada 
3560a9064fbSMasahiro Yamada 	if (name) {
3570a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
3580a9064fbSMasahiro Yamada 		showName = configSettings->readBoolEntry("/showName", false);
3590a9064fbSMasahiro Yamada 		showRange = configSettings->readBoolEntry("/showRange", false);
3600a9064fbSMasahiro Yamada 		showData = configSettings->readBoolEntry("/showData", false);
3610a9064fbSMasahiro Yamada 		optMode = (enum optionMode)configSettings->readNumEntry("/optionMode", false);
3620a9064fbSMasahiro Yamada 		configSettings->endGroup();
3630a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
3640a9064fbSMasahiro Yamada 	}
3650a9064fbSMasahiro Yamada 
3660a9064fbSMasahiro Yamada 	for (i = 0; i < colNr; i++)
3670a9064fbSMasahiro Yamada 		colMap[i] = colRevMap[i] = -1;
3680a9064fbSMasahiro Yamada 	addColumn(promptColIdx, _("Option"));
3690a9064fbSMasahiro Yamada 
3700a9064fbSMasahiro Yamada 	reinit();
3710a9064fbSMasahiro Yamada }
3720a9064fbSMasahiro Yamada 
3730a9064fbSMasahiro Yamada bool ConfigList::menuSkip(struct menu *menu)
3740a9064fbSMasahiro Yamada {
3750a9064fbSMasahiro Yamada 	if (optMode == normalOpt && menu_is_visible(menu))
3760a9064fbSMasahiro Yamada 		return false;
3770a9064fbSMasahiro Yamada 	if (optMode == promptOpt && menu_has_prompt(menu))
3780a9064fbSMasahiro Yamada 		return false;
3790a9064fbSMasahiro Yamada 	if (optMode == allOpt)
3800a9064fbSMasahiro Yamada 		return false;
3810a9064fbSMasahiro Yamada 	return true;
3820a9064fbSMasahiro Yamada }
3830a9064fbSMasahiro Yamada 
3840a9064fbSMasahiro Yamada void ConfigList::reinit(void)
3850a9064fbSMasahiro Yamada {
3860a9064fbSMasahiro Yamada 	removeColumn(dataColIdx);
3870a9064fbSMasahiro Yamada 	removeColumn(yesColIdx);
3880a9064fbSMasahiro Yamada 	removeColumn(modColIdx);
3890a9064fbSMasahiro Yamada 	removeColumn(noColIdx);
3900a9064fbSMasahiro Yamada 	removeColumn(nameColIdx);
3910a9064fbSMasahiro Yamada 
3920a9064fbSMasahiro Yamada 	if (showName)
3930a9064fbSMasahiro Yamada 		addColumn(nameColIdx, _("Name"));
3940a9064fbSMasahiro Yamada 	if (showRange) {
3950a9064fbSMasahiro Yamada 		addColumn(noColIdx, "N");
3960a9064fbSMasahiro Yamada 		addColumn(modColIdx, "M");
3970a9064fbSMasahiro Yamada 		addColumn(yesColIdx, "Y");
3980a9064fbSMasahiro Yamada 	}
3990a9064fbSMasahiro Yamada 	if (showData)
4000a9064fbSMasahiro Yamada 		addColumn(dataColIdx, _("Value"));
4010a9064fbSMasahiro Yamada 
4020a9064fbSMasahiro Yamada 	updateListAll();
4030a9064fbSMasahiro Yamada }
4040a9064fbSMasahiro Yamada 
4050a9064fbSMasahiro Yamada void ConfigList::saveSettings(void)
4060a9064fbSMasahiro Yamada {
4070a9064fbSMasahiro Yamada 	if (name()) {
4080a9064fbSMasahiro Yamada 		configSettings->beginGroup(name());
4090a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showName", showName);
4100a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showRange", showRange);
4110a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showData", showData);
4120a9064fbSMasahiro Yamada 		configSettings->writeEntry("/optionMode", (int)optMode);
4130a9064fbSMasahiro Yamada 		configSettings->endGroup();
4140a9064fbSMasahiro Yamada 	}
4150a9064fbSMasahiro Yamada }
4160a9064fbSMasahiro Yamada 
4170a9064fbSMasahiro Yamada ConfigItem* ConfigList::findConfigItem(struct menu *menu)
4180a9064fbSMasahiro Yamada {
4190a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)menu->data;
4200a9064fbSMasahiro Yamada 
4210a9064fbSMasahiro Yamada 	for (; item; item = item->nextItem) {
4220a9064fbSMasahiro Yamada 		if (this == item->listView())
4230a9064fbSMasahiro Yamada 			break;
4240a9064fbSMasahiro Yamada 	}
4250a9064fbSMasahiro Yamada 
4260a9064fbSMasahiro Yamada 	return item;
4270a9064fbSMasahiro Yamada }
4280a9064fbSMasahiro Yamada 
4290a9064fbSMasahiro Yamada void ConfigList::updateSelection(void)
4300a9064fbSMasahiro Yamada {
4310a9064fbSMasahiro Yamada 	struct menu *menu;
4320a9064fbSMasahiro Yamada 	enum prop_type type;
4330a9064fbSMasahiro Yamada 
4340a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)selectedItem();
4350a9064fbSMasahiro Yamada 	if (!item)
4360a9064fbSMasahiro Yamada 		return;
4370a9064fbSMasahiro Yamada 
4380a9064fbSMasahiro Yamada 	menu = item->menu;
4390a9064fbSMasahiro Yamada 	emit menuChanged(menu);
4400a9064fbSMasahiro Yamada 	if (!menu)
4410a9064fbSMasahiro Yamada 		return;
4420a9064fbSMasahiro Yamada 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
4430a9064fbSMasahiro Yamada 	if (mode == menuMode && type == P_MENU)
4440a9064fbSMasahiro Yamada 		emit menuSelected(menu);
4450a9064fbSMasahiro Yamada }
4460a9064fbSMasahiro Yamada 
4470a9064fbSMasahiro Yamada void ConfigList::updateList(ConfigItem* item)
4480a9064fbSMasahiro Yamada {
4490a9064fbSMasahiro Yamada 	ConfigItem* last = 0;
4500a9064fbSMasahiro Yamada 
4510a9064fbSMasahiro Yamada 	if (!rootEntry) {
4520a9064fbSMasahiro Yamada 		if (mode != listMode)
4530a9064fbSMasahiro Yamada 			goto update;
4540a9064fbSMasahiro Yamada 		Q3ListViewItemIterator it(this);
4550a9064fbSMasahiro Yamada 		ConfigItem* item;
4560a9064fbSMasahiro Yamada 
4570a9064fbSMasahiro Yamada 		for (; it.current(); ++it) {
4580a9064fbSMasahiro Yamada 			item = (ConfigItem*)it.current();
4590a9064fbSMasahiro Yamada 			if (!item->menu)
4600a9064fbSMasahiro Yamada 				continue;
4610a9064fbSMasahiro Yamada 			item->testUpdateMenu(menu_is_visible(item->menu));
4620a9064fbSMasahiro Yamada 		}
4630a9064fbSMasahiro Yamada 		return;
4640a9064fbSMasahiro Yamada 	}
4650a9064fbSMasahiro Yamada 
4660a9064fbSMasahiro Yamada 	if (rootEntry != &rootmenu && (mode == singleMode ||
4670a9064fbSMasahiro Yamada 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
4680a9064fbSMasahiro Yamada 		item = firstChild();
4690a9064fbSMasahiro Yamada 		if (!item)
4700a9064fbSMasahiro Yamada 			item = new ConfigItem(this, 0, true);
4710a9064fbSMasahiro Yamada 		last = item;
4720a9064fbSMasahiro Yamada 	}
4730a9064fbSMasahiro Yamada 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
4740a9064fbSMasahiro Yamada 	    rootEntry->sym && rootEntry->prompt) {
4750a9064fbSMasahiro Yamada 		item = last ? last->nextSibling() : firstChild();
4760a9064fbSMasahiro Yamada 		if (!item)
4770a9064fbSMasahiro Yamada 			item = new ConfigItem(this, last, rootEntry, true);
4780a9064fbSMasahiro Yamada 		else
4790a9064fbSMasahiro Yamada 			item->testUpdateMenu(true);
4800a9064fbSMasahiro Yamada 
4810a9064fbSMasahiro Yamada 		updateMenuList(item, rootEntry);
4820a9064fbSMasahiro Yamada 		triggerUpdate();
4830a9064fbSMasahiro Yamada 		return;
4840a9064fbSMasahiro Yamada 	}
4850a9064fbSMasahiro Yamada update:
4860a9064fbSMasahiro Yamada 	updateMenuList(this, rootEntry);
4870a9064fbSMasahiro Yamada 	triggerUpdate();
4880a9064fbSMasahiro Yamada }
4890a9064fbSMasahiro Yamada 
4900a9064fbSMasahiro Yamada void ConfigList::setValue(ConfigItem* item, tristate val)
4910a9064fbSMasahiro Yamada {
4920a9064fbSMasahiro Yamada 	struct symbol* sym;
4930a9064fbSMasahiro Yamada 	int type;
4940a9064fbSMasahiro Yamada 	tristate oldval;
4950a9064fbSMasahiro Yamada 
4960a9064fbSMasahiro Yamada 	sym = item->menu ? item->menu->sym : 0;
4970a9064fbSMasahiro Yamada 	if (!sym)
4980a9064fbSMasahiro Yamada 		return;
4990a9064fbSMasahiro Yamada 
5000a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
5010a9064fbSMasahiro Yamada 	switch (type) {
5020a9064fbSMasahiro Yamada 	case S_BOOLEAN:
5030a9064fbSMasahiro Yamada 	case S_TRISTATE:
5040a9064fbSMasahiro Yamada 		oldval = sym_get_tristate_value(sym);
5050a9064fbSMasahiro Yamada 
5060a9064fbSMasahiro Yamada 		if (!sym_set_tristate_value(sym, val))
5070a9064fbSMasahiro Yamada 			return;
5080a9064fbSMasahiro Yamada 		if (oldval == no && item->menu->list)
5090a9064fbSMasahiro Yamada 			item->setOpen(TRUE);
5100a9064fbSMasahiro Yamada 		parent()->updateList(item);
5110a9064fbSMasahiro Yamada 		break;
5120a9064fbSMasahiro Yamada 	}
5130a9064fbSMasahiro Yamada }
5140a9064fbSMasahiro Yamada 
5150a9064fbSMasahiro Yamada void ConfigList::changeValue(ConfigItem* item)
5160a9064fbSMasahiro Yamada {
5170a9064fbSMasahiro Yamada 	struct symbol* sym;
5180a9064fbSMasahiro Yamada 	struct menu* menu;
5190a9064fbSMasahiro Yamada 	int type, oldexpr, newexpr;
5200a9064fbSMasahiro Yamada 
5210a9064fbSMasahiro Yamada 	menu = item->menu;
5220a9064fbSMasahiro Yamada 	if (!menu)
5230a9064fbSMasahiro Yamada 		return;
5240a9064fbSMasahiro Yamada 	sym = menu->sym;
5250a9064fbSMasahiro Yamada 	if (!sym) {
5260a9064fbSMasahiro Yamada 		if (item->menu->list)
5270a9064fbSMasahiro Yamada 			item->setOpen(!item->isOpen());
5280a9064fbSMasahiro Yamada 		return;
5290a9064fbSMasahiro Yamada 	}
5300a9064fbSMasahiro Yamada 
5310a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
5320a9064fbSMasahiro Yamada 	switch (type) {
5330a9064fbSMasahiro Yamada 	case S_BOOLEAN:
5340a9064fbSMasahiro Yamada 	case S_TRISTATE:
5350a9064fbSMasahiro Yamada 		oldexpr = sym_get_tristate_value(sym);
5360a9064fbSMasahiro Yamada 		newexpr = sym_toggle_tristate_value(sym);
5370a9064fbSMasahiro Yamada 		if (item->menu->list) {
5380a9064fbSMasahiro Yamada 			if (oldexpr == newexpr)
5390a9064fbSMasahiro Yamada 				item->setOpen(!item->isOpen());
5400a9064fbSMasahiro Yamada 			else if (oldexpr == no)
5410a9064fbSMasahiro Yamada 				item->setOpen(TRUE);
5420a9064fbSMasahiro Yamada 		}
5430a9064fbSMasahiro Yamada 		if (oldexpr != newexpr)
5440a9064fbSMasahiro Yamada 			parent()->updateList(item);
5450a9064fbSMasahiro Yamada 		break;
5460a9064fbSMasahiro Yamada 	case S_INT:
5470a9064fbSMasahiro Yamada 	case S_HEX:
5480a9064fbSMasahiro Yamada 	case S_STRING:
5490a9064fbSMasahiro Yamada 		if (colMap[dataColIdx] >= 0)
5500a9064fbSMasahiro Yamada 			item->startRename(colMap[dataColIdx]);
5510a9064fbSMasahiro Yamada 		else
5520a9064fbSMasahiro Yamada 			parent()->lineEdit->show(item);
5530a9064fbSMasahiro Yamada 		break;
5540a9064fbSMasahiro Yamada 	}
5550a9064fbSMasahiro Yamada }
5560a9064fbSMasahiro Yamada 
5570a9064fbSMasahiro Yamada void ConfigList::setRootMenu(struct menu *menu)
5580a9064fbSMasahiro Yamada {
5590a9064fbSMasahiro Yamada 	enum prop_type type;
5600a9064fbSMasahiro Yamada 
5610a9064fbSMasahiro Yamada 	if (rootEntry == menu)
5620a9064fbSMasahiro Yamada 		return;
5630a9064fbSMasahiro Yamada 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
5640a9064fbSMasahiro Yamada 	if (type != P_MENU)
5650a9064fbSMasahiro Yamada 		return;
5660a9064fbSMasahiro Yamada 	updateMenuList(this, 0);
5670a9064fbSMasahiro Yamada 	rootEntry = menu;
5680a9064fbSMasahiro Yamada 	updateListAll();
5690a9064fbSMasahiro Yamada 	setSelected(currentItem(), hasFocus());
5700a9064fbSMasahiro Yamada 	ensureItemVisible(currentItem());
5710a9064fbSMasahiro Yamada }
5720a9064fbSMasahiro Yamada 
5730a9064fbSMasahiro Yamada void ConfigList::setParentMenu(void)
5740a9064fbSMasahiro Yamada {
5750a9064fbSMasahiro Yamada 	ConfigItem* item;
5760a9064fbSMasahiro Yamada 	struct menu *oldroot;
5770a9064fbSMasahiro Yamada 
5780a9064fbSMasahiro Yamada 	oldroot = rootEntry;
5790a9064fbSMasahiro Yamada 	if (rootEntry == &rootmenu)
5800a9064fbSMasahiro Yamada 		return;
5810a9064fbSMasahiro Yamada 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
5820a9064fbSMasahiro Yamada 
5830a9064fbSMasahiro Yamada 	Q3ListViewItemIterator it(this);
5840a9064fbSMasahiro Yamada 	for (; (item = (ConfigItem*)it.current()); it++) {
5850a9064fbSMasahiro Yamada 		if (item->menu == oldroot) {
5860a9064fbSMasahiro Yamada 			setCurrentItem(item);
5870a9064fbSMasahiro Yamada 			ensureItemVisible(item);
5880a9064fbSMasahiro Yamada 			break;
5890a9064fbSMasahiro Yamada 		}
5900a9064fbSMasahiro Yamada 	}
5910a9064fbSMasahiro Yamada }
5920a9064fbSMasahiro Yamada 
5930a9064fbSMasahiro Yamada /*
5940a9064fbSMasahiro Yamada  * update all the children of a menu entry
5950a9064fbSMasahiro Yamada  *   removes/adds the entries from the parent widget as necessary
5960a9064fbSMasahiro Yamada  *
5970a9064fbSMasahiro Yamada  * parent: either the menu list widget or a menu entry widget
5980a9064fbSMasahiro Yamada  * menu: entry to be updated
5990a9064fbSMasahiro Yamada  */
6000a9064fbSMasahiro Yamada template <class P>
6010a9064fbSMasahiro Yamada void ConfigList::updateMenuList(P* parent, struct menu* menu)
6020a9064fbSMasahiro Yamada {
6030a9064fbSMasahiro Yamada 	struct menu* child;
6040a9064fbSMasahiro Yamada 	ConfigItem* item;
6050a9064fbSMasahiro Yamada 	ConfigItem* last;
6060a9064fbSMasahiro Yamada 	bool visible;
6070a9064fbSMasahiro Yamada 	enum prop_type type;
6080a9064fbSMasahiro Yamada 
6090a9064fbSMasahiro Yamada 	if (!menu) {
6100a9064fbSMasahiro Yamada 		while ((item = parent->firstChild()))
6110a9064fbSMasahiro Yamada 			delete item;
6120a9064fbSMasahiro Yamada 		return;
6130a9064fbSMasahiro Yamada 	}
6140a9064fbSMasahiro Yamada 
6150a9064fbSMasahiro Yamada 	last = parent->firstChild();
6160a9064fbSMasahiro Yamada 	if (last && !last->goParent)
6170a9064fbSMasahiro Yamada 		last = 0;
6180a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
6190a9064fbSMasahiro Yamada 		item = last ? last->nextSibling() : parent->firstChild();
6200a9064fbSMasahiro Yamada 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6210a9064fbSMasahiro Yamada 
6220a9064fbSMasahiro Yamada 		switch (mode) {
6230a9064fbSMasahiro Yamada 		case menuMode:
6240a9064fbSMasahiro Yamada 			if (!(child->flags & MENU_ROOT))
6250a9064fbSMasahiro Yamada 				goto hide;
6260a9064fbSMasahiro Yamada 			break;
6270a9064fbSMasahiro Yamada 		case symbolMode:
6280a9064fbSMasahiro Yamada 			if (child->flags & MENU_ROOT)
6290a9064fbSMasahiro Yamada 				goto hide;
6300a9064fbSMasahiro Yamada 			break;
6310a9064fbSMasahiro Yamada 		default:
6320a9064fbSMasahiro Yamada 			break;
6330a9064fbSMasahiro Yamada 		}
6340a9064fbSMasahiro Yamada 
6350a9064fbSMasahiro Yamada 		visible = menu_is_visible(child);
6360a9064fbSMasahiro Yamada 		if (!menuSkip(child)) {
6370a9064fbSMasahiro Yamada 			if (!child->sym && !child->list && !child->prompt)
6380a9064fbSMasahiro Yamada 				continue;
6390a9064fbSMasahiro Yamada 			if (!item || item->menu != child)
6400a9064fbSMasahiro Yamada 				item = new ConfigItem(parent, last, child, visible);
6410a9064fbSMasahiro Yamada 			else
6420a9064fbSMasahiro Yamada 				item->testUpdateMenu(visible);
6430a9064fbSMasahiro Yamada 
6440a9064fbSMasahiro Yamada 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6450a9064fbSMasahiro Yamada 				updateMenuList(item, child);
6460a9064fbSMasahiro Yamada 			else
6470a9064fbSMasahiro Yamada 				updateMenuList(item, 0);
6480a9064fbSMasahiro Yamada 			last = item;
6490a9064fbSMasahiro Yamada 			continue;
6500a9064fbSMasahiro Yamada 		}
6510a9064fbSMasahiro Yamada 	hide:
6520a9064fbSMasahiro Yamada 		if (item && item->menu == child) {
6530a9064fbSMasahiro Yamada 			last = parent->firstChild();
6540a9064fbSMasahiro Yamada 			if (last == item)
6550a9064fbSMasahiro Yamada 				last = 0;
6560a9064fbSMasahiro Yamada 			else while (last->nextSibling() != item)
6570a9064fbSMasahiro Yamada 				last = last->nextSibling();
6580a9064fbSMasahiro Yamada 			delete item;
6590a9064fbSMasahiro Yamada 		}
6600a9064fbSMasahiro Yamada 	}
6610a9064fbSMasahiro Yamada }
6620a9064fbSMasahiro Yamada 
6630a9064fbSMasahiro Yamada void ConfigList::keyPressEvent(QKeyEvent* ev)
6640a9064fbSMasahiro Yamada {
6650a9064fbSMasahiro Yamada 	Q3ListViewItem* i = currentItem();
6660a9064fbSMasahiro Yamada 	ConfigItem* item;
6670a9064fbSMasahiro Yamada 	struct menu *menu;
6680a9064fbSMasahiro Yamada 	enum prop_type type;
6690a9064fbSMasahiro Yamada 
6700a9064fbSMasahiro Yamada 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
6710a9064fbSMasahiro Yamada 		emit parentSelected();
6720a9064fbSMasahiro Yamada 		ev->accept();
6730a9064fbSMasahiro Yamada 		return;
6740a9064fbSMasahiro Yamada 	}
6750a9064fbSMasahiro Yamada 
6760a9064fbSMasahiro Yamada 	if (!i) {
6770a9064fbSMasahiro Yamada 		Parent::keyPressEvent(ev);
6780a9064fbSMasahiro Yamada 		return;
6790a9064fbSMasahiro Yamada 	}
6800a9064fbSMasahiro Yamada 	item = (ConfigItem*)i;
6810a9064fbSMasahiro Yamada 
6820a9064fbSMasahiro Yamada 	switch (ev->key()) {
6830a9064fbSMasahiro Yamada 	case Qt::Key_Return:
6840a9064fbSMasahiro Yamada 	case Qt::Key_Enter:
6850a9064fbSMasahiro Yamada 		if (item->goParent) {
6860a9064fbSMasahiro Yamada 			emit parentSelected();
6870a9064fbSMasahiro Yamada 			break;
6880a9064fbSMasahiro Yamada 		}
6890a9064fbSMasahiro Yamada 		menu = item->menu;
6900a9064fbSMasahiro Yamada 		if (!menu)
6910a9064fbSMasahiro Yamada 			break;
6920a9064fbSMasahiro Yamada 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
6930a9064fbSMasahiro Yamada 		if (type == P_MENU && rootEntry != menu &&
6940a9064fbSMasahiro Yamada 		    mode != fullMode && mode != menuMode) {
6950a9064fbSMasahiro Yamada 			emit menuSelected(menu);
6960a9064fbSMasahiro Yamada 			break;
6970a9064fbSMasahiro Yamada 		}
6980a9064fbSMasahiro Yamada 	case Qt::Key_Space:
6990a9064fbSMasahiro Yamada 		changeValue(item);
7000a9064fbSMasahiro Yamada 		break;
7010a9064fbSMasahiro Yamada 	case Qt::Key_N:
7020a9064fbSMasahiro Yamada 		setValue(item, no);
7030a9064fbSMasahiro Yamada 		break;
7040a9064fbSMasahiro Yamada 	case Qt::Key_M:
7050a9064fbSMasahiro Yamada 		setValue(item, mod);
7060a9064fbSMasahiro Yamada 		break;
7070a9064fbSMasahiro Yamada 	case Qt::Key_Y:
7080a9064fbSMasahiro Yamada 		setValue(item, yes);
7090a9064fbSMasahiro Yamada 		break;
7100a9064fbSMasahiro Yamada 	default:
7110a9064fbSMasahiro Yamada 		Parent::keyPressEvent(ev);
7120a9064fbSMasahiro Yamada 		return;
7130a9064fbSMasahiro Yamada 	}
7140a9064fbSMasahiro Yamada 	ev->accept();
7150a9064fbSMasahiro Yamada }
7160a9064fbSMasahiro Yamada 
7170a9064fbSMasahiro Yamada void ConfigList::contentsMousePressEvent(QMouseEvent* e)
7180a9064fbSMasahiro Yamada {
7190a9064fbSMasahiro Yamada 	//QPoint p(contentsToViewport(e->pos()));
7200a9064fbSMasahiro Yamada 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
7210a9064fbSMasahiro Yamada 	Parent::contentsMousePressEvent(e);
7220a9064fbSMasahiro Yamada }
7230a9064fbSMasahiro Yamada 
7240a9064fbSMasahiro Yamada void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e)
7250a9064fbSMasahiro Yamada {
7260a9064fbSMasahiro Yamada 	QPoint p(contentsToViewport(e->pos()));
7270a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)itemAt(p);
7280a9064fbSMasahiro Yamada 	struct menu *menu;
7290a9064fbSMasahiro Yamada 	enum prop_type ptype;
7300a9064fbSMasahiro Yamada 	const QPixmap* pm;
7310a9064fbSMasahiro Yamada 	int idx, x;
7320a9064fbSMasahiro Yamada 
7330a9064fbSMasahiro Yamada 	if (!item)
7340a9064fbSMasahiro Yamada 		goto skip;
7350a9064fbSMasahiro Yamada 
7360a9064fbSMasahiro Yamada 	menu = item->menu;
7370a9064fbSMasahiro Yamada 	x = header()->offset() + p.x();
7380a9064fbSMasahiro Yamada 	idx = colRevMap[header()->sectionAt(x)];
7390a9064fbSMasahiro Yamada 	switch (idx) {
7400a9064fbSMasahiro Yamada 	case promptColIdx:
7410a9064fbSMasahiro Yamada 		pm = item->pixmap(promptColIdx);
7420a9064fbSMasahiro Yamada 		if (pm) {
7430a9064fbSMasahiro Yamada 			int off = header()->sectionPos(0) + itemMargin() +
7440a9064fbSMasahiro Yamada 				treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0));
7450a9064fbSMasahiro Yamada 			if (x >= off && x < off + pm->width()) {
7460a9064fbSMasahiro Yamada 				if (item->goParent) {
7470a9064fbSMasahiro Yamada 					emit parentSelected();
7480a9064fbSMasahiro Yamada 					break;
7490a9064fbSMasahiro Yamada 				} else if (!menu)
7500a9064fbSMasahiro Yamada 					break;
7510a9064fbSMasahiro Yamada 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
7520a9064fbSMasahiro Yamada 				if (ptype == P_MENU && rootEntry != menu &&
7530a9064fbSMasahiro Yamada 				    mode != fullMode && mode != menuMode)
7540a9064fbSMasahiro Yamada 					emit menuSelected(menu);
7550a9064fbSMasahiro Yamada 				else
7560a9064fbSMasahiro Yamada 					changeValue(item);
7570a9064fbSMasahiro Yamada 			}
7580a9064fbSMasahiro Yamada 		}
7590a9064fbSMasahiro Yamada 		break;
7600a9064fbSMasahiro Yamada 	case noColIdx:
7610a9064fbSMasahiro Yamada 		setValue(item, no);
7620a9064fbSMasahiro Yamada 		break;
7630a9064fbSMasahiro Yamada 	case modColIdx:
7640a9064fbSMasahiro Yamada 		setValue(item, mod);
7650a9064fbSMasahiro Yamada 		break;
7660a9064fbSMasahiro Yamada 	case yesColIdx:
7670a9064fbSMasahiro Yamada 		setValue(item, yes);
7680a9064fbSMasahiro Yamada 		break;
7690a9064fbSMasahiro Yamada 	case dataColIdx:
7700a9064fbSMasahiro Yamada 		changeValue(item);
7710a9064fbSMasahiro Yamada 		break;
7720a9064fbSMasahiro Yamada 	}
7730a9064fbSMasahiro Yamada 
7740a9064fbSMasahiro Yamada skip:
7750a9064fbSMasahiro Yamada 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
7760a9064fbSMasahiro Yamada 	Parent::contentsMouseReleaseEvent(e);
7770a9064fbSMasahiro Yamada }
7780a9064fbSMasahiro Yamada 
7790a9064fbSMasahiro Yamada void ConfigList::contentsMouseMoveEvent(QMouseEvent* e)
7800a9064fbSMasahiro Yamada {
7810a9064fbSMasahiro Yamada 	//QPoint p(contentsToViewport(e->pos()));
7820a9064fbSMasahiro Yamada 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
7830a9064fbSMasahiro Yamada 	Parent::contentsMouseMoveEvent(e);
7840a9064fbSMasahiro Yamada }
7850a9064fbSMasahiro Yamada 
7860a9064fbSMasahiro Yamada void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
7870a9064fbSMasahiro Yamada {
7880a9064fbSMasahiro Yamada 	QPoint p(contentsToViewport(e->pos()));
7890a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)itemAt(p);
7900a9064fbSMasahiro Yamada 	struct menu *menu;
7910a9064fbSMasahiro Yamada 	enum prop_type ptype;
7920a9064fbSMasahiro Yamada 
7930a9064fbSMasahiro Yamada 	if (!item)
7940a9064fbSMasahiro Yamada 		goto skip;
7950a9064fbSMasahiro Yamada 	if (item->goParent) {
7960a9064fbSMasahiro Yamada 		emit parentSelected();
7970a9064fbSMasahiro Yamada 		goto skip;
7980a9064fbSMasahiro Yamada 	}
7990a9064fbSMasahiro Yamada 	menu = item->menu;
8000a9064fbSMasahiro Yamada 	if (!menu)
8010a9064fbSMasahiro Yamada 		goto skip;
8020a9064fbSMasahiro Yamada 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8030a9064fbSMasahiro Yamada 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
8040a9064fbSMasahiro Yamada 		emit menuSelected(menu);
8050a9064fbSMasahiro Yamada 	else if (menu->sym)
8060a9064fbSMasahiro Yamada 		changeValue(item);
8070a9064fbSMasahiro Yamada 
8080a9064fbSMasahiro Yamada skip:
8090a9064fbSMasahiro Yamada 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
8100a9064fbSMasahiro Yamada 	Parent::contentsMouseDoubleClickEvent(e);
8110a9064fbSMasahiro Yamada }
8120a9064fbSMasahiro Yamada 
8130a9064fbSMasahiro Yamada void ConfigList::focusInEvent(QFocusEvent *e)
8140a9064fbSMasahiro Yamada {
8150a9064fbSMasahiro Yamada 	struct menu *menu = NULL;
8160a9064fbSMasahiro Yamada 
8170a9064fbSMasahiro Yamada 	Parent::focusInEvent(e);
8180a9064fbSMasahiro Yamada 
8190a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem *)currentItem();
8200a9064fbSMasahiro Yamada 	if (item) {
8210a9064fbSMasahiro Yamada 		setSelected(item, TRUE);
8220a9064fbSMasahiro Yamada 		menu = item->menu;
8230a9064fbSMasahiro Yamada 	}
8240a9064fbSMasahiro Yamada 	emit gotFocus(menu);
8250a9064fbSMasahiro Yamada }
8260a9064fbSMasahiro Yamada 
8270a9064fbSMasahiro Yamada void ConfigList::contextMenuEvent(QContextMenuEvent *e)
8280a9064fbSMasahiro Yamada {
8290a9064fbSMasahiro Yamada 	if (e->y() <= header()->geometry().bottom()) {
8300a9064fbSMasahiro Yamada 		if (!headerPopup) {
8310a9064fbSMasahiro Yamada 			Q3Action *action;
8320a9064fbSMasahiro Yamada 
8330a9064fbSMasahiro Yamada 			headerPopup = new Q3PopupMenu(this);
8340a9064fbSMasahiro Yamada 			action = new Q3Action(NULL, _("Show Name"), 0, this);
8350a9064fbSMasahiro Yamada 			  action->setToggleAction(TRUE);
8360a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
8370a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowName(bool)));
8380a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showNameChanged(bool)),
8390a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
8400a9064fbSMasahiro Yamada 			  action->setOn(showName);
8410a9064fbSMasahiro Yamada 			  action->addTo(headerPopup);
8420a9064fbSMasahiro Yamada 			action = new Q3Action(NULL, _("Show Range"), 0, this);
8430a9064fbSMasahiro Yamada 			  action->setToggleAction(TRUE);
8440a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
8450a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowRange(bool)));
8460a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
8470a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
8480a9064fbSMasahiro Yamada 			  action->setOn(showRange);
8490a9064fbSMasahiro Yamada 			  action->addTo(headerPopup);
8500a9064fbSMasahiro Yamada 			action = new Q3Action(NULL, _("Show Data"), 0, this);
8510a9064fbSMasahiro Yamada 			  action->setToggleAction(TRUE);
8520a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
8530a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowData(bool)));
8540a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showDataChanged(bool)),
8550a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
8560a9064fbSMasahiro Yamada 			  action->setOn(showData);
8570a9064fbSMasahiro Yamada 			  action->addTo(headerPopup);
8580a9064fbSMasahiro Yamada 		}
8590a9064fbSMasahiro Yamada 		headerPopup->exec(e->globalPos());
8600a9064fbSMasahiro Yamada 		e->accept();
8610a9064fbSMasahiro Yamada 	} else
8620a9064fbSMasahiro Yamada 		e->ignore();
8630a9064fbSMasahiro Yamada }
8640a9064fbSMasahiro Yamada 
8650a9064fbSMasahiro Yamada ConfigView*ConfigView::viewList;
8660a9064fbSMasahiro Yamada QAction *ConfigView::showNormalAction;
8670a9064fbSMasahiro Yamada QAction *ConfigView::showAllAction;
8680a9064fbSMasahiro Yamada QAction *ConfigView::showPromptAction;
8690a9064fbSMasahiro Yamada 
8700a9064fbSMasahiro Yamada ConfigView::ConfigView(QWidget* parent, const char *name)
8710a9064fbSMasahiro Yamada 	: Parent(parent, name)
8720a9064fbSMasahiro Yamada {
8730a9064fbSMasahiro Yamada 	list = new ConfigList(this, name);
8740a9064fbSMasahiro Yamada 	lineEdit = new ConfigLineEdit(this);
8750a9064fbSMasahiro Yamada 	lineEdit->hide();
8760a9064fbSMasahiro Yamada 
8770a9064fbSMasahiro Yamada 	this->nextView = viewList;
8780a9064fbSMasahiro Yamada 	viewList = this;
8790a9064fbSMasahiro Yamada }
8800a9064fbSMasahiro Yamada 
8810a9064fbSMasahiro Yamada ConfigView::~ConfigView(void)
8820a9064fbSMasahiro Yamada {
8830a9064fbSMasahiro Yamada 	ConfigView** vp;
8840a9064fbSMasahiro Yamada 
8850a9064fbSMasahiro Yamada 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
8860a9064fbSMasahiro Yamada 		if (*vp == this) {
8870a9064fbSMasahiro Yamada 			*vp = nextView;
8880a9064fbSMasahiro Yamada 			break;
8890a9064fbSMasahiro Yamada 		}
8900a9064fbSMasahiro Yamada 	}
8910a9064fbSMasahiro Yamada }
8920a9064fbSMasahiro Yamada 
8930a9064fbSMasahiro Yamada void ConfigView::setOptionMode(QAction *act)
8940a9064fbSMasahiro Yamada {
8950a9064fbSMasahiro Yamada 	if (act == showNormalAction)
8960a9064fbSMasahiro Yamada 		list->optMode = normalOpt;
8970a9064fbSMasahiro Yamada 	else if (act == showAllAction)
8980a9064fbSMasahiro Yamada 		list->optMode = allOpt;
8990a9064fbSMasahiro Yamada 	else
9000a9064fbSMasahiro Yamada 		list->optMode = promptOpt;
9010a9064fbSMasahiro Yamada 
9020a9064fbSMasahiro Yamada 	list->updateListAll();
9030a9064fbSMasahiro Yamada }
9040a9064fbSMasahiro Yamada 
9050a9064fbSMasahiro Yamada void ConfigView::setShowName(bool b)
9060a9064fbSMasahiro Yamada {
9070a9064fbSMasahiro Yamada 	if (list->showName != b) {
9080a9064fbSMasahiro Yamada 		list->showName = b;
9090a9064fbSMasahiro Yamada 		list->reinit();
9100a9064fbSMasahiro Yamada 		emit showNameChanged(b);
9110a9064fbSMasahiro Yamada 	}
9120a9064fbSMasahiro Yamada }
9130a9064fbSMasahiro Yamada 
9140a9064fbSMasahiro Yamada void ConfigView::setShowRange(bool b)
9150a9064fbSMasahiro Yamada {
9160a9064fbSMasahiro Yamada 	if (list->showRange != b) {
9170a9064fbSMasahiro Yamada 		list->showRange = b;
9180a9064fbSMasahiro Yamada 		list->reinit();
9190a9064fbSMasahiro Yamada 		emit showRangeChanged(b);
9200a9064fbSMasahiro Yamada 	}
9210a9064fbSMasahiro Yamada }
9220a9064fbSMasahiro Yamada 
9230a9064fbSMasahiro Yamada void ConfigView::setShowData(bool b)
9240a9064fbSMasahiro Yamada {
9250a9064fbSMasahiro Yamada 	if (list->showData != b) {
9260a9064fbSMasahiro Yamada 		list->showData = b;
9270a9064fbSMasahiro Yamada 		list->reinit();
9280a9064fbSMasahiro Yamada 		emit showDataChanged(b);
9290a9064fbSMasahiro Yamada 	}
9300a9064fbSMasahiro Yamada }
9310a9064fbSMasahiro Yamada 
9320a9064fbSMasahiro Yamada void ConfigList::setAllOpen(bool open)
9330a9064fbSMasahiro Yamada {
9340a9064fbSMasahiro Yamada 	Q3ListViewItemIterator it(this);
9350a9064fbSMasahiro Yamada 
9360a9064fbSMasahiro Yamada 	for (; it.current(); it++)
9370a9064fbSMasahiro Yamada 		it.current()->setOpen(open);
9380a9064fbSMasahiro Yamada }
9390a9064fbSMasahiro Yamada 
9400a9064fbSMasahiro Yamada void ConfigView::updateList(ConfigItem* item)
9410a9064fbSMasahiro Yamada {
9420a9064fbSMasahiro Yamada 	ConfigView* v;
9430a9064fbSMasahiro Yamada 
9440a9064fbSMasahiro Yamada 	for (v = viewList; v; v = v->nextView)
9450a9064fbSMasahiro Yamada 		v->list->updateList(item);
9460a9064fbSMasahiro Yamada }
9470a9064fbSMasahiro Yamada 
9480a9064fbSMasahiro Yamada void ConfigView::updateListAll(void)
9490a9064fbSMasahiro Yamada {
9500a9064fbSMasahiro Yamada 	ConfigView* v;
9510a9064fbSMasahiro Yamada 
9520a9064fbSMasahiro Yamada 	for (v = viewList; v; v = v->nextView)
9530a9064fbSMasahiro Yamada 		v->list->updateListAll();
9540a9064fbSMasahiro Yamada }
9550a9064fbSMasahiro Yamada 
9560a9064fbSMasahiro Yamada ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
9570a9064fbSMasahiro Yamada 	: Parent(parent, name), sym(0), _menu(0)
9580a9064fbSMasahiro Yamada {
9590a9064fbSMasahiro Yamada 	if (name) {
9600a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
9610a9064fbSMasahiro Yamada 		_showDebug = configSettings->readBoolEntry("/showDebug", false);
9620a9064fbSMasahiro Yamada 		configSettings->endGroup();
9630a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
9640a9064fbSMasahiro Yamada 	}
9650a9064fbSMasahiro Yamada }
9660a9064fbSMasahiro Yamada 
9670a9064fbSMasahiro Yamada void ConfigInfoView::saveSettings(void)
9680a9064fbSMasahiro Yamada {
9690a9064fbSMasahiro Yamada 	if (name()) {
9700a9064fbSMasahiro Yamada 		configSettings->beginGroup(name());
9710a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showDebug", showDebug());
9720a9064fbSMasahiro Yamada 		configSettings->endGroup();
9730a9064fbSMasahiro Yamada 	}
9740a9064fbSMasahiro Yamada }
9750a9064fbSMasahiro Yamada 
9760a9064fbSMasahiro Yamada void ConfigInfoView::setShowDebug(bool b)
9770a9064fbSMasahiro Yamada {
9780a9064fbSMasahiro Yamada 	if (_showDebug != b) {
9790a9064fbSMasahiro Yamada 		_showDebug = b;
9800a9064fbSMasahiro Yamada 		if (_menu)
9810a9064fbSMasahiro Yamada 			menuInfo();
9820a9064fbSMasahiro Yamada 		else if (sym)
9830a9064fbSMasahiro Yamada 			symbolInfo();
9840a9064fbSMasahiro Yamada 		emit showDebugChanged(b);
9850a9064fbSMasahiro Yamada 	}
9860a9064fbSMasahiro Yamada }
9870a9064fbSMasahiro Yamada 
9880a9064fbSMasahiro Yamada void ConfigInfoView::setInfo(struct menu *m)
9890a9064fbSMasahiro Yamada {
9900a9064fbSMasahiro Yamada 	if (_menu == m)
9910a9064fbSMasahiro Yamada 		return;
9920a9064fbSMasahiro Yamada 	_menu = m;
9930a9064fbSMasahiro Yamada 	sym = NULL;
9940a9064fbSMasahiro Yamada 	if (!_menu)
9950a9064fbSMasahiro Yamada 		clear();
9960a9064fbSMasahiro Yamada 	else
9970a9064fbSMasahiro Yamada 		menuInfo();
9980a9064fbSMasahiro Yamada }
9990a9064fbSMasahiro Yamada 
10000a9064fbSMasahiro Yamada void ConfigInfoView::symbolInfo(void)
10010a9064fbSMasahiro Yamada {
10020a9064fbSMasahiro Yamada 	QString str;
10030a9064fbSMasahiro Yamada 
10040a9064fbSMasahiro Yamada 	str += "<big>Symbol: <b>";
10050a9064fbSMasahiro Yamada 	str += print_filter(sym->name);
10060a9064fbSMasahiro Yamada 	str += "</b></big><br><br>value: ";
10070a9064fbSMasahiro Yamada 	str += print_filter(sym_get_string_value(sym));
10080a9064fbSMasahiro Yamada 	str += "<br>visibility: ";
10090a9064fbSMasahiro Yamada 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
10100a9064fbSMasahiro Yamada 	str += "<br>";
10110a9064fbSMasahiro Yamada 	str += debug_info(sym);
10120a9064fbSMasahiro Yamada 
10130a9064fbSMasahiro Yamada 	setText(str);
10140a9064fbSMasahiro Yamada }
10150a9064fbSMasahiro Yamada 
10160a9064fbSMasahiro Yamada void ConfigInfoView::menuInfo(void)
10170a9064fbSMasahiro Yamada {
10180a9064fbSMasahiro Yamada 	struct symbol* sym;
10190a9064fbSMasahiro Yamada 	QString head, debug, help;
10200a9064fbSMasahiro Yamada 
10210a9064fbSMasahiro Yamada 	sym = _menu->sym;
10220a9064fbSMasahiro Yamada 	if (sym) {
10230a9064fbSMasahiro Yamada 		if (_menu->prompt) {
10240a9064fbSMasahiro Yamada 			head += "<big><b>";
10250a9064fbSMasahiro Yamada 			head += print_filter(_(_menu->prompt->text));
10260a9064fbSMasahiro Yamada 			head += "</b></big>";
10270a9064fbSMasahiro Yamada 			if (sym->name) {
10280a9064fbSMasahiro Yamada 				head += " (";
10290a9064fbSMasahiro Yamada 				if (showDebug())
10300a9064fbSMasahiro Yamada 					head += QString().sprintf("<a href=\"s%p\">", sym);
10310a9064fbSMasahiro Yamada 				head += print_filter(sym->name);
10320a9064fbSMasahiro Yamada 				if (showDebug())
10330a9064fbSMasahiro Yamada 					head += "</a>";
10340a9064fbSMasahiro Yamada 				head += ")";
10350a9064fbSMasahiro Yamada 			}
10360a9064fbSMasahiro Yamada 		} else if (sym->name) {
10370a9064fbSMasahiro Yamada 			head += "<big><b>";
10380a9064fbSMasahiro Yamada 			if (showDebug())
10390a9064fbSMasahiro Yamada 				head += QString().sprintf("<a href=\"s%p\">", sym);
10400a9064fbSMasahiro Yamada 			head += print_filter(sym->name);
10410a9064fbSMasahiro Yamada 			if (showDebug())
10420a9064fbSMasahiro Yamada 				head += "</a>";
10430a9064fbSMasahiro Yamada 			head += "</b></big>";
10440a9064fbSMasahiro Yamada 		}
10450a9064fbSMasahiro Yamada 		head += "<br><br>";
10460a9064fbSMasahiro Yamada 
10470a9064fbSMasahiro Yamada 		if (showDebug())
10480a9064fbSMasahiro Yamada 			debug = debug_info(sym);
10490a9064fbSMasahiro Yamada 
10500a9064fbSMasahiro Yamada 		struct gstr help_gstr = str_new();
10510a9064fbSMasahiro Yamada 		menu_get_ext_help(_menu, &help_gstr);
10520a9064fbSMasahiro Yamada 		help = print_filter(str_get(&help_gstr));
10530a9064fbSMasahiro Yamada 		str_free(&help_gstr);
10540a9064fbSMasahiro Yamada 	} else if (_menu->prompt) {
10550a9064fbSMasahiro Yamada 		head += "<big><b>";
10560a9064fbSMasahiro Yamada 		head += print_filter(_(_menu->prompt->text));
10570a9064fbSMasahiro Yamada 		head += "</b></big><br><br>";
10580a9064fbSMasahiro Yamada 		if (showDebug()) {
10590a9064fbSMasahiro Yamada 			if (_menu->prompt->visible.expr) {
10600a9064fbSMasahiro Yamada 				debug += "&nbsp;&nbsp;dep: ";
10610a9064fbSMasahiro Yamada 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
10620a9064fbSMasahiro Yamada 				debug += "<br><br>";
10630a9064fbSMasahiro Yamada 			}
10640a9064fbSMasahiro Yamada 		}
10650a9064fbSMasahiro Yamada 	}
10660a9064fbSMasahiro Yamada 	if (showDebug())
10670a9064fbSMasahiro Yamada 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
10680a9064fbSMasahiro Yamada 
10690a9064fbSMasahiro Yamada 	setText(head + debug + help);
10700a9064fbSMasahiro Yamada }
10710a9064fbSMasahiro Yamada 
10720a9064fbSMasahiro Yamada QString ConfigInfoView::debug_info(struct symbol *sym)
10730a9064fbSMasahiro Yamada {
10740a9064fbSMasahiro Yamada 	QString debug;
10750a9064fbSMasahiro Yamada 
10760a9064fbSMasahiro Yamada 	debug += "type: ";
10770a9064fbSMasahiro Yamada 	debug += print_filter(sym_type_name(sym->type));
10780a9064fbSMasahiro Yamada 	if (sym_is_choice(sym))
10790a9064fbSMasahiro Yamada 		debug += " (choice)";
10800a9064fbSMasahiro Yamada 	debug += "<br>";
10810a9064fbSMasahiro Yamada 	if (sym->rev_dep.expr) {
10820a9064fbSMasahiro Yamada 		debug += "reverse dep: ";
10830a9064fbSMasahiro Yamada 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
10840a9064fbSMasahiro Yamada 		debug += "<br>";
10850a9064fbSMasahiro Yamada 	}
10860a9064fbSMasahiro Yamada 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
10870a9064fbSMasahiro Yamada 		switch (prop->type) {
10880a9064fbSMasahiro Yamada 		case P_PROMPT:
10890a9064fbSMasahiro Yamada 		case P_MENU:
10900a9064fbSMasahiro Yamada 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
10910a9064fbSMasahiro Yamada 			debug += print_filter(_(prop->text));
10920a9064fbSMasahiro Yamada 			debug += "</a><br>";
10930a9064fbSMasahiro Yamada 			break;
10940a9064fbSMasahiro Yamada 		case P_DEFAULT:
10950a9064fbSMasahiro Yamada 		case P_SELECT:
10960a9064fbSMasahiro Yamada 		case P_RANGE:
10970a9064fbSMasahiro Yamada 		case P_ENV:
10980a9064fbSMasahiro Yamada 			debug += prop_get_type_name(prop->type);
10990a9064fbSMasahiro Yamada 			debug += ": ";
11000a9064fbSMasahiro Yamada 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11010a9064fbSMasahiro Yamada 			debug += "<br>";
11020a9064fbSMasahiro Yamada 			break;
11030a9064fbSMasahiro Yamada 		case P_CHOICE:
11040a9064fbSMasahiro Yamada 			if (sym_is_choice(sym)) {
11050a9064fbSMasahiro Yamada 				debug += "choice: ";
11060a9064fbSMasahiro Yamada 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11070a9064fbSMasahiro Yamada 				debug += "<br>";
11080a9064fbSMasahiro Yamada 			}
11090a9064fbSMasahiro Yamada 			break;
11100a9064fbSMasahiro Yamada 		default:
11110a9064fbSMasahiro Yamada 			debug += "unknown property: ";
11120a9064fbSMasahiro Yamada 			debug += prop_get_type_name(prop->type);
11130a9064fbSMasahiro Yamada 			debug += "<br>";
11140a9064fbSMasahiro Yamada 		}
11150a9064fbSMasahiro Yamada 		if (prop->visible.expr) {
11160a9064fbSMasahiro Yamada 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11170a9064fbSMasahiro Yamada 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11180a9064fbSMasahiro Yamada 			debug += "<br>";
11190a9064fbSMasahiro Yamada 		}
11200a9064fbSMasahiro Yamada 	}
11210a9064fbSMasahiro Yamada 	debug += "<br>";
11220a9064fbSMasahiro Yamada 
11230a9064fbSMasahiro Yamada 	return debug;
11240a9064fbSMasahiro Yamada }
11250a9064fbSMasahiro Yamada 
11260a9064fbSMasahiro Yamada QString ConfigInfoView::print_filter(const QString &str)
11270a9064fbSMasahiro Yamada {
11280a9064fbSMasahiro Yamada 	QRegExp re("[<>&\"\\n]");
11290a9064fbSMasahiro Yamada 	QString res = str;
11300a9064fbSMasahiro Yamada 	for (int i = 0; (i = res.find(re, i)) >= 0;) {
11310a9064fbSMasahiro Yamada 		switch (res[i].latin1()) {
11320a9064fbSMasahiro Yamada 		case '<':
11330a9064fbSMasahiro Yamada 			res.replace(i, 1, "&lt;");
11340a9064fbSMasahiro Yamada 			i += 4;
11350a9064fbSMasahiro Yamada 			break;
11360a9064fbSMasahiro Yamada 		case '>':
11370a9064fbSMasahiro Yamada 			res.replace(i, 1, "&gt;");
11380a9064fbSMasahiro Yamada 			i += 4;
11390a9064fbSMasahiro Yamada 			break;
11400a9064fbSMasahiro Yamada 		case '&':
11410a9064fbSMasahiro Yamada 			res.replace(i, 1, "&amp;");
11420a9064fbSMasahiro Yamada 			i += 5;
11430a9064fbSMasahiro Yamada 			break;
11440a9064fbSMasahiro Yamada 		case '"':
11450a9064fbSMasahiro Yamada 			res.replace(i, 1, "&quot;");
11460a9064fbSMasahiro Yamada 			i += 6;
11470a9064fbSMasahiro Yamada 			break;
11480a9064fbSMasahiro Yamada 		case '\n':
11490a9064fbSMasahiro Yamada 			res.replace(i, 1, "<br>");
11500a9064fbSMasahiro Yamada 			i += 4;
11510a9064fbSMasahiro Yamada 			break;
11520a9064fbSMasahiro Yamada 		}
11530a9064fbSMasahiro Yamada 	}
11540a9064fbSMasahiro Yamada 	return res;
11550a9064fbSMasahiro Yamada }
11560a9064fbSMasahiro Yamada 
11570a9064fbSMasahiro Yamada void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
11580a9064fbSMasahiro Yamada {
11590a9064fbSMasahiro Yamada 	QString* text = reinterpret_cast<QString*>(data);
11600a9064fbSMasahiro Yamada 	QString str2 = print_filter(str);
11610a9064fbSMasahiro Yamada 
11620a9064fbSMasahiro Yamada 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
11630a9064fbSMasahiro Yamada 		*text += QString().sprintf("<a href=\"s%p\">", sym);
11640a9064fbSMasahiro Yamada 		*text += str2;
11650a9064fbSMasahiro Yamada 		*text += "</a>";
11660a9064fbSMasahiro Yamada 	} else
11670a9064fbSMasahiro Yamada 		*text += str2;
11680a9064fbSMasahiro Yamada }
11690a9064fbSMasahiro Yamada 
11700a9064fbSMasahiro Yamada Q3PopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)
11710a9064fbSMasahiro Yamada {
11720a9064fbSMasahiro Yamada 	Q3PopupMenu* popup = Parent::createPopupMenu(pos);
11730a9064fbSMasahiro Yamada 	Q3Action* action = new Q3Action(NULL, _("Show Debug Info"), 0, popup);
11740a9064fbSMasahiro Yamada 	  action->setToggleAction(TRUE);
11750a9064fbSMasahiro Yamada 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
11760a9064fbSMasahiro Yamada 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
11770a9064fbSMasahiro Yamada 	  action->setOn(showDebug());
11780a9064fbSMasahiro Yamada 	popup->insertSeparator();
11790a9064fbSMasahiro Yamada 	action->addTo(popup);
11800a9064fbSMasahiro Yamada 	return popup;
11810a9064fbSMasahiro Yamada }
11820a9064fbSMasahiro Yamada 
11830a9064fbSMasahiro Yamada void ConfigInfoView::contentsContextMenuEvent(QContextMenuEvent *e)
11840a9064fbSMasahiro Yamada {
11850a9064fbSMasahiro Yamada 	Parent::contentsContextMenuEvent(e);
11860a9064fbSMasahiro Yamada }
11870a9064fbSMasahiro Yamada 
11880a9064fbSMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
11890a9064fbSMasahiro Yamada 	: Parent(parent, name), result(NULL)
11900a9064fbSMasahiro Yamada {
11910a9064fbSMasahiro Yamada 	setCaption("Search Config");
11920a9064fbSMasahiro Yamada 
11930a9064fbSMasahiro Yamada 	QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6);
11940a9064fbSMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6);
11950a9064fbSMasahiro Yamada 	layout2->addWidget(new QLabel(_("Find:"), this));
11960a9064fbSMasahiro Yamada 	editField = new QLineEdit(this);
11970a9064fbSMasahiro Yamada 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
11980a9064fbSMasahiro Yamada 	layout2->addWidget(editField);
11990a9064fbSMasahiro Yamada 	searchButton = new QPushButton(_("Search"), this);
12000a9064fbSMasahiro Yamada 	searchButton->setAutoDefault(FALSE);
12010a9064fbSMasahiro Yamada 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
12020a9064fbSMasahiro Yamada 	layout2->addWidget(searchButton);
12030a9064fbSMasahiro Yamada 	layout1->addLayout(layout2);
12040a9064fbSMasahiro Yamada 
12050a9064fbSMasahiro Yamada 	split = new QSplitter(this);
12060a9064fbSMasahiro Yamada 	split->setOrientation(Qt::Vertical);
12070a9064fbSMasahiro Yamada 	list = new ConfigView(split, name);
12080a9064fbSMasahiro Yamada 	list->list->mode = listMode;
12090a9064fbSMasahiro Yamada 	info = new ConfigInfoView(split, name);
12100a9064fbSMasahiro Yamada 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
12110a9064fbSMasahiro Yamada 		info, SLOT(setInfo(struct menu *)));
12120a9064fbSMasahiro Yamada 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
12130a9064fbSMasahiro Yamada 		parent, SLOT(setMenuLink(struct menu *)));
12140a9064fbSMasahiro Yamada 
12150a9064fbSMasahiro Yamada 	layout1->addWidget(split);
12160a9064fbSMasahiro Yamada 
12170a9064fbSMasahiro Yamada 	if (name) {
12180a9064fbSMasahiro Yamada 		int x, y, width, height;
12190a9064fbSMasahiro Yamada 		bool ok;
12200a9064fbSMasahiro Yamada 
12210a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
12220a9064fbSMasahiro Yamada 		width = configSettings->readNumEntry("/window width", parent->width() / 2);
12230a9064fbSMasahiro Yamada 		height = configSettings->readNumEntry("/window height", parent->height() / 2);
12240a9064fbSMasahiro Yamada 		resize(width, height);
12250a9064fbSMasahiro Yamada 		x = configSettings->readNumEntry("/window x", 0, &ok);
12260a9064fbSMasahiro Yamada 		if (ok)
12270a9064fbSMasahiro Yamada 			y = configSettings->readNumEntry("/window y", 0, &ok);
12280a9064fbSMasahiro Yamada 		if (ok)
12290a9064fbSMasahiro Yamada 			move(x, y);
12300a9064fbSMasahiro Yamada 		Q3ValueList<int> sizes = configSettings->readSizes("/split", &ok);
12310a9064fbSMasahiro Yamada 		if (ok)
12320a9064fbSMasahiro Yamada 			split->setSizes(sizes);
12330a9064fbSMasahiro Yamada 		configSettings->endGroup();
12340a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
12350a9064fbSMasahiro Yamada 	}
12360a9064fbSMasahiro Yamada }
12370a9064fbSMasahiro Yamada 
12380a9064fbSMasahiro Yamada void ConfigSearchWindow::saveSettings(void)
12390a9064fbSMasahiro Yamada {
12400a9064fbSMasahiro Yamada 	if (name()) {
12410a9064fbSMasahiro Yamada 		configSettings->beginGroup(name());
12420a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window x", pos().x());
12430a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window y", pos().y());
12440a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window width", size().width());
12450a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window height", size().height());
12460a9064fbSMasahiro Yamada 		configSettings->writeSizes("/split", split->sizes());
12470a9064fbSMasahiro Yamada 		configSettings->endGroup();
12480a9064fbSMasahiro Yamada 	}
12490a9064fbSMasahiro Yamada }
12500a9064fbSMasahiro Yamada 
12510a9064fbSMasahiro Yamada void ConfigSearchWindow::search(void)
12520a9064fbSMasahiro Yamada {
12530a9064fbSMasahiro Yamada 	struct symbol **p;
12540a9064fbSMasahiro Yamada 	struct property *prop;
12550a9064fbSMasahiro Yamada 	ConfigItem *lastItem = NULL;
12560a9064fbSMasahiro Yamada 
12570a9064fbSMasahiro Yamada 	free(result);
12580a9064fbSMasahiro Yamada 	list->list->clear();
12590a9064fbSMasahiro Yamada 	info->clear();
12600a9064fbSMasahiro Yamada 
12610a9064fbSMasahiro Yamada 	result = sym_re_search(editField->text().latin1());
12620a9064fbSMasahiro Yamada 	if (!result)
12630a9064fbSMasahiro Yamada 		return;
12640a9064fbSMasahiro Yamada 	for (p = result; *p; p++) {
12650a9064fbSMasahiro Yamada 		for_all_prompts((*p), prop)
12660a9064fbSMasahiro Yamada 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
12670a9064fbSMasahiro Yamada 						  menu_is_visible(prop->menu));
12680a9064fbSMasahiro Yamada 	}
12690a9064fbSMasahiro Yamada }
12700a9064fbSMasahiro Yamada 
12710a9064fbSMasahiro Yamada /*
12720a9064fbSMasahiro Yamada  * Construct the complete config widget
12730a9064fbSMasahiro Yamada  */
12740a9064fbSMasahiro Yamada ConfigMainWindow::ConfigMainWindow(void)
12750a9064fbSMasahiro Yamada 	: searchWindow(0)
12760a9064fbSMasahiro Yamada {
12770a9064fbSMasahiro Yamada 	QMenuBar* menu;
12780a9064fbSMasahiro Yamada 	bool ok;
12790a9064fbSMasahiro Yamada 	int x, y, width, height;
12800a9064fbSMasahiro Yamada 	char title[256];
12810a9064fbSMasahiro Yamada 
12820a9064fbSMasahiro Yamada 	QDesktopWidget *d = configApp->desktop();
12830a9064fbSMasahiro Yamada 	snprintf(title, sizeof(title), "%s%s",
12840a9064fbSMasahiro Yamada 		rootmenu.prompt->text,
12850a9064fbSMasahiro Yamada #if QT_VERSION < 0x040000
12860a9064fbSMasahiro Yamada 		" (Qt3)"
12870a9064fbSMasahiro Yamada #else
12880a9064fbSMasahiro Yamada 		""
12890a9064fbSMasahiro Yamada #endif
12900a9064fbSMasahiro Yamada 		);
12910a9064fbSMasahiro Yamada 	setCaption(title);
12920a9064fbSMasahiro Yamada 
12930a9064fbSMasahiro Yamada 	width = configSettings->readNumEntry("/window width", d->width() - 64);
12940a9064fbSMasahiro Yamada 	height = configSettings->readNumEntry("/window height", d->height() - 64);
12950a9064fbSMasahiro Yamada 	resize(width, height);
12960a9064fbSMasahiro Yamada 	x = configSettings->readNumEntry("/window x", 0, &ok);
12970a9064fbSMasahiro Yamada 	if (ok)
12980a9064fbSMasahiro Yamada 		y = configSettings->readNumEntry("/window y", 0, &ok);
12990a9064fbSMasahiro Yamada 	if (ok)
13000a9064fbSMasahiro Yamada 		move(x, y);
13010a9064fbSMasahiro Yamada 
13020a9064fbSMasahiro Yamada 	split1 = new QSplitter(this);
13030a9064fbSMasahiro Yamada 	split1->setOrientation(Qt::Horizontal);
13040a9064fbSMasahiro Yamada 	setCentralWidget(split1);
13050a9064fbSMasahiro Yamada 
13060a9064fbSMasahiro Yamada 	menuView = new ConfigView(split1, "menu");
13070a9064fbSMasahiro Yamada 	menuList = menuView->list;
13080a9064fbSMasahiro Yamada 
13090a9064fbSMasahiro Yamada 	split2 = new QSplitter(split1);
13100a9064fbSMasahiro Yamada 	split2->setOrientation(Qt::Vertical);
13110a9064fbSMasahiro Yamada 
13120a9064fbSMasahiro Yamada 	// create config tree
13130a9064fbSMasahiro Yamada 	configView = new ConfigView(split2, "config");
13140a9064fbSMasahiro Yamada 	configList = configView->list;
13150a9064fbSMasahiro Yamada 
13160a9064fbSMasahiro Yamada 	helpText = new ConfigInfoView(split2, "help");
13170a9064fbSMasahiro Yamada 	helpText->setTextFormat(Qt::RichText);
13180a9064fbSMasahiro Yamada 
13190a9064fbSMasahiro Yamada 	setTabOrder(configList, helpText);
13200a9064fbSMasahiro Yamada 	configList->setFocus();
13210a9064fbSMasahiro Yamada 
13220a9064fbSMasahiro Yamada 	menu = menuBar();
13230a9064fbSMasahiro Yamada 	toolBar = new Q3ToolBar("Tools", this);
13240a9064fbSMasahiro Yamada 
13250a9064fbSMasahiro Yamada 	backAction = new Q3Action("Back", QPixmap(xpm_back), _("Back"), 0, this);
13260a9064fbSMasahiro Yamada 	  connect(backAction, SIGNAL(activated()), SLOT(goBack()));
13270a9064fbSMasahiro Yamada 	  backAction->setEnabled(FALSE);
13280a9064fbSMasahiro Yamada 	Q3Action *quitAction = new Q3Action("Quit", _("&Quit"), Qt::CTRL + Qt::Key_Q, this);
13290a9064fbSMasahiro Yamada 	  connect(quitAction, SIGNAL(activated()), SLOT(close()));
13300a9064fbSMasahiro Yamada 	Q3Action *loadAction = new Q3Action("Load", QPixmap(xpm_load), _("&Load"), Qt::CTRL + Qt::Key_L, this);
13310a9064fbSMasahiro Yamada 	  connect(loadAction, SIGNAL(activated()), SLOT(loadConfig()));
13320a9064fbSMasahiro Yamada 	saveAction = new Q3Action("Save", QPixmap(xpm_save), _("&Save"), Qt::CTRL + Qt::Key_S, this);
13330a9064fbSMasahiro Yamada 	  connect(saveAction, SIGNAL(activated()), SLOT(saveConfig()));
13340a9064fbSMasahiro Yamada 	conf_set_changed_callback(conf_changed);
13350a9064fbSMasahiro Yamada 	// Set saveAction's initial state
13360a9064fbSMasahiro Yamada 	conf_changed();
13370a9064fbSMasahiro Yamada 	Q3Action *saveAsAction = new Q3Action("Save As...", _("Save &As..."), 0, this);
13380a9064fbSMasahiro Yamada 	  connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
13390a9064fbSMasahiro Yamada 	Q3Action *searchAction = new Q3Action("Find", _("&Find"), Qt::CTRL + Qt::Key_F, this);
13400a9064fbSMasahiro Yamada 	  connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
13410a9064fbSMasahiro Yamada 	Q3Action *singleViewAction = new Q3Action("Single View", QPixmap(xpm_single_view), _("Single View"), 0, this);
13420a9064fbSMasahiro Yamada 	  connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
13430a9064fbSMasahiro Yamada 	Q3Action *splitViewAction = new Q3Action("Split View", QPixmap(xpm_split_view), _("Split View"), 0, this);
13440a9064fbSMasahiro Yamada 	  connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView()));
13450a9064fbSMasahiro Yamada 	Q3Action *fullViewAction = new Q3Action("Full View", QPixmap(xpm_tree_view), _("Full View"), 0, this);
13460a9064fbSMasahiro Yamada 	  connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView()));
13470a9064fbSMasahiro Yamada 
13480a9064fbSMasahiro Yamada 	Q3Action *showNameAction = new Q3Action(NULL, _("Show Name"), 0, this);
13490a9064fbSMasahiro Yamada 	  showNameAction->setToggleAction(TRUE);
13500a9064fbSMasahiro Yamada 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
13510a9064fbSMasahiro Yamada 	  connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool)));
13520a9064fbSMasahiro Yamada 	  showNameAction->setOn(configView->showName());
13530a9064fbSMasahiro Yamada 	Q3Action *showRangeAction = new Q3Action(NULL, _("Show Range"), 0, this);
13540a9064fbSMasahiro Yamada 	  showRangeAction->setToggleAction(TRUE);
13550a9064fbSMasahiro Yamada 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
13560a9064fbSMasahiro Yamada 	  connect(configView, SIGNAL(showRangeChanged(bool)), showRangeAction, SLOT(setOn(bool)));
13570a9064fbSMasahiro Yamada 	  showRangeAction->setOn(configList->showRange);
13580a9064fbSMasahiro Yamada 	Q3Action *showDataAction = new Q3Action(NULL, _("Show Data"), 0, this);
13590a9064fbSMasahiro Yamada 	  showDataAction->setToggleAction(TRUE);
13600a9064fbSMasahiro Yamada 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
13610a9064fbSMasahiro Yamada 	  connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
13620a9064fbSMasahiro Yamada 	  showDataAction->setOn(configList->showData);
13630a9064fbSMasahiro Yamada 
13640a9064fbSMasahiro Yamada 	QActionGroup *optGroup = new QActionGroup(this);
13650a9064fbSMasahiro Yamada 	optGroup->setExclusive(TRUE);
13660a9064fbSMasahiro Yamada 	connect(optGroup, SIGNAL(selected(QAction *)), configView,
13670a9064fbSMasahiro Yamada 		SLOT(setOptionMode(QAction *)));
13680a9064fbSMasahiro Yamada 	connect(optGroup, SIGNAL(selected(QAction *)), menuView,
13690a9064fbSMasahiro Yamada 		SLOT(setOptionMode(QAction *)));
13700a9064fbSMasahiro Yamada 
13710a9064fbSMasahiro Yamada #if QT_VERSION >= 0x040000
13720a9064fbSMasahiro Yamada 	configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
13730a9064fbSMasahiro Yamada 	configView->showAllAction = new QAction(_("Show All Options"), optGroup);
13740a9064fbSMasahiro Yamada 	configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
13750a9064fbSMasahiro Yamada #else
13760a9064fbSMasahiro Yamada 	configView->showNormalAction = new QAction(_("Show Normal Options"), 0, optGroup);
13770a9064fbSMasahiro Yamada 	configView->showAllAction = new QAction(_("Show All Options"), 0, optGroup);
13780a9064fbSMasahiro Yamada 	configView->showPromptAction = new QAction(_("Show Prompt Options"), 0, optGroup);
13790a9064fbSMasahiro Yamada #endif
13800a9064fbSMasahiro Yamada 	configView->showNormalAction->setToggleAction(TRUE);
13810a9064fbSMasahiro Yamada 	configView->showNormalAction->setOn(configList->optMode == normalOpt);
13820a9064fbSMasahiro Yamada 	configView->showAllAction->setToggleAction(TRUE);
13830a9064fbSMasahiro Yamada 	configView->showAllAction->setOn(configList->optMode == allOpt);
13840a9064fbSMasahiro Yamada 	configView->showPromptAction->setToggleAction(TRUE);
13850a9064fbSMasahiro Yamada 	configView->showPromptAction->setOn(configList->optMode == promptOpt);
13860a9064fbSMasahiro Yamada 
13870a9064fbSMasahiro Yamada 	Q3Action *showDebugAction = new Q3Action(NULL, _("Show Debug Info"), 0, this);
13880a9064fbSMasahiro Yamada 	  showDebugAction->setToggleAction(TRUE);
13890a9064fbSMasahiro Yamada 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
13900a9064fbSMasahiro Yamada 	  connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool)));
13910a9064fbSMasahiro Yamada 	  showDebugAction->setOn(helpText->showDebug());
13920a9064fbSMasahiro Yamada 
13930a9064fbSMasahiro Yamada 	Q3Action *showIntroAction = new Q3Action(NULL, _("Introduction"), 0, this);
13940a9064fbSMasahiro Yamada 	  connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro()));
13950a9064fbSMasahiro Yamada 	Q3Action *showAboutAction = new Q3Action(NULL, _("About"), 0, this);
13960a9064fbSMasahiro Yamada 	  connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout()));
13970a9064fbSMasahiro Yamada 
13980a9064fbSMasahiro Yamada 	// init tool bar
13990a9064fbSMasahiro Yamada 	backAction->addTo(toolBar);
14000a9064fbSMasahiro Yamada 	toolBar->addSeparator();
14010a9064fbSMasahiro Yamada 	loadAction->addTo(toolBar);
14020a9064fbSMasahiro Yamada 	saveAction->addTo(toolBar);
14030a9064fbSMasahiro Yamada 	toolBar->addSeparator();
14040a9064fbSMasahiro Yamada 	singleViewAction->addTo(toolBar);
14050a9064fbSMasahiro Yamada 	splitViewAction->addTo(toolBar);
14060a9064fbSMasahiro Yamada 	fullViewAction->addTo(toolBar);
14070a9064fbSMasahiro Yamada 
14080a9064fbSMasahiro Yamada 	// create config menu
14090a9064fbSMasahiro Yamada 	Q3PopupMenu* config = new Q3PopupMenu(this);
14100a9064fbSMasahiro Yamada 	menu->insertItem(_("&File"), config);
14110a9064fbSMasahiro Yamada 	loadAction->addTo(config);
14120a9064fbSMasahiro Yamada 	saveAction->addTo(config);
14130a9064fbSMasahiro Yamada 	saveAsAction->addTo(config);
14140a9064fbSMasahiro Yamada 	config->insertSeparator();
14150a9064fbSMasahiro Yamada 	quitAction->addTo(config);
14160a9064fbSMasahiro Yamada 
14170a9064fbSMasahiro Yamada 	// create edit menu
14180a9064fbSMasahiro Yamada 	Q3PopupMenu* editMenu = new Q3PopupMenu(this);
14190a9064fbSMasahiro Yamada 	menu->insertItem(_("&Edit"), editMenu);
14200a9064fbSMasahiro Yamada 	searchAction->addTo(editMenu);
14210a9064fbSMasahiro Yamada 
14220a9064fbSMasahiro Yamada 	// create options menu
14230a9064fbSMasahiro Yamada 	Q3PopupMenu* optionMenu = new Q3PopupMenu(this);
14240a9064fbSMasahiro Yamada 	menu->insertItem(_("&Option"), optionMenu);
14250a9064fbSMasahiro Yamada 	showNameAction->addTo(optionMenu);
14260a9064fbSMasahiro Yamada 	showRangeAction->addTo(optionMenu);
14270a9064fbSMasahiro Yamada 	showDataAction->addTo(optionMenu);
14280a9064fbSMasahiro Yamada 	optionMenu->insertSeparator();
14290a9064fbSMasahiro Yamada 	optGroup->addTo(optionMenu);
14300a9064fbSMasahiro Yamada 	optionMenu->insertSeparator();
14310a9064fbSMasahiro Yamada 
14320a9064fbSMasahiro Yamada 	// create help menu
14330a9064fbSMasahiro Yamada 	Q3PopupMenu* helpMenu = new Q3PopupMenu(this);
14340a9064fbSMasahiro Yamada 	menu->insertSeparator();
14350a9064fbSMasahiro Yamada 	menu->insertItem(_("&Help"), helpMenu);
14360a9064fbSMasahiro Yamada 	showIntroAction->addTo(helpMenu);
14370a9064fbSMasahiro Yamada 	showAboutAction->addTo(helpMenu);
14380a9064fbSMasahiro Yamada 
14390a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(menuChanged(struct menu *)),
14400a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
14410a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(menuSelected(struct menu *)),
14420a9064fbSMasahiro Yamada 		SLOT(changeMenu(struct menu *)));
14430a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(parentSelected()),
14440a9064fbSMasahiro Yamada 		SLOT(goBack()));
14450a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
14460a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
14470a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
14480a9064fbSMasahiro Yamada 		SLOT(changeMenu(struct menu *)));
14490a9064fbSMasahiro Yamada 
14500a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(gotFocus(struct menu *)),
14510a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
14520a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
14530a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
14540a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
14550a9064fbSMasahiro Yamada 		SLOT(listFocusChanged(void)));
14560a9064fbSMasahiro Yamada 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
14570a9064fbSMasahiro Yamada 		SLOT(setMenuLink(struct menu *)));
14580a9064fbSMasahiro Yamada 
14590a9064fbSMasahiro Yamada 	QString listMode = configSettings->readEntry("/listMode", "symbol");
14600a9064fbSMasahiro Yamada 	if (listMode == "single")
14610a9064fbSMasahiro Yamada 		showSingleView();
14620a9064fbSMasahiro Yamada 	else if (listMode == "full")
14630a9064fbSMasahiro Yamada 		showFullView();
14640a9064fbSMasahiro Yamada 	else /*if (listMode == "split")*/
14650a9064fbSMasahiro Yamada 		showSplitView();
14660a9064fbSMasahiro Yamada 
14670a9064fbSMasahiro Yamada 	// UI setup done, restore splitter positions
14680a9064fbSMasahiro Yamada 	Q3ValueList<int> sizes = configSettings->readSizes("/split1", &ok);
14690a9064fbSMasahiro Yamada 	if (ok)
14700a9064fbSMasahiro Yamada 		split1->setSizes(sizes);
14710a9064fbSMasahiro Yamada 
14720a9064fbSMasahiro Yamada 	sizes = configSettings->readSizes("/split2", &ok);
14730a9064fbSMasahiro Yamada 	if (ok)
14740a9064fbSMasahiro Yamada 		split2->setSizes(sizes);
14750a9064fbSMasahiro Yamada }
14760a9064fbSMasahiro Yamada 
14770a9064fbSMasahiro Yamada void ConfigMainWindow::loadConfig(void)
14780a9064fbSMasahiro Yamada {
14790a9064fbSMasahiro Yamada 	QString s = Q3FileDialog::getOpenFileName(conf_get_configname(), NULL, this);
14800a9064fbSMasahiro Yamada 	if (s.isNull())
14810a9064fbSMasahiro Yamada 		return;
14820a9064fbSMasahiro Yamada 	if (conf_read(QFile::encodeName(s)))
14830a9064fbSMasahiro Yamada 		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
14840a9064fbSMasahiro Yamada 	ConfigView::updateListAll();
14850a9064fbSMasahiro Yamada }
14860a9064fbSMasahiro Yamada 
14870a9064fbSMasahiro Yamada bool ConfigMainWindow::saveConfig(void)
14880a9064fbSMasahiro Yamada {
14890a9064fbSMasahiro Yamada 	if (conf_write(NULL)) {
14900a9064fbSMasahiro Yamada 		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
14910a9064fbSMasahiro Yamada 		return false;
14920a9064fbSMasahiro Yamada 	}
14930a9064fbSMasahiro Yamada 	return true;
14940a9064fbSMasahiro Yamada }
14950a9064fbSMasahiro Yamada 
14960a9064fbSMasahiro Yamada void ConfigMainWindow::saveConfigAs(void)
14970a9064fbSMasahiro Yamada {
14980a9064fbSMasahiro Yamada 	QString s = Q3FileDialog::getSaveFileName(conf_get_configname(), NULL, this);
14990a9064fbSMasahiro Yamada 	if (s.isNull())
15000a9064fbSMasahiro Yamada 		return;
15010a9064fbSMasahiro Yamada 	saveConfig();
15020a9064fbSMasahiro Yamada }
15030a9064fbSMasahiro Yamada 
15040a9064fbSMasahiro Yamada void ConfigMainWindow::searchConfig(void)
15050a9064fbSMasahiro Yamada {
15060a9064fbSMasahiro Yamada 	if (!searchWindow)
15070a9064fbSMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this, "search");
15080a9064fbSMasahiro Yamada 	searchWindow->show();
15090a9064fbSMasahiro Yamada }
15100a9064fbSMasahiro Yamada 
15110a9064fbSMasahiro Yamada void ConfigMainWindow::changeMenu(struct menu *menu)
15120a9064fbSMasahiro Yamada {
15130a9064fbSMasahiro Yamada 	configList->setRootMenu(menu);
15140a9064fbSMasahiro Yamada 	if (configList->rootEntry->parent == &rootmenu)
15150a9064fbSMasahiro Yamada 		backAction->setEnabled(FALSE);
15160a9064fbSMasahiro Yamada 	else
15170a9064fbSMasahiro Yamada 		backAction->setEnabled(TRUE);
15180a9064fbSMasahiro Yamada }
15190a9064fbSMasahiro Yamada 
15200a9064fbSMasahiro Yamada void ConfigMainWindow::setMenuLink(struct menu *menu)
15210a9064fbSMasahiro Yamada {
15220a9064fbSMasahiro Yamada 	struct menu *parent;
15230a9064fbSMasahiro Yamada 	ConfigList* list = NULL;
15240a9064fbSMasahiro Yamada 	ConfigItem* item;
15250a9064fbSMasahiro Yamada 
15260a9064fbSMasahiro Yamada 	if (configList->menuSkip(menu))
15270a9064fbSMasahiro Yamada 		return;
15280a9064fbSMasahiro Yamada 
15290a9064fbSMasahiro Yamada 	switch (configList->mode) {
15300a9064fbSMasahiro Yamada 	case singleMode:
15310a9064fbSMasahiro Yamada 		list = configList;
15320a9064fbSMasahiro Yamada 		parent = menu_get_parent_menu(menu);
15330a9064fbSMasahiro Yamada 		if (!parent)
15340a9064fbSMasahiro Yamada 			return;
15350a9064fbSMasahiro Yamada 		list->setRootMenu(parent);
15360a9064fbSMasahiro Yamada 		break;
15370a9064fbSMasahiro Yamada 	case symbolMode:
15380a9064fbSMasahiro Yamada 		if (menu->flags & MENU_ROOT) {
15390a9064fbSMasahiro Yamada 			configList->setRootMenu(menu);
15400a9064fbSMasahiro Yamada 			configList->clearSelection();
15410a9064fbSMasahiro Yamada 			list = menuList;
15420a9064fbSMasahiro Yamada 		} else {
15430a9064fbSMasahiro Yamada 			list = configList;
15440a9064fbSMasahiro Yamada 			parent = menu_get_parent_menu(menu->parent);
15450a9064fbSMasahiro Yamada 			if (!parent)
15460a9064fbSMasahiro Yamada 				return;
15470a9064fbSMasahiro Yamada 			item = menuList->findConfigItem(parent);
15480a9064fbSMasahiro Yamada 			if (item) {
15490a9064fbSMasahiro Yamada 				menuList->setSelected(item, TRUE);
15500a9064fbSMasahiro Yamada 				menuList->ensureItemVisible(item);
15510a9064fbSMasahiro Yamada 			}
15520a9064fbSMasahiro Yamada 			list->setRootMenu(parent);
15530a9064fbSMasahiro Yamada 		}
15540a9064fbSMasahiro Yamada 		break;
15550a9064fbSMasahiro Yamada 	case fullMode:
15560a9064fbSMasahiro Yamada 		list = configList;
15570a9064fbSMasahiro Yamada 		break;
15580a9064fbSMasahiro Yamada 	default:
15590a9064fbSMasahiro Yamada 		break;
15600a9064fbSMasahiro Yamada 	}
15610a9064fbSMasahiro Yamada 
15620a9064fbSMasahiro Yamada 	if (list) {
15630a9064fbSMasahiro Yamada 		item = list->findConfigItem(menu);
15640a9064fbSMasahiro Yamada 		if (item) {
15650a9064fbSMasahiro Yamada 			list->setSelected(item, TRUE);
15660a9064fbSMasahiro Yamada 			list->ensureItemVisible(item);
15670a9064fbSMasahiro Yamada 			list->setFocus();
15680a9064fbSMasahiro Yamada 		}
15690a9064fbSMasahiro Yamada 	}
15700a9064fbSMasahiro Yamada }
15710a9064fbSMasahiro Yamada 
15720a9064fbSMasahiro Yamada void ConfigMainWindow::listFocusChanged(void)
15730a9064fbSMasahiro Yamada {
15740a9064fbSMasahiro Yamada 	if (menuList->mode == menuMode)
15750a9064fbSMasahiro Yamada 		configList->clearSelection();
15760a9064fbSMasahiro Yamada }
15770a9064fbSMasahiro Yamada 
15780a9064fbSMasahiro Yamada void ConfigMainWindow::goBack(void)
15790a9064fbSMasahiro Yamada {
15800a9064fbSMasahiro Yamada 	ConfigItem* item;
15810a9064fbSMasahiro Yamada 
15820a9064fbSMasahiro Yamada 	configList->setParentMenu();
15830a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
15840a9064fbSMasahiro Yamada 		backAction->setEnabled(FALSE);
15850a9064fbSMasahiro Yamada 	item = (ConfigItem*)menuList->selectedItem();
15860a9064fbSMasahiro Yamada 	while (item) {
15870a9064fbSMasahiro Yamada 		if (item->menu == configList->rootEntry) {
15880a9064fbSMasahiro Yamada 			menuList->setSelected(item, TRUE);
15890a9064fbSMasahiro Yamada 			break;
15900a9064fbSMasahiro Yamada 		}
15910a9064fbSMasahiro Yamada 		item = (ConfigItem*)item->parent();
15920a9064fbSMasahiro Yamada 	}
15930a9064fbSMasahiro Yamada }
15940a9064fbSMasahiro Yamada 
15950a9064fbSMasahiro Yamada void ConfigMainWindow::showSingleView(void)
15960a9064fbSMasahiro Yamada {
15970a9064fbSMasahiro Yamada 	menuView->hide();
15980a9064fbSMasahiro Yamada 	menuList->setRootMenu(0);
15990a9064fbSMasahiro Yamada 	configList->mode = singleMode;
16000a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
16010a9064fbSMasahiro Yamada 		configList->updateListAll();
16020a9064fbSMasahiro Yamada 	else
16030a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
16040a9064fbSMasahiro Yamada 	configList->setAllOpen(TRUE);
16050a9064fbSMasahiro Yamada 	configList->setFocus();
16060a9064fbSMasahiro Yamada }
16070a9064fbSMasahiro Yamada 
16080a9064fbSMasahiro Yamada void ConfigMainWindow::showSplitView(void)
16090a9064fbSMasahiro Yamada {
16100a9064fbSMasahiro Yamada 	configList->mode = symbolMode;
16110a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
16120a9064fbSMasahiro Yamada 		configList->updateListAll();
16130a9064fbSMasahiro Yamada 	else
16140a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
16150a9064fbSMasahiro Yamada 	configList->setAllOpen(TRUE);
16160a9064fbSMasahiro Yamada 	configApp->processEvents();
16170a9064fbSMasahiro Yamada 	menuList->mode = menuMode;
16180a9064fbSMasahiro Yamada 	menuList->setRootMenu(&rootmenu);
16190a9064fbSMasahiro Yamada 	menuList->setAllOpen(TRUE);
16200a9064fbSMasahiro Yamada 	menuView->show();
16210a9064fbSMasahiro Yamada 	menuList->setFocus();
16220a9064fbSMasahiro Yamada }
16230a9064fbSMasahiro Yamada 
16240a9064fbSMasahiro Yamada void ConfigMainWindow::showFullView(void)
16250a9064fbSMasahiro Yamada {
16260a9064fbSMasahiro Yamada 	menuView->hide();
16270a9064fbSMasahiro Yamada 	menuList->setRootMenu(0);
16280a9064fbSMasahiro Yamada 	configList->mode = fullMode;
16290a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
16300a9064fbSMasahiro Yamada 		configList->updateListAll();
16310a9064fbSMasahiro Yamada 	else
16320a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
16330a9064fbSMasahiro Yamada 	configList->setAllOpen(FALSE);
16340a9064fbSMasahiro Yamada 	configList->setFocus();
16350a9064fbSMasahiro Yamada }
16360a9064fbSMasahiro Yamada 
16370a9064fbSMasahiro Yamada /*
16380a9064fbSMasahiro Yamada  * ask for saving configuration before quitting
16390a9064fbSMasahiro Yamada  * TODO ask only when something changed
16400a9064fbSMasahiro Yamada  */
16410a9064fbSMasahiro Yamada void ConfigMainWindow::closeEvent(QCloseEvent* e)
16420a9064fbSMasahiro Yamada {
16430a9064fbSMasahiro Yamada 	if (!conf_get_changed()) {
16440a9064fbSMasahiro Yamada 		e->accept();
16450a9064fbSMasahiro Yamada 		return;
16460a9064fbSMasahiro Yamada 	}
16470a9064fbSMasahiro Yamada 	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
16480a9064fbSMasahiro Yamada 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
16490a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
16500a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
16510a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
16520a9064fbSMasahiro Yamada 	switch (mb.exec()) {
16530a9064fbSMasahiro Yamada 	case QMessageBox::Yes:
16540a9064fbSMasahiro Yamada 		if (saveConfig())
16550a9064fbSMasahiro Yamada 			e->accept();
16560a9064fbSMasahiro Yamada 		else
16570a9064fbSMasahiro Yamada 			e->ignore();
16580a9064fbSMasahiro Yamada 		break;
16590a9064fbSMasahiro Yamada 	case QMessageBox::No:
16600a9064fbSMasahiro Yamada 		e->accept();
16610a9064fbSMasahiro Yamada 		break;
16620a9064fbSMasahiro Yamada 	case QMessageBox::Cancel:
16630a9064fbSMasahiro Yamada 		e->ignore();
16640a9064fbSMasahiro Yamada 		break;
16650a9064fbSMasahiro Yamada 	}
16660a9064fbSMasahiro Yamada }
16670a9064fbSMasahiro Yamada 
16680a9064fbSMasahiro Yamada void ConfigMainWindow::showIntro(void)
16690a9064fbSMasahiro Yamada {
16700a9064fbSMasahiro Yamada 	static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
16710a9064fbSMasahiro Yamada 		"For each option, a blank box indicates the feature is disabled, a check\n"
16720a9064fbSMasahiro Yamada 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
16730a9064fbSMasahiro Yamada 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
16740a9064fbSMasahiro Yamada 		"If you do not see an option (e.g., a device driver) that you believe\n"
16750a9064fbSMasahiro Yamada 		"should be present, try turning on Show All Options under the Options menu.\n"
16760a9064fbSMasahiro Yamada 		"Although there is no cross reference yet to help you figure out what other\n"
16770a9064fbSMasahiro Yamada 		"options must be enabled to support the option you are interested in, you can\n"
16780a9064fbSMasahiro Yamada 		"still view the help of a grayed-out option.\n\n"
16790a9064fbSMasahiro Yamada 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
16800a9064fbSMasahiro Yamada 		"which you can then match by examining other options.\n\n");
16810a9064fbSMasahiro Yamada 
16820a9064fbSMasahiro Yamada 	QMessageBox::information(this, "qconf", str);
16830a9064fbSMasahiro Yamada }
16840a9064fbSMasahiro Yamada 
16850a9064fbSMasahiro Yamada void ConfigMainWindow::showAbout(void)
16860a9064fbSMasahiro Yamada {
16870a9064fbSMasahiro Yamada 	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n"
16880a9064fbSMasahiro Yamada 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
16890a9064fbSMasahiro Yamada 
16900a9064fbSMasahiro Yamada 	QMessageBox::information(this, "qconf", str);
16910a9064fbSMasahiro Yamada }
16920a9064fbSMasahiro Yamada 
16930a9064fbSMasahiro Yamada void ConfigMainWindow::saveSettings(void)
16940a9064fbSMasahiro Yamada {
16950a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window x", pos().x());
16960a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window y", pos().y());
16970a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window width", size().width());
16980a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window height", size().height());
16990a9064fbSMasahiro Yamada 
17000a9064fbSMasahiro Yamada 	QString entry;
17010a9064fbSMasahiro Yamada 	switch(configList->mode) {
17020a9064fbSMasahiro Yamada 	case singleMode :
17030a9064fbSMasahiro Yamada 		entry = "single";
17040a9064fbSMasahiro Yamada 		break;
17050a9064fbSMasahiro Yamada 
17060a9064fbSMasahiro Yamada 	case symbolMode :
17070a9064fbSMasahiro Yamada 		entry = "split";
17080a9064fbSMasahiro Yamada 		break;
17090a9064fbSMasahiro Yamada 
17100a9064fbSMasahiro Yamada 	case fullMode :
17110a9064fbSMasahiro Yamada 		entry = "full";
17120a9064fbSMasahiro Yamada 		break;
17130a9064fbSMasahiro Yamada 
17140a9064fbSMasahiro Yamada 	default:
17150a9064fbSMasahiro Yamada 		break;
17160a9064fbSMasahiro Yamada 	}
17170a9064fbSMasahiro Yamada 	configSettings->writeEntry("/listMode", entry);
17180a9064fbSMasahiro Yamada 
17190a9064fbSMasahiro Yamada 	configSettings->writeSizes("/split1", split1->sizes());
17200a9064fbSMasahiro Yamada 	configSettings->writeSizes("/split2", split2->sizes());
17210a9064fbSMasahiro Yamada }
17220a9064fbSMasahiro Yamada 
17230a9064fbSMasahiro Yamada void ConfigMainWindow::conf_changed(void)
17240a9064fbSMasahiro Yamada {
17250a9064fbSMasahiro Yamada 	if (saveAction)
17260a9064fbSMasahiro Yamada 		saveAction->setEnabled(conf_get_changed());
17270a9064fbSMasahiro Yamada }
17280a9064fbSMasahiro Yamada 
17290a9064fbSMasahiro Yamada void fixup_rootmenu(struct menu *menu)
17300a9064fbSMasahiro Yamada {
17310a9064fbSMasahiro Yamada 	struct menu *child;
17320a9064fbSMasahiro Yamada 	static int menu_cnt = 0;
17330a9064fbSMasahiro Yamada 
17340a9064fbSMasahiro Yamada 	menu->flags |= MENU_ROOT;
17350a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
17360a9064fbSMasahiro Yamada 		if (child->prompt && child->prompt->type == P_MENU) {
17370a9064fbSMasahiro Yamada 			menu_cnt++;
17380a9064fbSMasahiro Yamada 			fixup_rootmenu(child);
17390a9064fbSMasahiro Yamada 			menu_cnt--;
17400a9064fbSMasahiro Yamada 		} else if (!menu_cnt)
17410a9064fbSMasahiro Yamada 			fixup_rootmenu(child);
17420a9064fbSMasahiro Yamada 	}
17430a9064fbSMasahiro Yamada }
17440a9064fbSMasahiro Yamada 
17450a9064fbSMasahiro Yamada static const char *progname;
17460a9064fbSMasahiro Yamada 
17470a9064fbSMasahiro Yamada static void usage(void)
17480a9064fbSMasahiro Yamada {
1749*9b5f0b1dSMasahiro Yamada 	printf(_("%s [-s] <config>\n"), progname);
17500a9064fbSMasahiro Yamada 	exit(0);
17510a9064fbSMasahiro Yamada }
17520a9064fbSMasahiro Yamada 
17530a9064fbSMasahiro Yamada int main(int ac, char** av)
17540a9064fbSMasahiro Yamada {
17550a9064fbSMasahiro Yamada 	ConfigMainWindow* v;
17560a9064fbSMasahiro Yamada 	const char *name;
17570a9064fbSMasahiro Yamada 
17580a9064fbSMasahiro Yamada 	bindtextdomain(PACKAGE, LOCALEDIR);
17590a9064fbSMasahiro Yamada 	textdomain(PACKAGE);
17600a9064fbSMasahiro Yamada 
17610a9064fbSMasahiro Yamada 	progname = av[0];
17620a9064fbSMasahiro Yamada 	configApp = new QApplication(ac, av);
17630a9064fbSMasahiro Yamada 	if (ac > 1 && av[1][0] == '-') {
17640a9064fbSMasahiro Yamada 		switch (av[1][1]) {
1765*9b5f0b1dSMasahiro Yamada 		case 's':
1766*9b5f0b1dSMasahiro Yamada 			conf_set_message_callback(NULL);
1767*9b5f0b1dSMasahiro Yamada 			break;
17680a9064fbSMasahiro Yamada 		case 'h':
17690a9064fbSMasahiro Yamada 		case '?':
17700a9064fbSMasahiro Yamada 			usage();
17710a9064fbSMasahiro Yamada 		}
17720a9064fbSMasahiro Yamada 		name = av[2];
17730a9064fbSMasahiro Yamada 	} else
17740a9064fbSMasahiro Yamada 		name = av[1];
17750a9064fbSMasahiro Yamada 	if (!name)
17760a9064fbSMasahiro Yamada 		usage();
17770a9064fbSMasahiro Yamada 
17780a9064fbSMasahiro Yamada 	conf_parse(name);
17790a9064fbSMasahiro Yamada 	fixup_rootmenu(&rootmenu);
17800a9064fbSMasahiro Yamada 	conf_read(NULL);
17810a9064fbSMasahiro Yamada 	//zconfdump(stdout);
17820a9064fbSMasahiro Yamada 
17830a9064fbSMasahiro Yamada 	configSettings = new ConfigSettings();
17840a9064fbSMasahiro Yamada 	configSettings->beginGroup("/kconfig/qconf");
17850a9064fbSMasahiro Yamada 	v = new ConfigMainWindow();
17860a9064fbSMasahiro Yamada 
17870a9064fbSMasahiro Yamada 	//zconfdump(stdout);
17880a9064fbSMasahiro Yamada 	configApp->setMainWidget(v);
17890a9064fbSMasahiro Yamada 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
17900a9064fbSMasahiro Yamada 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
17910a9064fbSMasahiro Yamada 	v->show();
17920a9064fbSMasahiro Yamada 	configApp->exec();
17930a9064fbSMasahiro Yamada 
17940a9064fbSMasahiro Yamada 	configSettings->endGroup();
17950a9064fbSMasahiro Yamada 	delete configSettings;
17960a9064fbSMasahiro Yamada 
17970a9064fbSMasahiro Yamada 	return 0;
17980a9064fbSMasahiro Yamada }
1799