xref: /openbmc/u-boot/scripts/kconfig/qconf.cc (revision 0a9064fb)
1*0a9064fbSMasahiro Yamada /*
2*0a9064fbSMasahiro Yamada  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3*0a9064fbSMasahiro Yamada  * Released under the terms of the GNU GPL v2.0.
4*0a9064fbSMasahiro Yamada  */
5*0a9064fbSMasahiro Yamada 
6*0a9064fbSMasahiro Yamada #include <qglobal.h>
7*0a9064fbSMasahiro Yamada 
8*0a9064fbSMasahiro Yamada #if QT_VERSION < 0x040000
9*0a9064fbSMasahiro Yamada #include <stddef.h>
10*0a9064fbSMasahiro Yamada #include <qmainwindow.h>
11*0a9064fbSMasahiro Yamada #include <qvbox.h>
12*0a9064fbSMasahiro Yamada #include <qvaluelist.h>
13*0a9064fbSMasahiro Yamada #include <qtextbrowser.h>
14*0a9064fbSMasahiro Yamada #include <qaction.h>
15*0a9064fbSMasahiro Yamada #include <qheader.h>
16*0a9064fbSMasahiro Yamada #include <qfiledialog.h>
17*0a9064fbSMasahiro Yamada #include <qdragobject.h>
18*0a9064fbSMasahiro Yamada #include <qpopupmenu.h>
19*0a9064fbSMasahiro Yamada #else
20*0a9064fbSMasahiro Yamada #include <q3mainwindow.h>
21*0a9064fbSMasahiro Yamada #include <q3vbox.h>
22*0a9064fbSMasahiro Yamada #include <q3valuelist.h>
23*0a9064fbSMasahiro Yamada #include <q3textbrowser.h>
24*0a9064fbSMasahiro Yamada #include <q3action.h>
25*0a9064fbSMasahiro Yamada #include <q3header.h>
26*0a9064fbSMasahiro Yamada #include <q3filedialog.h>
27*0a9064fbSMasahiro Yamada #include <q3dragobject.h>
28*0a9064fbSMasahiro Yamada #include <q3popupmenu.h>
29*0a9064fbSMasahiro Yamada #endif
30*0a9064fbSMasahiro Yamada 
31*0a9064fbSMasahiro Yamada #include <qapplication.h>
32*0a9064fbSMasahiro Yamada #include <qdesktopwidget.h>
33*0a9064fbSMasahiro Yamada #include <qtoolbar.h>
34*0a9064fbSMasahiro Yamada #include <qlayout.h>
35*0a9064fbSMasahiro Yamada #include <qsplitter.h>
36*0a9064fbSMasahiro Yamada #include <qlineedit.h>
37*0a9064fbSMasahiro Yamada #include <qlabel.h>
38*0a9064fbSMasahiro Yamada #include <qpushbutton.h>
39*0a9064fbSMasahiro Yamada #include <qmenubar.h>
40*0a9064fbSMasahiro Yamada #include <qmessagebox.h>
41*0a9064fbSMasahiro Yamada #include <qregexp.h>
42*0a9064fbSMasahiro Yamada #include <qevent.h>
43*0a9064fbSMasahiro Yamada 
44*0a9064fbSMasahiro Yamada #include <stdlib.h>
45*0a9064fbSMasahiro Yamada 
46*0a9064fbSMasahiro Yamada #include "lkc.h"
47*0a9064fbSMasahiro Yamada #include "qconf.h"
48*0a9064fbSMasahiro Yamada 
49*0a9064fbSMasahiro Yamada #include "qconf.moc"
50*0a9064fbSMasahiro Yamada #include "images.c"
51*0a9064fbSMasahiro Yamada 
52*0a9064fbSMasahiro Yamada #ifdef _
53*0a9064fbSMasahiro Yamada # undef _
54*0a9064fbSMasahiro Yamada # define _ qgettext
55*0a9064fbSMasahiro Yamada #endif
56*0a9064fbSMasahiro Yamada 
57*0a9064fbSMasahiro Yamada static QApplication *configApp;
58*0a9064fbSMasahiro Yamada static ConfigSettings *configSettings;
59*0a9064fbSMasahiro Yamada 
60*0a9064fbSMasahiro Yamada Q3Action *ConfigMainWindow::saveAction;
61*0a9064fbSMasahiro Yamada 
62*0a9064fbSMasahiro Yamada static inline QString qgettext(const char* str)
63*0a9064fbSMasahiro Yamada {
64*0a9064fbSMasahiro Yamada 	return QString::fromLocal8Bit(gettext(str));
65*0a9064fbSMasahiro Yamada }
66*0a9064fbSMasahiro Yamada 
67*0a9064fbSMasahiro Yamada static inline QString qgettext(const QString& str)
68*0a9064fbSMasahiro Yamada {
69*0a9064fbSMasahiro Yamada 	return QString::fromLocal8Bit(gettext(str.latin1()));
70*0a9064fbSMasahiro Yamada }
71*0a9064fbSMasahiro Yamada 
72*0a9064fbSMasahiro Yamada ConfigSettings::ConfigSettings()
73*0a9064fbSMasahiro Yamada 	: QSettings("kernel.org", "qconf")
74*0a9064fbSMasahiro Yamada {
75*0a9064fbSMasahiro Yamada }
76*0a9064fbSMasahiro Yamada 
77*0a9064fbSMasahiro Yamada /**
78*0a9064fbSMasahiro Yamada  * Reads a list of integer values from the application settings.
79*0a9064fbSMasahiro Yamada  */
80*0a9064fbSMasahiro Yamada Q3ValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
81*0a9064fbSMasahiro Yamada {
82*0a9064fbSMasahiro Yamada 	Q3ValueList<int> result;
83*0a9064fbSMasahiro Yamada 	QStringList entryList = readListEntry(key, ok);
84*0a9064fbSMasahiro Yamada 	QStringList::Iterator it;
85*0a9064fbSMasahiro Yamada 
86*0a9064fbSMasahiro Yamada 	for (it = entryList.begin(); it != entryList.end(); ++it)
87*0a9064fbSMasahiro Yamada 		result.push_back((*it).toInt());
88*0a9064fbSMasahiro Yamada 
89*0a9064fbSMasahiro Yamada 	return result;
90*0a9064fbSMasahiro Yamada }
91*0a9064fbSMasahiro Yamada 
92*0a9064fbSMasahiro Yamada /**
93*0a9064fbSMasahiro Yamada  * Writes a list of integer values to the application settings.
94*0a9064fbSMasahiro Yamada  */
95*0a9064fbSMasahiro Yamada bool ConfigSettings::writeSizes(const QString& key, const Q3ValueList<int>& value)
96*0a9064fbSMasahiro Yamada {
97*0a9064fbSMasahiro Yamada 	QStringList stringList;
98*0a9064fbSMasahiro Yamada 	Q3ValueList<int>::ConstIterator it;
99*0a9064fbSMasahiro Yamada 
100*0a9064fbSMasahiro Yamada 	for (it = value.begin(); it != value.end(); ++it)
101*0a9064fbSMasahiro Yamada 		stringList.push_back(QString::number(*it));
102*0a9064fbSMasahiro Yamada 	return writeEntry(key, stringList);
103*0a9064fbSMasahiro Yamada }
104*0a9064fbSMasahiro Yamada 
105*0a9064fbSMasahiro Yamada 
106*0a9064fbSMasahiro Yamada /*
107*0a9064fbSMasahiro Yamada  * set the new data
108*0a9064fbSMasahiro Yamada  * TODO check the value
109*0a9064fbSMasahiro Yamada  */
110*0a9064fbSMasahiro Yamada void ConfigItem::okRename(int col)
111*0a9064fbSMasahiro Yamada {
112*0a9064fbSMasahiro Yamada 	Parent::okRename(col);
113*0a9064fbSMasahiro Yamada 	sym_set_string_value(menu->sym, text(dataColIdx).latin1());
114*0a9064fbSMasahiro Yamada 	listView()->updateList(this);
115*0a9064fbSMasahiro Yamada }
116*0a9064fbSMasahiro Yamada 
117*0a9064fbSMasahiro Yamada /*
118*0a9064fbSMasahiro Yamada  * update the displayed of a menu entry
119*0a9064fbSMasahiro Yamada  */
120*0a9064fbSMasahiro Yamada void ConfigItem::updateMenu(void)
121*0a9064fbSMasahiro Yamada {
122*0a9064fbSMasahiro Yamada 	ConfigList* list;
123*0a9064fbSMasahiro Yamada 	struct symbol* sym;
124*0a9064fbSMasahiro Yamada 	struct property *prop;
125*0a9064fbSMasahiro Yamada 	QString prompt;
126*0a9064fbSMasahiro Yamada 	int type;
127*0a9064fbSMasahiro Yamada 	tristate expr;
128*0a9064fbSMasahiro Yamada 
129*0a9064fbSMasahiro Yamada 	list = listView();
130*0a9064fbSMasahiro Yamada 	if (goParent) {
131*0a9064fbSMasahiro Yamada 		setPixmap(promptColIdx, list->menuBackPix);
132*0a9064fbSMasahiro Yamada 		prompt = "..";
133*0a9064fbSMasahiro Yamada 		goto set_prompt;
134*0a9064fbSMasahiro Yamada 	}
135*0a9064fbSMasahiro Yamada 
136*0a9064fbSMasahiro Yamada 	sym = menu->sym;
137*0a9064fbSMasahiro Yamada 	prop = menu->prompt;
138*0a9064fbSMasahiro Yamada 	prompt = _(menu_get_prompt(menu));
139*0a9064fbSMasahiro Yamada 
140*0a9064fbSMasahiro Yamada 	if (prop) switch (prop->type) {
141*0a9064fbSMasahiro Yamada 	case P_MENU:
142*0a9064fbSMasahiro Yamada 		if (list->mode == singleMode || list->mode == symbolMode) {
143*0a9064fbSMasahiro Yamada 			/* a menuconfig entry is displayed differently
144*0a9064fbSMasahiro Yamada 			 * depending whether it's at the view root or a child.
145*0a9064fbSMasahiro Yamada 			 */
146*0a9064fbSMasahiro Yamada 			if (sym && list->rootEntry == menu)
147*0a9064fbSMasahiro Yamada 				break;
148*0a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, list->menuPix);
149*0a9064fbSMasahiro Yamada 		} else {
150*0a9064fbSMasahiro Yamada 			if (sym)
151*0a9064fbSMasahiro Yamada 				break;
152*0a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, 0);
153*0a9064fbSMasahiro Yamada 		}
154*0a9064fbSMasahiro Yamada 		goto set_prompt;
155*0a9064fbSMasahiro Yamada 	case P_COMMENT:
156*0a9064fbSMasahiro Yamada 		setPixmap(promptColIdx, 0);
157*0a9064fbSMasahiro Yamada 		goto set_prompt;
158*0a9064fbSMasahiro Yamada 	default:
159*0a9064fbSMasahiro Yamada 		;
160*0a9064fbSMasahiro Yamada 	}
161*0a9064fbSMasahiro Yamada 	if (!sym)
162*0a9064fbSMasahiro Yamada 		goto set_prompt;
163*0a9064fbSMasahiro Yamada 
164*0a9064fbSMasahiro Yamada 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
165*0a9064fbSMasahiro Yamada 
166*0a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
167*0a9064fbSMasahiro Yamada 	switch (type) {
168*0a9064fbSMasahiro Yamada 	case S_BOOLEAN:
169*0a9064fbSMasahiro Yamada 	case S_TRISTATE:
170*0a9064fbSMasahiro Yamada 		char ch;
171*0a9064fbSMasahiro Yamada 
172*0a9064fbSMasahiro Yamada 		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
173*0a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, 0);
174*0a9064fbSMasahiro Yamada 			setText(noColIdx, QString::null);
175*0a9064fbSMasahiro Yamada 			setText(modColIdx, QString::null);
176*0a9064fbSMasahiro Yamada 			setText(yesColIdx, QString::null);
177*0a9064fbSMasahiro Yamada 			break;
178*0a9064fbSMasahiro Yamada 		}
179*0a9064fbSMasahiro Yamada 		expr = sym_get_tristate_value(sym);
180*0a9064fbSMasahiro Yamada 		switch (expr) {
181*0a9064fbSMasahiro Yamada 		case yes:
182*0a9064fbSMasahiro Yamada 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
183*0a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->choiceYesPix);
184*0a9064fbSMasahiro Yamada 			else
185*0a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->symbolYesPix);
186*0a9064fbSMasahiro Yamada 			setText(yesColIdx, "Y");
187*0a9064fbSMasahiro Yamada 			ch = 'Y';
188*0a9064fbSMasahiro Yamada 			break;
189*0a9064fbSMasahiro Yamada 		case mod:
190*0a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, list->symbolModPix);
191*0a9064fbSMasahiro Yamada 			setText(modColIdx, "M");
192*0a9064fbSMasahiro Yamada 			ch = 'M';
193*0a9064fbSMasahiro Yamada 			break;
194*0a9064fbSMasahiro Yamada 		default:
195*0a9064fbSMasahiro Yamada 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
196*0a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->choiceNoPix);
197*0a9064fbSMasahiro Yamada 			else
198*0a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->symbolNoPix);
199*0a9064fbSMasahiro Yamada 			setText(noColIdx, "N");
200*0a9064fbSMasahiro Yamada 			ch = 'N';
201*0a9064fbSMasahiro Yamada 			break;
202*0a9064fbSMasahiro Yamada 		}
203*0a9064fbSMasahiro Yamada 		if (expr != no)
204*0a9064fbSMasahiro Yamada 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
205*0a9064fbSMasahiro Yamada 		if (expr != mod)
206*0a9064fbSMasahiro Yamada 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
207*0a9064fbSMasahiro Yamada 		if (expr != yes)
208*0a9064fbSMasahiro Yamada 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
209*0a9064fbSMasahiro Yamada 
210*0a9064fbSMasahiro Yamada 		setText(dataColIdx, QChar(ch));
211*0a9064fbSMasahiro Yamada 		break;
212*0a9064fbSMasahiro Yamada 	case S_INT:
213*0a9064fbSMasahiro Yamada 	case S_HEX:
214*0a9064fbSMasahiro Yamada 	case S_STRING:
215*0a9064fbSMasahiro Yamada 		const char* data;
216*0a9064fbSMasahiro Yamada 
217*0a9064fbSMasahiro Yamada 		data = sym_get_string_value(sym);
218*0a9064fbSMasahiro Yamada 
219*0a9064fbSMasahiro Yamada 		int i = list->mapIdx(dataColIdx);
220*0a9064fbSMasahiro Yamada 		if (i >= 0)
221*0a9064fbSMasahiro Yamada 			setRenameEnabled(i, TRUE);
222*0a9064fbSMasahiro Yamada 		setText(dataColIdx, data);
223*0a9064fbSMasahiro Yamada 		if (type == S_STRING)
224*0a9064fbSMasahiro Yamada 			prompt = QString("%1: %2").arg(prompt).arg(data);
225*0a9064fbSMasahiro Yamada 		else
226*0a9064fbSMasahiro Yamada 			prompt = QString("(%2) %1").arg(prompt).arg(data);
227*0a9064fbSMasahiro Yamada 		break;
228*0a9064fbSMasahiro Yamada 	}
229*0a9064fbSMasahiro Yamada 	if (!sym_has_value(sym) && visible)
230*0a9064fbSMasahiro Yamada 		prompt += _(" (NEW)");
231*0a9064fbSMasahiro Yamada set_prompt:
232*0a9064fbSMasahiro Yamada 	setText(promptColIdx, prompt);
233*0a9064fbSMasahiro Yamada }
234*0a9064fbSMasahiro Yamada 
235*0a9064fbSMasahiro Yamada void ConfigItem::testUpdateMenu(bool v)
236*0a9064fbSMasahiro Yamada {
237*0a9064fbSMasahiro Yamada 	ConfigItem* i;
238*0a9064fbSMasahiro Yamada 
239*0a9064fbSMasahiro Yamada 	visible = v;
240*0a9064fbSMasahiro Yamada 	if (!menu)
241*0a9064fbSMasahiro Yamada 		return;
242*0a9064fbSMasahiro Yamada 
243*0a9064fbSMasahiro Yamada 	sym_calc_value(menu->sym);
244*0a9064fbSMasahiro Yamada 	if (menu->flags & MENU_CHANGED) {
245*0a9064fbSMasahiro Yamada 		/* the menu entry changed, so update all list items */
246*0a9064fbSMasahiro Yamada 		menu->flags &= ~MENU_CHANGED;
247*0a9064fbSMasahiro Yamada 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
248*0a9064fbSMasahiro Yamada 			i->updateMenu();
249*0a9064fbSMasahiro Yamada 	} else if (listView()->updateAll)
250*0a9064fbSMasahiro Yamada 		updateMenu();
251*0a9064fbSMasahiro Yamada }
252*0a9064fbSMasahiro Yamada 
253*0a9064fbSMasahiro Yamada void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align)
254*0a9064fbSMasahiro Yamada {
255*0a9064fbSMasahiro Yamada 	ConfigList* list = listView();
256*0a9064fbSMasahiro Yamada 
257*0a9064fbSMasahiro Yamada 	if (visible) {
258*0a9064fbSMasahiro Yamada 		if (isSelected() && !list->hasFocus() && list->mode == menuMode)
259*0a9064fbSMasahiro Yamada 			Parent::paintCell(p, list->inactivedColorGroup, column, width, align);
260*0a9064fbSMasahiro Yamada 		else
261*0a9064fbSMasahiro Yamada 			Parent::paintCell(p, cg, column, width, align);
262*0a9064fbSMasahiro Yamada 	} else
263*0a9064fbSMasahiro Yamada 		Parent::paintCell(p, list->disabledColorGroup, column, width, align);
264*0a9064fbSMasahiro Yamada }
265*0a9064fbSMasahiro Yamada 
266*0a9064fbSMasahiro Yamada /*
267*0a9064fbSMasahiro Yamada  * construct a menu entry
268*0a9064fbSMasahiro Yamada  */
269*0a9064fbSMasahiro Yamada void ConfigItem::init(void)
270*0a9064fbSMasahiro Yamada {
271*0a9064fbSMasahiro Yamada 	if (menu) {
272*0a9064fbSMasahiro Yamada 		ConfigList* list = listView();
273*0a9064fbSMasahiro Yamada 		nextItem = (ConfigItem*)menu->data;
274*0a9064fbSMasahiro Yamada 		menu->data = this;
275*0a9064fbSMasahiro Yamada 
276*0a9064fbSMasahiro Yamada 		if (list->mode != fullMode)
277*0a9064fbSMasahiro Yamada 			setOpen(TRUE);
278*0a9064fbSMasahiro Yamada 		sym_calc_value(menu->sym);
279*0a9064fbSMasahiro Yamada 	}
280*0a9064fbSMasahiro Yamada 	updateMenu();
281*0a9064fbSMasahiro Yamada }
282*0a9064fbSMasahiro Yamada 
283*0a9064fbSMasahiro Yamada /*
284*0a9064fbSMasahiro Yamada  * destruct a menu entry
285*0a9064fbSMasahiro Yamada  */
286*0a9064fbSMasahiro Yamada ConfigItem::~ConfigItem(void)
287*0a9064fbSMasahiro Yamada {
288*0a9064fbSMasahiro Yamada 	if (menu) {
289*0a9064fbSMasahiro Yamada 		ConfigItem** ip = (ConfigItem**)&menu->data;
290*0a9064fbSMasahiro Yamada 		for (; *ip; ip = &(*ip)->nextItem) {
291*0a9064fbSMasahiro Yamada 			if (*ip == this) {
292*0a9064fbSMasahiro Yamada 				*ip = nextItem;
293*0a9064fbSMasahiro Yamada 				break;
294*0a9064fbSMasahiro Yamada 			}
295*0a9064fbSMasahiro Yamada 		}
296*0a9064fbSMasahiro Yamada 	}
297*0a9064fbSMasahiro Yamada }
298*0a9064fbSMasahiro Yamada 
299*0a9064fbSMasahiro Yamada ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
300*0a9064fbSMasahiro Yamada 	: Parent(parent)
301*0a9064fbSMasahiro Yamada {
302*0a9064fbSMasahiro Yamada 	connect(this, SIGNAL(lostFocus()), SLOT(hide()));
303*0a9064fbSMasahiro Yamada }
304*0a9064fbSMasahiro Yamada 
305*0a9064fbSMasahiro Yamada void ConfigLineEdit::show(ConfigItem* i)
306*0a9064fbSMasahiro Yamada {
307*0a9064fbSMasahiro Yamada 	item = i;
308*0a9064fbSMasahiro Yamada 	if (sym_get_string_value(item->menu->sym))
309*0a9064fbSMasahiro Yamada 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
310*0a9064fbSMasahiro Yamada 	else
311*0a9064fbSMasahiro Yamada 		setText(QString::null);
312*0a9064fbSMasahiro Yamada 	Parent::show();
313*0a9064fbSMasahiro Yamada 	setFocus();
314*0a9064fbSMasahiro Yamada }
315*0a9064fbSMasahiro Yamada 
316*0a9064fbSMasahiro Yamada void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
317*0a9064fbSMasahiro Yamada {
318*0a9064fbSMasahiro Yamada 	switch (e->key()) {
319*0a9064fbSMasahiro Yamada 	case Qt::Key_Escape:
320*0a9064fbSMasahiro Yamada 		break;
321*0a9064fbSMasahiro Yamada 	case Qt::Key_Return:
322*0a9064fbSMasahiro Yamada 	case Qt::Key_Enter:
323*0a9064fbSMasahiro Yamada 		sym_set_string_value(item->menu->sym, text().latin1());
324*0a9064fbSMasahiro Yamada 		parent()->updateList(item);
325*0a9064fbSMasahiro Yamada 		break;
326*0a9064fbSMasahiro Yamada 	default:
327*0a9064fbSMasahiro Yamada 		Parent::keyPressEvent(e);
328*0a9064fbSMasahiro Yamada 		return;
329*0a9064fbSMasahiro Yamada 	}
330*0a9064fbSMasahiro Yamada 	e->accept();
331*0a9064fbSMasahiro Yamada 	parent()->list->setFocus();
332*0a9064fbSMasahiro Yamada 	hide();
333*0a9064fbSMasahiro Yamada }
334*0a9064fbSMasahiro Yamada 
335*0a9064fbSMasahiro Yamada ConfigList::ConfigList(ConfigView* p, const char *name)
336*0a9064fbSMasahiro Yamada 	: Parent(p, name),
337*0a9064fbSMasahiro Yamada 	  updateAll(false),
338*0a9064fbSMasahiro Yamada 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
339*0a9064fbSMasahiro Yamada 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
340*0a9064fbSMasahiro Yamada 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
341*0a9064fbSMasahiro Yamada 	  showName(false), showRange(false), showData(false), optMode(normalOpt),
342*0a9064fbSMasahiro Yamada 	  rootEntry(0), headerPopup(0)
343*0a9064fbSMasahiro Yamada {
344*0a9064fbSMasahiro Yamada 	int i;
345*0a9064fbSMasahiro Yamada 
346*0a9064fbSMasahiro Yamada 	setSorting(-1);
347*0a9064fbSMasahiro Yamada 	setRootIsDecorated(TRUE);
348*0a9064fbSMasahiro Yamada 	disabledColorGroup = palette().active();
349*0a9064fbSMasahiro Yamada 	disabledColorGroup.setColor(QColorGroup::Text, palette().disabled().text());
350*0a9064fbSMasahiro Yamada 	inactivedColorGroup = palette().active();
351*0a9064fbSMasahiro Yamada 	inactivedColorGroup.setColor(QColorGroup::Highlight, palette().disabled().highlight());
352*0a9064fbSMasahiro Yamada 
353*0a9064fbSMasahiro Yamada 	connect(this, SIGNAL(selectionChanged(void)),
354*0a9064fbSMasahiro Yamada 		SLOT(updateSelection(void)));
355*0a9064fbSMasahiro Yamada 
356*0a9064fbSMasahiro Yamada 	if (name) {
357*0a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
358*0a9064fbSMasahiro Yamada 		showName = configSettings->readBoolEntry("/showName", false);
359*0a9064fbSMasahiro Yamada 		showRange = configSettings->readBoolEntry("/showRange", false);
360*0a9064fbSMasahiro Yamada 		showData = configSettings->readBoolEntry("/showData", false);
361*0a9064fbSMasahiro Yamada 		optMode = (enum optionMode)configSettings->readNumEntry("/optionMode", false);
362*0a9064fbSMasahiro Yamada 		configSettings->endGroup();
363*0a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
364*0a9064fbSMasahiro Yamada 	}
365*0a9064fbSMasahiro Yamada 
366*0a9064fbSMasahiro Yamada 	for (i = 0; i < colNr; i++)
367*0a9064fbSMasahiro Yamada 		colMap[i] = colRevMap[i] = -1;
368*0a9064fbSMasahiro Yamada 	addColumn(promptColIdx, _("Option"));
369*0a9064fbSMasahiro Yamada 
370*0a9064fbSMasahiro Yamada 	reinit();
371*0a9064fbSMasahiro Yamada }
372*0a9064fbSMasahiro Yamada 
373*0a9064fbSMasahiro Yamada bool ConfigList::menuSkip(struct menu *menu)
374*0a9064fbSMasahiro Yamada {
375*0a9064fbSMasahiro Yamada 	if (optMode == normalOpt && menu_is_visible(menu))
376*0a9064fbSMasahiro Yamada 		return false;
377*0a9064fbSMasahiro Yamada 	if (optMode == promptOpt && menu_has_prompt(menu))
378*0a9064fbSMasahiro Yamada 		return false;
379*0a9064fbSMasahiro Yamada 	if (optMode == allOpt)
380*0a9064fbSMasahiro Yamada 		return false;
381*0a9064fbSMasahiro Yamada 	return true;
382*0a9064fbSMasahiro Yamada }
383*0a9064fbSMasahiro Yamada 
384*0a9064fbSMasahiro Yamada void ConfigList::reinit(void)
385*0a9064fbSMasahiro Yamada {
386*0a9064fbSMasahiro Yamada 	removeColumn(dataColIdx);
387*0a9064fbSMasahiro Yamada 	removeColumn(yesColIdx);
388*0a9064fbSMasahiro Yamada 	removeColumn(modColIdx);
389*0a9064fbSMasahiro Yamada 	removeColumn(noColIdx);
390*0a9064fbSMasahiro Yamada 	removeColumn(nameColIdx);
391*0a9064fbSMasahiro Yamada 
392*0a9064fbSMasahiro Yamada 	if (showName)
393*0a9064fbSMasahiro Yamada 		addColumn(nameColIdx, _("Name"));
394*0a9064fbSMasahiro Yamada 	if (showRange) {
395*0a9064fbSMasahiro Yamada 		addColumn(noColIdx, "N");
396*0a9064fbSMasahiro Yamada 		addColumn(modColIdx, "M");
397*0a9064fbSMasahiro Yamada 		addColumn(yesColIdx, "Y");
398*0a9064fbSMasahiro Yamada 	}
399*0a9064fbSMasahiro Yamada 	if (showData)
400*0a9064fbSMasahiro Yamada 		addColumn(dataColIdx, _("Value"));
401*0a9064fbSMasahiro Yamada 
402*0a9064fbSMasahiro Yamada 	updateListAll();
403*0a9064fbSMasahiro Yamada }
404*0a9064fbSMasahiro Yamada 
405*0a9064fbSMasahiro Yamada void ConfigList::saveSettings(void)
406*0a9064fbSMasahiro Yamada {
407*0a9064fbSMasahiro Yamada 	if (name()) {
408*0a9064fbSMasahiro Yamada 		configSettings->beginGroup(name());
409*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showName", showName);
410*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showRange", showRange);
411*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showData", showData);
412*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/optionMode", (int)optMode);
413*0a9064fbSMasahiro Yamada 		configSettings->endGroup();
414*0a9064fbSMasahiro Yamada 	}
415*0a9064fbSMasahiro Yamada }
416*0a9064fbSMasahiro Yamada 
417*0a9064fbSMasahiro Yamada ConfigItem* ConfigList::findConfigItem(struct menu *menu)
418*0a9064fbSMasahiro Yamada {
419*0a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)menu->data;
420*0a9064fbSMasahiro Yamada 
421*0a9064fbSMasahiro Yamada 	for (; item; item = item->nextItem) {
422*0a9064fbSMasahiro Yamada 		if (this == item->listView())
423*0a9064fbSMasahiro Yamada 			break;
424*0a9064fbSMasahiro Yamada 	}
425*0a9064fbSMasahiro Yamada 
426*0a9064fbSMasahiro Yamada 	return item;
427*0a9064fbSMasahiro Yamada }
428*0a9064fbSMasahiro Yamada 
429*0a9064fbSMasahiro Yamada void ConfigList::updateSelection(void)
430*0a9064fbSMasahiro Yamada {
431*0a9064fbSMasahiro Yamada 	struct menu *menu;
432*0a9064fbSMasahiro Yamada 	enum prop_type type;
433*0a9064fbSMasahiro Yamada 
434*0a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)selectedItem();
435*0a9064fbSMasahiro Yamada 	if (!item)
436*0a9064fbSMasahiro Yamada 		return;
437*0a9064fbSMasahiro Yamada 
438*0a9064fbSMasahiro Yamada 	menu = item->menu;
439*0a9064fbSMasahiro Yamada 	emit menuChanged(menu);
440*0a9064fbSMasahiro Yamada 	if (!menu)
441*0a9064fbSMasahiro Yamada 		return;
442*0a9064fbSMasahiro Yamada 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
443*0a9064fbSMasahiro Yamada 	if (mode == menuMode && type == P_MENU)
444*0a9064fbSMasahiro Yamada 		emit menuSelected(menu);
445*0a9064fbSMasahiro Yamada }
446*0a9064fbSMasahiro Yamada 
447*0a9064fbSMasahiro Yamada void ConfigList::updateList(ConfigItem* item)
448*0a9064fbSMasahiro Yamada {
449*0a9064fbSMasahiro Yamada 	ConfigItem* last = 0;
450*0a9064fbSMasahiro Yamada 
451*0a9064fbSMasahiro Yamada 	if (!rootEntry) {
452*0a9064fbSMasahiro Yamada 		if (mode != listMode)
453*0a9064fbSMasahiro Yamada 			goto update;
454*0a9064fbSMasahiro Yamada 		Q3ListViewItemIterator it(this);
455*0a9064fbSMasahiro Yamada 		ConfigItem* item;
456*0a9064fbSMasahiro Yamada 
457*0a9064fbSMasahiro Yamada 		for (; it.current(); ++it) {
458*0a9064fbSMasahiro Yamada 			item = (ConfigItem*)it.current();
459*0a9064fbSMasahiro Yamada 			if (!item->menu)
460*0a9064fbSMasahiro Yamada 				continue;
461*0a9064fbSMasahiro Yamada 			item->testUpdateMenu(menu_is_visible(item->menu));
462*0a9064fbSMasahiro Yamada 		}
463*0a9064fbSMasahiro Yamada 		return;
464*0a9064fbSMasahiro Yamada 	}
465*0a9064fbSMasahiro Yamada 
466*0a9064fbSMasahiro Yamada 	if (rootEntry != &rootmenu && (mode == singleMode ||
467*0a9064fbSMasahiro Yamada 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
468*0a9064fbSMasahiro Yamada 		item = firstChild();
469*0a9064fbSMasahiro Yamada 		if (!item)
470*0a9064fbSMasahiro Yamada 			item = new ConfigItem(this, 0, true);
471*0a9064fbSMasahiro Yamada 		last = item;
472*0a9064fbSMasahiro Yamada 	}
473*0a9064fbSMasahiro Yamada 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
474*0a9064fbSMasahiro Yamada 	    rootEntry->sym && rootEntry->prompt) {
475*0a9064fbSMasahiro Yamada 		item = last ? last->nextSibling() : firstChild();
476*0a9064fbSMasahiro Yamada 		if (!item)
477*0a9064fbSMasahiro Yamada 			item = new ConfigItem(this, last, rootEntry, true);
478*0a9064fbSMasahiro Yamada 		else
479*0a9064fbSMasahiro Yamada 			item->testUpdateMenu(true);
480*0a9064fbSMasahiro Yamada 
481*0a9064fbSMasahiro Yamada 		updateMenuList(item, rootEntry);
482*0a9064fbSMasahiro Yamada 		triggerUpdate();
483*0a9064fbSMasahiro Yamada 		return;
484*0a9064fbSMasahiro Yamada 	}
485*0a9064fbSMasahiro Yamada update:
486*0a9064fbSMasahiro Yamada 	updateMenuList(this, rootEntry);
487*0a9064fbSMasahiro Yamada 	triggerUpdate();
488*0a9064fbSMasahiro Yamada }
489*0a9064fbSMasahiro Yamada 
490*0a9064fbSMasahiro Yamada void ConfigList::setValue(ConfigItem* item, tristate val)
491*0a9064fbSMasahiro Yamada {
492*0a9064fbSMasahiro Yamada 	struct symbol* sym;
493*0a9064fbSMasahiro Yamada 	int type;
494*0a9064fbSMasahiro Yamada 	tristate oldval;
495*0a9064fbSMasahiro Yamada 
496*0a9064fbSMasahiro Yamada 	sym = item->menu ? item->menu->sym : 0;
497*0a9064fbSMasahiro Yamada 	if (!sym)
498*0a9064fbSMasahiro Yamada 		return;
499*0a9064fbSMasahiro Yamada 
500*0a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
501*0a9064fbSMasahiro Yamada 	switch (type) {
502*0a9064fbSMasahiro Yamada 	case S_BOOLEAN:
503*0a9064fbSMasahiro Yamada 	case S_TRISTATE:
504*0a9064fbSMasahiro Yamada 		oldval = sym_get_tristate_value(sym);
505*0a9064fbSMasahiro Yamada 
506*0a9064fbSMasahiro Yamada 		if (!sym_set_tristate_value(sym, val))
507*0a9064fbSMasahiro Yamada 			return;
508*0a9064fbSMasahiro Yamada 		if (oldval == no && item->menu->list)
509*0a9064fbSMasahiro Yamada 			item->setOpen(TRUE);
510*0a9064fbSMasahiro Yamada 		parent()->updateList(item);
511*0a9064fbSMasahiro Yamada 		break;
512*0a9064fbSMasahiro Yamada 	}
513*0a9064fbSMasahiro Yamada }
514*0a9064fbSMasahiro Yamada 
515*0a9064fbSMasahiro Yamada void ConfigList::changeValue(ConfigItem* item)
516*0a9064fbSMasahiro Yamada {
517*0a9064fbSMasahiro Yamada 	struct symbol* sym;
518*0a9064fbSMasahiro Yamada 	struct menu* menu;
519*0a9064fbSMasahiro Yamada 	int type, oldexpr, newexpr;
520*0a9064fbSMasahiro Yamada 
521*0a9064fbSMasahiro Yamada 	menu = item->menu;
522*0a9064fbSMasahiro Yamada 	if (!menu)
523*0a9064fbSMasahiro Yamada 		return;
524*0a9064fbSMasahiro Yamada 	sym = menu->sym;
525*0a9064fbSMasahiro Yamada 	if (!sym) {
526*0a9064fbSMasahiro Yamada 		if (item->menu->list)
527*0a9064fbSMasahiro Yamada 			item->setOpen(!item->isOpen());
528*0a9064fbSMasahiro Yamada 		return;
529*0a9064fbSMasahiro Yamada 	}
530*0a9064fbSMasahiro Yamada 
531*0a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
532*0a9064fbSMasahiro Yamada 	switch (type) {
533*0a9064fbSMasahiro Yamada 	case S_BOOLEAN:
534*0a9064fbSMasahiro Yamada 	case S_TRISTATE:
535*0a9064fbSMasahiro Yamada 		oldexpr = sym_get_tristate_value(sym);
536*0a9064fbSMasahiro Yamada 		newexpr = sym_toggle_tristate_value(sym);
537*0a9064fbSMasahiro Yamada 		if (item->menu->list) {
538*0a9064fbSMasahiro Yamada 			if (oldexpr == newexpr)
539*0a9064fbSMasahiro Yamada 				item->setOpen(!item->isOpen());
540*0a9064fbSMasahiro Yamada 			else if (oldexpr == no)
541*0a9064fbSMasahiro Yamada 				item->setOpen(TRUE);
542*0a9064fbSMasahiro Yamada 		}
543*0a9064fbSMasahiro Yamada 		if (oldexpr != newexpr)
544*0a9064fbSMasahiro Yamada 			parent()->updateList(item);
545*0a9064fbSMasahiro Yamada 		break;
546*0a9064fbSMasahiro Yamada 	case S_INT:
547*0a9064fbSMasahiro Yamada 	case S_HEX:
548*0a9064fbSMasahiro Yamada 	case S_STRING:
549*0a9064fbSMasahiro Yamada 		if (colMap[dataColIdx] >= 0)
550*0a9064fbSMasahiro Yamada 			item->startRename(colMap[dataColIdx]);
551*0a9064fbSMasahiro Yamada 		else
552*0a9064fbSMasahiro Yamada 			parent()->lineEdit->show(item);
553*0a9064fbSMasahiro Yamada 		break;
554*0a9064fbSMasahiro Yamada 	}
555*0a9064fbSMasahiro Yamada }
556*0a9064fbSMasahiro Yamada 
557*0a9064fbSMasahiro Yamada void ConfigList::setRootMenu(struct menu *menu)
558*0a9064fbSMasahiro Yamada {
559*0a9064fbSMasahiro Yamada 	enum prop_type type;
560*0a9064fbSMasahiro Yamada 
561*0a9064fbSMasahiro Yamada 	if (rootEntry == menu)
562*0a9064fbSMasahiro Yamada 		return;
563*0a9064fbSMasahiro Yamada 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
564*0a9064fbSMasahiro Yamada 	if (type != P_MENU)
565*0a9064fbSMasahiro Yamada 		return;
566*0a9064fbSMasahiro Yamada 	updateMenuList(this, 0);
567*0a9064fbSMasahiro Yamada 	rootEntry = menu;
568*0a9064fbSMasahiro Yamada 	updateListAll();
569*0a9064fbSMasahiro Yamada 	setSelected(currentItem(), hasFocus());
570*0a9064fbSMasahiro Yamada 	ensureItemVisible(currentItem());
571*0a9064fbSMasahiro Yamada }
572*0a9064fbSMasahiro Yamada 
573*0a9064fbSMasahiro Yamada void ConfigList::setParentMenu(void)
574*0a9064fbSMasahiro Yamada {
575*0a9064fbSMasahiro Yamada 	ConfigItem* item;
576*0a9064fbSMasahiro Yamada 	struct menu *oldroot;
577*0a9064fbSMasahiro Yamada 
578*0a9064fbSMasahiro Yamada 	oldroot = rootEntry;
579*0a9064fbSMasahiro Yamada 	if (rootEntry == &rootmenu)
580*0a9064fbSMasahiro Yamada 		return;
581*0a9064fbSMasahiro Yamada 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
582*0a9064fbSMasahiro Yamada 
583*0a9064fbSMasahiro Yamada 	Q3ListViewItemIterator it(this);
584*0a9064fbSMasahiro Yamada 	for (; (item = (ConfigItem*)it.current()); it++) {
585*0a9064fbSMasahiro Yamada 		if (item->menu == oldroot) {
586*0a9064fbSMasahiro Yamada 			setCurrentItem(item);
587*0a9064fbSMasahiro Yamada 			ensureItemVisible(item);
588*0a9064fbSMasahiro Yamada 			break;
589*0a9064fbSMasahiro Yamada 		}
590*0a9064fbSMasahiro Yamada 	}
591*0a9064fbSMasahiro Yamada }
592*0a9064fbSMasahiro Yamada 
593*0a9064fbSMasahiro Yamada /*
594*0a9064fbSMasahiro Yamada  * update all the children of a menu entry
595*0a9064fbSMasahiro Yamada  *   removes/adds the entries from the parent widget as necessary
596*0a9064fbSMasahiro Yamada  *
597*0a9064fbSMasahiro Yamada  * parent: either the menu list widget or a menu entry widget
598*0a9064fbSMasahiro Yamada  * menu: entry to be updated
599*0a9064fbSMasahiro Yamada  */
600*0a9064fbSMasahiro Yamada template <class P>
601*0a9064fbSMasahiro Yamada void ConfigList::updateMenuList(P* parent, struct menu* menu)
602*0a9064fbSMasahiro Yamada {
603*0a9064fbSMasahiro Yamada 	struct menu* child;
604*0a9064fbSMasahiro Yamada 	ConfigItem* item;
605*0a9064fbSMasahiro Yamada 	ConfigItem* last;
606*0a9064fbSMasahiro Yamada 	bool visible;
607*0a9064fbSMasahiro Yamada 	enum prop_type type;
608*0a9064fbSMasahiro Yamada 
609*0a9064fbSMasahiro Yamada 	if (!menu) {
610*0a9064fbSMasahiro Yamada 		while ((item = parent->firstChild()))
611*0a9064fbSMasahiro Yamada 			delete item;
612*0a9064fbSMasahiro Yamada 		return;
613*0a9064fbSMasahiro Yamada 	}
614*0a9064fbSMasahiro Yamada 
615*0a9064fbSMasahiro Yamada 	last = parent->firstChild();
616*0a9064fbSMasahiro Yamada 	if (last && !last->goParent)
617*0a9064fbSMasahiro Yamada 		last = 0;
618*0a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
619*0a9064fbSMasahiro Yamada 		item = last ? last->nextSibling() : parent->firstChild();
620*0a9064fbSMasahiro Yamada 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
621*0a9064fbSMasahiro Yamada 
622*0a9064fbSMasahiro Yamada 		switch (mode) {
623*0a9064fbSMasahiro Yamada 		case menuMode:
624*0a9064fbSMasahiro Yamada 			if (!(child->flags & MENU_ROOT))
625*0a9064fbSMasahiro Yamada 				goto hide;
626*0a9064fbSMasahiro Yamada 			break;
627*0a9064fbSMasahiro Yamada 		case symbolMode:
628*0a9064fbSMasahiro Yamada 			if (child->flags & MENU_ROOT)
629*0a9064fbSMasahiro Yamada 				goto hide;
630*0a9064fbSMasahiro Yamada 			break;
631*0a9064fbSMasahiro Yamada 		default:
632*0a9064fbSMasahiro Yamada 			break;
633*0a9064fbSMasahiro Yamada 		}
634*0a9064fbSMasahiro Yamada 
635*0a9064fbSMasahiro Yamada 		visible = menu_is_visible(child);
636*0a9064fbSMasahiro Yamada 		if (!menuSkip(child)) {
637*0a9064fbSMasahiro Yamada 			if (!child->sym && !child->list && !child->prompt)
638*0a9064fbSMasahiro Yamada 				continue;
639*0a9064fbSMasahiro Yamada 			if (!item || item->menu != child)
640*0a9064fbSMasahiro Yamada 				item = new ConfigItem(parent, last, child, visible);
641*0a9064fbSMasahiro Yamada 			else
642*0a9064fbSMasahiro Yamada 				item->testUpdateMenu(visible);
643*0a9064fbSMasahiro Yamada 
644*0a9064fbSMasahiro Yamada 			if (mode == fullMode || mode == menuMode || type != P_MENU)
645*0a9064fbSMasahiro Yamada 				updateMenuList(item, child);
646*0a9064fbSMasahiro Yamada 			else
647*0a9064fbSMasahiro Yamada 				updateMenuList(item, 0);
648*0a9064fbSMasahiro Yamada 			last = item;
649*0a9064fbSMasahiro Yamada 			continue;
650*0a9064fbSMasahiro Yamada 		}
651*0a9064fbSMasahiro Yamada 	hide:
652*0a9064fbSMasahiro Yamada 		if (item && item->menu == child) {
653*0a9064fbSMasahiro Yamada 			last = parent->firstChild();
654*0a9064fbSMasahiro Yamada 			if (last == item)
655*0a9064fbSMasahiro Yamada 				last = 0;
656*0a9064fbSMasahiro Yamada 			else while (last->nextSibling() != item)
657*0a9064fbSMasahiro Yamada 				last = last->nextSibling();
658*0a9064fbSMasahiro Yamada 			delete item;
659*0a9064fbSMasahiro Yamada 		}
660*0a9064fbSMasahiro Yamada 	}
661*0a9064fbSMasahiro Yamada }
662*0a9064fbSMasahiro Yamada 
663*0a9064fbSMasahiro Yamada void ConfigList::keyPressEvent(QKeyEvent* ev)
664*0a9064fbSMasahiro Yamada {
665*0a9064fbSMasahiro Yamada 	Q3ListViewItem* i = currentItem();
666*0a9064fbSMasahiro Yamada 	ConfigItem* item;
667*0a9064fbSMasahiro Yamada 	struct menu *menu;
668*0a9064fbSMasahiro Yamada 	enum prop_type type;
669*0a9064fbSMasahiro Yamada 
670*0a9064fbSMasahiro Yamada 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
671*0a9064fbSMasahiro Yamada 		emit parentSelected();
672*0a9064fbSMasahiro Yamada 		ev->accept();
673*0a9064fbSMasahiro Yamada 		return;
674*0a9064fbSMasahiro Yamada 	}
675*0a9064fbSMasahiro Yamada 
676*0a9064fbSMasahiro Yamada 	if (!i) {
677*0a9064fbSMasahiro Yamada 		Parent::keyPressEvent(ev);
678*0a9064fbSMasahiro Yamada 		return;
679*0a9064fbSMasahiro Yamada 	}
680*0a9064fbSMasahiro Yamada 	item = (ConfigItem*)i;
681*0a9064fbSMasahiro Yamada 
682*0a9064fbSMasahiro Yamada 	switch (ev->key()) {
683*0a9064fbSMasahiro Yamada 	case Qt::Key_Return:
684*0a9064fbSMasahiro Yamada 	case Qt::Key_Enter:
685*0a9064fbSMasahiro Yamada 		if (item->goParent) {
686*0a9064fbSMasahiro Yamada 			emit parentSelected();
687*0a9064fbSMasahiro Yamada 			break;
688*0a9064fbSMasahiro Yamada 		}
689*0a9064fbSMasahiro Yamada 		menu = item->menu;
690*0a9064fbSMasahiro Yamada 		if (!menu)
691*0a9064fbSMasahiro Yamada 			break;
692*0a9064fbSMasahiro Yamada 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
693*0a9064fbSMasahiro Yamada 		if (type == P_MENU && rootEntry != menu &&
694*0a9064fbSMasahiro Yamada 		    mode != fullMode && mode != menuMode) {
695*0a9064fbSMasahiro Yamada 			emit menuSelected(menu);
696*0a9064fbSMasahiro Yamada 			break;
697*0a9064fbSMasahiro Yamada 		}
698*0a9064fbSMasahiro Yamada 	case Qt::Key_Space:
699*0a9064fbSMasahiro Yamada 		changeValue(item);
700*0a9064fbSMasahiro Yamada 		break;
701*0a9064fbSMasahiro Yamada 	case Qt::Key_N:
702*0a9064fbSMasahiro Yamada 		setValue(item, no);
703*0a9064fbSMasahiro Yamada 		break;
704*0a9064fbSMasahiro Yamada 	case Qt::Key_M:
705*0a9064fbSMasahiro Yamada 		setValue(item, mod);
706*0a9064fbSMasahiro Yamada 		break;
707*0a9064fbSMasahiro Yamada 	case Qt::Key_Y:
708*0a9064fbSMasahiro Yamada 		setValue(item, yes);
709*0a9064fbSMasahiro Yamada 		break;
710*0a9064fbSMasahiro Yamada 	default:
711*0a9064fbSMasahiro Yamada 		Parent::keyPressEvent(ev);
712*0a9064fbSMasahiro Yamada 		return;
713*0a9064fbSMasahiro Yamada 	}
714*0a9064fbSMasahiro Yamada 	ev->accept();
715*0a9064fbSMasahiro Yamada }
716*0a9064fbSMasahiro Yamada 
717*0a9064fbSMasahiro Yamada void ConfigList::contentsMousePressEvent(QMouseEvent* e)
718*0a9064fbSMasahiro Yamada {
719*0a9064fbSMasahiro Yamada 	//QPoint p(contentsToViewport(e->pos()));
720*0a9064fbSMasahiro Yamada 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
721*0a9064fbSMasahiro Yamada 	Parent::contentsMousePressEvent(e);
722*0a9064fbSMasahiro Yamada }
723*0a9064fbSMasahiro Yamada 
724*0a9064fbSMasahiro Yamada void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e)
725*0a9064fbSMasahiro Yamada {
726*0a9064fbSMasahiro Yamada 	QPoint p(contentsToViewport(e->pos()));
727*0a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)itemAt(p);
728*0a9064fbSMasahiro Yamada 	struct menu *menu;
729*0a9064fbSMasahiro Yamada 	enum prop_type ptype;
730*0a9064fbSMasahiro Yamada 	const QPixmap* pm;
731*0a9064fbSMasahiro Yamada 	int idx, x;
732*0a9064fbSMasahiro Yamada 
733*0a9064fbSMasahiro Yamada 	if (!item)
734*0a9064fbSMasahiro Yamada 		goto skip;
735*0a9064fbSMasahiro Yamada 
736*0a9064fbSMasahiro Yamada 	menu = item->menu;
737*0a9064fbSMasahiro Yamada 	x = header()->offset() + p.x();
738*0a9064fbSMasahiro Yamada 	idx = colRevMap[header()->sectionAt(x)];
739*0a9064fbSMasahiro Yamada 	switch (idx) {
740*0a9064fbSMasahiro Yamada 	case promptColIdx:
741*0a9064fbSMasahiro Yamada 		pm = item->pixmap(promptColIdx);
742*0a9064fbSMasahiro Yamada 		if (pm) {
743*0a9064fbSMasahiro Yamada 			int off = header()->sectionPos(0) + itemMargin() +
744*0a9064fbSMasahiro Yamada 				treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0));
745*0a9064fbSMasahiro Yamada 			if (x >= off && x < off + pm->width()) {
746*0a9064fbSMasahiro Yamada 				if (item->goParent) {
747*0a9064fbSMasahiro Yamada 					emit parentSelected();
748*0a9064fbSMasahiro Yamada 					break;
749*0a9064fbSMasahiro Yamada 				} else if (!menu)
750*0a9064fbSMasahiro Yamada 					break;
751*0a9064fbSMasahiro Yamada 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
752*0a9064fbSMasahiro Yamada 				if (ptype == P_MENU && rootEntry != menu &&
753*0a9064fbSMasahiro Yamada 				    mode != fullMode && mode != menuMode)
754*0a9064fbSMasahiro Yamada 					emit menuSelected(menu);
755*0a9064fbSMasahiro Yamada 				else
756*0a9064fbSMasahiro Yamada 					changeValue(item);
757*0a9064fbSMasahiro Yamada 			}
758*0a9064fbSMasahiro Yamada 		}
759*0a9064fbSMasahiro Yamada 		break;
760*0a9064fbSMasahiro Yamada 	case noColIdx:
761*0a9064fbSMasahiro Yamada 		setValue(item, no);
762*0a9064fbSMasahiro Yamada 		break;
763*0a9064fbSMasahiro Yamada 	case modColIdx:
764*0a9064fbSMasahiro Yamada 		setValue(item, mod);
765*0a9064fbSMasahiro Yamada 		break;
766*0a9064fbSMasahiro Yamada 	case yesColIdx:
767*0a9064fbSMasahiro Yamada 		setValue(item, yes);
768*0a9064fbSMasahiro Yamada 		break;
769*0a9064fbSMasahiro Yamada 	case dataColIdx:
770*0a9064fbSMasahiro Yamada 		changeValue(item);
771*0a9064fbSMasahiro Yamada 		break;
772*0a9064fbSMasahiro Yamada 	}
773*0a9064fbSMasahiro Yamada 
774*0a9064fbSMasahiro Yamada skip:
775*0a9064fbSMasahiro Yamada 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
776*0a9064fbSMasahiro Yamada 	Parent::contentsMouseReleaseEvent(e);
777*0a9064fbSMasahiro Yamada }
778*0a9064fbSMasahiro Yamada 
779*0a9064fbSMasahiro Yamada void ConfigList::contentsMouseMoveEvent(QMouseEvent* e)
780*0a9064fbSMasahiro Yamada {
781*0a9064fbSMasahiro Yamada 	//QPoint p(contentsToViewport(e->pos()));
782*0a9064fbSMasahiro Yamada 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
783*0a9064fbSMasahiro Yamada 	Parent::contentsMouseMoveEvent(e);
784*0a9064fbSMasahiro Yamada }
785*0a9064fbSMasahiro Yamada 
786*0a9064fbSMasahiro Yamada void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
787*0a9064fbSMasahiro Yamada {
788*0a9064fbSMasahiro Yamada 	QPoint p(contentsToViewport(e->pos()));
789*0a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)itemAt(p);
790*0a9064fbSMasahiro Yamada 	struct menu *menu;
791*0a9064fbSMasahiro Yamada 	enum prop_type ptype;
792*0a9064fbSMasahiro Yamada 
793*0a9064fbSMasahiro Yamada 	if (!item)
794*0a9064fbSMasahiro Yamada 		goto skip;
795*0a9064fbSMasahiro Yamada 	if (item->goParent) {
796*0a9064fbSMasahiro Yamada 		emit parentSelected();
797*0a9064fbSMasahiro Yamada 		goto skip;
798*0a9064fbSMasahiro Yamada 	}
799*0a9064fbSMasahiro Yamada 	menu = item->menu;
800*0a9064fbSMasahiro Yamada 	if (!menu)
801*0a9064fbSMasahiro Yamada 		goto skip;
802*0a9064fbSMasahiro Yamada 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
803*0a9064fbSMasahiro Yamada 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
804*0a9064fbSMasahiro Yamada 		emit menuSelected(menu);
805*0a9064fbSMasahiro Yamada 	else if (menu->sym)
806*0a9064fbSMasahiro Yamada 		changeValue(item);
807*0a9064fbSMasahiro Yamada 
808*0a9064fbSMasahiro Yamada skip:
809*0a9064fbSMasahiro Yamada 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
810*0a9064fbSMasahiro Yamada 	Parent::contentsMouseDoubleClickEvent(e);
811*0a9064fbSMasahiro Yamada }
812*0a9064fbSMasahiro Yamada 
813*0a9064fbSMasahiro Yamada void ConfigList::focusInEvent(QFocusEvent *e)
814*0a9064fbSMasahiro Yamada {
815*0a9064fbSMasahiro Yamada 	struct menu *menu = NULL;
816*0a9064fbSMasahiro Yamada 
817*0a9064fbSMasahiro Yamada 	Parent::focusInEvent(e);
818*0a9064fbSMasahiro Yamada 
819*0a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem *)currentItem();
820*0a9064fbSMasahiro Yamada 	if (item) {
821*0a9064fbSMasahiro Yamada 		setSelected(item, TRUE);
822*0a9064fbSMasahiro Yamada 		menu = item->menu;
823*0a9064fbSMasahiro Yamada 	}
824*0a9064fbSMasahiro Yamada 	emit gotFocus(menu);
825*0a9064fbSMasahiro Yamada }
826*0a9064fbSMasahiro Yamada 
827*0a9064fbSMasahiro Yamada void ConfigList::contextMenuEvent(QContextMenuEvent *e)
828*0a9064fbSMasahiro Yamada {
829*0a9064fbSMasahiro Yamada 	if (e->y() <= header()->geometry().bottom()) {
830*0a9064fbSMasahiro Yamada 		if (!headerPopup) {
831*0a9064fbSMasahiro Yamada 			Q3Action *action;
832*0a9064fbSMasahiro Yamada 
833*0a9064fbSMasahiro Yamada 			headerPopup = new Q3PopupMenu(this);
834*0a9064fbSMasahiro Yamada 			action = new Q3Action(NULL, _("Show Name"), 0, this);
835*0a9064fbSMasahiro Yamada 			  action->setToggleAction(TRUE);
836*0a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
837*0a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowName(bool)));
838*0a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showNameChanged(bool)),
839*0a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
840*0a9064fbSMasahiro Yamada 			  action->setOn(showName);
841*0a9064fbSMasahiro Yamada 			  action->addTo(headerPopup);
842*0a9064fbSMasahiro Yamada 			action = new Q3Action(NULL, _("Show Range"), 0, this);
843*0a9064fbSMasahiro Yamada 			  action->setToggleAction(TRUE);
844*0a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
845*0a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowRange(bool)));
846*0a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
847*0a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
848*0a9064fbSMasahiro Yamada 			  action->setOn(showRange);
849*0a9064fbSMasahiro Yamada 			  action->addTo(headerPopup);
850*0a9064fbSMasahiro Yamada 			action = new Q3Action(NULL, _("Show Data"), 0, this);
851*0a9064fbSMasahiro Yamada 			  action->setToggleAction(TRUE);
852*0a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
853*0a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowData(bool)));
854*0a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showDataChanged(bool)),
855*0a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
856*0a9064fbSMasahiro Yamada 			  action->setOn(showData);
857*0a9064fbSMasahiro Yamada 			  action->addTo(headerPopup);
858*0a9064fbSMasahiro Yamada 		}
859*0a9064fbSMasahiro Yamada 		headerPopup->exec(e->globalPos());
860*0a9064fbSMasahiro Yamada 		e->accept();
861*0a9064fbSMasahiro Yamada 	} else
862*0a9064fbSMasahiro Yamada 		e->ignore();
863*0a9064fbSMasahiro Yamada }
864*0a9064fbSMasahiro Yamada 
865*0a9064fbSMasahiro Yamada ConfigView*ConfigView::viewList;
866*0a9064fbSMasahiro Yamada QAction *ConfigView::showNormalAction;
867*0a9064fbSMasahiro Yamada QAction *ConfigView::showAllAction;
868*0a9064fbSMasahiro Yamada QAction *ConfigView::showPromptAction;
869*0a9064fbSMasahiro Yamada 
870*0a9064fbSMasahiro Yamada ConfigView::ConfigView(QWidget* parent, const char *name)
871*0a9064fbSMasahiro Yamada 	: Parent(parent, name)
872*0a9064fbSMasahiro Yamada {
873*0a9064fbSMasahiro Yamada 	list = new ConfigList(this, name);
874*0a9064fbSMasahiro Yamada 	lineEdit = new ConfigLineEdit(this);
875*0a9064fbSMasahiro Yamada 	lineEdit->hide();
876*0a9064fbSMasahiro Yamada 
877*0a9064fbSMasahiro Yamada 	this->nextView = viewList;
878*0a9064fbSMasahiro Yamada 	viewList = this;
879*0a9064fbSMasahiro Yamada }
880*0a9064fbSMasahiro Yamada 
881*0a9064fbSMasahiro Yamada ConfigView::~ConfigView(void)
882*0a9064fbSMasahiro Yamada {
883*0a9064fbSMasahiro Yamada 	ConfigView** vp;
884*0a9064fbSMasahiro Yamada 
885*0a9064fbSMasahiro Yamada 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
886*0a9064fbSMasahiro Yamada 		if (*vp == this) {
887*0a9064fbSMasahiro Yamada 			*vp = nextView;
888*0a9064fbSMasahiro Yamada 			break;
889*0a9064fbSMasahiro Yamada 		}
890*0a9064fbSMasahiro Yamada 	}
891*0a9064fbSMasahiro Yamada }
892*0a9064fbSMasahiro Yamada 
893*0a9064fbSMasahiro Yamada void ConfigView::setOptionMode(QAction *act)
894*0a9064fbSMasahiro Yamada {
895*0a9064fbSMasahiro Yamada 	if (act == showNormalAction)
896*0a9064fbSMasahiro Yamada 		list->optMode = normalOpt;
897*0a9064fbSMasahiro Yamada 	else if (act == showAllAction)
898*0a9064fbSMasahiro Yamada 		list->optMode = allOpt;
899*0a9064fbSMasahiro Yamada 	else
900*0a9064fbSMasahiro Yamada 		list->optMode = promptOpt;
901*0a9064fbSMasahiro Yamada 
902*0a9064fbSMasahiro Yamada 	list->updateListAll();
903*0a9064fbSMasahiro Yamada }
904*0a9064fbSMasahiro Yamada 
905*0a9064fbSMasahiro Yamada void ConfigView::setShowName(bool b)
906*0a9064fbSMasahiro Yamada {
907*0a9064fbSMasahiro Yamada 	if (list->showName != b) {
908*0a9064fbSMasahiro Yamada 		list->showName = b;
909*0a9064fbSMasahiro Yamada 		list->reinit();
910*0a9064fbSMasahiro Yamada 		emit showNameChanged(b);
911*0a9064fbSMasahiro Yamada 	}
912*0a9064fbSMasahiro Yamada }
913*0a9064fbSMasahiro Yamada 
914*0a9064fbSMasahiro Yamada void ConfigView::setShowRange(bool b)
915*0a9064fbSMasahiro Yamada {
916*0a9064fbSMasahiro Yamada 	if (list->showRange != b) {
917*0a9064fbSMasahiro Yamada 		list->showRange = b;
918*0a9064fbSMasahiro Yamada 		list->reinit();
919*0a9064fbSMasahiro Yamada 		emit showRangeChanged(b);
920*0a9064fbSMasahiro Yamada 	}
921*0a9064fbSMasahiro Yamada }
922*0a9064fbSMasahiro Yamada 
923*0a9064fbSMasahiro Yamada void ConfigView::setShowData(bool b)
924*0a9064fbSMasahiro Yamada {
925*0a9064fbSMasahiro Yamada 	if (list->showData != b) {
926*0a9064fbSMasahiro Yamada 		list->showData = b;
927*0a9064fbSMasahiro Yamada 		list->reinit();
928*0a9064fbSMasahiro Yamada 		emit showDataChanged(b);
929*0a9064fbSMasahiro Yamada 	}
930*0a9064fbSMasahiro Yamada }
931*0a9064fbSMasahiro Yamada 
932*0a9064fbSMasahiro Yamada void ConfigList::setAllOpen(bool open)
933*0a9064fbSMasahiro Yamada {
934*0a9064fbSMasahiro Yamada 	Q3ListViewItemIterator it(this);
935*0a9064fbSMasahiro Yamada 
936*0a9064fbSMasahiro Yamada 	for (; it.current(); it++)
937*0a9064fbSMasahiro Yamada 		it.current()->setOpen(open);
938*0a9064fbSMasahiro Yamada }
939*0a9064fbSMasahiro Yamada 
940*0a9064fbSMasahiro Yamada void ConfigView::updateList(ConfigItem* item)
941*0a9064fbSMasahiro Yamada {
942*0a9064fbSMasahiro Yamada 	ConfigView* v;
943*0a9064fbSMasahiro Yamada 
944*0a9064fbSMasahiro Yamada 	for (v = viewList; v; v = v->nextView)
945*0a9064fbSMasahiro Yamada 		v->list->updateList(item);
946*0a9064fbSMasahiro Yamada }
947*0a9064fbSMasahiro Yamada 
948*0a9064fbSMasahiro Yamada void ConfigView::updateListAll(void)
949*0a9064fbSMasahiro Yamada {
950*0a9064fbSMasahiro Yamada 	ConfigView* v;
951*0a9064fbSMasahiro Yamada 
952*0a9064fbSMasahiro Yamada 	for (v = viewList; v; v = v->nextView)
953*0a9064fbSMasahiro Yamada 		v->list->updateListAll();
954*0a9064fbSMasahiro Yamada }
955*0a9064fbSMasahiro Yamada 
956*0a9064fbSMasahiro Yamada ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
957*0a9064fbSMasahiro Yamada 	: Parent(parent, name), sym(0), _menu(0)
958*0a9064fbSMasahiro Yamada {
959*0a9064fbSMasahiro Yamada 	if (name) {
960*0a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
961*0a9064fbSMasahiro Yamada 		_showDebug = configSettings->readBoolEntry("/showDebug", false);
962*0a9064fbSMasahiro Yamada 		configSettings->endGroup();
963*0a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
964*0a9064fbSMasahiro Yamada 	}
965*0a9064fbSMasahiro Yamada }
966*0a9064fbSMasahiro Yamada 
967*0a9064fbSMasahiro Yamada void ConfigInfoView::saveSettings(void)
968*0a9064fbSMasahiro Yamada {
969*0a9064fbSMasahiro Yamada 	if (name()) {
970*0a9064fbSMasahiro Yamada 		configSettings->beginGroup(name());
971*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/showDebug", showDebug());
972*0a9064fbSMasahiro Yamada 		configSettings->endGroup();
973*0a9064fbSMasahiro Yamada 	}
974*0a9064fbSMasahiro Yamada }
975*0a9064fbSMasahiro Yamada 
976*0a9064fbSMasahiro Yamada void ConfigInfoView::setShowDebug(bool b)
977*0a9064fbSMasahiro Yamada {
978*0a9064fbSMasahiro Yamada 	if (_showDebug != b) {
979*0a9064fbSMasahiro Yamada 		_showDebug = b;
980*0a9064fbSMasahiro Yamada 		if (_menu)
981*0a9064fbSMasahiro Yamada 			menuInfo();
982*0a9064fbSMasahiro Yamada 		else if (sym)
983*0a9064fbSMasahiro Yamada 			symbolInfo();
984*0a9064fbSMasahiro Yamada 		emit showDebugChanged(b);
985*0a9064fbSMasahiro Yamada 	}
986*0a9064fbSMasahiro Yamada }
987*0a9064fbSMasahiro Yamada 
988*0a9064fbSMasahiro Yamada void ConfigInfoView::setInfo(struct menu *m)
989*0a9064fbSMasahiro Yamada {
990*0a9064fbSMasahiro Yamada 	if (_menu == m)
991*0a9064fbSMasahiro Yamada 		return;
992*0a9064fbSMasahiro Yamada 	_menu = m;
993*0a9064fbSMasahiro Yamada 	sym = NULL;
994*0a9064fbSMasahiro Yamada 	if (!_menu)
995*0a9064fbSMasahiro Yamada 		clear();
996*0a9064fbSMasahiro Yamada 	else
997*0a9064fbSMasahiro Yamada 		menuInfo();
998*0a9064fbSMasahiro Yamada }
999*0a9064fbSMasahiro Yamada 
1000*0a9064fbSMasahiro Yamada void ConfigInfoView::symbolInfo(void)
1001*0a9064fbSMasahiro Yamada {
1002*0a9064fbSMasahiro Yamada 	QString str;
1003*0a9064fbSMasahiro Yamada 
1004*0a9064fbSMasahiro Yamada 	str += "<big>Symbol: <b>";
1005*0a9064fbSMasahiro Yamada 	str += print_filter(sym->name);
1006*0a9064fbSMasahiro Yamada 	str += "</b></big><br><br>value: ";
1007*0a9064fbSMasahiro Yamada 	str += print_filter(sym_get_string_value(sym));
1008*0a9064fbSMasahiro Yamada 	str += "<br>visibility: ";
1009*0a9064fbSMasahiro Yamada 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1010*0a9064fbSMasahiro Yamada 	str += "<br>";
1011*0a9064fbSMasahiro Yamada 	str += debug_info(sym);
1012*0a9064fbSMasahiro Yamada 
1013*0a9064fbSMasahiro Yamada 	setText(str);
1014*0a9064fbSMasahiro Yamada }
1015*0a9064fbSMasahiro Yamada 
1016*0a9064fbSMasahiro Yamada void ConfigInfoView::menuInfo(void)
1017*0a9064fbSMasahiro Yamada {
1018*0a9064fbSMasahiro Yamada 	struct symbol* sym;
1019*0a9064fbSMasahiro Yamada 	QString head, debug, help;
1020*0a9064fbSMasahiro Yamada 
1021*0a9064fbSMasahiro Yamada 	sym = _menu->sym;
1022*0a9064fbSMasahiro Yamada 	if (sym) {
1023*0a9064fbSMasahiro Yamada 		if (_menu->prompt) {
1024*0a9064fbSMasahiro Yamada 			head += "<big><b>";
1025*0a9064fbSMasahiro Yamada 			head += print_filter(_(_menu->prompt->text));
1026*0a9064fbSMasahiro Yamada 			head += "</b></big>";
1027*0a9064fbSMasahiro Yamada 			if (sym->name) {
1028*0a9064fbSMasahiro Yamada 				head += " (";
1029*0a9064fbSMasahiro Yamada 				if (showDebug())
1030*0a9064fbSMasahiro Yamada 					head += QString().sprintf("<a href=\"s%p\">", sym);
1031*0a9064fbSMasahiro Yamada 				head += print_filter(sym->name);
1032*0a9064fbSMasahiro Yamada 				if (showDebug())
1033*0a9064fbSMasahiro Yamada 					head += "</a>";
1034*0a9064fbSMasahiro Yamada 				head += ")";
1035*0a9064fbSMasahiro Yamada 			}
1036*0a9064fbSMasahiro Yamada 		} else if (sym->name) {
1037*0a9064fbSMasahiro Yamada 			head += "<big><b>";
1038*0a9064fbSMasahiro Yamada 			if (showDebug())
1039*0a9064fbSMasahiro Yamada 				head += QString().sprintf("<a href=\"s%p\">", sym);
1040*0a9064fbSMasahiro Yamada 			head += print_filter(sym->name);
1041*0a9064fbSMasahiro Yamada 			if (showDebug())
1042*0a9064fbSMasahiro Yamada 				head += "</a>";
1043*0a9064fbSMasahiro Yamada 			head += "</b></big>";
1044*0a9064fbSMasahiro Yamada 		}
1045*0a9064fbSMasahiro Yamada 		head += "<br><br>";
1046*0a9064fbSMasahiro Yamada 
1047*0a9064fbSMasahiro Yamada 		if (showDebug())
1048*0a9064fbSMasahiro Yamada 			debug = debug_info(sym);
1049*0a9064fbSMasahiro Yamada 
1050*0a9064fbSMasahiro Yamada 		struct gstr help_gstr = str_new();
1051*0a9064fbSMasahiro Yamada 		menu_get_ext_help(_menu, &help_gstr);
1052*0a9064fbSMasahiro Yamada 		help = print_filter(str_get(&help_gstr));
1053*0a9064fbSMasahiro Yamada 		str_free(&help_gstr);
1054*0a9064fbSMasahiro Yamada 	} else if (_menu->prompt) {
1055*0a9064fbSMasahiro Yamada 		head += "<big><b>";
1056*0a9064fbSMasahiro Yamada 		head += print_filter(_(_menu->prompt->text));
1057*0a9064fbSMasahiro Yamada 		head += "</b></big><br><br>";
1058*0a9064fbSMasahiro Yamada 		if (showDebug()) {
1059*0a9064fbSMasahiro Yamada 			if (_menu->prompt->visible.expr) {
1060*0a9064fbSMasahiro Yamada 				debug += "&nbsp;&nbsp;dep: ";
1061*0a9064fbSMasahiro Yamada 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
1062*0a9064fbSMasahiro Yamada 				debug += "<br><br>";
1063*0a9064fbSMasahiro Yamada 			}
1064*0a9064fbSMasahiro Yamada 		}
1065*0a9064fbSMasahiro Yamada 	}
1066*0a9064fbSMasahiro Yamada 	if (showDebug())
1067*0a9064fbSMasahiro Yamada 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
1068*0a9064fbSMasahiro Yamada 
1069*0a9064fbSMasahiro Yamada 	setText(head + debug + help);
1070*0a9064fbSMasahiro Yamada }
1071*0a9064fbSMasahiro Yamada 
1072*0a9064fbSMasahiro Yamada QString ConfigInfoView::debug_info(struct symbol *sym)
1073*0a9064fbSMasahiro Yamada {
1074*0a9064fbSMasahiro Yamada 	QString debug;
1075*0a9064fbSMasahiro Yamada 
1076*0a9064fbSMasahiro Yamada 	debug += "type: ";
1077*0a9064fbSMasahiro Yamada 	debug += print_filter(sym_type_name(sym->type));
1078*0a9064fbSMasahiro Yamada 	if (sym_is_choice(sym))
1079*0a9064fbSMasahiro Yamada 		debug += " (choice)";
1080*0a9064fbSMasahiro Yamada 	debug += "<br>";
1081*0a9064fbSMasahiro Yamada 	if (sym->rev_dep.expr) {
1082*0a9064fbSMasahiro Yamada 		debug += "reverse dep: ";
1083*0a9064fbSMasahiro Yamada 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
1084*0a9064fbSMasahiro Yamada 		debug += "<br>";
1085*0a9064fbSMasahiro Yamada 	}
1086*0a9064fbSMasahiro Yamada 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1087*0a9064fbSMasahiro Yamada 		switch (prop->type) {
1088*0a9064fbSMasahiro Yamada 		case P_PROMPT:
1089*0a9064fbSMasahiro Yamada 		case P_MENU:
1090*0a9064fbSMasahiro Yamada 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
1091*0a9064fbSMasahiro Yamada 			debug += print_filter(_(prop->text));
1092*0a9064fbSMasahiro Yamada 			debug += "</a><br>";
1093*0a9064fbSMasahiro Yamada 			break;
1094*0a9064fbSMasahiro Yamada 		case P_DEFAULT:
1095*0a9064fbSMasahiro Yamada 		case P_SELECT:
1096*0a9064fbSMasahiro Yamada 		case P_RANGE:
1097*0a9064fbSMasahiro Yamada 		case P_ENV:
1098*0a9064fbSMasahiro Yamada 			debug += prop_get_type_name(prop->type);
1099*0a9064fbSMasahiro Yamada 			debug += ": ";
1100*0a9064fbSMasahiro Yamada 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
1101*0a9064fbSMasahiro Yamada 			debug += "<br>";
1102*0a9064fbSMasahiro Yamada 			break;
1103*0a9064fbSMasahiro Yamada 		case P_CHOICE:
1104*0a9064fbSMasahiro Yamada 			if (sym_is_choice(sym)) {
1105*0a9064fbSMasahiro Yamada 				debug += "choice: ";
1106*0a9064fbSMasahiro Yamada 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
1107*0a9064fbSMasahiro Yamada 				debug += "<br>";
1108*0a9064fbSMasahiro Yamada 			}
1109*0a9064fbSMasahiro Yamada 			break;
1110*0a9064fbSMasahiro Yamada 		default:
1111*0a9064fbSMasahiro Yamada 			debug += "unknown property: ";
1112*0a9064fbSMasahiro Yamada 			debug += prop_get_type_name(prop->type);
1113*0a9064fbSMasahiro Yamada 			debug += "<br>";
1114*0a9064fbSMasahiro Yamada 		}
1115*0a9064fbSMasahiro Yamada 		if (prop->visible.expr) {
1116*0a9064fbSMasahiro Yamada 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
1117*0a9064fbSMasahiro Yamada 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
1118*0a9064fbSMasahiro Yamada 			debug += "<br>";
1119*0a9064fbSMasahiro Yamada 		}
1120*0a9064fbSMasahiro Yamada 	}
1121*0a9064fbSMasahiro Yamada 	debug += "<br>";
1122*0a9064fbSMasahiro Yamada 
1123*0a9064fbSMasahiro Yamada 	return debug;
1124*0a9064fbSMasahiro Yamada }
1125*0a9064fbSMasahiro Yamada 
1126*0a9064fbSMasahiro Yamada QString ConfigInfoView::print_filter(const QString &str)
1127*0a9064fbSMasahiro Yamada {
1128*0a9064fbSMasahiro Yamada 	QRegExp re("[<>&\"\\n]");
1129*0a9064fbSMasahiro Yamada 	QString res = str;
1130*0a9064fbSMasahiro Yamada 	for (int i = 0; (i = res.find(re, i)) >= 0;) {
1131*0a9064fbSMasahiro Yamada 		switch (res[i].latin1()) {
1132*0a9064fbSMasahiro Yamada 		case '<':
1133*0a9064fbSMasahiro Yamada 			res.replace(i, 1, "&lt;");
1134*0a9064fbSMasahiro Yamada 			i += 4;
1135*0a9064fbSMasahiro Yamada 			break;
1136*0a9064fbSMasahiro Yamada 		case '>':
1137*0a9064fbSMasahiro Yamada 			res.replace(i, 1, "&gt;");
1138*0a9064fbSMasahiro Yamada 			i += 4;
1139*0a9064fbSMasahiro Yamada 			break;
1140*0a9064fbSMasahiro Yamada 		case '&':
1141*0a9064fbSMasahiro Yamada 			res.replace(i, 1, "&amp;");
1142*0a9064fbSMasahiro Yamada 			i += 5;
1143*0a9064fbSMasahiro Yamada 			break;
1144*0a9064fbSMasahiro Yamada 		case '"':
1145*0a9064fbSMasahiro Yamada 			res.replace(i, 1, "&quot;");
1146*0a9064fbSMasahiro Yamada 			i += 6;
1147*0a9064fbSMasahiro Yamada 			break;
1148*0a9064fbSMasahiro Yamada 		case '\n':
1149*0a9064fbSMasahiro Yamada 			res.replace(i, 1, "<br>");
1150*0a9064fbSMasahiro Yamada 			i += 4;
1151*0a9064fbSMasahiro Yamada 			break;
1152*0a9064fbSMasahiro Yamada 		}
1153*0a9064fbSMasahiro Yamada 	}
1154*0a9064fbSMasahiro Yamada 	return res;
1155*0a9064fbSMasahiro Yamada }
1156*0a9064fbSMasahiro Yamada 
1157*0a9064fbSMasahiro Yamada void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
1158*0a9064fbSMasahiro Yamada {
1159*0a9064fbSMasahiro Yamada 	QString* text = reinterpret_cast<QString*>(data);
1160*0a9064fbSMasahiro Yamada 	QString str2 = print_filter(str);
1161*0a9064fbSMasahiro Yamada 
1162*0a9064fbSMasahiro Yamada 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1163*0a9064fbSMasahiro Yamada 		*text += QString().sprintf("<a href=\"s%p\">", sym);
1164*0a9064fbSMasahiro Yamada 		*text += str2;
1165*0a9064fbSMasahiro Yamada 		*text += "</a>";
1166*0a9064fbSMasahiro Yamada 	} else
1167*0a9064fbSMasahiro Yamada 		*text += str2;
1168*0a9064fbSMasahiro Yamada }
1169*0a9064fbSMasahiro Yamada 
1170*0a9064fbSMasahiro Yamada Q3PopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)
1171*0a9064fbSMasahiro Yamada {
1172*0a9064fbSMasahiro Yamada 	Q3PopupMenu* popup = Parent::createPopupMenu(pos);
1173*0a9064fbSMasahiro Yamada 	Q3Action* action = new Q3Action(NULL, _("Show Debug Info"), 0, popup);
1174*0a9064fbSMasahiro Yamada 	  action->setToggleAction(TRUE);
1175*0a9064fbSMasahiro Yamada 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
1176*0a9064fbSMasahiro Yamada 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
1177*0a9064fbSMasahiro Yamada 	  action->setOn(showDebug());
1178*0a9064fbSMasahiro Yamada 	popup->insertSeparator();
1179*0a9064fbSMasahiro Yamada 	action->addTo(popup);
1180*0a9064fbSMasahiro Yamada 	return popup;
1181*0a9064fbSMasahiro Yamada }
1182*0a9064fbSMasahiro Yamada 
1183*0a9064fbSMasahiro Yamada void ConfigInfoView::contentsContextMenuEvent(QContextMenuEvent *e)
1184*0a9064fbSMasahiro Yamada {
1185*0a9064fbSMasahiro Yamada 	Parent::contentsContextMenuEvent(e);
1186*0a9064fbSMasahiro Yamada }
1187*0a9064fbSMasahiro Yamada 
1188*0a9064fbSMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
1189*0a9064fbSMasahiro Yamada 	: Parent(parent, name), result(NULL)
1190*0a9064fbSMasahiro Yamada {
1191*0a9064fbSMasahiro Yamada 	setCaption("Search Config");
1192*0a9064fbSMasahiro Yamada 
1193*0a9064fbSMasahiro Yamada 	QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6);
1194*0a9064fbSMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6);
1195*0a9064fbSMasahiro Yamada 	layout2->addWidget(new QLabel(_("Find:"), this));
1196*0a9064fbSMasahiro Yamada 	editField = new QLineEdit(this);
1197*0a9064fbSMasahiro Yamada 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
1198*0a9064fbSMasahiro Yamada 	layout2->addWidget(editField);
1199*0a9064fbSMasahiro Yamada 	searchButton = new QPushButton(_("Search"), this);
1200*0a9064fbSMasahiro Yamada 	searchButton->setAutoDefault(FALSE);
1201*0a9064fbSMasahiro Yamada 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
1202*0a9064fbSMasahiro Yamada 	layout2->addWidget(searchButton);
1203*0a9064fbSMasahiro Yamada 	layout1->addLayout(layout2);
1204*0a9064fbSMasahiro Yamada 
1205*0a9064fbSMasahiro Yamada 	split = new QSplitter(this);
1206*0a9064fbSMasahiro Yamada 	split->setOrientation(Qt::Vertical);
1207*0a9064fbSMasahiro Yamada 	list = new ConfigView(split, name);
1208*0a9064fbSMasahiro Yamada 	list->list->mode = listMode;
1209*0a9064fbSMasahiro Yamada 	info = new ConfigInfoView(split, name);
1210*0a9064fbSMasahiro Yamada 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
1211*0a9064fbSMasahiro Yamada 		info, SLOT(setInfo(struct menu *)));
1212*0a9064fbSMasahiro Yamada 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
1213*0a9064fbSMasahiro Yamada 		parent, SLOT(setMenuLink(struct menu *)));
1214*0a9064fbSMasahiro Yamada 
1215*0a9064fbSMasahiro Yamada 	layout1->addWidget(split);
1216*0a9064fbSMasahiro Yamada 
1217*0a9064fbSMasahiro Yamada 	if (name) {
1218*0a9064fbSMasahiro Yamada 		int x, y, width, height;
1219*0a9064fbSMasahiro Yamada 		bool ok;
1220*0a9064fbSMasahiro Yamada 
1221*0a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
1222*0a9064fbSMasahiro Yamada 		width = configSettings->readNumEntry("/window width", parent->width() / 2);
1223*0a9064fbSMasahiro Yamada 		height = configSettings->readNumEntry("/window height", parent->height() / 2);
1224*0a9064fbSMasahiro Yamada 		resize(width, height);
1225*0a9064fbSMasahiro Yamada 		x = configSettings->readNumEntry("/window x", 0, &ok);
1226*0a9064fbSMasahiro Yamada 		if (ok)
1227*0a9064fbSMasahiro Yamada 			y = configSettings->readNumEntry("/window y", 0, &ok);
1228*0a9064fbSMasahiro Yamada 		if (ok)
1229*0a9064fbSMasahiro Yamada 			move(x, y);
1230*0a9064fbSMasahiro Yamada 		Q3ValueList<int> sizes = configSettings->readSizes("/split", &ok);
1231*0a9064fbSMasahiro Yamada 		if (ok)
1232*0a9064fbSMasahiro Yamada 			split->setSizes(sizes);
1233*0a9064fbSMasahiro Yamada 		configSettings->endGroup();
1234*0a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
1235*0a9064fbSMasahiro Yamada 	}
1236*0a9064fbSMasahiro Yamada }
1237*0a9064fbSMasahiro Yamada 
1238*0a9064fbSMasahiro Yamada void ConfigSearchWindow::saveSettings(void)
1239*0a9064fbSMasahiro Yamada {
1240*0a9064fbSMasahiro Yamada 	if (name()) {
1241*0a9064fbSMasahiro Yamada 		configSettings->beginGroup(name());
1242*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window x", pos().x());
1243*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window y", pos().y());
1244*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window width", size().width());
1245*0a9064fbSMasahiro Yamada 		configSettings->writeEntry("/window height", size().height());
1246*0a9064fbSMasahiro Yamada 		configSettings->writeSizes("/split", split->sizes());
1247*0a9064fbSMasahiro Yamada 		configSettings->endGroup();
1248*0a9064fbSMasahiro Yamada 	}
1249*0a9064fbSMasahiro Yamada }
1250*0a9064fbSMasahiro Yamada 
1251*0a9064fbSMasahiro Yamada void ConfigSearchWindow::search(void)
1252*0a9064fbSMasahiro Yamada {
1253*0a9064fbSMasahiro Yamada 	struct symbol **p;
1254*0a9064fbSMasahiro Yamada 	struct property *prop;
1255*0a9064fbSMasahiro Yamada 	ConfigItem *lastItem = NULL;
1256*0a9064fbSMasahiro Yamada 
1257*0a9064fbSMasahiro Yamada 	free(result);
1258*0a9064fbSMasahiro Yamada 	list->list->clear();
1259*0a9064fbSMasahiro Yamada 	info->clear();
1260*0a9064fbSMasahiro Yamada 
1261*0a9064fbSMasahiro Yamada 	result = sym_re_search(editField->text().latin1());
1262*0a9064fbSMasahiro Yamada 	if (!result)
1263*0a9064fbSMasahiro Yamada 		return;
1264*0a9064fbSMasahiro Yamada 	for (p = result; *p; p++) {
1265*0a9064fbSMasahiro Yamada 		for_all_prompts((*p), prop)
1266*0a9064fbSMasahiro Yamada 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1267*0a9064fbSMasahiro Yamada 						  menu_is_visible(prop->menu));
1268*0a9064fbSMasahiro Yamada 	}
1269*0a9064fbSMasahiro Yamada }
1270*0a9064fbSMasahiro Yamada 
1271*0a9064fbSMasahiro Yamada /*
1272*0a9064fbSMasahiro Yamada  * Construct the complete config widget
1273*0a9064fbSMasahiro Yamada  */
1274*0a9064fbSMasahiro Yamada ConfigMainWindow::ConfigMainWindow(void)
1275*0a9064fbSMasahiro Yamada 	: searchWindow(0)
1276*0a9064fbSMasahiro Yamada {
1277*0a9064fbSMasahiro Yamada 	QMenuBar* menu;
1278*0a9064fbSMasahiro Yamada 	bool ok;
1279*0a9064fbSMasahiro Yamada 	int x, y, width, height;
1280*0a9064fbSMasahiro Yamada 	char title[256];
1281*0a9064fbSMasahiro Yamada 
1282*0a9064fbSMasahiro Yamada 	QDesktopWidget *d = configApp->desktop();
1283*0a9064fbSMasahiro Yamada 	snprintf(title, sizeof(title), "%s%s",
1284*0a9064fbSMasahiro Yamada 		rootmenu.prompt->text,
1285*0a9064fbSMasahiro Yamada #if QT_VERSION < 0x040000
1286*0a9064fbSMasahiro Yamada 		" (Qt3)"
1287*0a9064fbSMasahiro Yamada #else
1288*0a9064fbSMasahiro Yamada 		""
1289*0a9064fbSMasahiro Yamada #endif
1290*0a9064fbSMasahiro Yamada 		);
1291*0a9064fbSMasahiro Yamada 	setCaption(title);
1292*0a9064fbSMasahiro Yamada 
1293*0a9064fbSMasahiro Yamada 	width = configSettings->readNumEntry("/window width", d->width() - 64);
1294*0a9064fbSMasahiro Yamada 	height = configSettings->readNumEntry("/window height", d->height() - 64);
1295*0a9064fbSMasahiro Yamada 	resize(width, height);
1296*0a9064fbSMasahiro Yamada 	x = configSettings->readNumEntry("/window x", 0, &ok);
1297*0a9064fbSMasahiro Yamada 	if (ok)
1298*0a9064fbSMasahiro Yamada 		y = configSettings->readNumEntry("/window y", 0, &ok);
1299*0a9064fbSMasahiro Yamada 	if (ok)
1300*0a9064fbSMasahiro Yamada 		move(x, y);
1301*0a9064fbSMasahiro Yamada 
1302*0a9064fbSMasahiro Yamada 	split1 = new QSplitter(this);
1303*0a9064fbSMasahiro Yamada 	split1->setOrientation(Qt::Horizontal);
1304*0a9064fbSMasahiro Yamada 	setCentralWidget(split1);
1305*0a9064fbSMasahiro Yamada 
1306*0a9064fbSMasahiro Yamada 	menuView = new ConfigView(split1, "menu");
1307*0a9064fbSMasahiro Yamada 	menuList = menuView->list;
1308*0a9064fbSMasahiro Yamada 
1309*0a9064fbSMasahiro Yamada 	split2 = new QSplitter(split1);
1310*0a9064fbSMasahiro Yamada 	split2->setOrientation(Qt::Vertical);
1311*0a9064fbSMasahiro Yamada 
1312*0a9064fbSMasahiro Yamada 	// create config tree
1313*0a9064fbSMasahiro Yamada 	configView = new ConfigView(split2, "config");
1314*0a9064fbSMasahiro Yamada 	configList = configView->list;
1315*0a9064fbSMasahiro Yamada 
1316*0a9064fbSMasahiro Yamada 	helpText = new ConfigInfoView(split2, "help");
1317*0a9064fbSMasahiro Yamada 	helpText->setTextFormat(Qt::RichText);
1318*0a9064fbSMasahiro Yamada 
1319*0a9064fbSMasahiro Yamada 	setTabOrder(configList, helpText);
1320*0a9064fbSMasahiro Yamada 	configList->setFocus();
1321*0a9064fbSMasahiro Yamada 
1322*0a9064fbSMasahiro Yamada 	menu = menuBar();
1323*0a9064fbSMasahiro Yamada 	toolBar = new Q3ToolBar("Tools", this);
1324*0a9064fbSMasahiro Yamada 
1325*0a9064fbSMasahiro Yamada 	backAction = new Q3Action("Back", QPixmap(xpm_back), _("Back"), 0, this);
1326*0a9064fbSMasahiro Yamada 	  connect(backAction, SIGNAL(activated()), SLOT(goBack()));
1327*0a9064fbSMasahiro Yamada 	  backAction->setEnabled(FALSE);
1328*0a9064fbSMasahiro Yamada 	Q3Action *quitAction = new Q3Action("Quit", _("&Quit"), Qt::CTRL + Qt::Key_Q, this);
1329*0a9064fbSMasahiro Yamada 	  connect(quitAction, SIGNAL(activated()), SLOT(close()));
1330*0a9064fbSMasahiro Yamada 	Q3Action *loadAction = new Q3Action("Load", QPixmap(xpm_load), _("&Load"), Qt::CTRL + Qt::Key_L, this);
1331*0a9064fbSMasahiro Yamada 	  connect(loadAction, SIGNAL(activated()), SLOT(loadConfig()));
1332*0a9064fbSMasahiro Yamada 	saveAction = new Q3Action("Save", QPixmap(xpm_save), _("&Save"), Qt::CTRL + Qt::Key_S, this);
1333*0a9064fbSMasahiro Yamada 	  connect(saveAction, SIGNAL(activated()), SLOT(saveConfig()));
1334*0a9064fbSMasahiro Yamada 	conf_set_changed_callback(conf_changed);
1335*0a9064fbSMasahiro Yamada 	// Set saveAction's initial state
1336*0a9064fbSMasahiro Yamada 	conf_changed();
1337*0a9064fbSMasahiro Yamada 	Q3Action *saveAsAction = new Q3Action("Save As...", _("Save &As..."), 0, this);
1338*0a9064fbSMasahiro Yamada 	  connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
1339*0a9064fbSMasahiro Yamada 	Q3Action *searchAction = new Q3Action("Find", _("&Find"), Qt::CTRL + Qt::Key_F, this);
1340*0a9064fbSMasahiro Yamada 	  connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
1341*0a9064fbSMasahiro Yamada 	Q3Action *singleViewAction = new Q3Action("Single View", QPixmap(xpm_single_view), _("Single View"), 0, this);
1342*0a9064fbSMasahiro Yamada 	  connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
1343*0a9064fbSMasahiro Yamada 	Q3Action *splitViewAction = new Q3Action("Split View", QPixmap(xpm_split_view), _("Split View"), 0, this);
1344*0a9064fbSMasahiro Yamada 	  connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView()));
1345*0a9064fbSMasahiro Yamada 	Q3Action *fullViewAction = new Q3Action("Full View", QPixmap(xpm_tree_view), _("Full View"), 0, this);
1346*0a9064fbSMasahiro Yamada 	  connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView()));
1347*0a9064fbSMasahiro Yamada 
1348*0a9064fbSMasahiro Yamada 	Q3Action *showNameAction = new Q3Action(NULL, _("Show Name"), 0, this);
1349*0a9064fbSMasahiro Yamada 	  showNameAction->setToggleAction(TRUE);
1350*0a9064fbSMasahiro Yamada 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
1351*0a9064fbSMasahiro Yamada 	  connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool)));
1352*0a9064fbSMasahiro Yamada 	  showNameAction->setOn(configView->showName());
1353*0a9064fbSMasahiro Yamada 	Q3Action *showRangeAction = new Q3Action(NULL, _("Show Range"), 0, this);
1354*0a9064fbSMasahiro Yamada 	  showRangeAction->setToggleAction(TRUE);
1355*0a9064fbSMasahiro Yamada 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1356*0a9064fbSMasahiro Yamada 	  connect(configView, SIGNAL(showRangeChanged(bool)), showRangeAction, SLOT(setOn(bool)));
1357*0a9064fbSMasahiro Yamada 	  showRangeAction->setOn(configList->showRange);
1358*0a9064fbSMasahiro Yamada 	Q3Action *showDataAction = new Q3Action(NULL, _("Show Data"), 0, this);
1359*0a9064fbSMasahiro Yamada 	  showDataAction->setToggleAction(TRUE);
1360*0a9064fbSMasahiro Yamada 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
1361*0a9064fbSMasahiro Yamada 	  connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
1362*0a9064fbSMasahiro Yamada 	  showDataAction->setOn(configList->showData);
1363*0a9064fbSMasahiro Yamada 
1364*0a9064fbSMasahiro Yamada 	QActionGroup *optGroup = new QActionGroup(this);
1365*0a9064fbSMasahiro Yamada 	optGroup->setExclusive(TRUE);
1366*0a9064fbSMasahiro Yamada 	connect(optGroup, SIGNAL(selected(QAction *)), configView,
1367*0a9064fbSMasahiro Yamada 		SLOT(setOptionMode(QAction *)));
1368*0a9064fbSMasahiro Yamada 	connect(optGroup, SIGNAL(selected(QAction *)), menuView,
1369*0a9064fbSMasahiro Yamada 		SLOT(setOptionMode(QAction *)));
1370*0a9064fbSMasahiro Yamada 
1371*0a9064fbSMasahiro Yamada #if QT_VERSION >= 0x040000
1372*0a9064fbSMasahiro Yamada 	configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
1373*0a9064fbSMasahiro Yamada 	configView->showAllAction = new QAction(_("Show All Options"), optGroup);
1374*0a9064fbSMasahiro Yamada 	configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
1375*0a9064fbSMasahiro Yamada #else
1376*0a9064fbSMasahiro Yamada 	configView->showNormalAction = new QAction(_("Show Normal Options"), 0, optGroup);
1377*0a9064fbSMasahiro Yamada 	configView->showAllAction = new QAction(_("Show All Options"), 0, optGroup);
1378*0a9064fbSMasahiro Yamada 	configView->showPromptAction = new QAction(_("Show Prompt Options"), 0, optGroup);
1379*0a9064fbSMasahiro Yamada #endif
1380*0a9064fbSMasahiro Yamada 	configView->showNormalAction->setToggleAction(TRUE);
1381*0a9064fbSMasahiro Yamada 	configView->showNormalAction->setOn(configList->optMode == normalOpt);
1382*0a9064fbSMasahiro Yamada 	configView->showAllAction->setToggleAction(TRUE);
1383*0a9064fbSMasahiro Yamada 	configView->showAllAction->setOn(configList->optMode == allOpt);
1384*0a9064fbSMasahiro Yamada 	configView->showPromptAction->setToggleAction(TRUE);
1385*0a9064fbSMasahiro Yamada 	configView->showPromptAction->setOn(configList->optMode == promptOpt);
1386*0a9064fbSMasahiro Yamada 
1387*0a9064fbSMasahiro Yamada 	Q3Action *showDebugAction = new Q3Action(NULL, _("Show Debug Info"), 0, this);
1388*0a9064fbSMasahiro Yamada 	  showDebugAction->setToggleAction(TRUE);
1389*0a9064fbSMasahiro Yamada 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
1390*0a9064fbSMasahiro Yamada 	  connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool)));
1391*0a9064fbSMasahiro Yamada 	  showDebugAction->setOn(helpText->showDebug());
1392*0a9064fbSMasahiro Yamada 
1393*0a9064fbSMasahiro Yamada 	Q3Action *showIntroAction = new Q3Action(NULL, _("Introduction"), 0, this);
1394*0a9064fbSMasahiro Yamada 	  connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro()));
1395*0a9064fbSMasahiro Yamada 	Q3Action *showAboutAction = new Q3Action(NULL, _("About"), 0, this);
1396*0a9064fbSMasahiro Yamada 	  connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout()));
1397*0a9064fbSMasahiro Yamada 
1398*0a9064fbSMasahiro Yamada 	// init tool bar
1399*0a9064fbSMasahiro Yamada 	backAction->addTo(toolBar);
1400*0a9064fbSMasahiro Yamada 	toolBar->addSeparator();
1401*0a9064fbSMasahiro Yamada 	loadAction->addTo(toolBar);
1402*0a9064fbSMasahiro Yamada 	saveAction->addTo(toolBar);
1403*0a9064fbSMasahiro Yamada 	toolBar->addSeparator();
1404*0a9064fbSMasahiro Yamada 	singleViewAction->addTo(toolBar);
1405*0a9064fbSMasahiro Yamada 	splitViewAction->addTo(toolBar);
1406*0a9064fbSMasahiro Yamada 	fullViewAction->addTo(toolBar);
1407*0a9064fbSMasahiro Yamada 
1408*0a9064fbSMasahiro Yamada 	// create config menu
1409*0a9064fbSMasahiro Yamada 	Q3PopupMenu* config = new Q3PopupMenu(this);
1410*0a9064fbSMasahiro Yamada 	menu->insertItem(_("&File"), config);
1411*0a9064fbSMasahiro Yamada 	loadAction->addTo(config);
1412*0a9064fbSMasahiro Yamada 	saveAction->addTo(config);
1413*0a9064fbSMasahiro Yamada 	saveAsAction->addTo(config);
1414*0a9064fbSMasahiro Yamada 	config->insertSeparator();
1415*0a9064fbSMasahiro Yamada 	quitAction->addTo(config);
1416*0a9064fbSMasahiro Yamada 
1417*0a9064fbSMasahiro Yamada 	// create edit menu
1418*0a9064fbSMasahiro Yamada 	Q3PopupMenu* editMenu = new Q3PopupMenu(this);
1419*0a9064fbSMasahiro Yamada 	menu->insertItem(_("&Edit"), editMenu);
1420*0a9064fbSMasahiro Yamada 	searchAction->addTo(editMenu);
1421*0a9064fbSMasahiro Yamada 
1422*0a9064fbSMasahiro Yamada 	// create options menu
1423*0a9064fbSMasahiro Yamada 	Q3PopupMenu* optionMenu = new Q3PopupMenu(this);
1424*0a9064fbSMasahiro Yamada 	menu->insertItem(_("&Option"), optionMenu);
1425*0a9064fbSMasahiro Yamada 	showNameAction->addTo(optionMenu);
1426*0a9064fbSMasahiro Yamada 	showRangeAction->addTo(optionMenu);
1427*0a9064fbSMasahiro Yamada 	showDataAction->addTo(optionMenu);
1428*0a9064fbSMasahiro Yamada 	optionMenu->insertSeparator();
1429*0a9064fbSMasahiro Yamada 	optGroup->addTo(optionMenu);
1430*0a9064fbSMasahiro Yamada 	optionMenu->insertSeparator();
1431*0a9064fbSMasahiro Yamada 
1432*0a9064fbSMasahiro Yamada 	// create help menu
1433*0a9064fbSMasahiro Yamada 	Q3PopupMenu* helpMenu = new Q3PopupMenu(this);
1434*0a9064fbSMasahiro Yamada 	menu->insertSeparator();
1435*0a9064fbSMasahiro Yamada 	menu->insertItem(_("&Help"), helpMenu);
1436*0a9064fbSMasahiro Yamada 	showIntroAction->addTo(helpMenu);
1437*0a9064fbSMasahiro Yamada 	showAboutAction->addTo(helpMenu);
1438*0a9064fbSMasahiro Yamada 
1439*0a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1440*0a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
1441*0a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1442*0a9064fbSMasahiro Yamada 		SLOT(changeMenu(struct menu *)));
1443*0a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(parentSelected()),
1444*0a9064fbSMasahiro Yamada 		SLOT(goBack()));
1445*0a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1446*0a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
1447*0a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1448*0a9064fbSMasahiro Yamada 		SLOT(changeMenu(struct menu *)));
1449*0a9064fbSMasahiro Yamada 
1450*0a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1451*0a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
1452*0a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1453*0a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
1454*0a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1455*0a9064fbSMasahiro Yamada 		SLOT(listFocusChanged(void)));
1456*0a9064fbSMasahiro Yamada 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1457*0a9064fbSMasahiro Yamada 		SLOT(setMenuLink(struct menu *)));
1458*0a9064fbSMasahiro Yamada 
1459*0a9064fbSMasahiro Yamada 	QString listMode = configSettings->readEntry("/listMode", "symbol");
1460*0a9064fbSMasahiro Yamada 	if (listMode == "single")
1461*0a9064fbSMasahiro Yamada 		showSingleView();
1462*0a9064fbSMasahiro Yamada 	else if (listMode == "full")
1463*0a9064fbSMasahiro Yamada 		showFullView();
1464*0a9064fbSMasahiro Yamada 	else /*if (listMode == "split")*/
1465*0a9064fbSMasahiro Yamada 		showSplitView();
1466*0a9064fbSMasahiro Yamada 
1467*0a9064fbSMasahiro Yamada 	// UI setup done, restore splitter positions
1468*0a9064fbSMasahiro Yamada 	Q3ValueList<int> sizes = configSettings->readSizes("/split1", &ok);
1469*0a9064fbSMasahiro Yamada 	if (ok)
1470*0a9064fbSMasahiro Yamada 		split1->setSizes(sizes);
1471*0a9064fbSMasahiro Yamada 
1472*0a9064fbSMasahiro Yamada 	sizes = configSettings->readSizes("/split2", &ok);
1473*0a9064fbSMasahiro Yamada 	if (ok)
1474*0a9064fbSMasahiro Yamada 		split2->setSizes(sizes);
1475*0a9064fbSMasahiro Yamada }
1476*0a9064fbSMasahiro Yamada 
1477*0a9064fbSMasahiro Yamada void ConfigMainWindow::loadConfig(void)
1478*0a9064fbSMasahiro Yamada {
1479*0a9064fbSMasahiro Yamada 	QString s = Q3FileDialog::getOpenFileName(conf_get_configname(), NULL, this);
1480*0a9064fbSMasahiro Yamada 	if (s.isNull())
1481*0a9064fbSMasahiro Yamada 		return;
1482*0a9064fbSMasahiro Yamada 	if (conf_read(QFile::encodeName(s)))
1483*0a9064fbSMasahiro Yamada 		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
1484*0a9064fbSMasahiro Yamada 	ConfigView::updateListAll();
1485*0a9064fbSMasahiro Yamada }
1486*0a9064fbSMasahiro Yamada 
1487*0a9064fbSMasahiro Yamada bool ConfigMainWindow::saveConfig(void)
1488*0a9064fbSMasahiro Yamada {
1489*0a9064fbSMasahiro Yamada 	if (conf_write(NULL)) {
1490*0a9064fbSMasahiro Yamada 		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
1491*0a9064fbSMasahiro Yamada 		return false;
1492*0a9064fbSMasahiro Yamada 	}
1493*0a9064fbSMasahiro Yamada 	return true;
1494*0a9064fbSMasahiro Yamada }
1495*0a9064fbSMasahiro Yamada 
1496*0a9064fbSMasahiro Yamada void ConfigMainWindow::saveConfigAs(void)
1497*0a9064fbSMasahiro Yamada {
1498*0a9064fbSMasahiro Yamada 	QString s = Q3FileDialog::getSaveFileName(conf_get_configname(), NULL, this);
1499*0a9064fbSMasahiro Yamada 	if (s.isNull())
1500*0a9064fbSMasahiro Yamada 		return;
1501*0a9064fbSMasahiro Yamada 	saveConfig();
1502*0a9064fbSMasahiro Yamada }
1503*0a9064fbSMasahiro Yamada 
1504*0a9064fbSMasahiro Yamada void ConfigMainWindow::searchConfig(void)
1505*0a9064fbSMasahiro Yamada {
1506*0a9064fbSMasahiro Yamada 	if (!searchWindow)
1507*0a9064fbSMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this, "search");
1508*0a9064fbSMasahiro Yamada 	searchWindow->show();
1509*0a9064fbSMasahiro Yamada }
1510*0a9064fbSMasahiro Yamada 
1511*0a9064fbSMasahiro Yamada void ConfigMainWindow::changeMenu(struct menu *menu)
1512*0a9064fbSMasahiro Yamada {
1513*0a9064fbSMasahiro Yamada 	configList->setRootMenu(menu);
1514*0a9064fbSMasahiro Yamada 	if (configList->rootEntry->parent == &rootmenu)
1515*0a9064fbSMasahiro Yamada 		backAction->setEnabled(FALSE);
1516*0a9064fbSMasahiro Yamada 	else
1517*0a9064fbSMasahiro Yamada 		backAction->setEnabled(TRUE);
1518*0a9064fbSMasahiro Yamada }
1519*0a9064fbSMasahiro Yamada 
1520*0a9064fbSMasahiro Yamada void ConfigMainWindow::setMenuLink(struct menu *menu)
1521*0a9064fbSMasahiro Yamada {
1522*0a9064fbSMasahiro Yamada 	struct menu *parent;
1523*0a9064fbSMasahiro Yamada 	ConfigList* list = NULL;
1524*0a9064fbSMasahiro Yamada 	ConfigItem* item;
1525*0a9064fbSMasahiro Yamada 
1526*0a9064fbSMasahiro Yamada 	if (configList->menuSkip(menu))
1527*0a9064fbSMasahiro Yamada 		return;
1528*0a9064fbSMasahiro Yamada 
1529*0a9064fbSMasahiro Yamada 	switch (configList->mode) {
1530*0a9064fbSMasahiro Yamada 	case singleMode:
1531*0a9064fbSMasahiro Yamada 		list = configList;
1532*0a9064fbSMasahiro Yamada 		parent = menu_get_parent_menu(menu);
1533*0a9064fbSMasahiro Yamada 		if (!parent)
1534*0a9064fbSMasahiro Yamada 			return;
1535*0a9064fbSMasahiro Yamada 		list->setRootMenu(parent);
1536*0a9064fbSMasahiro Yamada 		break;
1537*0a9064fbSMasahiro Yamada 	case symbolMode:
1538*0a9064fbSMasahiro Yamada 		if (menu->flags & MENU_ROOT) {
1539*0a9064fbSMasahiro Yamada 			configList->setRootMenu(menu);
1540*0a9064fbSMasahiro Yamada 			configList->clearSelection();
1541*0a9064fbSMasahiro Yamada 			list = menuList;
1542*0a9064fbSMasahiro Yamada 		} else {
1543*0a9064fbSMasahiro Yamada 			list = configList;
1544*0a9064fbSMasahiro Yamada 			parent = menu_get_parent_menu(menu->parent);
1545*0a9064fbSMasahiro Yamada 			if (!parent)
1546*0a9064fbSMasahiro Yamada 				return;
1547*0a9064fbSMasahiro Yamada 			item = menuList->findConfigItem(parent);
1548*0a9064fbSMasahiro Yamada 			if (item) {
1549*0a9064fbSMasahiro Yamada 				menuList->setSelected(item, TRUE);
1550*0a9064fbSMasahiro Yamada 				menuList->ensureItemVisible(item);
1551*0a9064fbSMasahiro Yamada 			}
1552*0a9064fbSMasahiro Yamada 			list->setRootMenu(parent);
1553*0a9064fbSMasahiro Yamada 		}
1554*0a9064fbSMasahiro Yamada 		break;
1555*0a9064fbSMasahiro Yamada 	case fullMode:
1556*0a9064fbSMasahiro Yamada 		list = configList;
1557*0a9064fbSMasahiro Yamada 		break;
1558*0a9064fbSMasahiro Yamada 	default:
1559*0a9064fbSMasahiro Yamada 		break;
1560*0a9064fbSMasahiro Yamada 	}
1561*0a9064fbSMasahiro Yamada 
1562*0a9064fbSMasahiro Yamada 	if (list) {
1563*0a9064fbSMasahiro Yamada 		item = list->findConfigItem(menu);
1564*0a9064fbSMasahiro Yamada 		if (item) {
1565*0a9064fbSMasahiro Yamada 			list->setSelected(item, TRUE);
1566*0a9064fbSMasahiro Yamada 			list->ensureItemVisible(item);
1567*0a9064fbSMasahiro Yamada 			list->setFocus();
1568*0a9064fbSMasahiro Yamada 		}
1569*0a9064fbSMasahiro Yamada 	}
1570*0a9064fbSMasahiro Yamada }
1571*0a9064fbSMasahiro Yamada 
1572*0a9064fbSMasahiro Yamada void ConfigMainWindow::listFocusChanged(void)
1573*0a9064fbSMasahiro Yamada {
1574*0a9064fbSMasahiro Yamada 	if (menuList->mode == menuMode)
1575*0a9064fbSMasahiro Yamada 		configList->clearSelection();
1576*0a9064fbSMasahiro Yamada }
1577*0a9064fbSMasahiro Yamada 
1578*0a9064fbSMasahiro Yamada void ConfigMainWindow::goBack(void)
1579*0a9064fbSMasahiro Yamada {
1580*0a9064fbSMasahiro Yamada 	ConfigItem* item;
1581*0a9064fbSMasahiro Yamada 
1582*0a9064fbSMasahiro Yamada 	configList->setParentMenu();
1583*0a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
1584*0a9064fbSMasahiro Yamada 		backAction->setEnabled(FALSE);
1585*0a9064fbSMasahiro Yamada 	item = (ConfigItem*)menuList->selectedItem();
1586*0a9064fbSMasahiro Yamada 	while (item) {
1587*0a9064fbSMasahiro Yamada 		if (item->menu == configList->rootEntry) {
1588*0a9064fbSMasahiro Yamada 			menuList->setSelected(item, TRUE);
1589*0a9064fbSMasahiro Yamada 			break;
1590*0a9064fbSMasahiro Yamada 		}
1591*0a9064fbSMasahiro Yamada 		item = (ConfigItem*)item->parent();
1592*0a9064fbSMasahiro Yamada 	}
1593*0a9064fbSMasahiro Yamada }
1594*0a9064fbSMasahiro Yamada 
1595*0a9064fbSMasahiro Yamada void ConfigMainWindow::showSingleView(void)
1596*0a9064fbSMasahiro Yamada {
1597*0a9064fbSMasahiro Yamada 	menuView->hide();
1598*0a9064fbSMasahiro Yamada 	menuList->setRootMenu(0);
1599*0a9064fbSMasahiro Yamada 	configList->mode = singleMode;
1600*0a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
1601*0a9064fbSMasahiro Yamada 		configList->updateListAll();
1602*0a9064fbSMasahiro Yamada 	else
1603*0a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
1604*0a9064fbSMasahiro Yamada 	configList->setAllOpen(TRUE);
1605*0a9064fbSMasahiro Yamada 	configList->setFocus();
1606*0a9064fbSMasahiro Yamada }
1607*0a9064fbSMasahiro Yamada 
1608*0a9064fbSMasahiro Yamada void ConfigMainWindow::showSplitView(void)
1609*0a9064fbSMasahiro Yamada {
1610*0a9064fbSMasahiro Yamada 	configList->mode = symbolMode;
1611*0a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
1612*0a9064fbSMasahiro Yamada 		configList->updateListAll();
1613*0a9064fbSMasahiro Yamada 	else
1614*0a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
1615*0a9064fbSMasahiro Yamada 	configList->setAllOpen(TRUE);
1616*0a9064fbSMasahiro Yamada 	configApp->processEvents();
1617*0a9064fbSMasahiro Yamada 	menuList->mode = menuMode;
1618*0a9064fbSMasahiro Yamada 	menuList->setRootMenu(&rootmenu);
1619*0a9064fbSMasahiro Yamada 	menuList->setAllOpen(TRUE);
1620*0a9064fbSMasahiro Yamada 	menuView->show();
1621*0a9064fbSMasahiro Yamada 	menuList->setFocus();
1622*0a9064fbSMasahiro Yamada }
1623*0a9064fbSMasahiro Yamada 
1624*0a9064fbSMasahiro Yamada void ConfigMainWindow::showFullView(void)
1625*0a9064fbSMasahiro Yamada {
1626*0a9064fbSMasahiro Yamada 	menuView->hide();
1627*0a9064fbSMasahiro Yamada 	menuList->setRootMenu(0);
1628*0a9064fbSMasahiro Yamada 	configList->mode = fullMode;
1629*0a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
1630*0a9064fbSMasahiro Yamada 		configList->updateListAll();
1631*0a9064fbSMasahiro Yamada 	else
1632*0a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
1633*0a9064fbSMasahiro Yamada 	configList->setAllOpen(FALSE);
1634*0a9064fbSMasahiro Yamada 	configList->setFocus();
1635*0a9064fbSMasahiro Yamada }
1636*0a9064fbSMasahiro Yamada 
1637*0a9064fbSMasahiro Yamada /*
1638*0a9064fbSMasahiro Yamada  * ask for saving configuration before quitting
1639*0a9064fbSMasahiro Yamada  * TODO ask only when something changed
1640*0a9064fbSMasahiro Yamada  */
1641*0a9064fbSMasahiro Yamada void ConfigMainWindow::closeEvent(QCloseEvent* e)
1642*0a9064fbSMasahiro Yamada {
1643*0a9064fbSMasahiro Yamada 	if (!conf_get_changed()) {
1644*0a9064fbSMasahiro Yamada 		e->accept();
1645*0a9064fbSMasahiro Yamada 		return;
1646*0a9064fbSMasahiro Yamada 	}
1647*0a9064fbSMasahiro Yamada 	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
1648*0a9064fbSMasahiro Yamada 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1649*0a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
1650*0a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
1651*0a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
1652*0a9064fbSMasahiro Yamada 	switch (mb.exec()) {
1653*0a9064fbSMasahiro Yamada 	case QMessageBox::Yes:
1654*0a9064fbSMasahiro Yamada 		if (saveConfig())
1655*0a9064fbSMasahiro Yamada 			e->accept();
1656*0a9064fbSMasahiro Yamada 		else
1657*0a9064fbSMasahiro Yamada 			e->ignore();
1658*0a9064fbSMasahiro Yamada 		break;
1659*0a9064fbSMasahiro Yamada 	case QMessageBox::No:
1660*0a9064fbSMasahiro Yamada 		e->accept();
1661*0a9064fbSMasahiro Yamada 		break;
1662*0a9064fbSMasahiro Yamada 	case QMessageBox::Cancel:
1663*0a9064fbSMasahiro Yamada 		e->ignore();
1664*0a9064fbSMasahiro Yamada 		break;
1665*0a9064fbSMasahiro Yamada 	}
1666*0a9064fbSMasahiro Yamada }
1667*0a9064fbSMasahiro Yamada 
1668*0a9064fbSMasahiro Yamada void ConfigMainWindow::showIntro(void)
1669*0a9064fbSMasahiro Yamada {
1670*0a9064fbSMasahiro Yamada 	static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
1671*0a9064fbSMasahiro Yamada 		"For each option, a blank box indicates the feature is disabled, a check\n"
1672*0a9064fbSMasahiro Yamada 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
1673*0a9064fbSMasahiro Yamada 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
1674*0a9064fbSMasahiro Yamada 		"If you do not see an option (e.g., a device driver) that you believe\n"
1675*0a9064fbSMasahiro Yamada 		"should be present, try turning on Show All Options under the Options menu.\n"
1676*0a9064fbSMasahiro Yamada 		"Although there is no cross reference yet to help you figure out what other\n"
1677*0a9064fbSMasahiro Yamada 		"options must be enabled to support the option you are interested in, you can\n"
1678*0a9064fbSMasahiro Yamada 		"still view the help of a grayed-out option.\n\n"
1679*0a9064fbSMasahiro Yamada 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1680*0a9064fbSMasahiro Yamada 		"which you can then match by examining other options.\n\n");
1681*0a9064fbSMasahiro Yamada 
1682*0a9064fbSMasahiro Yamada 	QMessageBox::information(this, "qconf", str);
1683*0a9064fbSMasahiro Yamada }
1684*0a9064fbSMasahiro Yamada 
1685*0a9064fbSMasahiro Yamada void ConfigMainWindow::showAbout(void)
1686*0a9064fbSMasahiro Yamada {
1687*0a9064fbSMasahiro Yamada 	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n"
1688*0a9064fbSMasahiro Yamada 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
1689*0a9064fbSMasahiro Yamada 
1690*0a9064fbSMasahiro Yamada 	QMessageBox::information(this, "qconf", str);
1691*0a9064fbSMasahiro Yamada }
1692*0a9064fbSMasahiro Yamada 
1693*0a9064fbSMasahiro Yamada void ConfigMainWindow::saveSettings(void)
1694*0a9064fbSMasahiro Yamada {
1695*0a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window x", pos().x());
1696*0a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window y", pos().y());
1697*0a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window width", size().width());
1698*0a9064fbSMasahiro Yamada 	configSettings->writeEntry("/window height", size().height());
1699*0a9064fbSMasahiro Yamada 
1700*0a9064fbSMasahiro Yamada 	QString entry;
1701*0a9064fbSMasahiro Yamada 	switch(configList->mode) {
1702*0a9064fbSMasahiro Yamada 	case singleMode :
1703*0a9064fbSMasahiro Yamada 		entry = "single";
1704*0a9064fbSMasahiro Yamada 		break;
1705*0a9064fbSMasahiro Yamada 
1706*0a9064fbSMasahiro Yamada 	case symbolMode :
1707*0a9064fbSMasahiro Yamada 		entry = "split";
1708*0a9064fbSMasahiro Yamada 		break;
1709*0a9064fbSMasahiro Yamada 
1710*0a9064fbSMasahiro Yamada 	case fullMode :
1711*0a9064fbSMasahiro Yamada 		entry = "full";
1712*0a9064fbSMasahiro Yamada 		break;
1713*0a9064fbSMasahiro Yamada 
1714*0a9064fbSMasahiro Yamada 	default:
1715*0a9064fbSMasahiro Yamada 		break;
1716*0a9064fbSMasahiro Yamada 	}
1717*0a9064fbSMasahiro Yamada 	configSettings->writeEntry("/listMode", entry);
1718*0a9064fbSMasahiro Yamada 
1719*0a9064fbSMasahiro Yamada 	configSettings->writeSizes("/split1", split1->sizes());
1720*0a9064fbSMasahiro Yamada 	configSettings->writeSizes("/split2", split2->sizes());
1721*0a9064fbSMasahiro Yamada }
1722*0a9064fbSMasahiro Yamada 
1723*0a9064fbSMasahiro Yamada void ConfigMainWindow::conf_changed(void)
1724*0a9064fbSMasahiro Yamada {
1725*0a9064fbSMasahiro Yamada 	if (saveAction)
1726*0a9064fbSMasahiro Yamada 		saveAction->setEnabled(conf_get_changed());
1727*0a9064fbSMasahiro Yamada }
1728*0a9064fbSMasahiro Yamada 
1729*0a9064fbSMasahiro Yamada void fixup_rootmenu(struct menu *menu)
1730*0a9064fbSMasahiro Yamada {
1731*0a9064fbSMasahiro Yamada 	struct menu *child;
1732*0a9064fbSMasahiro Yamada 	static int menu_cnt = 0;
1733*0a9064fbSMasahiro Yamada 
1734*0a9064fbSMasahiro Yamada 	menu->flags |= MENU_ROOT;
1735*0a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
1736*0a9064fbSMasahiro Yamada 		if (child->prompt && child->prompt->type == P_MENU) {
1737*0a9064fbSMasahiro Yamada 			menu_cnt++;
1738*0a9064fbSMasahiro Yamada 			fixup_rootmenu(child);
1739*0a9064fbSMasahiro Yamada 			menu_cnt--;
1740*0a9064fbSMasahiro Yamada 		} else if (!menu_cnt)
1741*0a9064fbSMasahiro Yamada 			fixup_rootmenu(child);
1742*0a9064fbSMasahiro Yamada 	}
1743*0a9064fbSMasahiro Yamada }
1744*0a9064fbSMasahiro Yamada 
1745*0a9064fbSMasahiro Yamada static const char *progname;
1746*0a9064fbSMasahiro Yamada 
1747*0a9064fbSMasahiro Yamada static void usage(void)
1748*0a9064fbSMasahiro Yamada {
1749*0a9064fbSMasahiro Yamada 	printf(_("%s <config>\n"), progname);
1750*0a9064fbSMasahiro Yamada 	exit(0);
1751*0a9064fbSMasahiro Yamada }
1752*0a9064fbSMasahiro Yamada 
1753*0a9064fbSMasahiro Yamada int main(int ac, char** av)
1754*0a9064fbSMasahiro Yamada {
1755*0a9064fbSMasahiro Yamada 	ConfigMainWindow* v;
1756*0a9064fbSMasahiro Yamada 	const char *name;
1757*0a9064fbSMasahiro Yamada 
1758*0a9064fbSMasahiro Yamada 	bindtextdomain(PACKAGE, LOCALEDIR);
1759*0a9064fbSMasahiro Yamada 	textdomain(PACKAGE);
1760*0a9064fbSMasahiro Yamada 
1761*0a9064fbSMasahiro Yamada 	progname = av[0];
1762*0a9064fbSMasahiro Yamada 	configApp = new QApplication(ac, av);
1763*0a9064fbSMasahiro Yamada 	if (ac > 1 && av[1][0] == '-') {
1764*0a9064fbSMasahiro Yamada 		switch (av[1][1]) {
1765*0a9064fbSMasahiro Yamada 		case 'h':
1766*0a9064fbSMasahiro Yamada 		case '?':
1767*0a9064fbSMasahiro Yamada 			usage();
1768*0a9064fbSMasahiro Yamada 		}
1769*0a9064fbSMasahiro Yamada 		name = av[2];
1770*0a9064fbSMasahiro Yamada 	} else
1771*0a9064fbSMasahiro Yamada 		name = av[1];
1772*0a9064fbSMasahiro Yamada 	if (!name)
1773*0a9064fbSMasahiro Yamada 		usage();
1774*0a9064fbSMasahiro Yamada 
1775*0a9064fbSMasahiro Yamada 	conf_parse(name);
1776*0a9064fbSMasahiro Yamada 	fixup_rootmenu(&rootmenu);
1777*0a9064fbSMasahiro Yamada 	conf_read(NULL);
1778*0a9064fbSMasahiro Yamada 	//zconfdump(stdout);
1779*0a9064fbSMasahiro Yamada 
1780*0a9064fbSMasahiro Yamada 	configSettings = new ConfigSettings();
1781*0a9064fbSMasahiro Yamada 	configSettings->beginGroup("/kconfig/qconf");
1782*0a9064fbSMasahiro Yamada 	v = new ConfigMainWindow();
1783*0a9064fbSMasahiro Yamada 
1784*0a9064fbSMasahiro Yamada 	//zconfdump(stdout);
1785*0a9064fbSMasahiro Yamada 	configApp->setMainWidget(v);
1786*0a9064fbSMasahiro Yamada 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
1787*0a9064fbSMasahiro Yamada 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
1788*0a9064fbSMasahiro Yamada 	v->show();
1789*0a9064fbSMasahiro Yamada 	configApp->exec();
1790*0a9064fbSMasahiro Yamada 
1791*0a9064fbSMasahiro Yamada 	configSettings->endGroup();
1792*0a9064fbSMasahiro Yamada 	delete configSettings;
1793*0a9064fbSMasahiro Yamada 
1794*0a9064fbSMasahiro Yamada 	return 0;
1795*0a9064fbSMasahiro Yamada }
1796