/* Configurations.c- misc. configurations
 *
 *  WPrefs - Window Maker Preferences Program
 *
 *  Copyright (c) 1998-2003 Alfredo K. Kojima
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 *  USA.
 */


#include "WPrefs.h"

typedef struct _Panel {
    WMBox *box;
    char *sectionName;

    char *description;

    CallbackRec callbacks;

    WMWidget *parent;

    WMFrame *icoF;
    WMButton *icoB[5];

    WMFrame *shaF;
    WMButton *shaB[5];

    WMFrame *titlF;
    WMButton *oldsB;
    WMButton *newsB;

    WMFrame *animF;
    WMButton *animB;
    WMButton *supB;
    WMButton *sfxB;
    WMLabel *noteL;

    WMFrame *smoF;
    WMButton *smoB;

    WMFrame *dithF;
    WMButton *dithB;
    WMSlider *dithS;
    WMLabel *dithL;
    WMLabel *dith1L;
    WMLabel *dith2L;

    int cmapSize;
} _Panel;



#define ICON_FILE	"configs"

#define OLDS_IMAGE	"oldstyle"
#define NEWS_IMAGE	"newstyle"

#define ANIM_IMAGE	"animations"
#define SUPERF_IMAGE	"moreanim"
#define SOUND_IMAGE	"sound"
#define SMOOTH_IMAGE	"smooth"

#define SPEED_IMAGE 	"speed%i"
#define SPEED_IMAGE_S 	"speed%is"

#define ARQUIVO_XIS	"xis"


static void updateLabel(WMWidget *self, void *data);


static void
showData(_Panel *panel)
{
    WMPerformButtonClick(panel->icoB[GetSpeedForKey("IconSlideSpeed")]);

    WMPerformButtonClick(panel->shaB[GetSpeedForKey("ShadeSpeed")]);

    if (GetBoolForKey("NewStyle")) {
        WMPerformButtonClick(panel->newsB);
    } else {
        WMPerformButtonClick(panel->oldsB);
    }

    WMSetButtonSelected(panel->animB, !GetBoolForKey("DisableAnimations"));

    WMSetButtonSelected(panel->supB, GetBoolForKey("Superfluous"));

    WMSetButtonSelected(panel->sfxB, !GetBoolForKey("DisableSound"));

    WMSetButtonSelected(panel->smoB, GetBoolForKey("SmoothWorkspaceBack"));

    WMSetButtonSelected(panel->dithB, GetBoolForKey("DisableDithering"));

    WMSetSliderValue(panel->dithS, GetIntegerForKey("ColormapSize"));

    updateLabel(panel->dithS, panel);
}


static void
updateLabel(WMWidget *self, void *data)
{
    WMSlider *sPtr = (WMSlider*)self;
    _Panel *panel = (_Panel*)data;
    char buffer[64];
    float fl;

    fl = WMGetSliderValue(sPtr);

    panel->cmapSize = (int)fl;

    sprintf(buffer, "%i", panel->cmapSize*panel->cmapSize*panel->cmapSize);
    WMSetLabelText(panel->dithL, buffer);
}


static void
createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file,
             WMPixmap **icon1,  WMPixmap **icon2)
{
    RImage *icon;
    char *path;
    RColor gray = {0xae,0xaa,0xae};

    *icon1 = NULL;
    *icon2 = NULL;

    path = LocateImage(file);
    if (!path) {
        return;
    }

    *icon1 = WMCreatePixmapFromFile(scr, path);
    if (!*icon1) {
        wwarning(_("could not load icon %s"), path);
        wfree(path);
        return;
    }
    icon = RLoadImage(rc, path, 0);
    if (!icon) {
        wwarning(_("could not load icon %s"), path);
        wfree(path);
        return;
    }
    RCombineImageWithColor(icon, &gray);
    if (xis) {
        RCombineImagesWithOpaqueness(icon, xis, 180);
        if (!(*icon2 = WMCreatePixmapFromRImage(scr, icon, 127)))
            wwarning(_("could not process icon %s:"), file, RMessageForError(RErrorCode));
    }
    RReleaseImage(icon);
    wfree(path);
}


