root/src/servers/app/decorator/DecorManager.h
/*
 * Copyright (c) 2001-2005, Haiku, Inc.
 * Distributed under the terms of the MIT license.
 *
 * Author:
 *              DarkWyrm <bpmagic@columbus.rr.com>
 *              Clemens Zeidler <haiku@clemens-zeidler.de>
 *              Joseph Groover <looncraz@satx.rr.com>
 */
#ifndef DECOR_MANAGER_H
#define DECOR_MANAGER_H


#include <image.h>
#include <String.h>
#include <Locker.h>
#include <ObjectList.h>
#include <Entry.h>
#include <DecorInfo.h>

#include "Decorator.h"

class Desktop;
class DesktopListener;
class DrawingEngine;
class Window;
class WindowBehaviour;


typedef BObjectList<DesktopListener> DesktopListenerList;


// special name to test for use of non-fs-tied default decorator
// this just keeps things clean and simple is all

class DecorAddOn {
public:
                                                                DecorAddOn(image_id id, const char* name);
        virtual                                         ~DecorAddOn();

        virtual status_t                        InitCheck() const;

                        image_id                        ImageID() const { return fImageID; }

                        Decorator*                      AllocateDecorator(Desktop* desktop,
                                                                        DrawingEngine* engine, BRect rect,
                                                                        const char* title, window_look look,
                                                                        uint32 flags);

        virtual WindowBehaviour*        AllocateWindowBehaviour(Window* window);

        virtual const DesktopListenerList& GetDesktopListeners();

protected:
        virtual Decorator*                      _AllocateDecorator(DesktopSettings& settings,
                                                                        BRect rect, Desktop* desktop);

                        DesktopListenerList     fDesktopListeners;

private:
                        image_id                        fImageID;
                        BString                         fName;
};


class DecorManager {
public:
                                                                DecorManager();
                                                                ~DecorManager();

                        Decorator*                      AllocateDecorator(Window *window);
                        WindowBehaviour*        AllocateWindowBehaviour(Window *window);
                        void                            CleanupForWindow(Window *window);

                        status_t                        PreviewDecorator(BString path, Window *window);

                        const DesktopListenerList& GetDesktopListeners();

                        BString                         GetCurrentDecorator() const;
                        status_t                        SetDecorator(BString path, Desktop *desktop);

private:
                        DecorAddOn*                     _LoadDecor(BString path, status_t &error);
                        bool                            _LoadSettingsFromDisk();
                        bool                            _SaveSettingsToDisk();

private:
                        DecorAddOn                      fDefaultDecor;
                        DecorAddOn*                     fCurrentDecor;
                        DecorAddOn*                     fPreviewDecor;

                        Window*                         fPreviewWindow;
                        BString                         fCurrentDecorPath;
};

extern DecorManager gDecorManager;

#endif  /* DECOR_MANAGER_H */