


#include "misc.h"
#include "proc.h"

extern SearchBox 	*search_box;
extern bool 	flag_show_thread;	
extern int 		flag_thread_ok;
extern bool 	flag_devel;

#include "./icon/x1.xpm" 
#include "./icon/x2.xpm" 


#include <stdio.h>
#include <time.h>
#include <errno.h>


// 300% faster than glibc (by fasthyun@magicn.com) 
int x_atoi(const char *sstr)
{
	register const char *str=sstr;
	register int val=0;
	while(*str)
	{
		val*=10;
		val+=*str-48;
		str++;
	}
	return val;
}

#include <QApplication>
QWidget * getQpsWidget()
{
	QWidgetList list=QApplication::topLevelWidgets();
	for (int i = 0; i < list.size(); ++i) {
		QWidget *w=list.at(i);
     	if (w->objectName() == "qps")
	 		return w;
    }
	return 0;
}


#include <stdarg.h>
#include <string.h>
/* 
  ver 0.2
  A simplified vsscanf implementation from Internet
  
  %S can read  char_string_has_spaces. 
  	ex. "(%S)" ==  (foo bar) or (foo bar )
 
  
  %s %d %ld %u %x? %lu %*s %f  
  %S: (%S)    
 
  Only recognizes %s %f,%d, %u, %ld, %lu, %lg and  whitespace. ...terminates scanning.
  space* same tab*
 
 */

// Description:
//   	mini_sscanf() == strstr() + sscanf() + %S 
// 
//  there is test_sample_code in init_misc()
// 	fixed : invalid conversion from ‘const char*’ to ‘char*’ 
//
// TOO COMPLEX !!!!!!  -> simple code 
char *strchar(const char *s,int k);
int mini_sscanf(const char *s1,const char *fmt, ...)
{

	va_list va; 
	va_start(va,fmt);
	char *s=(char*)s1; // *** for gcc 4.4 
	char *p;
	int k=0; // count 
	while (*fmt and *s) 	//	if (*fmt==0 or *s==0) break;
	{
		if (*fmt=='%')
		{
			int n;
			if (fmt[1]=='S')
			{
				//if(fmt[2]!=0)
				p=strchr(s,fmt[2]); //get the token
				int len=p-s;
				p=va_arg(va,char*);
				strncpy(p,s,len);
				p[len]=0;
				s+=len+1; fmt+=3; k++;
			}
			else if (fmt[1]=='s')  // extract string
			{
				//printf("%s : %%s =%s \n",__FUNCTION__,s);
				k+=sscanf(s,"%s%n",va_arg(va,char *),&n);
				s+=n; fmt+=2;
			}
			else if (fmt[1]=='*' && fmt[2]=='s') // skip
			{
				p=strchr(s,' '); //0x20,0x00,0x0A, 123 435 54054
				if(p==0) 
				{
				//	printf("%s : %c [%s] \n",__FUNCTION__,fmt[1],s);
					break; 
				}
				s=p; fmt+=3; 
			}
			else if (fmt[1]=='c')
			{
				p=va_arg(va,char*);
			//	printf("%s : %c [%c] \n",__FUNCTION__,fmt[1],*s);
				*p=*s;
				s++; k++; fmt+=2;
			}
			else if (fmt[1]=='f')
			{
				k+=sscanf(s,"%f%n",va_arg(va,float*),&n);
				s+=n; fmt+=2;
			}
			else if (fmt[1]=='d')
			{
				k+=sscanf(s,"%d%n",va_arg(va,int*),&n);
				s+=n; fmt+=2;
			}
			else if (fmt[1]=='u')
			{
				k+=sscanf(s,"%u%n",va_arg(va,int*),&n);
				s+=n; fmt+=2;
			}
			else if (fmt[1]=='l' && fmt[2]=='d')
			{
				k+=sscanf(s,"%ld%n",va_arg(va,long*),&n);
				s+=n; fmt+=3;
			}
			else if (fmt[1]=='l' && fmt[2]=='u')
			{
				k+=sscanf(s,"%lu%n",va_arg(va,long*),&n);
				s+=n; fmt+=3;
			}
			else if (fmt[1]=='l' && fmt[2]=='g')
			{
				k+=sscanf(s,"%lg%n",va_arg(va,double*),&n);
				s+=n; fmt+=3;
			}
			else
			{
				printf("%s: unsupported"" format '%c'",__FUNCTION__,fmt[1]);
				break;
			}
		}
		else
		{
			if (isspace(*fmt)) // isblank
			{
				while (isspace(*s)) s++;
				fmt++;
			}
			else 
			{ 
				char sstr[32];
				int n=strcspn(fmt," %\n"); // find delimiters noSEGFAULT
				strncpy(sstr,fmt,n); sstr[n]=0;
				p=strstr(s,sstr);
				if(p==0) 
				{
					if(0 and flag_devel) printf("%s : can't found [%s] in %s\n",__FUNCTION__,sstr,s);
					break;
				}
				s=p+n;
				fmt+=n;
				// ddd at %s, at%s
				// printf("opp_vsscanf: unexpected ""char in format '%s'",fmt);
				//break;
				//return k;
			}
		}
		
		if (*fmt=='\0' || *fmt=='#' or *s==0)
			break;
	}
	va_end(va);
	return k;
}

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

