text: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  #include						"elektroexp.h"
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  //	SELECT.CPP					(c)	YoY'01						WEB: www.aestesis.org
  //
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  #include						<stdio.h>
  #include						"select.h"
  #include						"interface.h"
  #include						"resource.h"
  #include						"effect.h"
  #include						"elektro.h"
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL ACI						Aselect::CI=ACI("Aselect", GUID(0xE4EC7600,0x00010060), &AcontrolObj::CI, 0, NULL);
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL Aselect::Aselect(QIID qiid, char *name, Aobject *L, int x, int y, int nx, int ny, Aresobj *o, int ow, int oh, int ddflag, char *text) : AcontrolObj(name, L, x, y, 4, 4)
  {
  	Aeffect	*ef=Aeffect::getEffect(L);
  	this->ddflag=ddflag;
  	if(ef)
  		control=new Acontrol(qiid, name, ef, this, Acontrol::KEY_01+(nx*ny)-1);
  	else
  		control=new Acontrol(qiid, name, Atable::getTable(this), this, Acontrol::KEY_01+(nx*ny)-1);
  	bmp=new Abitmap(o);
  	this->ow=ow;
  	this->oh=oh;
  	this->nx=nx;
  	this->ny=ny;
  	size(nx*(ow+2)-2, ny*(oh+2)-2);
  	over=-1;
  	set(0);
  	defvalue=-1;
  	ctrlPaint=false;
  	this->text=null;
  	if(text)
  		this->text=strdup(text);
  	timer(CTRLTIMEREPAINT);
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL Aselect::Aselect(QIID qiid, char *name, Aobject *L, int x, int y, int nx, int ny, Abitmap *b, int ow, int oh, int ddflag, char *text) : AcontrolObj(name, L, x, y, 4, 4)
  {
  	Aeffect	*ef=Aeffect::getEffect(L);
  	this->ddflag=ddflag;
  	if(ef)
  		control=new Acontrol(qiid, name, ef, this, Acontrol::KEY_01+(nx*ny)-1);
  	else
  		control=new Acontrol(qiid, name, Atable::getTable(this), this, Acontrol::KEY_01+(nx*ny)-1);
  	bmp=new Abitmap(b->w, b->h);
  	bmp->set(0, 0, b, bitmapDEFAULT, bitmapDEFAULT);
  	this->ow=ow;
  	this->oh=oh;
  	this->nx=nx;
  	this->ny=ny;
  	size(nx*(ow+2)-2, ny*(oh+2)-2);
  	over=-1;
  	set(0);
  	defvalue=-1;
  	ctrlPaint=false;
  	this->text=null;
  	if(text)
  		this->text=strdup(text);
  	timer(CTRLTIMEREPAINT);
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL Aselect::~Aselect()
  {
  	delete(control);
  	if(bmp)
  		delete(bmp);
  	if(text)
  		free(text);
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL bool Aselect::keyboard(int event, int ascii, int scan, int state)
  {
  	switch(event)
  	{
  		case keyboardDOWN:
  		if(state&keyboardALT)
  		{
  			if(defvalue!=-1)
  				set(defvalue);
  			else
  				set(0);
  			father->notify(this, nyCHANGE, press);
  			return true;
  		}
  		break;
  	}
  	return false;
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL bool Aselect::mouse(int x, int y, int state, int event)
  {
  	switch(event)
  	{
  		case mouseLDOWN:
  		control->select();
  		mouseCapture(true);
  		{
  			int vx=x/(ow+2);
  			int	vy=y/(oh+2);
  			int	n=vy*nx+vx;
  			if(n!=over)
  			{
  				over=n;
  				repaint();
  			}
  		}
  		return true;
  
  		case mouseNORMAL:
  		cursor(cursorHANDSEL);
  		focus(this);
  		if(getKeyboardState()&keyboardLALT)
  		{
  			if(defvalue!=-1)
  				set(defvalue);
  			else
  				set(0);
  			father->notify(this, nyCHANGE);
  			return true;
  		}
  		if(!(state&mouseL))
  		{
  			int vx=x/(ow+2);
  			int	vy=y/(oh+2);
  			int	n=vy*nx+vx;
  			if(n!=over)
  			{
  				over=n;
  				repaint();
  			}
  		}
  		return true;
  
  		case mouseLUP:
  		mouseCapture(false);
  		if(press!=over)
  		{
  			press=over;
  			control->set(Acontrol::KEY, (float)press);
  			father->notify(this, nyCHANGE, press);
  			repaint();
  		}
  		return TRUE;
  
  		case mouseLEAVE:
  		over=-1;
  		repaint();
  		return true;
  	}
  	return FALSE;
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL void Aselect::change(Abitmap *b)
  {
  	bmp->set(0, 0, b, bitmapDEFAULT, bitmapDEFAULT);
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL void Aselect::change(int nx, int ny)
  {
  	this->nx=nx;
  	this->ny=ny;
  	size(nx*(ow+2)-2, ny*(oh+2)-2);
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL void Aselect::set(int n)
  {
  	press=n%(nx*ny);
  	if(defvalue==-1)
  		defvalue=press;
  	control->set(Acontrol::KEY_01, (float)press);
  	repaint();
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL int Aselect::get()
  {
  	return press;
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL bool Aselect::sequence(int nctrl, float value)
  {
  	press=(int)value;
  	father->notify(this, nyCHANGE, press);
  	ctrlPaint=true;
  	return true;
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL void Aselect::pulse()
  {
  	if(ctrlPaint)
  	{
  		repaint();
  		ctrlPaint=false;
  	}
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL void Aselect::paint(Abitmap *bitmap)
  {
  	if(bmp)
  	{
  		int		n=0;
  		int		i,j;
  		int		max=bmp->h/oh;
  		char	tt[1024];
  		if(text)
  			strcpy(tt, text);
  		char	*s=tt;
  
  		for(j=0; j<ny; j++)
  		{
  			for(i=0; i<nx; i++)
  			{
  				int	nn=(press==n)?2:((over==n)?1:0);
  				if(text)
  				{
  					Afont	*f=alib.getFont(fontTERMINAL06);
  					int		x=((i+1)*(ow+2)-2)-ow;
  					int		y=((j+1)*(oh+2)-2)-oh;
  					bitmap->set(x, y, nn*ow, 0, ow, oh, bmp, bitmapDEFAULT, bitmapDEFAULT);
  					if(*s)
  					{
  						char	*str=s;
  						while(*s&&(*s!=','))
  							s++;
  						if(*str)
  						{
  							*(s++)=0;
  							Arectangle r=f->getRectangle(0, 0, str);
  							f->set(bitmap, 1+x+(ow-r.w)/2, 1+y+(oh-r.h)/2, str, 0xff000000); 
  						}
  					}
  					n++;
  				}
  				else
  				{
  					bitmap->set(((i+1)*(ow+2)-2)-ow, ((j+1)*(oh+2)-2)-oh, nn*ow, n*oh, ow, oh, bmp, bitmapDEFAULT, bitmapDEFAULT);
  					n++;
  					if(n>=max)
  					{
  						controlPaint(bitmap, pos.w, pos.h);
  						return;
  					}
  				}
  			}
  		}
  	}
  	controlPaint(bitmap, pos.w, pos.h);
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  EDLL bool Aselect::dragdrop(int x, int y, int state, int event, void *data)
  {
  	switch(event)
  	{
  		case dragdropENTER:
  		case dragdropOVER:
  		if((state&dragdropFILE)&&(ddflag&&dragdropFILE))
  			return true;
  		if((state&dragdropTEXT)&&(ddflag&&dragdropTEXT))
  			return true;
  		break;
  
  		case dragdropDROP:
  		if(((state&dragdropFILE)&&(ddflag&&dragdropFILE))||((state&dragdropTEXT)&&(ddflag&&dragdropTEXT)))
  		{
  			SelectDragDrop	sdd;
  			int vx=x/(ow+2);
  			int	vy=y/(oh+2);
  			sdd.n=vy*nx+vx;
  			sdd.state=state;
  			sdd.event=event;
  			sdd.data=data;
  			return father->notify(this, nySELECTDROP, (dword)&sdd);
  		}
  		break;		
  	}
  	return false;
  }
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  