/*
 * Copyright 2002-2006, Haiku. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Michael Pfeiffer
 */
#ifndef _SETTINGS_H
#define _SETTINGS_H

#include "BeUtils.h"
#include "ObjectList.h"

#include <String.h>

class AppSettings {
private:
	BString fMimeType; // application signature
	BString fPrinter;  // printer used by application (default == empty string)

public:
	AppSettings(const char* mimeType, const char* printer = NULL);
	
	const char* GetMimeType() const      { return fMimeType.String(); }
	bool UsesDefaultPrinter() const      { return fMimeType.Length() == 0; }
	const char* GetPrinter() const       { return fPrinter.String(); }
	void SetPrinter(const char* printer) { fPrinter = printer; }
	void SetDefaultPrinter()             { fPrinter = ""; }	
};


class PrinterSettings {
private:
	BString  fPrinter;
	BMessage fPageSettings; // default page settings
	BMessage fJobSettings;  // default job settings

public:
	PrinterSettings(const char* printer, BMessage* pageSettings = NULL, BMessage* jobSettings = NULL);
	
	const char* GetPrinter() const       { return fPrinter.String(); }
	BMessage* GetPageSettings()          { return &fPageSettings; }
	BMessage* GetJobSettings()           { return &fJobSettings; }

	void SetPrinter(const char* p)       { fPrinter = p; }
	void SetPageSettings(BMessage* s)    { fPageSettings = *s; }
	void SetJobSettings(BMessage* s)     { fJobSettings = *s; }
};

class Settings {
private:
	BObjectList<AppSettings>     fApps;
	BObjectList<PrinterSettings> fPrinters;
	bool                         fUseConfigWindow;
	BRect                        fConfigWindowFrame;
	BString                      fDefaultPrinter;
	
	static Settings* sSingleton;
	Settings();
	
public:
	static Settings* GetSettings();
	~Settings();
	
	int AppSettingsCount() const           { return fApps.CountItems(); }
	AppSettings* AppSettingsAt(int i)      { return fApps.ItemAt(i); }
	void AddAppSettings(AppSettings* s)    { fApps.AddItem(s); }
	void RemoveAppSettings(int i);
	AppSettings* FindAppSettings(const char* mimeType);
		
	int PrinterSettingsCount() const            { return fPrinters.CountItems(); }
	PrinterSettings* PrinterSettingsAt(int i)   { return fPrinters.ItemAt(i); }
	void AddPrinterSettings(PrinterSettings* s) { fPrinters.AddItem(s); }
	void RemovePrinterSettings(int i);
	PrinterSettings* FindPrinterSettings(const char* printer);
	
	bool UseConfigWindow() const          { return fUseConfigWindow; }
	void SetUseConfigWindow(bool b)       { fUseConfigWindow = b; }
	BRect ConfigWindowFrame() const       { return fConfigWindowFrame; }
	void SetConfigWindowFrame(BRect r)    { fConfigWindowFrame = r; }	
	const char* DefaultPrinter() const    { return fDefaultPrinter.String(); }
	void SetDefaultPrinter(const char* n) { fDefaultPrinter = n; }	
		
	void Save(BFile* settings_file);
	void Load(BFile* settings_file);
};

#endif