// return /proc/* file size 
int fsize(char *fname)
{
	int size=0;
	if(0)
	{
		// !!! important !! not works with [/proc] , because [/proc/*] always zero
		int fd = open(fname, O_RDONLY);
		if(fd < 0) return -1;
		size=lseek(fd,0, SEEK_END);
		printf("size=%d\n",size);
		close(fd);
		return size;
	}
	
	int buf[1024];
	int r;
	int fd = open(fname, O_RDONLY);
	if(fd < 0) return -1;
	do{
		r = read(fd, buf, 1024);
		size+=r;
	//	printf("r_size=%d\n",size);
	} while(r);
	// printf("size=%d\n",size);
	close(fd);
	return size;
}

// sleep for mili seconds
void msleep(long msec)
{
#ifdef LINUX
	timespec req,remain;
	timeval tv;
	req.tv_sec=0;
	req.tv_nsec=msec*1000000;
	//int  	nanosleep(const struct timespec *req, struct timespec *remain)
	/*while (nanosleep(&req, &req))
	{
		if (errno != EINTR)
			break;
	} */

	tv.tv_sec=0;
	tv.tv_usec=msec*1000;                
	select(0,NULL,NULL,NULL,&tv);
	return;
#endif

}

void mem_string_k(int kbytes, char *buf)
{
	if(kbytes >= 1024) {
		int mb = kbytes >> 10;
		if(mb >= 1024*100)
			sprintf(buf, "%uGB", mb >> 10);
		else
			sprintf(buf, "%uMB", mb);
	} else
		sprintf(buf, "%uKB", kbytes);
}
void mem_string(int kbytes, char *buf)
{
	if(kbytes >= 1024) {
		int meg = kbytes >> 10;
		if(meg >= 1024*100)
			sprintf(buf, "%uGb", meg >> 10);
		else
			sprintf(buf, "%uMb", meg);
	} else
		sprintf(buf, "%uKb", kbytes);
}


//DEL
CheckMenu::CheckMenu(QWidget *parent)
          : QMenu(parent)
{}


// ???
CrossBox::CrossBox(const char *text, QWidget *parent)
         : QCheckBox(text, parent)
{
}

void CrossBox::drawButton(QPainter *p)
{ 
	/////	QCheckBox::drawButton(p);
}

TBloon::TBloon(QWidget *parent):QLabel(parent)
{ 
	
	return;
	paren=parent;
	setStyleSheet(  "QLabel { "    
				//"border-width: 1px; border-style: solid;  border-color: rgb(150,45,100); border-radius: 5px ;"
				"border-width: 1px; border-style: solid;  border-color: rgb(150,180,180); border-radius: 5px ;"
				"background-color : rgba(0,0,0,48%); padding: 3px; color: rgb(255,120,60); }");
// COLOR orange FF5d00
	
	setText(" This is unstable Alpha feature\n You maybe see a SEGFAULT...");
	resize(sizeHint());
//	parent->installEventFilter(this);
//	parent->setMouseTracking(true);
	hide();
	
 // Construct a 1-second timeline with a frame range of 0 - 100
 	timeLine = new QTimeLine(100000, this);
 	timeLine->setFrameRange(0, 20000);
	timeLine->setCurveShape ( QTimeLine::EaseOutCurve	);
 //	timeLine->set(0, 20000);
	connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(update(int)));
}

