/*

    Copyright (C) 2000-2001 Stefan Westerfeld
                                stefan@space.twc.de
                  2001-2003 Matthias Kretz
                            kretz@kde.org
                  2002-2003 Arnold Krille
                            arnold@arnoldarts.de

     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
     License as published by the Free Software Foundation; either
     version 2 of the License, or (at your option) any later version.

     This library 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
     Library General Public License for more details.

     You should have received a copy of the GNU Library General Public License
     along with this library; see the file COPYING.LIB.  If not, write to
     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     Boston, MA 02110-1301, USA.

*/

/*
* DISCLAIMER: The interfaces in artsmodules.idl (and the derived .cpp/.h files)
*             DO NOT GUARANTEE BINARY COMPATIBILITY YET.
*
* They are intended for developers. You shouldn't expect that applications in
* binary form will be fully compatibile with further releases of these
* interfaces.
*/

#include <artsgui.idl>
#include <artsflow.idl>
#include <artsmidi.idl>

#include <artsmodulessynth.idl>

module Arts {

module Environment {
	interface Context {
		void addEntry(string name, object obj);
		string lookupEntry(object obj);
		void removeEntry(object obj);
	};

	interface Item;

	interface Container {
		attribute string dataDirectory;
		attribute Context context;
		readonly attribute sequence<Item> items;

		sequence<string> saveToList();
		void loadFromList(sequence<string> strlist);

		void addItem(Item item);
		Item createItem(string name);
		void removeItem(Item item);
	};

	interface Item {
		/**
		 * true if item resides inside a container
		 */
		readonly attribute boolean active;

		/**
		 * the container the item lives in
		 */
		readonly attribute Container parent;

		/**
		 * called by the container to insert/remove item from/to the
		 * environment
		 */
		void setContainer(Container container);

		/**
		 * called by the container to save the item
		 */
		sequence<string> saveToList();

		/**
		 * called by the container to restore the item
		 */
		void loadFromList(sequence<string> strlist);
	};

	interface InstrumentItem : Item {
		readonly attribute Arts::MidiPort port;
		attribute string filename;
		attribute string busname;
	};

	interface InstrumentItemGuiFactory : Arts::GuiFactory {
	};

	interface StereoEffectItem : Item {
		attribute Arts::SynthModule effect;
		attribute Arts::StereoEffectStack stack;
	};

	interface MixerChannel : Arts::StereoEffect {
		attribute string name;
	};

	interface MixerItem : Item {
		readonly attribute sequence<MixerChannel> channels;
		attribute long channelCount;
		attribute string name;
		attribute string type;
	};

	interface EffectRackItem : Item {
		Arts::StereoEffect createEffect( string type, string name );
		void delEffect( long pos );
		void routeToMaster( long pos, boolean tomaster );
		readonly attribute sequence<Arts::StereoEffect> effects;
		readonly attribute long effectCount;
		attribute string name;
	};

};

interface MixerItemGui {
	/*writeonly*/ attribute boolean active;
	/*writeonly*/ attribute long channelCount;
	/*writeonly*/ attribute string type;
	// builds a MixerItemGui for a specific MixerItem (call this exactly once)
	Widget initialize(Environment::MixerItem item);
};

interface EffectRackSlot;

interface EffectRackItemGui {
	void removeSlot( EffectRackSlot slot );
	void routeToMaster( EffectRackSlot slot, boolean tomaster );

	attribute boolean active;
	attribute string type;
	/*writeonly*/ attribute boolean addeffect;

	// builds a EffectRackItemGui for a specific EffectRackItem (call this exactly once)
	Widget initialize(Environment::EffectRackItem item);
};

interface EffectRackSlot {
	void constructor( Widget parent, Widget effect, EffectRackItemGui effectrackgui );
	/*writeonly*/ attribute boolean removeslot;
	/*writeonly*/ attribute boolean tomaster;
};

// creates: Environment::MixerItem, SimpleMixerChannel
interface MixerGuiFactory : GuiFactory {
};

// creates: Environment::EffectRackItem
interface EffectRackGuiFactory : GuiFactory {
};

};