static void
createPanel(Panel *p)
{
    _Panel *panel = (_Panel*)p;
    WMScreen *scr = WMWidgetScreen(panel->parent);
    char *buf1, *buf2;
    WMPixmap *icon, *altIcon;
    RImage *xis = NULL;
    int i;
    RContext *rc = WMScreenRContext(scr);
    WMFont *font = WMSystemFontOfSize(scr, 10);
    char *path;

    path = LocateImage(ARQUIVO_XIS);
    if (path) {
        xis = RLoadImage(rc, path, 0);
        if (!xis) {
            wwarning(_("could not load image file %s"), path);
        }
        wfree(path);
    }


    panel->box = WMCreateBox(panel->parent);
    WMSetViewExpandsToParent(WMWidgetView(panel->box), 2, 2, 2, 2);

    /*********** Icon Slide Speed **********/

    panel->icoF = WMCreateFrame(panel->box);
    WMResizeWidget(panel->icoF, 230, 45);
    WMMoveWidget(panel->icoF, 15, 10);
    WMSetFrameTitle(panel->icoF, _("Icon Slide Speed"));

    /*********** Shade Animation Speed **********/
    panel->shaF = WMCreateFrame(panel->box);
    WMResizeWidget(panel->shaF, 230, 45);
    WMMoveWidget(panel->shaF, 15, 60);
    WMSetFrameTitle(panel->shaF, _("Shade Animation Speed"));


    buf1 = wmalloc(strlen(SPEED_IMAGE)+1);
    buf2 = wmalloc(strlen(SPEED_IMAGE_S)+1);

    for (i = 0; i < 5; i++) {
        panel->icoB[i] = WMCreateCustomButton(panel->icoF, WBBStateChangeMask);
        panel->shaB[i] = WMCreateCustomButton(panel->shaF, WBBStateChangeMask);
        WMResizeWidget(panel->icoB[i], 40, 24);
        WMMoveWidget(panel->icoB[i], 10+(40*i), 15);
        WMResizeWidget(panel->shaB[i], 40, 24);
        WMMoveWidget(panel->shaB[i], 10+(40*i), 15);
        WMSetButtonBordered(panel->icoB[i], False);
        WMSetButtonImagePosition(panel->icoB[i], WIPImageOnly);
        if (i > 0) {
            WMGroupButtons(panel->icoB[0], panel->icoB[i]);
        }
        WMSetButtonBordered(panel->shaB[i], False);
        WMSetButtonImagePosition(panel->shaB[i], WIPImageOnly);
        if (i > 0) {
            WMGroupButtons(panel->shaB[0], panel->shaB[i]);
        }
        sprintf(buf1, SPEED_IMAGE, i);
        sprintf(buf2, SPEED_IMAGE_S, i);
        path = LocateImage(buf1);
        if (path) {
            icon = WMCreatePixmapFromFile(scr, path);
            if (icon) {
                WMSetButtonImage(panel->icoB[i], icon);
                WMSetButtonImage(panel->shaB[i], icon);
                WMReleasePixmap(icon);
            } else {
                wwarning(_("could not load icon file %s"), path);
            }
            wfree(path);
        }
        path = LocateImage(buf2);
        if (path) {
            icon = WMCreatePixmapFromFile(scr, path);
            if (icon) {
                WMSetButtonAltImage(panel->icoB[i], icon);
                WMSetButtonAltImage(panel->shaB[i], icon);
                WMReleasePixmap(icon);
            } else {
                wwarning(_("could not load icon file %s"), path);
            }
            wfree(path);
        }
    }
    wfree(buf1);
    wfree(buf2);


    WMMapSubwidgets(panel->icoF);
    WMMapSubwidgets(panel->shaF);


    /***************** Smoothed Scaling *****************/
    panel->smoF = WMCreateFrame(panel->box);
    WMResizeWidget(panel->smoF, 115, 110);
    WMMoveWidget(panel->smoF, 18, 115);
    WMSetFrameTitle(panel->smoF, _("Smooth Scaling"));
    WMSetBalloonTextForView(_("Smooth scaled background images, neutralizing\n"
                              "the `pixelization' effect. This will slow\n"
                              "down loading of background images considerably."),
                            WMWidgetView(panel->smoF));

    panel->smoB = WMCreateButton(panel->smoF, WBTToggle);
    WMResizeWidget(panel->smoB, 64, 64);
    WMMoveWidget(panel->smoB, 25, 25);
    WMSetButtonImagePosition(panel->smoB, WIPImageOnly);
    path = LocateImage(SMOOTH_IMAGE);
    if (path) {
        RImage *image, *scaled;

        image = RLoadImage(WMScreenRContext(scr), path, 0);
        wfree(path);

        scaled = RScaleImage(image, 61, 61);
        icon = WMCreatePixmapFromRImage(scr, scaled, 128);
        RReleaseImage(scaled);
        if (icon) {
            WMSetButtonImage(panel->smoB, icon);
            WMReleasePixmap(icon);
        }

        scaled = RSmoothScaleImage(image, 61, 61);
        icon = WMCreatePixmapFromRImage(scr, scaled, 128);
        RReleaseImage(scaled);
        if (icon) {
            WMSetButtonAltImage(panel->smoB, icon);
            WMReleasePixmap(icon);
        }

        RReleaseImage(image);
    }

    WMMapSubwidgets(panel->smoF);

    /***************** Titlebar Style Size ****************/
    panel->titlF = WMCreateFrame(panel->box);
    WMResizeWidget(panel->titlF, 105, 110);
    WMMoveWidget(panel->titlF, 140, 115);
    WMSetFrameTitle(panel->titlF, _("Titlebar Style"));

    panel->newsB = WMCreateButton(panel->titlF, WBTOnOff);
    WMResizeWidget(panel->newsB, 74, 40);
    WMMoveWidget(panel->newsB, 15, 20);
    WMSetButtonImagePosition(panel->newsB, WIPImageOnly);
    path = LocateImage(NEWS_IMAGE);
    if (path) {
        icon = WMCreatePixmapFromFile(scr, path);
        if (icon) {
            WMSetButtonImage(panel->newsB, icon);
            WMReleasePixmap(icon);
        }
    }

    panel->oldsB = WMCreateButton(panel->titlF, WBTOnOff);
    WMResizeWidget(panel->oldsB, 74, 40);
    WMMoveWidget(panel->oldsB, 15, 60);
    WMSetButtonImagePosition(panel->oldsB, WIPImageOnly);
    path = LocateImage(OLDS_IMAGE);
    if (path) {
        icon = WMCreatePixmapFromFile(scr, path);
        if (icon) {
            WMSetButtonImage(panel->oldsB, icon);
            WMReleasePixmap(icon);
        }
        wfree(path);
    }

    WMGroupButtons(panel->newsB, panel->oldsB);

    WMMapSubwidgets(panel->titlF);

    /**************** Features ******************/

    panel->animF = WMCreateFrame(panel->box);
    WMResizeWidget(panel->animF, 255, 115);
    WMMoveWidget(panel->animF, 255, 10);
    WMSetFrameTitle(panel->animF, _("Animations and Sound"));

    panel->animB = WMCreateButton(panel->animF, WBTToggle);
    WMResizeWidget(panel->animB, 64, 64);
    WMMoveWidget(panel->animB, 15, 20);
    WMSetButtonFont(panel->animB, font);
    WMSetButtonText(panel->animB, _("Animations"));
    WMSetButtonImagePosition(panel->animB, WIPAbove);
    createImages(scr, rc, xis, ANIM_IMAGE, &altIcon, &icon);
    if (icon) {
        WMSetButtonImage(panel->animB, icon);
        WMReleasePixmap(icon);
    }
    if (altIcon) {
        WMSetButtonAltImage(panel->animB, altIcon);
        WMReleasePixmap(altIcon);
    }
    WMSetBalloonTextForView(_("Disable/enable animations such as those shown\n"
                              "for window miniaturization, shading etc."),
                            WMWidgetView(panel->animB));

    panel->supB = WMCreateButton(panel->animF, WBTToggle);
    WMResizeWidget(panel->supB, 64, 64);
    WMMoveWidget(panel->supB, 95, 20);
    WMSetButtonFont(panel->supB, font);
    WMSetButtonText(panel->supB, _("Superfluous"));
    WMSetButtonImagePosition(panel->supB, WIPAbove);
    createImages(scr, rc, xis, SUPERF_IMAGE, &altIcon, &icon);
    if (icon) {
        WMSetButtonImage(panel->supB, icon);
        WMReleasePixmap(icon);
    }
    if (altIcon) {
        WMSetButtonAltImage(panel->supB, altIcon);
        WMReleasePixmap(altIcon);
    }
    WMSetBalloonTextForView(_("Disable/enable `superfluous' features and\n"
                              "animations. These include the `ghosting' of the\n"
                              "dock when it's being moved to another side and\n"
                              "the explosion animation when undocking icons."),
                            WMWidgetView(panel->supB));

    panel->sfxB = WMCreateButton(panel->animF, WBTToggle);
    WMResizeWidget(panel->sfxB, 64, 64);
    WMMoveWidget(panel->sfxB, 175, 20);
    WMSetButtonFont(panel->sfxB, font);
    WMSetButtonText(panel->sfxB, _("Sounds"));
    WMSetButtonImagePosition(panel->sfxB, WIPAbove);
    createImages(scr, rc, xis, SOUND_IMAGE, &altIcon, &icon);
    if (icon) {
        WMSetButtonImage(panel->sfxB, icon);
        WMReleasePixmap(icon);
    }
    if (altIcon) {
        WMSetButtonAltImage(panel->sfxB, altIcon);
        WMReleasePixmap(altIcon);
    }
    WMSetBalloonTextForView(_("Disable/enable support for sound effects played\n"
                              "for actions like shading and closing a window.\n"
                              "You will need a module distributed separately\n"
                              "for this. You can get it at:\n"
                              "http://largo.windowmaker.org/files.php#WSoundServer"),
                            WMWidgetView(panel->sfxB));

    panel->noteL = WMCreateLabel(panel->animF);
    WMResizeWidget(panel->noteL, 235, 28);
    WMMoveWidget(panel->noteL, 10, 85);
    WMSetLabelFont(panel->noteL, font);
    WMSetLabelText(panel->noteL, _("Note: sound requires a module distributed\nseparately"));

    WMMapSubwidgets(panel->animF);

    /*********** Dithering **********/
    panel->cmapSize = 4;

    panel->dithF = WMCreateFrame(panel->box);
    WMResizeWidget(panel->dithF, 255, 95);
    WMMoveWidget(panel->dithF, 255, 130);
    WMSetFrameTitle(panel->dithF, _("Dithering colormap for 8bpp"));

    WMSetBalloonTextForView(_("Number of colors to reserve for Window Maker\n"
                              "on displays that support only 8bpp (PseudoColor)."),
                            WMWidgetView(panel->dithF));

    panel->dithB = WMCreateSwitchButton(panel->dithF);
    WMResizeWidget(panel->dithB, 235, 32);
    WMMoveWidget(panel->dithB, 15, 15);
    WMSetButtonText(panel->dithB, _("Disable dithering in any visual/depth"));

    panel->dithL = WMCreateLabel(panel->dithF);
    WMResizeWidget(panel->dithL, 75, 16);
    WMMoveWidget(panel->dithL, 90, 50);
    WMSetLabelTextAlignment(panel->dithL, WACenter);
    WMSetLabelText(panel->dithL, "64");

    panel->dithS = WMCreateSlider(panel->dithF);
    WMResizeWidget(panel->dithS, 95, 16);
    WMMoveWidget(panel->dithS, 80, 65);
    WMSetSliderMinValue(panel->dithS, 2);
    WMSetSliderMaxValue(panel->dithS, 6);
    WMSetSliderContinuous(panel->dithS, True);
    WMSetSliderAction(panel->dithS, updateLabel, panel);

    panel->dith1L = WMCreateLabel(panel->dithF);
    WMResizeWidget(panel->dith1L, 70, 35);
    WMMoveWidget(panel->dith1L, 5, 50);
    WMSetLabelTextAlignment(panel->dith1L, WACenter);
    WMSetLabelFont(panel->dith1L, font);
    WMSetLabelText(panel->dith1L, _("More colors for\napplications"));

    panel->dith2L = WMCreateLabel(panel->dithF);
    WMResizeWidget(panel->dith2L, 70, 35);
    WMMoveWidget(panel->dith2L, 180, 50);
    WMSetLabelTextAlignment(panel->dith2L, WACenter);
    WMSetLabelFont(panel->dith2L, font);
    WMSetLabelText(panel->dith2L, _("More colors for\nWindow Maker"));

    WMMapSubwidgets(panel->dithF);

    WMRealizeWidget(panel->box);
    WMMapSubwidgets(panel->box);

    if (xis)
        RReleaseImage(xis);
    WMReleaseFont(font);

    showData(panel);
}