/*
void TBloon::start_ani()
{

} */

void TBloon::update(int val)
{
	//`QPoint p=QCursor::pos();
	//qDebug("pos %d %d", p.x(),p.y());
	QPoint p2=paren->mapFromGlobal(QCursor::pos());

	//qDebug("wpos %d %d", p2.x(),p2.y());
	int tx=p2.x();
	int ty=p2.y();
	int sx=pos().x();
	int sy=pos().y();
	float dx=tx-sx;
	float dy=ty-sy;
	dx=dx/1.35;
	dy=dy/1.35;
	move(tx+dx+8,ty+dy+14);
}

bool TBloon::eventFilter(QObject *obj, QEvent *event)
{
	if (event->type() ==QEvent::Enter) {
		QPoint p=paren->mapFromGlobal(QCursor::pos());
		move(p);
	//	qDebug("Enter parent");
		timeLine->start();
		show();
		return true;

	}else if (event->type() ==QEvent::Leave) {
	//	qDebug("Leave parent");
		timeLine->stop();
		hide();
		return true;
	}
	else if (event->type() == QEvent::MouseMove) {
		QMouseEvent *me = static_cast<QMouseEvent *>(event);	
	//	qDebug("Ate key press %d %d", me->x(),me->y());
	//	move(me->x()+5,me->y()+4);
		return false;
	} else {
		// standard event processing
		return QObject::eventFilter(obj, event);
	}
}

/*
void TBloon::paintEvent(  QPaintEvent * event ) 
{
	QLabel::paintEvent(event);
} */

TFrame::TFrame(QWidget *parent):QLabel(parent)
//TFrame::TFrame(QWidget *parent):QFrame(parent)
{
	text="this is Tframe widget";
	//setAutoFillBackground(false);
	//setGeometry(50,50,100,100);
	//setAttribute(Qt::WA_OpaquePaintEvent);
	//setFrameShape(QFrame::StyledPanel);
	//setFrameShadow(QFrame::Sunken);
	//setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
	//setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
	//setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);
	//setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

	//"border-width: 1px; border-style: solid;  border-color: rgb(150,45,100); border-radius: 5px ;"
 	setStyleSheet(  "QLabel { " "border-width: 1px; border-style: solid;  border-color: rgb(210,50,130); border-radius: 5px ;" "background-color : rgba(0,0,0,69%); padding: 3px; color: rgb(0,255,150); }");
// 	setStyleSheet(  "QLabel { " "border-width: 1px; border-style: solid;  border-radius: 5px ; padding: 3px; }");
	hide();

	timeLine = new QTimeLine(2000, this);
 	timeLine->setFrameRange(0, 100);
 	connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(setValue(int)));
}


/*
void TFrame::showText(QPoint glob_pos,QString str)
{


}


void TFrame::move(int x,int y)
{


} */

// QToolTip::showText(e->globalPos(), s);
void TFrame::showText(QPoint glob_pos,QString str)
{

}

void TFrame::setText(QString str)
{
	text=str;

	QLabel::setText(str);

	//resize(minimumSizeHint());
	resize(sizeHint()); // **** before show !!  *****

	if(str.size()==0) 
	{
		hide();
		return;
	}
	show();
}

