/*
 *  load_rx.c: Standar R+jX Load input functions.
 *
 *  Copyright (C) 1997-2005 John Coppens (john@jcoppens.com)
 *
 *  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 of
 *  the License, 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 Library General Public License for more details.
 *
 *  You should have received a copy of the GNU Library General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gtk/gtk.h>
#include <libxml/tree.h>
#include <gnome.h>
#include <unistd.h>

#include "support.h"
#include "callbacks.h"
#include "global.h"
#include "main.h"
#include "load.h"
#include "load_rx.h"
#include "chart.h"
#include "aux.h"

GtkTreeIter	active_ld_iter;
load_definition	active_load;
GtkWidget	*ld_view;

//---------------------------------------------------------------------
//	Loads
//---------------------------------------------------------------------

void
enable_load_rx_buttons(int action)
{
  GtkWidget *w, *w1;

  w = lookup_widget(MainWindow, "load_append_btn");
  gtk_widget_set_sensitive(w,
       load_rx_valid(NULL)
  );

  w = lookup_widget(MainWindow, "load_remove_btn");   
  gtk_widget_set_sensitive(w,
       action == LOADLIST_UPDATED
    || action == LOADLIST_EDITED
    || action == LOADLIST_SELECT
  );

  w = lookup_widget(MainWindow, "load_edit_btn");
  gtk_widget_set_sensitive(w,
       (action == LOADLIST_EDITED)
    && load_rx_valid(NULL)
    && (number_selected_loads() == 1)
  );

  w = lookup_widget(MainWindow, "load_clear_btn");
  gtk_widget_set_sensitive(w,
	action = LOADLIST_EMPTY
  );

  if (action == LOADLIST_UPDATED ||
      action == LOADLIST_REMOVED)
    recalculate_all();
}


void
on_load_rx_selected(GtkTreeView *treeview)
{
  GtkWidget *w1, *w2, *w3;
  GtkTreeModel *store;
  GtkTreeSelection *sel;
  char bff[20];

  sel = gtk_tree_view_get_selection(treeview);
  if (gtk_tree_selection_get_selected(sel, &store, &active_ld_iter)) {
    gtk_tree_model_get(store, &active_ld_iter, 
                   LD_FREQ_VAL,  &active_load.f, 
                   LD_REAL_VAL,  &active_load.r, 
                   LD_REACT_VAL, &active_load.x,
                   LD_POINT,     &active_load.pt,
		   -1);

    w1 = lookup_widget(MainWindow, "load_r_entry");
    w2 = lookup_widget(MainWindow, "load_x_entry");
    w3 = lookup_widget(MainWindow, "load_freq_entry");

    sprintf(bff, "%.2f", active_load.r);
    gtk_entry_set_text(GTK_ENTRY(w1), bff);

    sprintf(bff, "%.2f", active_load.x);
    gtk_entry_set_text(GTK_ENTRY(w2), bff);

    sprintf(bff, "%.*f", pref.prec_mhz, active_load.f);
    gtk_entry_set_text(GTK_ENTRY(w3), bff);

//    enable_load_buttons(LOADLIST_SELECT);
  }
}


int
load_rx_valid(load_definition *dest)
{
  GtkWidget *w;
  char *fin = NULL;
  load_definition tload;

  w = lookup_widget(MainWindow, "load_freq_entry");
  tload.f = strtod(gtk_entry_get_text(GTK_ENTRY(w)), NULL);
  if (errno != 0) return FALSE;

  w = lookup_widget(MainWindow, "load_r_entry");
  tload.r = strtod(gtk_entry_get_text(GTK_ENTRY(w)), NULL);
  if (errno != 0) return FALSE;

  w = lookup_widget(MainWindow, "load_x_entry");
  tload.x = strtod(gtk_entry_get_text(GTK_ENTRY(w)), NULL);
  if (errno != 0) return FALSE;

  if (tload.f == 0) return FALSE;

  if (dest) {
    dest->r = tload.r;
    dest->x = tload.x;
    dest->f = tload.f;
  }
  return TRUE;
}


void
load_rx_update(load_definition *tload)
{
  GtkListStore *store;
  char r[20], x[20], f[20];
  
  if (active_ld_iter.stamp == 0) return;
  store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ld_view)));

  sprintf(f, "%.*f", pref.prec_mhz, tload->f);
  sprintf(r, "%.1f", tload->r);
  sprintf(x, "%.1f", tload->x);
  set_point(tload->pt, tload->r + tload->x*I, ZPT_LOAD);
  gtk_list_store_set(store, &active_ld_iter,
		LD_FREQ, f,
		LD_REAL, r,
		LD_REACT, x,
		LD_FREQ_VAL, tload->f,
		LD_REAL_VAL, tload->r,
		LD_REACT_VAL, tload->x,
		LD_POINT, tload->pt,
		-1);

  enable_load_buttons(LOADLIST_UPDATED);
}


void
active_load_rx_update(void)
{
  if (active_ld_iter.stamp == 0) return;
  load_rx_valid(&active_load);
  load_rx_update(&active_load);
}


void
load_rx_append(load_definition *tload)
{
  GtkTreeIter iter;
  GtkTreeModel *ldstore;
  
  ldstore = gtk_tree_view_get_model(GTK_TREE_VIEW(ld_view));
  gtk_list_store_append(GTK_LIST_STORE(ldstore), &active_ld_iter);

  tload->pt = create_load_point();
  load_rx_update(tload);
}


void
active_load_rx_remove(void)
{
  GtkListStore *store;
  chart_point *pt;

  if (active_ld_iter.stamp == 0) return;

  store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ld_view)));
  gtk_tree_model_get(GTK_TREE_MODEL(store), &active_ld_iter,
		LD_POINT, &pt,
		-1);

  if (pt) {
    gtk_object_destroy(GTK_OBJECT(pt->point));
    g_free(pt);
  }
                              
  gtk_list_store_remove(store, &active_ld_iter);

  enable_load_rx_buttons(LOADLIST_REMOVED);
  if (number_loads() == 0)
    enable_load_rx_buttons(LOADLIST_EMPTY);
}


void
loadlist_rx_clear(void)
{
  enable_load_rx_buttons(LOADLIST_EMPTY);
}


void
load_rx_modified(int which)
{
  enable_load_buttons(LOADLIST_EDITED);
}



syntax highlighted by Code2HTML, v. 0.9.1