static void
storeData(_Panel *panel)
{
    int i;

    for (i=0; i<5; i++) {
        if (WMGetButtonSelected(panel->icoB[i]))
            break;
    }
    SetSpeedForKey(i, "IconSlideSpeed");


    for (i=0; i<5; i++) {
        if (WMGetButtonSelected(panel->shaB[i]))
            break;
    }
    SetSpeedForKey(i, "ShadeSpeed");

    SetBoolForKey(WMGetButtonSelected(panel->newsB), "NewStyle");

    SetBoolForKey(!WMGetButtonSelected(panel->animB), "DisableAnimations");
    SetBoolForKey(WMGetButtonSelected(panel->supB), "Superfluous");
    SetBoolForKey(!WMGetButtonSelected(panel->sfxB), "DisableSound");

    SetBoolForKey(WMGetButtonSelected(panel->smoB), "SmoothWorkspaceBack");

    SetBoolForKey(WMGetButtonSelected(panel->dithB), "DisableDithering");
    SetIntegerForKey(WMGetSliderValue(panel->dithS), "ColormapSize");
}



Panel*
InitConfigurations(WMScreen *scr, WMWidget *parent)
{
    _Panel *panel;

    panel = wmalloc(sizeof(_Panel));
    memset(panel, 0, sizeof(_Panel));

    panel->sectionName = _("Other Configurations");

    panel->description = _("Animation speeds, titlebar styles, various option\n"
                           "toggling and number of colors to reserve for\n"
                           "Window Maker on 8bit displays.");

    panel->parent = parent;

    panel->callbacks.createWidgets = createPanel;
    panel->callbacks.updateDomain = storeData;

    AddSection(panel, ICON_FILE);

    return panel;
}




syntax highlighted by Code2HTML, v. 0.9.1