// to avoid ~
void TFrame::draw( QPainter &p )
{
//	if(!isVisible()) 	return;
	return;	
	int h=fontMetrics ().height() + 3;
	int w=fontMetrics ().width(text) + 9;
	setFixedSize(w,h);
//	QFont font("Adobe Helvetica"); // helvetica & No-Antialias
// 	font.setPixelSize(10);
//	setFont(font);
//	p.drawRoundRect(rect(),10,10);
//	p.fillRect ( cr,QColor(0,0,0));
	QColor bg=QColor(0,0,0,120);
#if QT_VERSION < 0x040400 	
	p.fillRect(rect(),QColor(0,0,0,120));
#else
	//p.fillRect(rect(),QColor(0,0,0,90));
  	
//	p.setPen(QColor(0,255,155)); // less visually obtrusive than black
//	p.setBrush(QBrush(bg));
//	p.drawRoundedRect(0,0,w,h, 4, 4);
	p.fillRect(rect(),bg);

#endif
    
	p.setPen(QColor(0,255,155)); // less visually obtrusive than black
	p.drawText(0, 0,w, h, Qt::AlignVCenter | Qt::AlignHCenter,text);
}

void TFrame::setPos()
{
	QWidget *parent= QWidget::parentWidget ();
	
	QPoint p=parent->mapFromGlobal(QCursor::pos());

	setPos(p.x(),p.y());
}

void TFrame::setPos(int x,int y)
{
	QWidget *parent= QWidget::parentWidget ();
	int pwidth=parent->width();
	
	if(width()+x > pwidth)
	{
		x=pwidth - width();
	}	
	move(x+16,y+4);
}

void TFrame::moveEvent (QMoveEvent * e ) 
{
	//int x=e->pos().x();
	//printf("pos (%d %d) \n",e->pos().x(),e->pos().y()); 
	//event->oldPos();
}

void TFrame::setValue(int	val)
{
	opacity+=((float)val/100);
	update();
}

void TFrame::showEvent ( QShowEvent * event )
{
	opacity=0.2;
//	timeLine->start(); 
}

// Maybe SEGFAULT
void setPaletteBlend(QPalette &p)
{
	for(int i=0; i<	(QPalette::NoRole)	;i++)
	{
		QColor c=p.color(QPalette::ColorRole(i));
		c.alpha();
	}
}

void TFrame::paintEvent(  QPaintEvent * event ) 
{
	QLabel::paintEvent(event);
	return;

	QCursor::pos();
//	if(x()+width() >  ) ;
	QPalette np=palette();
	setPaletteBlend(np);
		
	QPainter p(this);  // why?

//	if(opacity>1) timeLine->stop(); //
//	p.setOpacity(opacity);
//	p.setOpacity(0.01);
//	setWindowOpacity (0.1 );
//	QFrame::paintEvent(event);
//    p.scale(0.5,0.5);
	
	//draw(p);
	//p.setBackgroundMode (Qt::TransparentMode);
    //p.setRenderHint(QPainter::Antialiasing);
    //painter.translate(width() / 2, height() / 2);
}

UFrame::UFrame(QWidget *parent):QFrame(parent)
//TFrame::TFrame(QWidget *parent):QFrame(parent)
{
//	setAttribute(Qt::WA_OpaquePaintEvent);
//	setFrameShape(QFrame::StyledPanel);
//	setFrameShadow(QFrame::Sunken);
//	setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);

						//"border-width: 1px; border-style: solid;  border-color: rgb(150,45,100); border-radius: 5px ;"

//setStyleSheet(  "QLabel { "   "border-width: 1px; border-style: solid;  border-color: rgb(210,50,130); border-radius: 5px ;" "background-color : rgba(0,0,0,70%); padding: 3px; color: rgb(0,255,150); }");
	hide();
		
	QVBoxLayout *vlayout = new QVBoxLayout;
	QLabel *label=new QLabel("title");	
	vlayout->addWidget(label);
	
	setLayout(vlayout);
	QWidget *qps=getQpsWidget();
	if(qps)
	{
		int w=qps->width();
		int h= qps->height();
		printf("qps w=%d h=%d\n",qps->width(),qps->height());
		move(w/2,h/2);
	}

}

FaderWidget::FaderWidget(QWidget *parent) : QWidget(parent)
{
	if (parent)
		startBrush = parent->palette().window();
	else
		startBrush = Qt::white;

	timeLine = new QTimeLine(333, this);
	timeLine->setFrameRange(1000, 0);
	connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(update()));

	setAttribute(Qt::WA_DeleteOnClose);
	resize(parent->size());
}


void FaderWidget::start()
{
	timeLine->start();
	show();
}


