IliDbGrapher

The IliDbGrapher Hierarchy and Example Gadget

The IliDbGrapher gadget lets you specify a nodes data source and a links data source. It displays the information contained in these data sources in the form of a graph.

Customizing a DbGrapher

The DbGrapher can be customized with callbacks.

The setDefineObject member function lets you specify a callback that is called when the end user attempts to create a new node. The callback is expected to fill in a table buffer with the values for the node to be created. It can open a dialog box to obtain information from the end user if needed. A similar callback for defining links can also be specified.

Here is an example:

static IlvBoolean

MyDefineNodeCallback(IliTableBuffer* buf, IlvGraphic*, IlAny any) {

static int stId = 1000;

 

if (buf->at("IDENTIFIER").isNull()) {

buf->at("IDENTIFIER").importInteger(stId);

stId++;

}

return IlvTrue;

}

 

int main() {

IliDbGrapher* gr;

...

gr->setDefineObjectCallback(MyDefineNodeCallback, NULL, IlvTrue);

...

}

The setCreateObject member function lets you specify a callback that is called when a new row has been inserted in the nodes data source. This callback is needed to create and configure the graphic object that will represent this row. A similar callback for defining links can also be specified.

Here is an example:

static IlvGraphic*

MyCreateNodeCallback(IliTableBuffer* buf, IlAny any) {

IliDbGrapher* gr = (IliDbGrapher*)any;

const char* picture;

switch (buff->at("TYPE").asInteger()) {

case TypeNodeCenter : picture = "center.xpm"; break;

case TypeNodeParabol : picture = "parabol.xpm"; break;

default : picture = "terminal.xpm"; break;

}

gr->setBitmapName((const char*)picture);

IlvGraphic* obj = gr->createDefaultObjectNode(buf);

if (obj->isSubtypeOf(IliLabeledBitmap::ClassInfo())) {

IliLabeledBitmap* node = (IliLabeledBitmap*)obj;

node->setLabelName(buff->at("NAME").getFormatted());

}

return node;

}

 

int main() {

IliDbGrapher* gr;

...

gr->setCreateObjectCallback(MyCreateNodeCallback, gr,IlvTrue);

...

}

There are also a NodeDoubleClicked callback and a LinkDoubleClicked callback.

Here is an example of using the NodeDoubleClicked callback:

static void

MyDoubleClickNodeCallback(IlvGraphic* g, IlAny any) {

IliDbGrapher* gr = (IliDbGrapher*)g;

const char* s = gr->getObjectNameDoubleClicked();

IlvPrint ("Node %s double clicked", (const char*)s);

}

 

int main() {

IliDbGrapher* gr;

...

gr->addCallback(IliDbGrapher::NodeDoubleClickedSymbol(),

MyDoubleClickNodeCallback,myPanel)

...

}