/***** * * Copyright (C) 2004, 2005 Pablo Belin * All Rights Reserved * * This file is part of the gprelude program. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * *****/ #include #include #include #include #include #include "gprelude-mem.h" #include "idmef-tree.h" static void insert_idmef_tree_store ( GtkTreeStore *store, GtkTreeIter *parent, idmef_type_t type ) { GtkTreeIter iter; idmef_type_t child_type; idmef_value_type_id_t id; idmef_child_t child = 0; char *name; while ( (name = idmef_type_get_child_name ( type, child )) ) { gtk_tree_store_append ( store, &iter, parent ); gtk_tree_store_set ( store, &iter, IDMEF_TREE_STORE_NAME, name, -1 ); id = idmef_type_get_child_type ( type, child ); if ( id == type_object ) { child_type = idmef_type_get_child_object_type ( type, child ); if ( child_type > 0 && (child_type != idmef_type_linkage )) { /* FIXME */ gtk_tree_store_set ( store, &iter, IDMEF_TREE_STORE_TYPE, child_type, -1 ); insert_idmef_tree_store ( store, &iter, child_type ); } } else if ( id == type_enum ) { child_type = idmef_type_get_child_enum_type ( type, child ); if ( child_type > 0 ) gtk_tree_store_set ( store, &iter, IDMEF_TREE_STORE_TYPE, child_type, -1 ); } else gtk_tree_store_set ( store, &iter, IDMEF_TREE_STORE_TYPE, 0, -1 ); gtk_tree_store_set ( store, &iter, IDMEF_TREE_STORE_TYPE_ID, id, -1 ); child ++; } } GtkTreeStore *create_idmef_tree_store ( idmef_type_t type ) { GtkTreeStore *store; store = gtk_tree_store_new ( IDMEF_TREE_STORE_NB, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT ); insert_idmef_tree_store ( store, NULL, type ); return store; } int get_idmef_tree_selected ( GtkWidget *view, GtkTreeIter *iter ) { GtkTreeModel *model; GtkTreeSelection *selection; model = gtk_tree_view_get_model ( GTK_TREE_VIEW(view) ); selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(view) ); if ( gtk_tree_selection_get_selected ( selection, &model, iter ) ) return 0; return -1; } int idmef_tree_iter_has_child ( GtkWidget *view, GtkTreeIter *iter ) { GtkTreeModel *model; model = gtk_tree_view_get_model ( GTK_TREE_VIEW(view) ); return gtk_tree_model_iter_has_child ( model, iter ); } idmef_type_t get_idmef_tree_type ( GtkWidget *view, GtkTreeIter *iter ) { GtkTreeModel *model; idmef_type_t type; model = gtk_tree_view_get_model ( GTK_TREE_VIEW(view) ); gtk_tree_model_get ( model, iter, IDMEF_TREE_STORE_TYPE, &type, -1 ); return type; } idmef_value_type_id_t get_idmef_tree_type_id ( GtkWidget *view, GtkTreeIter *iter ) { GtkTreeModel *model; idmef_value_type_id_t id; model = gtk_tree_view_get_model ( GTK_TREE_VIEW(view) ); gtk_tree_model_get ( model, iter, IDMEF_TREE_STORE_TYPE_ID, &id, -1 ); return id; } char *get_idmef_tree_name ( GtkWidget *view, GtkTreeIter *iter ) { GtkTreeModel *model; char *name = NULL; model = gtk_tree_view_get_model ( GTK_TREE_VIEW(view) ); gtk_tree_model_get ( model, iter, IDMEF_TREE_STORE_NAME, &name, -1 ); return name; } char *get_idmef_tree_path ( GtkWidget *view, GtkTreeIter *iter, const char *prepend ) { GtkTreeModel *model; GtkTreeIter parent, child; char *buff, *path = NULL, *name = NULL; model = gtk_tree_view_get_model ( GTK_TREE_VIEW(view) ); parent = *iter; do { child = parent; gtk_tree_model_get ( model, &child, IDMEF_TREE_STORE_NAME, &name, -1 ); if ( path ) { buff = gprelude_sprintf ( "%s.%s", name, path ); free ( name ); free ( path ); if ( !buff ) return NULL; path = buff; } else path = name; } while ( gtk_tree_model_iter_parent ( model, &parent, &child ) ); if ( prepend ) { buff = gprelude_sprintf ( "%s.%s", prepend, path ); free ( path ); path = buff; } return path; } GtkWidget *create_idmef_tree_ornament ( GtkWidget *view ) { GtkWidget *frame, *scrolled, *box; scrolled = gtk_scrolled_window_new ( NULL, NULL ); gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); gtk_container_add ( GTK_CONTAINER(scrolled), view ); gtk_widget_show ( view ); box = gtk_vbox_new ( FALSE, 0 ); gtk_box_pack_start ( GTK_BOX(box), scrolled, TRUE, TRUE, 0 ); gtk_widget_show ( scrolled ) ; frame = gtk_frame_new ( NULL ); gtk_container_add ( GTK_CONTAINER(frame), box ); gtk_widget_show ( box ); return frame; } GtkWidget *create_idmef_tree ( GtkTreeStore *store, const char *title ) { GtkWidget *view; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkCellRenderer *renderer; view = gtk_tree_view_new_with_model ( GTK_TREE_MODEL(store) ); if ( !title ) gtk_tree_view_set_headers_visible ( GTK_TREE_VIEW(view), FALSE ); selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(view) ); gtk_tree_selection_set_mode ( selection, GTK_SELECTION_SINGLE ); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ( title, renderer, "text", IDMEF_TREE_STORE_NAME, NULL ); gtk_tree_view_append_column ( GTK_TREE_VIEW(view), column ); return view; }