void FaderWidget::paintEvent(QPaintEvent * /* event */)
{
	QPainter painter(this);
	qreal frame = timeLine->currentFrame();
	painter.setOpacity(frame / 1000.);
	painter.fillRect(rect(), startBrush);

	if (frame <= 0.)
		close();
}


void UFrame::setTitle(QString str)
{
	//	QLabel::setText(str);
	title=str;
}


void UFrame::paintEvent(  QPaintEvent * event ) 
{

}
/*
//void SearchBox::event_cursor_moved(QMouseEvent *e)
{
	move(e->x(),e->y());
	//printf("xxxxxxxxxxxxxk\n");
}

*/

QPixmap *letters;
int pf_height=9;
int pf_width=6;

void init_xpm()
{
	letters=new QPixmap(":/icon/letters.png");
	pf_height=9;
	pf_width=6;
}

#ifdef LINUX
#include <sys/prctl.h>
#include <QThread>
char strong_buff[128];
class MyThread : public QThread
 {
 public:
     void run()
 	{
		prctl(PR_SET_NAME, "thread_test123456789"); 
		
		while(true)
		{
			int m=0;
			for(int i=0;i<20000;i++)
			{
				int p=rand()%120;
				strong_buff[p]=p;
			}
			msleep(40);
		}
     	exec();
 	}
};
class MyThread2 : public QThread
 {
 public:
     void run()
 	{
		prctl(PR_SET_NAME, "thread_test987654321"); 
		
		while(true)
		{
			int m=0;
			int i;
			for(i=0;i<100000;i++)
			{
				int p=rand()%120;
				//strong_buff[p]=p;
				m=i*p;
			}
			m+=i;
			msleep(60);
		}
     	exec();
 	}
};
#endif 

int  pf_str_width(char *str)
{
	int len;
	len=strlen(str)*pf_width;
	return len;
}
int  pf_char_height()
{
	return pf_height;
}

int pf_write(QPainter *p,int x,int y,const char *str)
{
	int i,len,n;
	int ch;
	int sx,sy;
	int x0=x;
	len=strlen(str);
	for(i=0;i<len;i++)
	{
		ch=str[i];
		
		if(ch=='\n')
		{
			//y+=pf_height;
			continue;
		}
		//if(ch>96) ch-=(97-65);
		n=ch-32;		
		p->drawPixmap ( x ,  y, *letters, n*pf_width , 0 , pf_width+1, pf_height);
		x+=pf_width;
	}
	return x-x0;
}


QPixmap *x1,*x2;
XButton::XButton(QWidget *parent):QAbstractButton(parent)
{
	setFocusPolicy(Qt::NoFocus);
	x1=new QPixmap( (const char**)x1_xpm);
	x2=new QPixmap( (const char**)x2_xpm);
	int w=x1->width();
	setGeometry(0,0,w,w);
}


void XButton::resizeEvent(QResizeEvent *p)
{
	int i,h;
	i=height()%2;

	if(i!=0)
		h=height()+1;
	else h=height();	
	setFixedSize(h,h);
}

void XButton::paintEvent(  QPaintEvent * event ) 
{ 
	QPainter p(this);
	int w,h,m;

	if(isDown())
		p.drawPixmap(0,0,*x2);	
	else	p.drawPixmap(0,0,*x1);

	return;
}

SearchBox::SearchBox(QWidget *parent):QLineEdit(parent)
{
	setToolTip("PID,COMMAND,USER..." );
	left_time=0;
	setMaximumWidth (300) ;
	setMinimumWidth (20) ;

//	setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
//	setContentsMargins(0,3,1,0);
//	setLineWidth( 1 );
//	setMargin(2);
	xb=new XButton(this);
	connect(xb, SIGNAL(clicked()), SLOT(event_xbutton_clicked()));
	setFocus (Qt::ActiveWindowFocusReason  ); //good
}

void SearchBox::event_cursor_moved(QMouseEvent *e)
{
	move(e->x(),e->y());
}

