//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================

#pragma once

// Include this here so warnings are disabled for VGUI1 code as well.
#include "Platform.h"

// If you are going to add stuff to the vgui core...
//
// Keep it simple.
//
// Never put code in a header.
//
// The name of the class is the name of the the file
//
// Each class gets its own .cpp file for its definition and a .h for its header. Helper
// classes can be used but only within the .cpp and not referenceable from anywhere else.
//
// Don't add unneeded files. Keep the API clean.
//
// No platform specific code in vgui\lib-src\vgui dir. Code in vgui\lib-src\vgui should
// only include from vgui\include or standard C includes. ie, if I see windows.h included
// anywhere but vgui\lib-src\win32 I will hunt you down and kill you. Don't give me any crap
// that mfc is platform inspecific.
//
// Always use <> and not "" for includes
//
// Use minimum dependencies in headers. Don't include another header if you can get away
// with forward declaring (which is usually the case)
//
// No macros in headers. They are tools of satan. This also means no use of DEFINEs, use enum
//
// Minimize global functions
//
// No global variables.
//
// Panel is getting pretty plump, try and avoid adding junk to it if you can

// TODO: Look and Feel support
//		add Panel::setPaintProxy, if _paintProxy exists, it calls _paintProxy->paint
//		instead of Panel::paint. Components should implement their painting in a seperate
//       plugin class. Perhaps to encourage this, Panel::paint should just go away completely
//       The other option is to have Panel have the interface Paintable
//       class Paintable
//       {
//       public:
//			virtual void paint()=0;
//       };
//       Then a component can implement its paint in the class itself and then call
//		setPaintProxy(this). If this is the case _paintProxy->paint should always be called
//       and never Panel::paint from within paintTraverse
// TODO: Figure out the 'Valve' Look and Feel and implement that instead of a the Java one
// TODO: Determine ownership policy for Borders, Layouts, etc..
// TODO: tooltips support
// TODO: ComboKey (hot key support)
// TODO: add Background.cpp, remove paintBackground from all components
//		Panel implements setBackground, Panel::paintBackground calls _background->paintBackground
//		similiar to the way Border works.
// TODO: Builtin components should never overide paintBackground, only paint
// TODO: All protected members should be converted to private
// TODO: All member variables should be moved to the top of the class prototype
// TODO: All private methods should be prepended with private
// TODO: Use of word internal in method names is not consistent and confusing
// TODO: Cleanup so bullshit publics are properly named, maybe even figure out
//       a naming convention for them
// TODO: Breakup InputSignal into logical pieces
// TODO: Button is in a state of disarray, it should have ButtonModel support
// TODO: get rid of all the stupid strdup laziness, convert to vgui_strdup
// TODO: actually figure out policy on String and implement it consistently
// TODO: implement createLayoutInfo for other Layouts than need it
// TODO: BorderLayout should have option for a null LayoutInfo defaulting to center
// TODO: SurfaceBase should go away, put it in Surface
// TODO: ActionSignals and other Signals should just set a flag when they fire.
//		then App can come along later and fire all the signals
// TODO: Change all method naming to starting with a capital letter.

#ifdef WIN32
#define VGUIAPI __declspec(dllexport)
#else
#define VGUIAPI __attribute__((visibility("default")))
#include <sys/types.h> // size_t define
#endif

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;

namespace vgui
{

VGUIAPI void vgui_setMalloc(void* (*malloc)(size_t size));
VGUIAPI void vgui_setFree(void (*free)(void* memblock));
VGUIAPI void vgui_strcpy(char* dst, int dstLen, const char* src);
VGUIAPI char* vgui_strdup(const char* src);
VGUIAPI int vgui_printf(const char* format, ...);
VGUIAPI int vgui_dprintf(const char* format, ...);
VGUIAPI int vgui_dprintf2(const char* format, ...);

}
