Annotation of qemu/roms/seabios/tools/kconfig/qconf.cc, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.