void SearchBox::resizeEvent(QResizeEvent *p)
{
	int w,h,margin;
	//setMinimumHeight(height()-4);
	//setMaximumHeight(p->size().height()-1);
	//setFixedHeight(p->size().height()-5);
	//setMaximumHeight(height()-2);
	w=width();
	h=height();
	margin=(h - xb->width())/2;
	xb->move(w-h+margin-1,margin);
	return;	
}

void SearchBox::event_xbutton_clicked()
{
	QKeyEvent ke(QEvent::KeyPress,Qt::Key_Escape,0 ); // temp..
	keyPressEvent (&ke );
}

//public
/*void SearchBox::keyPress( QKeyEvent * e )
{

} */

void SearchBox::timerEvent( QTimerEvent *e )
{
 //       qDebug( "timer event, id %d", e->timerId() );
}

LogBox::LogBox( QWidget *p):QLabel(p)
{
	text=new QTextEdit(p);
	text->setFocusPolicy(Qt::NoFocus);
}

// Location: bottom
StatusBar::StatusBar(QWidget *parent)  : QStatusBar(parent)
{
	setSizeGripEnabled (true);
//	QWidget *le = new QLabel(this);//QButton *button = new QButton(this);
//	QLineEdit *le=new QLineEdit(this);


//	showMessage ( const QString & message, int timeout = 0 )	
//	showMessage("aaaaaa");
	label = new QLabel(this);//QButton *button = new QButton(this);
	//label->setText ("") ;
	label->setFrameShape(QFrame::NoFrame);
	//label->setFrameShape (QFrame::StyledPanel);
	//label->setFrameShape (QFrame::Panel);
	//label->setFrameShape (QFrame::WinPanel);
	//label->setFrameShadow(QFrame::Sunken);
//	button2 = new QToolButton(this);//QButton *button = new QButton(this);
//	button2->setTextLabel ("") ;
//	button2->setUsesTextLabel ( true );
//	button2->setAutoRaise(true); 
//	button3 = new QLabel(this);//QButton *button = new QButton(this);
//	button3->setText ("") ;
//	addPermanentWidget(label);
	addWidget(label);
//	addPermanentWidget(le,1);
}

void StatusBar::refresh()
{

}

extern	int num_opened_files;
void StatusBar::update(int total_n)
{
	QString str;
	int 	x=0;
	label->setText("Process count: " + str.setNum(total_n) ) ;
//	button2->setTextLabel ("Network Process(testing): "+ str.setNum(Procinfo::num_network_process));
//	button3->setText ("Opened files : "+ str.setNum(num_opened_files));
}

#include <QHBoxLayout> 

