def new_table(spj, element):

    # Create field infos
    formats = []
    info_dict = {}
    for eColumn in element.findall("Column"):
        # name
        try:
            name = eColumn.attrib["name"]
        except KeyError:
            logger.warn("Could not get column name; using default name instead.")
            name = utils.unique_names(["col"], info_dict.keys())

        # format
        try:
            format = eColumn.attrib["format"]
        except KeyError:
            logger.warn("Could not get column type, using default type instead.")
            format = "f4"
        formats.append(format)

        # create info with attributes
        info = Table.Info()
        for eAttribute in eColumn.findall("Attribute"):
            key = eAttribute.attrib["key"]
            value = eAttribute.text
            if value is not None:
                info.set_value(key, value)
        info_dict[name] = info

    # create table with given format and infos, but w/o any rows
    a = numpy.zeros((0,), {"names": info_dict.keys(), "formats": formats})
    tbl = Table(a, info_dict)

    # node info
    for eItem in element.findall("NodeInfo/Item"):
        key = eItem.attrib["key"]
        value = eItem.text
        if value is not None:
            tbl.node_info.set_value(key, value)

    for eItem in element.findall("NodeInfo/MetaItem"):
        key = eItem.attrib["key"]
        value = eItem.text
        if value is not None:
            tbl.node_info.metadata[key] = value

    # table key is essential
    try:
        key = element.attrib["key"]
    except KeyError:
        logger.warn("Could not get table key. Using generic key instead.")
        key = pdict.unique_key(spj.datasets, "dataset")
    tbl.key = key

    # Right now, the Table is still empty. By setting this callback
    # for the _import attribute, the dataset is loaded from the hard
    # disk on the next access.
    tbl._import = DatasetImporter(spj.get_filename(), tbl.key)
    return tbl
def add_experimental_plot(project, undolist=None):

    if undolist is None:
        undolist = project.journal

    ul = UndoList().describe("Experimental Plot")

    a = numpy.array(
        [(1,1),
         (2,4),
         (3,9),
         (4,16),
         (5,25)],
         dtype = {'names':['col1','col2'],
                  'formats':['f4','f4']}
         )
    ds = Table(a)
    ds.infos['col2'].designation = 'Y'
    ds.key = pdict.unique_key(project.datasets, "exp_ds")


    a = numpy.array(
        [(10,12),
         (11,14),
         (13,-5),
         (16,8),
         (18,0)],
         dtype = {'names':['col3','col4'],
                  'formats':['f4','f4']}
         )

    ds2 = Table(a)
    ds2.infos['col4'].designation = 'Y'        
    ds2.key = pdict.unique_key(project.datasets, "exp_ds2")

    plot = Plot()
    plot.key = pdict.unique_key(project.plots, "exp_plot")
    layer1 = Layer(type="line2d",
                   lines=[Line(source=ds,cx=0,cy=1),
                          Line(source=ds2,cx=0,cy=1)],
                   x=0.0, y=0.0, width=1.0, height=0.5)
#     layer2 = Layer(type="line2d",
#                    lines=[Line(source=ds2,cx=0,cy=1)],
#                    x=0.0, y=0.5, width=1.0, height=0.5)
#     plot.layers = [layer1, layer2]
    plot.layers = [layer1]
    
    project.add_datasets([ds,ds2], undolist=ul)
    #project.add_dataset(ds, undolist=ul)
    project.add_plot(plot, undolist=ul)
    undolist.append(ul)
        return self.get_columns().index(column)
        #return self.get_columns().index(column) - 1



# register only for pygtk < 2.8
if gtk.pygtk_version[1] < 8:
    gobject.type_register(DatasetView)




###############################################################################

if __name__ == "__main__":

    win = gtk.Window()
    win.connect("destroy", gtk.main_quit)

    ds = Table( numpy.array([(1,2,3),(4,5,6)]) )
#    ds = setup_test_dataset()
#    ds.remove(0)
    ds.dump()
    print ds.nrows

    dsview = DatasetView(None,ds)
    win.add(dsview)
    
    win.show_all()
    gtk.main()