//
// qtpendel-tab.h
//
//  - Hubert Feyrer <hubert@feyrer.de>
// 

#include <qapplication.h>
#include <qhbuttongroup.h>
#include <qvbuttongroup.h>
#include <qcolor.h>
#include <qpainter.h>
#include <qpaintdevice.h>
#include <qpixmap.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qhbox.h>
#include <qvbox.h>
#include <qpushbutton.h>
#include <qsizepolicy.h>
#include <qsplitter.h>
#include <stdio.h>

#include "qtpendel.h"		// fuer update()-Routine

#include "qtpendel-tab.h"

#include "qtpendel-tab.moc"

/*************************************************************************/
void QtPendelTab::resizeEvent(QResizeEvent *e)
{
	delete buffer;
	
	tabbox->resize(e->size());

	buffer = new QPixmap(map->width(), map->height());
        buffer->fill();
        map->setPixmap(*buffer);
}

/*************************************************************************/
QtPendelTab::QtPendelTab(char *h, QWidget *parent = 0)
{
	int i;

	tabbox = new QVButtonGroup(parent);

	labelbox = new QHBox(tabbox);
	
	label_filler1 = new QLabel("", labelbox);
	label_filler1->setSizePolicy(sizepol_ef);
	label = new QLabel(h, labelbox);
	label->setSizePolicy(sizepol_ff);
	label_filler2 = new QLabel("", labelbox);
	label_filler2->setSizePolicy(sizepol_ef);
	
	split1 = new QFrame(tabbox);
	split1->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	
	ranges = new QVBox(tabbox);
	for(i=0; i < sizeof(range)/sizeof(range[0]); i++) {
		char s[10];
		char *labels[] = {"NB", "NM", "NS", "ZE", "PS", "PM", "PB"};
		
		range[i] = new QHBox(ranges);

		range_label[i] = new QLabel(labels[i], range[i]);
		range_label[i]->setSizePolicy(sizepol_ff);

		range_filler[i] = new QLabel("", range[i]);
		range_filler[i]->setSizePolicy(sizepol_ef);
		
		sprintf(s, "%d", i);
		range_value[i] = new QLabel(s, range[i]);
		range_value[i]->setSizePolicy(sizepol_ff);
	}
	
	split2 = new QFrame(tabbox);
	split2->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	split2->setSizePolicy(sizepol_ef);

	map = new QLabel(tabbox);
	buffer = new QPixmap(map->width(), 100);
	buffer->fill();
	map->setPixmap(*buffer);
	map->setSizePolicy(sizepol_ef); // HF: ee ?
	
	split3 = new QFrame(tabbox);
	split3->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	split3->setSizePolicy(sizepol_ef);

	valuebox = new QHBox(tabbox);
	value_name = new QLabel(h, valuebox);
	value_name->setSizePolicy(sizepol_ff);
	value_is= new QLabel(" = ", valuebox);
	value_is->setSizePolicy(sizepol_ff);
	value_value = new QLabel("42", valuebox);
	value_value->setSizePolicy(sizepol_ff);
	value_filler = new QLabel("", valuebox);
	value_filler->setSizePolicy(sizepol_ef);
}

/*************************************************************************/
void QtPendelTab::update(QtPendel *pendel, QtPendelData::Values *v)
{
	double val;
	int i;

	// 1. Bereiche, Zahlen
	for (i=0; i<QtPendelData::NRANGES; i++) {
		val = v->rangevalues[i];
		QString text = range_value[i]->text(); // free? mem leak?
		text.setNum(val, 'f', 2);
		range_value[i]->setText(text);
	}

	// 2. Bereiche, grafisch
	{
		QPainter p;
		int h, w;
		double ml, mr;

		h = map->height();
		w = map->width();
		ml = v->maxbounds.lower;
		mr = v->maxbounds.upper;

		buffer->fill();
		
		p.begin(buffer);
		p.setPen(black);
		p.drawLine(0, h - 1,
			   w, h - 1);

		// Ranges
		for(int i=0; i<QtPendelData::NRANGES; i++) {
			double l, r;
			double mid;

			l = v->bounds[i].lower;
			r = v->bounds[i].upper;
			mid = (l + r)/2.0;
			p.drawLine((l-ml)/(mr-ml)*w, h-1,
				   (mid-ml)/(mr-ml)*w, 0);
			p.drawLine((mid-ml)/(mr-ml)*w, 0,
				   (r-ml)/(mr-ml)*w, h-1);
		}

		// Todo: Trapeze

		// der eigentliche Wert
		val = v->currentvalue;
		p.setPen(red);
		p.drawLine((val-ml)/(mr-ml)*w, 0,
			   (val-ml)/(mr-ml)*w, h); 
		
		p.end();
		bitBlt(map, 0, 0, buffer);
	}

	// 3. Wert
	val = v->currentvalue;
	if (v == &pendel->data->alpha) {
		val = val / pendel->data->pi*180.0;
	}
	QString text=value_value->text(); // memory leak? delete?
	text.setNum(val, 'f', 2);
	value_value->setText(text);
	
}