// Pstable or Procview 
// Location : 
QSpacerItem *stretch;
ControlBar::ControlBar(QWidget *parent)  : QFrame(parent)
{
	int h;
	//setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Expanding);
	setFrameStyle(QFrame::NoFrame);
	//setFrameStyle(Panel | Raised);//bad
	//setFrameStyle(Panel ); //bad 
	layout = new QHBoxLayout(this);
	layout->addSpacing(4); //left gap 
	layout->setMargin(0);
	
//	setStyleSheet(" QFrame,QCheckBox,QRadioButton { color: rgb(244, 244, 244);\
	border-image: url(:/icon/vista.png); } "); 
  /*  Frame { background-color: yellow } 
   *  border: 2px solid #8f8f91;
   min-width: 80px; */
	/* image: url(:/icon/vista.png);*/

	b_linear = new QRadioButton("Linear", this);
	b_linear->setFocusPolicy(Qt::NoFocus);

	b_tree = new QRadioButton("Tree", this);
	b_tree->setFocusPolicy(Qt::NoFocus);

	search_box=new SearchBox(this);
	connect(b_linear, SIGNAL(clicked()), SLOT(linear_clicked()));
	connect(b_tree, SIGNAL(clicked()), SLOT(tree_clicked()));
	connect(search_box, SIGNAL(textChanged ( const QString & ) ), SLOT(event_search_box_changed()));
	//search_box->setFocusPolicy(Qt::NoFocus);
	//search_box->setFocus (Qt::ActiveWindowFocusReason);
	//search_box->setFocusProxy ( parent );

	if(flag_thread_ok){
		check_thread=new QCheckBox ("Thread",this);
		check_thread->setFocusPolicy(Qt::NoFocus);
		connect(check_thread, SIGNAL(clicked()), SLOT(show_thread_clicked()));
		check_thread->setChecked (flag_show_thread) ;
	}
	
	view=new QComboBox(this);
	view->insertItem(0,"All Processes", Procview::ALL);
	view->insertItem(1,"Your Processes", Procview::OWNED);
	view->insertItem(2,"Non-Root Processes", Procview::NROOT );
	view->insertItem(3,"Running Processes", Procview::RUNNING);
	connect(view, SIGNAL(activated( int ) ), SLOT(view_changed(int)));
	view->setFocusPolicy(Qt::NoFocus);
	//PAUSED view->insertItem("Hidden Processes", Procview::HIDDEN);

	layout->addWidget( b_linear);
	layout->addWidget( b_tree);
	if(flag_thread_ok)
		layout->addWidget(check_thread);
	layout->addWidget( search_box);
	layout->addWidget( view);

	//stretch=new QSpacerItem(0,0,QSizePolicy::Expanding);
	//layout->addItem(stretch);
	layout->addStretch();
	
	/*
	QPushButton *mb=new QPushButton;
	mb->setContentsMargins(0,0,0,0);
	//mb->setDown(true);
	mb->setCheckable(true);
	mb->setText("pause");
	mb->setFixedWidth(32);
	mb->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
	layout->addWidget(mb);
	*/

     pauseButton = new QToolButton;
     //QPushButton *pauseButton = new QPushButton;
     pauseButton->setCheckable(true);
     pauseButton->setIcon(QIcon(":/icon/pause.png"));
     pauseButton->setIconSize(QSize(19,19));
     pauseButton->setToolTip(tr("Pause (Ctrl+Space)"));
	 pauseButton->setFocusPolicy(Qt::NoFocus);
	 //pauseButton->setFlat(true);
	 pauseButton->setAutoRaise(true);
	 connect(pauseButton, SIGNAL(clicked(bool)), SLOT(setPaused(bool)));
	 
	 layout->addWidget(pauseButton);
	
	 setLayout(layout);
}


void PSTABLE_SETTREEMODE(bool mode);
void ControlBar::setMode(bool treemode) // just.. interface function
{
	b_linear->setChecked(!treemode);
	b_tree->setChecked(treemode);
	
	PSTABLE_SETTREEMODE(treemode);	//	pstable->setTreeMode(treemode);
}

#include <QAction>
void ControlBar::view_changed(int idx)
{
	QAction act(this);
	act.setData(QVariant(idx));
	emit viewChange(&act);
}

extern bool flag_refresh;
void ControlBar::setPaused(bool b)
{
	flag_refresh=!b;
//	if(!pauseButton->isDown()) pauseButton->setDown(true);
}

void ControlBar::linear_clicked()
{
	setMode(FALSE); 
//	emit modeChange(FALSE);
}

void ControlBar::tree_clicked()
{
	setMode(TRUE);
//	emit modeChange(TRUE);
}

void ControlBar::show_thread_clicked()
{
	flag_show_thread=check_thread->isChecked ();
	emit need_refresh();
}

void ControlBar::event_search_box_changed()
{
	//printf("search_box changed!\n");
}

void ControlBar::event_command_pressed()
{
	//printf("command!\n");
}

// not used
void ControlBar::update_bar() // trick for Command 
{

}

// called after resize()
// simplified by fasthyun@magicn.com

extern bool flag_smallscreen;

void ControlBar::resizeEvent(QResizeEvent *e)
{
	return;	
	//QLayoutItem *item=layout->takeAt (layout->count()-1);
	//return;
	if(flag_smallscreen)
	{
		search_box->hide();
     	pauseButton->hide();
	}
	else
	{
		search_box->show();
     	pauseButton->show();
	}



//	printf("size=%d\n",stretch->geometry().width());
	//printf("hsize=%d\n",stretch->sizeHint().height());
	//QSize s=e->size();
	return;
	/*
	if(stretch->geometry().width()==0)
		search_box->hide();
	else 
		search_box->show();
	*/		

	/* setMaximumHeight (b_tree->sizeHint().height()+2);
	search_box->setMaximumHeight(height()-4);
	//search_box->setMinimumHeight(height()-5);
	
	for(i=0;i< commands.size();i++)
	{
		QToolButton *b;
		b=commands[i]->toolbutton;
		if(commands[i]->toolbar==true)
		{
			if (layout->findWidget(b)<0)
				layout->addWidget(b);
			b->show();
		}
		else 
			if(b!=NULL)
				b->hide();
	} */
} 

