Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/vaclgui/dspar.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/vaclgui/dspar.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,939 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1997-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * dspar.cpp + */ + +#include <ifontdlg.hpp> +#include <ifonthdr.hpp> +#include <windows.h> + +#include "agcstack.h" +#include "cint.h" +#include "dspar.hpp" +#include "helpview.hpp" +#include "myalloc.h" +#include "vaclgui.hpp" + +//#define INCLUDE_LOGGING +#include "log.h" + + +FontDialog::FontDialog() + : AgFrame( IFrameWindow::border + | dialogBackground + | IFrameWindow::systemMenu) + , canvas(nextChildId(), this, this, IRectangle(), + IMultiCellCanvas::classDefaultStyle + | IWindow::clipChildren) + , fontChoices(nextChildId(), &canvas, &canvas, IRectangle(), + ISetCanvas::horizontalDecks + | ISetCanvas::packEven + | ISetCanvas::rightAlign + | ISetCanvas::centerVerticalAlign + | IWindow::clipChildren + | IWindow::visible) + , buttons(nextChildId(), &canvas, &canvas, IRectangle(), + ISetCanvas::horizontalDecks + | ISetCanvas::packExpanded + | ISetCanvas::rightAlign + | ISetCanvas::topAlign + | IWindow::clipChildren + | IWindow::visible) + , undoButton(undoCommand, &buttons, &buttons) + , defaultButton(defaultCommand, &buttons, &buttons) + , cancelButton(cancelCommand, &buttons, &buttons) + , helpButton(helpCommand, &buttons, &buttons) + , fontDialogActive(0) +{ + LOGSECTION("FontDialog::FontDialog"); + IPaintHandler::handleEventsFor(&canvas); + IPaintHandler::handleEventsFor(&fontChoices); + IPaintHandler::handleEventsFor(&buttons); + setClient(&canvas); + { + int i; + IStaticText *text; + IPushButton *button; + + for (i = 0; i < nFontSpecs; i++) { + LOGV(i); + text = new IStaticText(nextChildId(), &fontChoices, &fontChoices); + LOGV((int) text); + button = new IPushButton(i+1, &fontChoices, &fontChoices); + LOGV((int) button); + text->setText(specRecord[i].title); + text->setAlignment(IStaticText::centerRight); + + LOGV(specRecord[i].title); + button->setText(specRecord[i].pointer->description().pointer()); + button->enableTabStop(); + LOGV((int) &optionRecord[i]); + optionRecord[i].text = text; + optionRecord[i].button = button; + LOGV((int) optionRecord[i].button); + } + optionRecord[0].button->setText("100 point New Times Roman bold italic"); + ISize buttonSize = optionRecord[0].button->minimumSize(); + LOGV(buttonSize.asString()); + optionRecord[0].button->setText( + specRecord[0].pointer->description().pointer() + ); + for (i = 0; i < nFontSpecs; i++) { + LOGV(i); + LOGV((int) optionRecord[i].button); + optionRecord[i].button->setMinimumSize(buttonSize); + } + + fontChoices.setDeckCount(nFontSpecs); + buttons.setDeckCount(1); + { + undoButton.setText("Undo").enableTabStop(); + defaultButton.setText("Default").enableTabStop(); + cancelButton.setText("Close").enableTabStop(); + helpButton.setText("Help").enableTabStop(); + } + } + windowTitle.setText("AnaGram - Set Fonts"); + registerTitle("Set Fonts"); + int choicesWidth = fontChoices.size().width(); + int buttonsWidth = buttons.size().width(); + canvas.setColumnWidth(1, choicesWidth - buttonsWidth); + canvas.setColumnWidth(2, buttonsWidth); + canvas.addToCell(&fontChoices, 1, 1, 2); + canvas.addToCell(&buttons, 2, 2); + ISize minSize = canvas.minimumSize(); + sizeTo(frameRectFor(minSize).size()); + positionFrame(); + show().setFocus(); + LOGV(isVisible()); + LOGV(isShowing()); + LOGV(rect().asString()); +} + +FontDialog::~FontDialog() { + IPaintHandler::stopHandlingEventsFor(&canvas); + IPaintHandler::stopHandlingEventsFor(&fontChoices); + IPaintHandler::stopHandlingEventsFor(&buttons); +} + +Boolean FontDialog::paintWindow(IPaintEvent &event) { + LOGSECTION("FontDialog::paintWindow"); + event.clearBackground(IGUIColor::dialogBgnd); + return false; +} + +RGBSelector::RGBSelector(IWindow *owner, IColor color) + : ISetCanvas(nextChildId(), owner, owner, IRectangle(), + horizontalDecks + | centerAlign + | packEven + | visible) + , redSpinner(nextChildId(), this, this) + , greenSpinner(nextChildId(), this, this) + , blueSpinner(nextChildId(), this, this) + , redText(nextChildId(), this, this) + , greenText(nextChildId(), this, this) + , blueText(nextChildId(), this, this) +{ + LOGSECTION("RGBSelector::RGBSelector"); + redText.setText("Red").setAlignment(IStaticText::topCenter); + greenText.setText("Green").setAlignment(IStaticText::topCenter); + blueText.setText("Blue").setAlignment(IStaticText::topCenter); + IRange range(0, 255); + LOGV(color.redMix()) LCV(color.greenMix()) LCV(color.blueMix()); + redSpinner + . setRange(range) + . spinTo(color.redMix()) + . setLimit(3) + . enableTabStop() + ; + + greenSpinner + . setRange(range) + . spinTo(color.greenMix()) + . setLimit(3) + . enableTabStop() + ; + + blueSpinner + . setRange(range) + . spinTo(color.blueMix()) + . setLimit(3) + . enableTabStop() + ; + + setDeckCount(2); + ISpinHandler::handleEventsFor(&redSpinner); + ISpinHandler::handleEventsFor(&greenSpinner); + ISpinHandler::handleEventsFor(&blueSpinner); + IEditHandler::handleEventsFor(&redSpinner); + IEditHandler::handleEventsFor(&greenSpinner); + IEditHandler::handleEventsFor(&blueSpinner); + show(); +} + +RGBSelector::~RGBSelector() { + ISpinHandler::stopHandlingEventsFor(&redSpinner); + ISpinHandler::stopHandlingEventsFor(&greenSpinner); + ISpinHandler::stopHandlingEventsFor(&blueSpinner); + IEditHandler::stopHandlingEventsFor(&redSpinner); + IEditHandler::stopHandlingEventsFor(&greenSpinner); + IEditHandler::stopHandlingEventsFor(&blueSpinner); +} + +Boolean RGBSelector::edit(IControlEvent &event) { + //controlWindow()->spinTo(controlWindow()->value()); + changeAction.perform(); + return false; +} + + +AgString ColorPair::string() { + char buf[100]; + sprintf(buf, "(%x,%x)", fg.asRGBLong(), bg.asRGBLong()); + return buf; +} + +void ColorPair::setValue(char *s) { + sscanf(s, "(%d,%d)", &fg, &bg); +} + + +ColorSelector::ColorSelector(ColorDialog *owner_, ColorPair &colorPair_) + : AgDialog(owner_) + , ownerDialog(owner_) + , colorPair(colorPair_) + , canvas(nextChildId(), this, this, IRectangle(), + IMultiCellCanvas::classDefaultStyle + | IWindow::clipChildren) + , workArea(nextChildId(), &canvas, &canvas, IRectangle(), + ISetCanvas::verticalDecks + | ISetCanvas::packEven + | ISetCanvas::centerAlign + | ISetCanvas::centerVerticalAlign + | IWindow::clipChildren + | IWindow::visible) + , sampleText(nextChildId(), &workArea, &workArea) + , selectorCanvas(nextChildId(), &workArea, &workArea, IRectangle(), + ISetCanvas::verticalDecks + | ISetCanvas::packEven + | ISetCanvas::leftAlign + | IWindow::clipChildren + | IWindow::visible) + , foregroundSelector(&selectorCanvas, colorPair_.fg) + , backgroundSelector(&selectorCanvas, colorPair_.bg) + , buttonCanvas(&canvas) + , okButton(okCommand, &buttonCanvas, + IPushButton::defaultButton + | IWindow::visible) + , cancelButton(cancelCommand, &buttonCanvas) +{ + LOGSECTION("ColorSelector::ColorSelector"); + foregroundSelector.setText("Foreground:"); + backgroundSelector.setText("Background:"); + sampleText.setText("Sample Text").setAlignment(IStaticText::centerCenter); + sampleText.setForegroundColor(colorPair.fg); + sampleText.setBackgroundColor(colorPair.bg); + sampleText.setMinimumSize(foregroundSelector.minimumSize()); + setClient(&canvas); + selectorCanvas.setDeckCount(1); + workArea.setDeckCount(1); + + cancelButton.setText("Cancel"); + + int width = workArea.minimumSize().width(); + int buttonCanvasWidth = buttonCanvas.minimumSize().width(); + LOGV(width); + LOGV(buttonCanvasWidth); + canvas.setColumnWidth(1, width - buttonCanvasWidth); + canvas.setColumnWidth(2, buttonCanvasWidth); + canvas.addToCell(&workArea, 1, 1, 2); + canvas.addToCell(&buttonCanvas, 2, 2, 1); + + + foregroundSelector.setChangeAction(actionObject(this, changeForeground)); + backgroundSelector.setChangeAction(actionObject(this, changeBackground)); + + removeDefaultHandler(); + IFrameHandler::handleEventsFor(this); + IPaintHandler::handleEventsFor(&canvas); + IPaintHandler::handleEventsFor(&workArea); + IPaintHandler::handleEventsFor(&selectorCanvas); + IPaintHandler::handleEventsFor(&buttonCanvas); + + ISize size = canvas.minimumSize(); + LOGV(size); + sizeTo(frameRectFor(IRectangle(size)).size()); + setFocus(); +} + +ColorSelector::~ColorSelector() { + IFrameHandler::stopHandlingEventsFor(this); + IPaintHandler::stopHandlingEventsFor(&canvas); + IPaintHandler::stopHandlingEventsFor(&workArea); + IPaintHandler::stopHandlingEventsFor(&selectorCanvas); + IPaintHandler::stopHandlingEventsFor(&buttonCanvas); +} + +Boolean ColorSelector::paintWindow(IPaintEvent &event) { + LOGSECTION("ColorSelector::paintWindow"); + event.clearBackground(IGUIColor::dialogBgnd); + return false; +} + + +Boolean ColorSelector::command(ICommandEvent &event) { + LOGSECTION("ColorSelector::command"); + switch (event.commandId()) { + case okCommand: + colorPair = ColorPair(foregroundSelector.value(), + backgroundSelector.value()); + dismiss(1); + return true; + case cancelCommand: + dismiss(0); + return true; + } + return false; +} + +ColoredButton::ColoredButton(long id, IWindow *owner, + ColorSpec *colorPair, char *text) + : IPushButton(id, owner, owner) + , fgColor(colorPair->fg()) + , bgColor(colorPair->bg()) +{ + LOGSECTION("ColoredButton::ColoredButton"); + LOGV(fgColor.redMix()) LCV(fgColor.greenMix()) LCV(fgColor.blueMix()); + LOGV(bgColor.redMix()) LCV(bgColor.greenMix()) LCV(bgColor.blueMix()); + setText(text); + enableTabStop(); +} + +ColorDialog::ColorDialog() + : AgFrame(IFrameWindow::border | IFrameWindow::systemMenu) + , canvas(nextChildId(), this, this, IRectangle(), + ISetCanvas::verticalDecks + | ISetCanvas::packEven + | ISetCanvas::rightAlign + | ISetCanvas::centerVerticalAlign + | IWindow:: clipChildren + | IWindow::visible) + , colorChoices(nextChildId(), &canvas, &canvas, IRectangle(), + ISetCanvas::verticalDecks + | ISetCanvas::packExpanded + | ISetCanvas::centerAlign + | ISetCanvas::bottomAlign + | IWindow::clipChildren + | IWindow::visible) + , buttons(&canvas) + , undoButton(undoCommand, &buttons) + , defaultButton(defaultCommand, &buttons) + , cancelButton(cancelCommand, &buttons) + , helpButton(helpCommand, &buttons) + //, activeDialog(0) +{ + LOGSECTION("ColorDialog::ColorDialog"); + IPaintHandler::handleEventsFor(&colorChoices); + IPaintHandler::handleEventsFor(&buttons); + setClient(&canvas); + int i; + + int maxWidth = 0; + for (i = 0; i < nColorSpecs; i++) { + LOGV(i); + ColorSpec *colorSpec = specRecord[i].pointer; + IColor fg = colorSpec->fg(); + IColor bg = colorSpec->bg(); + LOGV(fg.redMix()) LCV(fg.greenMix()) LCV(fg.blueMix()); + LOGV(bg.redMix()) LCV(bg.greenMix()) LCV(bg.blueMix()); + buttonList[i] = new ColoredButton(i+1, &colorChoices, + specRecord[i].pointer, + specRecord[i].title); + int width = buttonList[i]->minimumSize().width(); + if (maxWidth < width) { + maxWidth = width; + } + } + canvas.setDeckCount(1); + colorChoices.setDeckCount(2); + windowTitle.setText("AnaGram - Set Colors"); + registerTitle("Set Colors"); + canvas.setBackgroundColor(IGUIColor(IGUIColor::dialogBgnd)); + ISize choicesSize = colorChoices.size(); + int choicesWidth = choicesSize.width(); + int buttonsWidth = buttons.size().width(); + if (choicesWidth < buttonsWidth) { + choicesWidth = buttonsWidth; + choicesSize.setWidth(choicesWidth); + colorChoices.sizeTo(choicesSize); + } + LOGV(colorChoices.minimumSize()); + LOGV(buttons.minimumSize()); + ISize size = canvas.minimumSize(); + LOGV(size); + sizeTo(frameRectFor(IRectangle(size)).size()); + positionFrame(); + show().setFocus(); + LOGV(isVisible()); + LOGV(isShowing()); + LOGV(rect().asString()); +} + +ColorDialog::~ColorDialog() { + IPaintHandler::stopHandlingEventsFor(&canvas); + IPaintHandler::stopHandlingEventsFor(&colorChoices); + IPaintHandler::stopHandlingEventsFor(&buttons); +} + +Boolean ColorDialog::paintWindow(IPaintEvent &event) { + LOGSECTION("ColorDialog::paintWindow"); + event.clearBackground(IGUIColor::dialogBgnd); + return false; +} + + +Boolean ColorSelector::activated(IFrameEvent &event) { + AgFrame::windowRegistry.markActive(ownerDialog->windowId); + return false; +} + +Boolean ColorDialog::command(ICommandEvent &event) { + LOGSECTION("ColorDialog::command"); + LOGV(event.commandId()); + switch (event.commandId()) { + case undoCommand: { + LOGS("undo"); + if (undoStack.size() == 0) { + messageBeep(); + return true; + } + undoStack.pop(undoRecord); + ColorSpec &colorSpec = *undoRecord.pointer; + //int option = undoRecord.buttonNumber; + ColorPair colorPair = undoRecord.colorPair; + colorSpec = undoRecord.colorPair; + return true; + } + case defaultCommand: { + int i; + for (i = 0; i < nColorSpecs; i++) { + undoRecord.pointer = specRecord[i].pointer; + undoRecord.colorPair = *undoRecord.pointer; + undoRecord.buttonNumber =i; + + undoRecord.pointer->reset(); + undoStack.push(undoRecord); + } + return true; + } + case cancelCommand: { + AgFrame::windowRegistry.remove(windowId); + close(); + return true; + } + case helpCommand: { + LOGSECTION("ColorDialog::helpCommand"); + AgHelpWindow::showHelp("Set Colors"); + return true; + } + default: if (event.commandId() <= nColorSpecs) { + int option = event.commandId() - 1; + LOGS(specRecord[option].title); + undoRecord.pointer = specRecord[option].pointer; + ColorPair colorPair= *undoRecord.pointer; + undoRecord.colorPair = colorPair; + undoRecord.buttonNumber = option; + + ColorSelector colorSelector(this, colorPair); + char *title = specRecord[option].title; + colorSelector.windowTitle.setText(title); + LOGS("Ready to show modal dialog"); +/* + #ifdef AG_WINDOWS + RECT r; + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + ISize size(r.right - r.left, r.bottom - r.top); + #else + ISize size = IWindow::desktopWindow()->size(); + #endif + IPoint where = (IPair) place(size, colorSelector.size(), 22); +*/ + IPoint where = placeOnDesktop(colorSelector.size(), 22); + IPoint buttonWhere = buttonList[option]->position(); + int height = buttonList[option]->size().height(); + buttonWhere += position() + ISize(0,height); + buttonWhere += canvas.position(); + buttonWhere += colorChoices.position(); + where = where.minimum(buttonWhere); + colorSelector.moveTo(where); + modalDialog = &colorSelector; + int flag = colorSelector.showModally(); + modalDialog = 0; + LOGV(flag); + if (!flag) { + return true; + } + *undoRecord.pointer = colorPair; + + + undoStack.push(undoRecord); + } + else { + return AgFrame::command(event); + } + } + return true; +} + +static IColor makeColor(int x) { + LOGSECTION("makeColor"); + int red, green, blue; + red = x & 0xff; + x >>= 8; + green = x & 0xff; + x >>= 8; + blue = x & 0xff; + LOGV(x) LCV(red) LCV(green) LCV(blue); + IColor value(red, green, blue); + LOGV(value.asRGBLong()); + return value; +} + +void ColorDialog::initColor(AgString name, cint p) { + LOGSECTION("ColorDialog::initColor"); + //int f = p.x; + IColor fg = makeColor(p.x); + IColor bg = makeColor(p.y); + LOGV(name) LCV(fg.asRGBLong()) LCV(bg.asRGBLong()); + for (int i = 0; i < nColorSpecs; i++) { + if (name != specRecord[i].title) { + continue; + } + specRecord[i].pointer->initialize(ColorPair(fg,bg)); + return; + } +} + +Boolean FontSpec::reset() { + contents = defaultFont; + notify(); + return 1; +} + +Boolean ColorSpec::reset() { + contents = defaultValue; + notify(); + return 1; +} + +FontDialog::SpecRecord FontDialog::specRecord[FontDialog::nFontSpecs] = { + &FontSpec::dataTable, "Data Tables", + &FontSpec::columnHead, "Column headings", + &FontSpec::markedToken, "Marked tokens", + &FontSpec::syntaxFile, "Syntax file text", + &FontSpec::traceFile, "File trace text", + &FontSpec::help, "Help window text", + &FontSpec::helpTitle, "Help window titles" +}; + +class AFontDialogHandler + : public IFontDialogHandler + //, public IFrameHandler +{ +private: + FontDialog *dialog; + +public: + AFontDialogHandler(FontDialog *d) : dialog(d) {} + Boolean dispatchHandlerEvent(IEvent &e); + Boolean modelessResults(IFontDialog *); + //Boolean activated(IFrameEvent &event); +}; + +/* +Boolean AFontDialogHandler::activated(IFrameEvent &event) { + LOGSECTION("AFontDialogHandler::activated"); + LOGV((int) dialog) LCV(dialog->windowId); + //AgFrame::windowRegistry.bubbleUp(dialog->windowId); + AgFrame::windowRegistry.markActive(dialog->windowId); + return false; +} +*/ + +Boolean AFontDialogHandler::dispatchHandlerEvent(IEvent &e) { + LOGSECTION("AFontDialogHandler::dispatchHandlerEvent"); + //IWindow *pWindow = IWindow::windowWithHandle(dialog->dialogHandle); + if (dialog->fontDialogActive == 1 && e.controlHandle().isValid()) { + LOGS("Valid handle found"); + dialog->dialogHandle = e.controlHandle(); + dialog->fontDialogActive = 2; + //IWindow *pWindow = IWindow::windowWithHandle(dialog->dialogHandle); + //IFrameHandler::handleEventsFor(pWindow); + } + if (e.eventId() == WM_SETFOCUS || e.eventId() == WM_ACTIVATE) { + //AgFrame::windowRegistry.bubbleUp(dialog->windowId); + AgFrame::windowRegistry.markActive(dialog->windowId); + } + if (e.eventId() == WM_DESTROY) { + LOGS("Destroy message seen"); + dialog->fontDialogActive = 3; + //IWindow *pWindow = IWindow::windowWithHandle(dialog->dialogHandle); + //IFrameHandler::stopHandlingEventsFor(pWindow); + } + LOGV(e.eventId()) LCV((int) e.parameter1()); + return IFontDialogHandler::dispatchHandlerEvent(e); +} + +Boolean AFontDialogHandler::modelessResults(IFontDialog *) { + LOGSECTION("AFontDialogHandler::modelessResults"); + assert(dialog->dialogHandle.isValid()); + IWindow *pWindow = IWindow::windowWithHandle(dialog->dialogHandle); + LOGV((int) pWindow); + IFontDialogHandler::stopHandlingEventsFor(pWindow); + IFrameHandler::stopHandlingEventsFor(pWindow); + return false; +} + +FontDialog &FontDialog::closeModalDialog() { + LOGSECTION("FontDialog::closeModalDialog"); + LOGV(fontDialogActive); + if (fontDialogActive == 0) { + return *this; + } + + IWindow *pWindow = windowWithHandle(dialogHandle); + LOGV((int) pWindow); + if (pWindow) { + //pWindow->sendEvent(WM_COMMAND, IDABORT); + pWindow->sendEvent(WM_COMMAND, IDCANCEL); + return *this; + } + return *this; +} + +void FontDialog::closeFrame() { + LOGSECTION("FontDialog::closeFrame"); + if (fontDialogActive) { + closeAction.performDeferred(); + return; + } + close(); +} + +FontDialog &FontDialog::mySetFocus() { + LOGSECTION("FontDialog::mySetFocus"); + switch (fontDialogActive) { + case 0: + case 3: { + setFocus(); + return *this; + } + case 1: + case 2: { + IWindow *pWindow = windowWithHandle(dialogHandle); + LOGV((int) pWindow); + if (pWindow) { + pWindow->setFocus(); + return *this; + } + } + } + return *this; +} + +void FontDialog::popUp() { + LOGSECTION("FontDialog::popUp"); + switch (fontDialogActive) { + case 0: + case 3: { + if (isMinimized()) { + restore(); + } + show().setFocus(); + return; + } + case 1: + case 2: { + IWindow *pWindow = windowWithHandle(dialogHandle); + LOGV((int) pWindow); + if (pWindow) { + pWindow->setFocus(); + return; + } + } + } +} + +Boolean FontDialog::command(ICommandEvent &event) { + LOGSECTION("FontDialog::command"); + LOGV(event.commandId()); + switch (event.commandId()) { + case undoCommand: { + LOGS("undo"); + if (undoStack.size() == 0) { + messageBeep(); + return true; + } + undoStack.pop(undoRecord); + LOGV(undoRecord.pointer->description()); + FontSpec &fontSpec = *undoRecord.pointer; + fontSpec = undoRecord.font; + undoRecord.button->setText(fontSpec.description().pointer()); + LOGV(undoRecord.pointer->description()); + return true; + } + case defaultCommand: { + int i; + for (i = 0; i < nFontSpecs; i++) { + undoRecord.pointer = specRecord[i].pointer; + undoRecord.button = optionRecord[i].button; + undoRecord.font = *undoRecord.pointer; + + LOGV(undoRecord.pointer->description()); + undoRecord.pointer->reset(); + LOGV(undoRecord.pointer->description()); + undoStack.push(undoRecord); + undoRecord.button->setText( + undoRecord.pointer->description().pointer() + ); + } + return true; + } + case cancelCommand: { + AgFrame::windowRegistry.remove(windowId); + close(); + return true; + } + case helpCommand: { + LOGSECTION("FontDialog::helpCommand"); + AgHelpWindow::showHelp("Set Fonts"); + return true; + } + default: if (event.commandId() <= nFontSpecs) { + int option = event.commandId() - 1; + LOGV(option); + LOGV(specRecord[option].title); + undoRecord.pointer = specRecord[option].pointer; + undoRecord.button = optionRecord[option].button; + IFont font = *undoRecord.pointer; + undoRecord.font = font; + LOGV(undoRecord.pointer->description()); + + IFontDialog::Settings settings(&font); + LOGS("Settings object created"); + AgString title = specRecord[option].title; + LOGV(title); + int n = title.size() - 1; + LOGV(n); + if (title[n] == ':') { + title[n] = 0; + } + LOGV(title); + settings.setTitle(AgString::format("AnaGram - Set Fonts - %s", + title.pointer()).pointer()); + LOGS("Title set in settings object"); + fontDialogActive = 1; + AFontDialogHandler handler(this); + IFontDialog fontDialog(this, this, (IFontDialogHandler *) &handler, + IFontDialog::defaultStyle(), settings); + fontDialogActive = 0; + if (!fontDialog.pressedOK()) { + return true; + } + LOGS("Return from font dialog"); + *undoRecord.pointer = font; + LOGV(undoRecord.pointer->description()); + undoStack.push(undoRecord); + undoRecord.button->setText(undoRecord.pointer->description().pointer()); + } + else { + return AgFrame::command(event); + } + } + return true; +} + +void FontDialog::initFont(int field, int flags, int size, AgString name) { + LOGSECTION("FontDialog::initFont"); + LOGV(name) LCV(field) LCV(flags) LCV(size); + if (field >= nFontSpecs) { + return; + } + IFont f(name.pointer(), size); + LOGV(name); + if (flags & FontSpec::italic) f.setItalic(); + if (flags & FontSpec::bold) f.setBold(); + if (flags & FontSpec::strikeout) f.setStrikeout(); + if (flags & FontSpec::underscore) f.setUnderscore(); + specRecord[field].pointer->initialize(f); + return; +} + +int FontDialog::idField(AgString name) { + int i; + for (i = 0; i < nFontSpecs; i++) { + if (name == specRecord[i].title) { + break; + } + } + return i; +} + +ColorDialog::SpecRecord ColorDialog::specRecord[ColorDialog::nColorSpecs] = { + &ColorSpec::syntaxFile, "Syntax File", + &ColorSpec::data, "Data Tables", + &ColorSpec::activeTitle, "Active Pane Column Headings", + &ColorSpec::inactiveTitle, "Inactive Pane Column Headings", + &ColorSpec::activeCursor, "Active Pane Cursor Bar", + &ColorSpec::inactiveCursor, "Inactive Pane Cursor Bar", + &ColorSpec::traceFileUnscanned, "File Trace Text (Unparsed)", + &ColorSpec::traceFileScanned, "File Trace Text (Parsed)", + &ColorSpec::traceFileHilite, "File Trace Text (Highlight)", + &ColorSpec::helpText, "Help Window", + &ColorSpec::helpLink, "Help Links", + &ColorSpec::helpUsedLink, "Traversed Links" +}; + +void ColorDialog::stackSettings(AgCharStack &stack) { + for (int i = 0; i < nColorSpecs; i++) { + stack << "Color:" << specRecord[i].title << '='; + stack << specRecord[i].pointer->string() << '\n'; + } +} + +AgString FontSpec::string() { + AgCharStack stack; + if (contents.isBold()) stack << 'B'; + if (contents.isItalic()) stack << 'I'; + if (contents.isStrikeout()) stack << 'S'; + if (contents. isUnderscore()) stack << 'U'; + char buf[20]; + itoa(contents.pointSize(), buf, 10); + stack << buf; + stack << '.' << (char *) contents.name(); + return stack.popString(); +} + +void FontDialog::stackSettings(AgCharStack &stack) { + for (int i = 0; i < nFontSpecs; i++) { + stack << "Font:" << specRecord[i].title << '='; + stack << specRecord[i].pointer->string() << '\n'; + } +} + +ColorSpec ColorSpec::defaultSetting( + IColor(0,0,0), IColor(255,255,255)); + +#ifdef COLOR_SCHEME_1 +// original scheme + +ColorSpec ColorSpec::dialogBackground ( + IColor(0,0,0), IGUIColor(IGUIColor::dialogBgnd)); + +ColorSpec ColorSpec::syntaxFile( + IColor(0,0,0), IColor(216,252,240)); + +ColorSpec ColorSpec::traceFileHilite( + IColor(255,255,255), IColor(0,125,130)); + +ColorSpec ColorSpec::traceFileScanned( + IColor(0,0,0), IColor(216,252,240)); + +ColorSpec ColorSpec::traceFileUnscanned( + IColor(0,0,0),IColor(184,220,208)); + +ColorSpec ColorSpec::activeTitle( + IColor(0,0,0), IColor(150,213,255)); + +ColorSpec ColorSpec::inactiveTitle( + IColor(0,0,0), IColor(152,196,216)); + +ColorSpec ColorSpec::data( + IColor(0,0,0), IColor(216,252,240)); + +ColorSpec ColorSpec::activeCursor( + IColor(255,255,255), IColor(0, 125, 130)); + +ColorSpec ColorSpec::inactiveCursor( + IColor(255,255,255), IColor(125,165,150)); + + + +ColorSpec ColorSpec::helpText( + IColor(0,0,0), IColor(255,255,225)); + +ColorSpec ColorSpec::helpLink( + IColor(0,115,240),IColor(255,255,225)); + +ColorSpec ColorSpec::helpUsedLink( + IColor(0,140,30),IColor(255,255,225)); + +#else +// Renata's scheme 2 + +ColorSpec ColorSpec::dialogBackground ( + IColor(0,0,0), IGUIColor(IGUIColor::dialogBgnd)); + +ColorSpec ColorSpec::syntaxFile( + IColor(0,0,0), IColor(220,245,250)); + +ColorSpec ColorSpec::traceFileHilite( + IColor(255,255,255), IColor(120,45,45)); + +ColorSpec ColorSpec::traceFileScanned( + IColor(0,0,0), IColor(245,245,235)); + +ColorSpec ColorSpec::traceFileUnscanned( + IColor(0,0,0),IColor(222,220,208)); + +ColorSpec ColorSpec::activeTitle( + IColor(0,0,0), IColor(150,213,255)); + +ColorSpec ColorSpec::inactiveTitle( + IColor(0,0,0), IColor(171,203,228)); + +ColorSpec ColorSpec::data( + IColor(0,0,0), IColor(220,245,250)); + +ColorSpec ColorSpec::activeCursor( + IColor(255,255,255), IColor(120, 45, 45)); + +ColorSpec ColorSpec::inactiveCursor( + IColor(255,255,255), IColor(155,110,115)); + + + +ColorSpec ColorSpec::helpText( + IColor(0,0,0), IColor(255,255,225)); + +ColorSpec ColorSpec::helpLink( + IColor(0,115,255),IColor(255,255,225)); + +ColorSpec ColorSpec::helpUsedLink( + IColor(0,140,30),IColor(255,255,225)); + +#endif + + +FontSpec FontSpec::defaultSetting; +FontSpec FontSpec::syntaxFile("Courier", 10); +FontSpec FontSpec::traceFile("Courier", 10); + +FontSpec FontSpec::help("MS Sans Serif", 10); +FontSpec FontSpec::helpTitle("MS Sans Serif", 12, FontSpec::bold); + +FontSpec FontSpec::columnHead("MS Sans Serif", 10); + +FontSpec FontSpec::dataTable("MS Sans Serif", 10); +FontSpec FontSpec::markedToken("MS Sans Serif", 10, FontSpec::boldItalic); + + +AgString FontSpec::description() { + return AgString::format("%d point %s", + contents.pointSize(), contents.name()); +} +