1 /*
2  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3  * Released under the terms of the GNU GPL v2.0.
4  */
5 
6 #include <QTextBrowser>
7 #include <QTreeWidget>
8 #include <QMainWindow>
9 #include <QHeaderView>
10 #include <qsettings.h>
11 #include <QPushButton>
12 #include <QSettings>
13 #include <QLineEdit>
14 #include <QSplitter>
15 #include <QCheckBox>
16 #include <QDialog>
17 #include "expr.h"
18 
19 class ConfigView;
20 class ConfigList;
21 class ConfigItem;
22 class ConfigLineEdit;
23 class ConfigMainWindow;
24 
25 class ConfigSettings : public QSettings {
26 public:
27 	ConfigSettings();
28 	QList<int> readSizes(const QString& key, bool *ok);
29 	bool writeSizes(const QString& key, const QList<int>& value);
30 };
31 
32 enum colIdx {
33 	promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr
34 };
35 enum listMode {
36 	singleMode, menuMode, symbolMode, fullMode, listMode
37 };
38 enum optionMode {
39 	normalOpt = 0, allOpt, promptOpt
40 };
41 
42 class ConfigList : public QTreeWidget {
43 	Q_OBJECT
44 	typedef class QTreeWidget Parent;
45 public:
46 	ConfigList(ConfigView* p, const char *name = 0);
47 	void reinit(void);
parent(void)48 	ConfigView* parent(void) const
49 	{
50 		return (ConfigView*)Parent::parent();
51 	}
52 	ConfigItem* findConfigItem(struct menu *);
53 
54 protected:
55 	void keyPressEvent(QKeyEvent *e);
56 	void mousePressEvent(QMouseEvent *e);
57 	void mouseReleaseEvent(QMouseEvent *e);
58 	void mouseMoveEvent(QMouseEvent *e);
59 	void mouseDoubleClickEvent(QMouseEvent *e);
60 	void focusInEvent(QFocusEvent *e);
61 	void contextMenuEvent(QContextMenuEvent *e);
62 
63 public slots:
64 	void setRootMenu(struct menu *menu);
65 
66 	void updateList(ConfigItem *item);
67 	void setValue(ConfigItem* item, tristate val);
68 	void changeValue(ConfigItem* item);
69 	void updateSelection(void);
70 	void saveSettings(void);
71 signals:
72 	void menuChanged(struct menu *menu);
73 	void menuSelected(struct menu *menu);
74 	void parentSelected(void);
75 	void gotFocus(struct menu *);
76 
77 public:
updateListAll(void)78 	void updateListAll(void)
79 	{
80 		updateAll = true;
81 		updateList(NULL);
82 		updateAll = false;
83 	}
listView()84 	ConfigList* listView()
85 	{
86 		return this;
87 	}
firstChild()88 	ConfigItem* firstChild() const
89 	{
90 		return (ConfigItem *)children().first();
91 	}
addColumn(colIdx idx)92 	void addColumn(colIdx idx)
93 	{
94 		showColumn(idx);
95 	}
removeColumn(colIdx idx)96 	void removeColumn(colIdx idx)
97 	{
98 		hideColumn(idx);
99 	}
100 	void setAllOpen(bool open);
101 	void setParentMenu(void);
102 
103 	bool menuSkip(struct menu *);
104 
105 	void updateMenuList(ConfigItem *parent, struct menu*);
106 	void updateMenuList(ConfigList *parent, struct menu*);
107 
108 	bool updateAll;
109 
110 	QPixmap symbolYesPix, symbolModPix, symbolNoPix;
111 	QPixmap choiceYesPix, choiceNoPix;
112 	QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
113 
114 	bool showName, showRange, showData;
115 	enum listMode mode;
116 	enum optionMode optMode;
117 	struct menu *rootEntry;
118 	QPalette disabledColorGroup;
119 	QPalette inactivedColorGroup;
120 	QMenu* headerPopup;
121 };
122 
123 class ConfigItem : public QTreeWidgetItem {
124 	typedef class QTreeWidgetItem Parent;
125 public:
ConfigItem(ConfigList * parent,ConfigItem * after,struct menu * m,bool v)126 	ConfigItem(ConfigList *parent, ConfigItem *after, struct menu *m, bool v)
127 	: Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false)
128 	{
129 		init();
130 	}
ConfigItem(ConfigItem * parent,ConfigItem * after,struct menu * m,bool v)131 	ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v)
132 	: Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false)
133 	{
134 		init();
135 	}
ConfigItem(ConfigList * parent,ConfigItem * after,bool v)136 	ConfigItem(ConfigList *parent, ConfigItem *after, bool v)
137 	: Parent(parent, after), nextItem(0), menu(0), visible(v), goParent(true)
138 	{
139 		init();
140 	}
141 	~ConfigItem(void);
142 	void init(void);
143 	void okRename(int col);
144 	void updateMenu(void);
145 	void testUpdateMenu(bool v);
listView()146 	ConfigList* listView() const
147 	{
148 		return (ConfigList*)Parent::treeWidget();
149 	}
firstChild()150 	ConfigItem* firstChild() const
151 	{
152 		return (ConfigItem *)Parent::child(0);
153 	}
nextSibling()154 	ConfigItem* nextSibling()
155 	{
156 		ConfigItem *ret = NULL;
157 		ConfigItem *_parent = (ConfigItem *)parent();
158 
159 		if(_parent) {
160 			ret = (ConfigItem *)_parent->child(_parent->indexOfChild(this)+1);
161 		} else {
162 			QTreeWidget *_treeWidget = treeWidget();
163 			ret = (ConfigItem *)_treeWidget->topLevelItem(_treeWidget->indexOfTopLevelItem(this)+1);
164 		}
165 
166 		return ret;
167 	}
setText(colIdx idx,const QString & text)168 	void setText(colIdx idx, const QString& text)
169 	{
170 		Parent::setText(idx, text);
171 	}
text(colIdx idx)172 	QString text(colIdx idx) const
173 	{
174 		return Parent::text(idx);
175 	}
setPixmap(colIdx idx,const QIcon & icon)176 	void setPixmap(colIdx idx, const QIcon &icon)
177 	{
178 		Parent::setIcon(idx, icon);
179 	}
pixmap(colIdx idx)180 	const QIcon pixmap(colIdx idx) const
181 	{
182 		return icon(idx);
183 	}
184 	// TODO: Implement paintCell
185 
186 	ConfigItem* nextItem;
187 	struct menu *menu;
188 	bool visible;
189 	bool goParent;
190 };
191 
192 class ConfigLineEdit : public QLineEdit {
193 	Q_OBJECT
194 	typedef class QLineEdit Parent;
195 public:
196 	ConfigLineEdit(ConfigView* parent);
parent(void)197 	ConfigView* parent(void) const
198 	{
199 		return (ConfigView*)Parent::parent();
200 	}
201 	void show(ConfigItem *i);
202 	void keyPressEvent(QKeyEvent *e);
203 
204 public:
205 	ConfigItem *item;
206 };
207 
208 class ConfigView : public QWidget {
209 	Q_OBJECT
210 	typedef class QWidget Parent;
211 public:
212 	ConfigView(QWidget* parent, const char *name = 0);
213 	~ConfigView(void);
214 	static void updateList(ConfigItem* item);
215 	static void updateListAll(void);
216 
showName(void)217 	bool showName(void) const { return list->showName; }
showRange(void)218 	bool showRange(void) const { return list->showRange; }
showData(void)219 	bool showData(void) const { return list->showData; }
220 public slots:
221 	void setShowName(bool);
222 	void setShowRange(bool);
223 	void setShowData(bool);
224 	void setOptionMode(QAction *);
225 signals:
226 	void showNameChanged(bool);
227 	void showRangeChanged(bool);
228 	void showDataChanged(bool);
229 public:
230 	ConfigList* list;
231 	ConfigLineEdit* lineEdit;
232 
233 	static ConfigView* viewList;
234 	ConfigView* nextView;
235 
236 	static QAction *showNormalAction;
237 	static QAction *showAllAction;
238 	static QAction *showPromptAction;
239 };
240 
241 class ConfigInfoView : public QTextBrowser {
242 	Q_OBJECT
243 	typedef class QTextBrowser Parent;
244 public:
245 	ConfigInfoView(QWidget* parent, const char *name = 0);
showDebug(void)246 	bool showDebug(void) const { return _showDebug; }
247 
248 public slots:
249 	void setInfo(struct menu *menu);
250 	void saveSettings(void);
251 	void setShowDebug(bool);
252 
253 signals:
254 	void showDebugChanged(bool);
255 	void menuSelected(struct menu *);
256 
257 protected:
258 	void symbolInfo(void);
259 	void menuInfo(void);
260 	QString debug_info(struct symbol *sym);
261 	static QString print_filter(const QString &str);
262 	static void expr_print_help(void *data, struct symbol *sym, const char *str);
263 	QMenu *createStandardContextMenu(const QPoint & pos);
264 	void contextMenuEvent(QContextMenuEvent *e);
265 
266 	struct symbol *sym;
267 	struct menu *_menu;
268 	bool _showDebug;
269 };
270 
271 class ConfigSearchWindow : public QDialog {
272 	Q_OBJECT
273 	typedef class QDialog Parent;
274 public:
275 	ConfigSearchWindow(ConfigMainWindow* parent, const char *name = 0);
276 
277 public slots:
278 	void saveSettings(void);
279 	void search(void);
280 
281 protected:
282 	QLineEdit* editField;
283 	QPushButton* searchButton;
284 	QSplitter* split;
285 	ConfigView* list;
286 	ConfigInfoView* info;
287 
288 	struct symbol **result;
289 };
290 
291 class ConfigMainWindow : public QMainWindow {
292 	Q_OBJECT
293 
294 	static QAction *saveAction;
295 	static void conf_changed(void);
296 public:
297 	ConfigMainWindow(void);
298 public slots:
299 	void changeMenu(struct menu *);
300 	void setMenuLink(struct menu *);
301 	void listFocusChanged(void);
302 	void goBack(void);
303 	void loadConfig(void);
304 	bool saveConfig(void);
305 	void saveConfigAs(void);
306 	void searchConfig(void);
307 	void showSingleView(void);
308 	void showSplitView(void);
309 	void showFullView(void);
310 	void showIntro(void);
311 	void showAbout(void);
312 	void saveSettings(void);
313 
314 protected:
315 	void closeEvent(QCloseEvent *e);
316 
317 	ConfigSearchWindow *searchWindow;
318 	ConfigView *menuView;
319 	ConfigList *menuList;
320 	ConfigView *configView;
321 	ConfigList *configList;
322 	ConfigInfoView *helpText;
323 	QToolBar *toolBar;
324 	QAction *backAction;
325 	QAction *singleViewAction;
326 	QAction *splitViewAction;
327 	QAction *fullViewAction;
328 	QSplitter *split1;
329 	QSplitter *split2;
330 };
331