void ServerAdaptor::accelerate()
{

}

//#include <QtDBus>
//#include <QDBusServer>
//#include <QtDBus/QDBusConnection>
#include <QDBusConnection>
//ServerAdaptor::ServerAdaptor(){ }
//ServerAdaptor::~ServerAdaptor(){}

#define SERVICE_NAME "com.trolltech.qps"
void dbus_register_server()
{
	ServerAdaptor *sv= new ServerAdaptor();
    QDBusConnection connection = QDBusConnection::sessionBus(); //user only??
	//QDBusConnection connection = QDBusConnection::systemBus(); //user only??
   	connection.registerObject("/QPS_OBJ", sv);
    connection.registerService(SERVICE_NAME); // 
}

#include <QtDebug>
void qdbus_client()
{
//	connection.connect ( SERVICE_NAME,"path", "interface","name", QObject * receiver, const char * slot );

	//QDBusConnection conn = QDBusConnection::connectToBus(SERVICE_NAME,"hyun");
	
	QDBusConnection conn = QDBusConnection::sessionBus();  //owner-user only, hang.. blocked !!!

	QDBusReply<QStringList> reply = conn.interface()->registeredServiceNames();
	

	if (!reply.isValid()) {
        qDebug() << "qdbus_client Error:" << reply.error().message();
    //    exit(1);
    }

	/*
	foreach (QString name, reply.value())
	{
        qDebug() << name;
		//printf("name %s, value %s \n",qPrintable(name),
	} */
    
	if(conn.interface()->isServiceRegistered (SERVICE_NAME))
	{
		printf("Qps: Already another QPS is running...\n");
		exit(1);
	}
}



void check_qps_running()
{
	//QDBusServer *server=QDBusServer("xaddr"); //peer2peer mode
	//service,path,interface,name
	//connect(server, SIGNAL(clicked()), SLOT(event_xbutton_clicked()));
	//SIGNAL(newConnection ( const QDBusConnection & connection ))
	//QDBusConnection::connectToBus ("xaddr", "name" );

	//	glib_dbus_getlist();
	//	glib_dbus_server();

	qdbus_client(); // hang... on root-user
//	printf("D1-1-3\n");
	dbus_register_server();
//	printf("D1-1-6\n");
}

char * read_proc_file(char *fname,int pid=-1,int tgid=-1); // Temp
void init_misc(QWidget *main)
{

	init_xpm(); // xpm image file load

	if(true) //TESTING
	{
	
	}

#ifdef LINUX
	if(false or flag_devel) // thread's Name Change test
	{
		QThread *task=new MyThread();
		task->start();
		task=new MyThread2();
		task->start();
	}
#endif

	if(false) //test mini_sscanf()
	{
		char *buf;
		int val;
		char sstr[32]="pu%s";
		char buffer[128];

		if((buf= read_proc_file("stat",1)) ==0 )
		{
			printf("cant open [%s]\n","sss");
		}
		if(mini_sscanf(buf, sstr,&val)!=0)	printf("found [%s] val=%d \n",sstr,val);
		if(mini_sscanf(buf, "(%s)",&buffer)!=0)	printf("found  str=%s \n",buffer);
	
		abort();
	}
}


QTabWidgetX::QTabWidgetX(QWidget *parent)
{

}

void QTabWidgetX::showTab(bool flag)
{

	QTabBar *tb=tabBar();
//	tb->setDrawBase(false); //??
	
	if(flag) 
		tb->show();
	else
		tb->hide();
 //if flag_useTabView == false
#if QT_VERSION > 0x040500 	
//	setDocumentMode (true); // QT 4.5
#endif

}

#include "qticonloader.cpp"
