/*
 * Copyright (c) 2006
 *  Morten Slot Kristensen, Århus, Denmark.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <gtk/gtk.h>
#include "matrix.hpp"
#include "operations.hpp"
#include "gtk.hpp"
#include "defs.hpp"
using namespace std;

/*
 * Destroys the program
 */
gint destroy_app(GtkWidget *widget, gpointer gdata)
{
	gtk_main_quit();
}

/*
 * Shows a messagebox with a specified text, message-type
 * and button-type
 */
void msgbox(string msg, GtkMessageType mtype, GtkButtonsType btype)
{
	GtkWidget *dialog = gtk_message_dialog_new(NULL,
			GTK_DIALOG_DESTROY_WITH_PARENT,
			mtype,
			btype,
			msg.c_str());

	gtk_dialog_run(GTK_DIALOG(dialog));
	gtk_widget_destroy(dialog);
}

/*
 * Adds columns to the treeview (list)
 */
void add_columns_to_treeview(GtkTreeView *treeview)
{
	GtkCellRenderer *renderer;
	GtkTreeViewColumn *column;
	GtkTreeModel *model = gtk_tree_view_get_model(treeview);

	// ID column
	renderer = gtk_cell_renderer_text_new();
	column = gtk_tree_view_column_new_with_attributes("ID", renderer, "text", COLUMN_ID, NULL);
	gtk_tree_view_column_set_sort_column_id(column, COLUMN_ID);
	gtk_tree_view_append_column(treeview, column);
	
	// Info column
	renderer = gtk_cell_renderer_text_new();
	column = gtk_tree_view_column_new_with_attributes("Information", renderer, "text", COLUMN_INFO, NULL);
	gtk_tree_view_column_set_sort_column_id(column, COLUMN_INFO);
	gtk_tree_view_append_column(treeview, column);
}

/*
 * Shows the about dialog
 */
void show_about(GtkWidget *widget, gpointer gdata)
{
	GtkWidget *about = gtk_about_dialog_new();
	gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), string(VERSION).c_str());
	gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about), string(DEVSITE).c_str());
	gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), string("Copyright 2006 - "+to_string(DEVNAME)+" <"+to_string(					DEVMAIL)+">").c_str());
	gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), "Mathemathical matrix calculator.");
	gtk_dialog_run(GTK_DIALOG(about));
	gtk_widget_destroy(about);
}

/*
 * Adds a matrix to the treeview (list)
 */
void add_matrix_to_treeview(GtkTreeView *treeview, matrix *m, GtkListStore *store)
{
	GtkTreeIter iter;

	gtk_list_store_append(store, &iter);
	gtk_list_store_set(store, &iter,
			COLUMN_ID, m->get_id(),
			COLUMN_INFO, string(to_string(m->get_rows())+"x"+to_string(m->get_columns())).c_str(),
			-1);

	gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
}

/*
 * Inserts a matrix into a textbuffer
 */
void insert_matrix(GtkTextBuffer *widget, matrix *m)
{
	string matrix = gen_text_matrix(m);
	gtk_text_buffer_set_text(widget, matrix.c_str(), matrix.length());
}


syntax highlighted by Code2HTML, v. 0.9.1