//
// "$Id: tree-as-container.cxx 11731 2016-05-11 22:39:13Z greg.ercolano $"
//
//	Fl_Tree as a container of FLTK widgets. - erco 04/15/2012
//
// Copyright 2010,2012 Greg Ercolano.
// Copyright 1998-2010 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file.  If this
// file is missing or damaged, see the license at:
//
//     http://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
//     http://www.fltk.org/str.php
//
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Tree.H>
#include <FL/Fl_Group.H>
#include <FL/Fl_Input.H>

#define MAX_ROWS     20000
#define MAX_FIELDS   5
#define FIELD_WIDTH  70
#define FIELD_HEIGHT 30

class MyData : public Fl_Group {
    Fl_Input *fields[MAX_FIELDS];
public:
    MyData(int X,int Y,int W,int H) : Fl_Group(X,Y,W,H) {
	static unsigned int colors[MAX_FIELDS] = {
	    0xffffdd00, 0xffdddd00, 0xddffff00, 0xddffdd00, 0xddddff00
	};
        for ( int t=0; t<MAX_FIELDS; t++ ) {
	    fields[t] = new Fl_Input(X+t*FIELD_WIDTH,Y,FIELD_WIDTH,H);
	    fields[t]->color(Fl_Color(colors[t]));
	}
	end();
    }
    void SetData(int col, const char *val) {
        if ( col >= 0 && col < MAX_FIELDS )
	    fields[col]->value(val);
    }
};

int main(int argc, char *argv[]) {
  Fl_Double_Window *win = new Fl_Double_Window(450, 400, "Tree As FLTK Widget Container");
  win->begin();
  {
    // Create the tree
    Fl_Tree *tree = new Fl_Tree(10, 10, win->w()-20, win->h()-20);
    tree->showroot(0);				// don't show root of tree
    // Add some regular text nodes
    tree->add("Foo/Bar/001");
    tree->add("Foo/Bar/002");
    tree->add("Foo/Bla/Aaa");
    tree->add("Foo/Bla/Bbb");
    // Add items to the 'Data' node
    for ( int t=0; t<MAX_ROWS; t++ ) {
        // Add item to tree
        static char s[80];
	sprintf(s, "FLTK Widgets/%d", t);
	Fl_Tree_Item *item = tree->add(s);
	// Reconfigure item to be an FLTK widget (MyData)
	tree->begin();
	{
	    MyData *data = new MyData(0,0,FIELD_WIDTH*MAX_FIELDS, FIELD_HEIGHT);
	    item->widget(data);
	    // Initialize widget data
	    for ( int c=0; c<MAX_FIELDS; c++ ) {
		sprintf(s, "%d-%d", t,c);
	        data->SetData(c,s);
	    }
	}
	tree->end();
    }
  }
  win->end();
  win->resizable(win);
  win->show(argc, argv);
  return(Fl::run());
}

//
// End of "$Id: tree-as-container.cxx 11731 2016-05-11 22:39:13Z greg.ercolano $".
//
