#include <stdio.h>
#include <unistd.h>
#include <gtk/gtk.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <string.h>
#include "calc.h"
#include "main.h"
#include "dataconv.h"
#include "widget.h"
#include "draw.h"

extern GtkTextBuffer *txtcircbuff;
extern int Zcirc, Ycirc, RHOcirc, Qcirc, tsidx;
extern GtkWidget *scarea, *toptable, *menubar, *topwindow;
extern SMCDATA smcdata;
extern float tunestep;
extern const float tunesteptab[6];
extern gint scdim;
extern GtkWidget *statarr[20];
extern const char statlabelname[20][15];

GtkItemFactory *item_factory;
GtkWidget *filew, *about;
GtkWidget *evb, *etb1, *etb2, *etb3;
gchar *entry_text, entry_text_type;
GtkWidget *entryval;

static GtkItemFactoryEntry menu_items[] = {
  { "/_File",         NULL,              NULL, 0, "<Branch>", NULL },
  { "/File/New",   "<control>N",      restart, 0, NULL, NULL },
  { "/File/Write",   "<control>W",      write_activate, 0, NULL, NULL },
  { "/File/sep1",    NULL,              NULL, 0, "<Separator>", NULL },
  { "/File/Quit",    "<control>Q",      main_quit, 0, NULL, NULL },

  { "/_Set",         NULL,              NULL, 0, "<Branch>", NULL },
  { "/Set/Start Point","S",             sp_activate, 0, NULL, NULL },
  { "/Set/Frequency","F",               f0_activate, 0, NULL, NULL },
  { "/Set/Characteristic Impedance","<control>0",z0_activate, 0,
    NULL, NULL },

  { "/_Add",     NULL,              NULL, 0, "<Branch>", NULL },
  { "/Add/[add] Resistance",       "R", add_resistance_activate, 0,
    NULL, NULL },
  { "/Add/[add] Inductance",       "L", add_inductance_activate, 0,
    NULL, NULL },
  { "/Add/[add] Capacitance",      "C", add_capacitance_activate, 0,
    NULL, NULL },
  { "/Add/[add] Transmission Line","T", add_tline_activate, 0, NULL, NULL },
  { "/Add/sep2",    NULL,              NULL, 0, "<Separator>", NULL },
  { "/Add/[ins] Resistance",       "<shift>R",
    ins_resistance_activate, 0, NULL, NULL },
  { "/Add/[ins] Inductance",       "<shift>L",
    ins_inductance_activate, 0, NULL, NULL },
  { "/Add/[ins] Capacitance",      "<shift>C",
    ins_capacitance_activate, 0, NULL, NULL },
  { "/Add/[ins] Transmission Line","<shift>T",
    ins_tline_activate, 0, NULL, NULL },

  { "/_Edit",     NULL,              NULL, 0, "<Branch>", NULL},
  { "/Edit/Delete component",       "D", delete_component_activate, 0,
    NULL, NULL },
  { "/Edit/sep3",    NULL,              NULL, 0, "<Separator>" , NULL},
  { "/Edit/Decrease first value",    "<shift>Left",
    decrease_first_activate, 0, NULL, NULL },
  { "/Edit/Increase first value",    "<shift>Right",
    increase_first_activate, 0, NULL, NULL },
  { "/Edit/Decrease second value",    "<alt>Left",
    decrease_second_activate, 0, NULL, NULL },
  { "/Edit/Increase second value",    "<alt>Right",
    increase_second_activate, 0, NULL, NULL },
  { "/Edit/Select previous element",    "<shift>Up",
    select_previous, 0, NULL, NULL },
  { "/Edit/Select next element",    "<shift>Down",
    select_next, 0, NULL , NULL},

  { "/Edit/Increase tuning step",    "<alt>Up",
    increase_tunestep, 0, NULL, NULL },
  { "/Edit/Decrease tuning step",    "<alt>Down",
    decrease_tunestep, 0, NULL, NULL },

  { "/Edit/Set first value",    "equal",
    set_first_val, 0, NULL, NULL },
  { "/Edit/Set second value",    "<alt>equal",
    set_second_val, 0, NULL, NULL },

  { "/_View", NULL, NULL, 0, "<Branch>", NULL},
  { "/View/Impedance", "<control>1", on_imped_activate, 0, 
    "<CheckItem>", NULL},
  { "/View/Admittaance", "<control>2", on_admit_activate, 0, 
    "<CheckItem>", NULL},
  { "/View/Coefficient of Reflection",
    "<control>3", on_cor_activate, 0, "<CheckItem>", NULL},
  { "/View/Quality Factor (Q)", "<control>4", on_qfac_activate, 0,
    "<CheckItem>", NULL},

  { "/_Help",        NULL,              NULL, 0, "<LastBranch>", NULL },
  { "/Help/Keystrokes",  NULL,  help_keystrokes, 0, NULL, NULL },
  { "/Help/About",  NULL,  help_about, 0, NULL, NULL},
};

void help_about(GtkWidget *widget __attribute__((unused)),
		gpointer user_data __attribute__((unused))) {
  GtkWidget *label, *button;

  about=gtk_dialog_new();
  label = gtk_label_new ("\n GSMC - A Smith Chart Calculator\n" \
			 "Version 1.0 - Sept. 2003\n\n\n" \
			 "(c) 2003 by Lapo Pieri\n" \
			 " ik5nax@amsat.org\n");
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, TRUE, TRUE, 0);
  button=gtk_button_new_from_stock(GTK_STOCK_OK);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->action_area), 
		     button, TRUE, TRUE, 0);
  gtk_signal_connect(GTK_OBJECT(button), "clicked",
		     (GtkSignalFunc)help_about_destroy, NULL);

  gtk_widget_show(button); gtk_widget_show(label); gtk_widget_show(about);
}

void help_about_destroy(GtkWidget *widget __attribute__((unused)),
			gpointer user_data __attribute__((unused))) {
  gtk_widget_destroy(about);
}

void help_keystrokes(GtkWidget *widget __attribute__((unused)),
		     gpointer user_data __attribute__((unused))) {
  GtkWidget *label, *button, *label2;

  about=gtk_dialog_new();
  label=gtk_label_new("GSMC Keystrokes");
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, TRUE, TRUE, 0);

  label2=gtk_label_new("\
Ctrl+q\t\t Quit the program\n\
Ctrl+1\t\t Toggle visualization of impedance (Z) circle\n\
Ctrl+2\t\t Toggle visualization of admittance (Y) circle\n\
Ctrl+3\t\t Toggle visualization of reflection coefficient (RHO) circle\n\
Ctrl+4\t\t Toggle visualization of constant Q circle\n\
s\t\t\t Set start point\n\
Ctrl+0\t\t (zero) Set characteristic impedance z0\n\
f\t\t\t Set frequency (f0)\n\
r\t\t\t Add a resistor\n\
l\t\t\t Add an inductor\n\
c\t\t\t Add a capacitor\n\
t\t\t\t Add a transmission line or stub\n\
Shift+r\t\t Insert a resistor before the highlighted element\n\
Shift+l\t\t Insert an inductor before the highlighted element\n\
Shift+c\t\t Insert a capacitor before the highlighted element\n\
Shift+t\t\t Insert a transmission line or stub before the highlighted element\n\
d\t\t\t Delete the currently highligthed element\n\
Shift+Curs\t Up Highlight previous element\n\
Shift+Curs\t Down Highlight next element\n\
Shift+Curs\t Left Decrease the first field of currently highlighted element\n\
Shift+Curs\t Rigth Increase the first field of currently highlighted element\n\
Mod+Curs\t Left Decrease the second field of currently highlighted element\n\
Mod+Curs\t Rigth Increase the second field of currently highlighted element\n\
Mod+Curs\t Up Increase the tuning step\n\
Mod+Curs\t Down Decrease the tuning step\n\
Ctrl+w\t\t Write network file in spice format\n\
Ctrl+n\t\t Restart for a new calculation with a clean chart\n\
=\t\t\t Change first field of currently highlighted element\n\
Mod+=\t\t Change second field of currently highlighted element\n\
");
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label2, TRUE, TRUE, 0);


  button=gtk_button_new_from_stock(GTK_STOCK_CLOSE);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->action_area), 
		     button, TRUE, TRUE, 0);
  gtk_signal_connect(GTK_OBJECT(button), "clicked",
		     (GtkSignalFunc)help_about_destroy, NULL);

  gtk_widget_show(button); gtk_widget_show(label); 
  gtk_widget_show(label2); gtk_widget_show(about);
}

void help_keystrokes_destroy(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))) {
  gtk_widget_destroy(about);
}

void main_quit(GtkWidget *widget __attribute__((unused)),
	       gpointer user_data __attribute__((unused))) {
  gtk_main_quit();
}

void on_imped_activate(GtkWidget *widget __attribute__((unused)),
		       gpointer user_data __attribute__((unused))) {
  Zcirc^=1;
  drawchart();
  gtk_widget_draw(scarea, NULL);
}

void on_admit_activate(GtkWidget *widget __attribute__((unused)),
		       gpointer user_data __attribute__((unused))) {
  Ycirc^=1;
  drawchart();
  gtk_widget_draw(scarea, NULL);
}

void on_cor_activate(GtkWidget *widget __attribute__((unused)),
		     gpointer user_data __attribute__((unused))) {
  RHOcirc^=1;
  drawchart();
  gtk_widget_draw(scarea, NULL);
}

void on_qfac_activate(GtkWidget *widget __attribute__((unused)),
		      gpointer user_data __attribute__((unused))) {
  Qcirc^=1;
  drawchart();
  gtk_widget_draw(scarea, NULL);
}

void  sp_activate(GtkWidget *widget __attribute__((unused)),
		  gpointer user_data __attribute__((unused))) {
  GtkWidget *lb, *hbb, *b1, *b2, *b3, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new(); 
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Start point");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);


  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Z");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Y");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  b3=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b2)), "_RHO");
  gtk_box_pack_start(GTK_BOX(hbb), b3, TRUE, FALSE, FALSE);
  gtk_widget_show(b3);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);
  switch(smcdata.SPtype){ /* Start with previous button toggled */
  case SPTYPE_Z: gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1),
					     TRUE); break;
  case SPTYPE_Y: gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b2),
					     TRUE); break;
  case SPTYPE_RHO: gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b3),
					       TRUE); break;
  }

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_spZ), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_spY), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b3), "toggled", 
		     GTK_SIGNAL_FUNC(set_spRHO), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTSP;
}

void f0_activate(GtkWidget *widget __attribute__((unused)),
		 gpointer user_data __attribute__((unused))) {
  GtkWidget *lb, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Center frequency");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTF0;
}

void  z0_activate(GtkWidget *widget __attribute__((unused)),
		  gpointer user_data __attribute__((unused))) {
  GtkWidget *lb, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Caracteristic Impedance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTZ0;
}


void add_resistance_activate(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *hbb, *b1, *b2, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Add Resistance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Parallel");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);


  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);


  gtk_widget_grab_focus(etb);

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE);
  set_series();

  entry_text_type=ETTAR;
}

void add_inductance_activate(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *hbb, *b1, *b2, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Add Inductance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Parallel");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE);
  set_series();

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTAL;
}

void add_capacitance_activate(GtkWidget *widget __attribute__((unused)),
			      gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *hbb, *b1, *b2, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Add Capacitance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Parallel");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE);
  set_series();

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTAC;
}

void add_tline_activate(GtkWidget *widget __attribute__((unused)),
			gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *vbb, *hbb, *b1, *b2, *b3, *b4, *b5, *bok, *label;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Add Transmission line");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  vbb=gtk_vbox_new(TRUE, 0);
  hbb=gtk_hbox_new(TRUE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "Open series stub (_a)");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), 
				     "Short series stub (_l)");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE);
  gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0);
  b3=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b2)), 
				     "Open parallel stub (_o)");
  gtk_box_pack_start(GTK_BOX(hbb), b3, TRUE, FALSE, FALSE);
  gtk_widget_show(b3);
  b4=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b3)), 
				     "Short parallel stub (_c)");
  gtk_box_pack_start(GTK_BOX(hbb), b4, TRUE, FALSE, FALSE);
  gtk_widget_show(b4);
  gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE);
  gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0);
  b5=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b4)), 
				     "Transmissive (_t)");
  gtk_box_pack_start(GTK_BOX(hbb), b5, TRUE, FALSE, FALSE);
  gtk_widget_show(b5);
  bok=gtk_button_new_with_label("OK"); gtk_widget_show(bok);
  gtk_signal_connect(GTK_OBJECT(bok), "clicked", 
		     GTK_SIGNAL_FUNC(etbt_callback), GTK_OBJECT(bok));
  gtk_box_pack_start(GTK_BOX(hbb), bok, TRUE, FALSE, FALSE);
  gtk_widget_show(hbb);
  gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE);

  gtk_box_pack_start(GTK_BOX(evb), vbb, FALSE, FALSE, FALSE);
  gtk_widget_show(vbb);

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_open_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_short_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b3), "toggled", 
		     GTK_SIGNAL_FUNC(set_open_parallel), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b4), "toggled", 
		     GTK_SIGNAL_FUNC(set_short_parallel), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b5), "toggled", 
		     GTK_SIGNAL_FUNC(set_transmissive), GTK_OBJECT(evb));

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b5), TRUE);
  set_transmissive();

  /* entry box */
  hbb=gtk_hbox_new(FALSE, 0);
  etb1=gtk_entry_new_with_max_length(16);
  gtk_entry_set_editable(GTK_ENTRY(etb1), TRUE);
  label=gtk_label_new("    Len [deg] ");
  gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(hbb), etb1, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(label); gtk_widget_show(etb1); gtk_widget_show(hbb);

  hbb=gtk_hbox_new(FALSE, 0);
  etb2=gtk_entry_new_with_max_length(16);
  gtk_entry_set_editable(GTK_ENTRY(etb2), TRUE);
  label=gtk_label_new("    Z [ohm]  ");
  gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(hbb), etb2, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(label); gtk_widget_show(etb2); gtk_widget_show(hbb);

  /*
  hbb=gtk_hbox_new(FALSE, 0);
  etb3=gtk_entry_new_with_max_length(16);
  gtk_entry_set_editable(GTK_ENTRY(etb3), TRUE);
  label=gtk_label_new("    Att [dB/m] ");
  gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(hbb), etb3, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(label); gtk_widget_show(etb3); gtk_widget_show(hbb);
  */
  
  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb1);

  entry_text_type=ETTAT;
}

void ins_resistance_activate(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *hbb, *b1, *b2, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Ins Resistance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Parallel");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE);
  set_series();

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTIR;
}

void ins_inductance_activate(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *hbb, *b1, *b2, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Ins Inductance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Parallel");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE);
  set_series();

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTIL;
}

void ins_capacitance_activate(GtkWidget *widget __attribute__((unused)),
			      gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *hbb, *b1, *b2, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Add Capacitance");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  hbb=gtk_hbox_new(FALSE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), "_Parallel");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(hbb);

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE);
  set_series();

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb));

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb);

  entry_text_type=ETTIC;
}


void ins_tline_activate(GtkWidget *widget __attribute__((unused)),
			gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *vbb, *hbb, *b1, *b2, *b3, *b4, *b5, *bok, *label;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Ins Transmission line");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* Button for various type of entry format */
  vbb=gtk_vbox_new(TRUE, 0);
  hbb=gtk_hbox_new(TRUE, 0);
  b1=gtk_radio_button_new_with_mnemonic(NULL, "Open series stub (_a)");
  gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE);
  gtk_widget_show(b1);
  b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b1)), 
				     "Short series stub (_l)");
  gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE);
  gtk_widget_show(b2);
  gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE);
  gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0);
  b3=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b2)), 
				     "Open parallel stub (_o)");
  gtk_box_pack_start(GTK_BOX(hbb), b3, TRUE, FALSE, FALSE);
  gtk_widget_show(b3);
  b4=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b3)), 
				     "Short parallel stub (_c)");
  gtk_box_pack_start(GTK_BOX(hbb), b4, TRUE, FALSE, FALSE);
  gtk_widget_show(b4);
  gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE);
  gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0);
  b5=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group(
				     GTK_RADIO_BUTTON(b4)), 
				     "Transmissive (_t)");
  gtk_box_pack_start(GTK_BOX(hbb), b5, TRUE, FALSE, FALSE);
  gtk_widget_show(b5);
  bok=gtk_button_new_with_label("OK"); gtk_widget_show(bok);
  gtk_signal_connect(GTK_OBJECT(bok), "clicked", 
		     GTK_SIGNAL_FUNC(etbt_callback), GTK_OBJECT(bok));
  gtk_box_pack_start(GTK_BOX(hbb), bok, TRUE, FALSE, FALSE);
  gtk_widget_show(hbb);
  gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE);

  gtk_box_pack_start(GTK_BOX(evb), vbb, FALSE, FALSE, FALSE);
  gtk_widget_show(vbb);

  /* connecting radio button the signal */
  gtk_signal_connect(GTK_OBJECT(b1), "toggled", 
		     GTK_SIGNAL_FUNC(set_open_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b2), "toggled", 
		     GTK_SIGNAL_FUNC(set_short_series), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b3), "toggled", 
		     GTK_SIGNAL_FUNC(set_open_parallel), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b4), "toggled", 
		     GTK_SIGNAL_FUNC(set_short_parallel), GTK_OBJECT(evb));
  gtk_signal_connect(GTK_OBJECT(b5), "toggled", 
		     GTK_SIGNAL_FUNC(set_transmissive), GTK_OBJECT(evb));

  /* Rivedere */
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b5), TRUE);
  set_transmissive();

  /* entry box */
  hbb=gtk_hbox_new(FALSE, 0);
  etb1=gtk_entry_new_with_max_length(16);
  gtk_entry_set_editable(GTK_ENTRY(etb1), TRUE);
  label=gtk_label_new("    Len [deg] ");
  gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(hbb), etb1, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(label); gtk_widget_show(etb1); gtk_widget_show(hbb);

  hbb=gtk_hbox_new(FALSE, 0);
  etb2=gtk_entry_new_with_max_length(16);
  gtk_entry_set_editable(GTK_ENTRY(etb2), TRUE);
  label=gtk_label_new("    Z [ohm]  ");
  gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(hbb), etb2, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(label); gtk_widget_show(etb2); gtk_widget_show(hbb);

  /*
  hbb=gtk_hbox_new(FALSE, 0);
  etb3=gtk_entry_new_with_max_length(16);
  gtk_entry_set_editable(GTK_ENTRY(etb3), TRUE);
  label=gtk_label_new("    Att [dB/m] ");
  gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(hbb), etb3, FALSE, FALSE, FALSE);
  gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE);
  gtk_widget_show(label); gtk_widget_show(etb3); gtk_widget_show(hbb);
  */
  
  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);

  gtk_widget_grab_focus(etb1);

  entry_text_type=ETTIT;
}


gint etb_callback(GtkWidget *widget __attribute__((unused)),
		  GtkWidget *entry) {
  float re, im, val0, val1, val2;
  char c, temp;
  int i;

  entry_text=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry));
  if(strlen(entry_text)!=0){
    switch(entry_text_type) {
    case ETTSP:
      entrystringdecode(entry_text, &smcdata.reentrySP, &smcdata.imentrySP);
      break;
    case ETTZ0:
      if(entrystringdecode(entry_text, &re, &im)==0) {
	if(re<=0.)  
	  fprintf(stderr, "Invalid characteristic impedance value\n");
	else
	  smcdata.z0=re;
      }
      else
	fprintf(stderr, "Invalid characteristic impedance\n");
      break;
    case ETTF0:
      smcdata.f0=psdec(entry_text);
      break;
    case ETTAR:
      c='r';
      if(smcdata.ne<NEL) {
	smcdata.ne++; smcdata.ELtype[smcdata.ne]=c;
	if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.ne]=val0;
	  smcdata.ELval1[smcdata.ne]=val1; smcdata.ELval2[smcdata.ne]=val2;
	}
	else
	  smcdata.ne--;
      }
      else
	fprintf(stderr, "No more space left for component\n");
      smcdata.neidx=smcdata.ne;
      break;
      
    case ETTAL:
      c='l';
      if(smcdata.ne<NEL) {
	smcdata.ne++; smcdata.ELtype[smcdata.ne]=c;
	if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.ne]=val0;
	  smcdata.ELval1[smcdata.ne]=val1; smcdata.ELval2[smcdata.ne]=val2;
	}
	else
	  smcdata.ne--;
      }
      else
	fprintf(stderr, "No more space left for component\n");
      smcdata.neidx=smcdata.ne;
      break;
      
    case ETTAC:
      c='c';
      if(smcdata.ne<NEL) {
	smcdata.ne++; smcdata.ELtype[smcdata.ne]=c;
	if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.ne]=val0;
	  smcdata.ELval1[smcdata.ne]=val1; smcdata.ELval2[smcdata.ne]=val2;
	}
	else
	  smcdata.ne--;
      }
      else
	fprintf(stderr, "No more space left for component\n");
      smcdata.neidx=smcdata.ne;
      break;
    case ETTIR:
      /* Insert a component in the location specified by index */
      if(smcdata.ne<NEL) {
	/* make place for new network element */
	for(i=smcdata.ne; i>=smcdata.neidx; i--) {
	  smcdata.ELtype[i+1]=smcdata.ELtype[i];
	  smcdata.ELval0[i+1]=smcdata.ELval0[i];
	  smcdata.ELval1[i+1]=smcdata.ELval1[i];
	  smcdata.ELval2[i+1]=smcdata.ELval2[i];
	  temp=smcdata.ELplace[i+1];
	  smcdata.ELplace[i+1]=smcdata.ELplace[i];
	  smcdata.ELplace[i]=temp;
	  smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i];
	  smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i];
	}
	smcdata.ne++;
	
	/* and then add the network element in the place just freed */
	c='r';
	smcdata.ELtype[smcdata.neidx]=c;
	if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.neidx]=val0;
	  smcdata.ELval1[smcdata.neidx]=val1;
	  smcdata.ELval2[smcdata.neidx]=val2;
	}
	else 
	  removene();      
      }
      else
	fprintf(stderr, "No more space left for component\n");
      recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
      break;
      
    case ETTIL:
      /* Insert a component in the location specified by index */
      if(smcdata.ne<NEL) {
	/* make place for new network element */
	for(i=smcdata.ne; i>=smcdata.neidx; i--) {
	  smcdata.ELtype[i+1]=smcdata.ELtype[i];
	  smcdata.ELval0[i+1]=smcdata.ELval0[i];
	  smcdata.ELval1[i+1]=smcdata.ELval1[i];
	  smcdata.ELval2[i+1]=smcdata.ELval2[i];
	  temp=smcdata.ELplace[i+1];
	  smcdata.ELplace[i+1]=smcdata.ELplace[i];
	  smcdata.ELplace[i]=temp;
	  smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i];
	  smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i];
	}
	smcdata.ne++;
	
	/* and then add the network element in the place just freed */
	c='l';
	smcdata.ELtype[smcdata.neidx]=c;
	if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.neidx]=val0;
	  smcdata.ELval1[smcdata.neidx]=val1;
	  smcdata.ELval2[smcdata.neidx]=val2;
	}
	else 
	  removene();      
      }
      else
	fprintf(stderr, "No more space left for component\n");
      recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
      break;
    case ETTIC:
      /* Insert a component in the location specified by index */
      if(smcdata.ne<NEL) {
	/* make place for new network element */
	for(i=smcdata.ne; i>=smcdata.neidx; i--) {
	  smcdata.ELtype[i+1]=smcdata.ELtype[i];
	  smcdata.ELval0[i+1]=smcdata.ELval0[i];
	  smcdata.ELval1[i+1]=smcdata.ELval1[i];
	  smcdata.ELval2[i+1]=smcdata.ELval2[i];
	  temp=smcdata.ELplace[i+1];
	  smcdata.ELplace[i+1]=smcdata.ELplace[i];
	  smcdata.ELplace[i]=temp;
	  smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i];
	  smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i];
	}
	smcdata.ne++;
	
	/* and then add the network element in the place just freed */
	c='c';
	smcdata.ELtype[smcdata.neidx]=c;
	if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.neidx]=val0;
	  smcdata.ELval1[smcdata.neidx]=val1;
	  smcdata.ELval2[smcdata.neidx]=val2;
	}
	else 
	  removene();      
      }
      else
	fprintf(stderr, "No more space left for component\n");
      recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
      break;
      
    case ETTNULL:
    default: printf("%s\n", entry_text);
    }
    
    recalc(); showtextstat(); showcircdesc();
    entry_text_type=ETTNULL;
    drawchart(); gtk_widget_draw(scarea, NULL);
  }
  gtk_widget_destroy(entryval);
  return TRUE;
}

gint etbt_callback(GtkWidget *widget __attribute__((unused)),
		   GtkWidget *entry __attribute__((unused))) {
  gchar *entry_text1, *entry_text2, *entry_text3;
  char c, temp;
  float val0, val1, val2;
  int i;

  entry_text1=(gchar*)gtk_entry_get_text(GTK_ENTRY(etb1));
  entry_text2=(gchar*)gtk_entry_get_text(GTK_ENTRY(etb2));
  //  entry_text3=(gchar*)gtk_entry_get_text(GTK_ENTRY(etb3));
  if((strlen(entry_text1)!=0) && (strlen(entry_text2)!=0)){

    switch(entry_text_type){
    case ETTAT:
      c='t';
      if(smcdata.ne<NEL) {
	smcdata.ne++; smcdata.ELtype[smcdata.ne]=c;
       if(componentvaluestringdecode(entry_text1, &val0, &val1, &val2, &c)==0){
	 smcdata.ELval0[smcdata.ne]=val0;
       }
       else
	 smcdata.ne--;
       if(componentvaluestringdecode(entry_text2, &val0, &val1, &val2, &c)==0){
	 smcdata.ELval1[smcdata.ne]=val0;
       }
       else
	 smcdata.ne--;
       /*
       if(componentvaluestringdecode(entry_text3, &val0, &val1, &val2, &c)==0){
       smcdata.ELval2[smcdata.ne]=val0;
       }
       else
       smcdata.ne--;
       */
      }
      else
	fprintf(stderr, "No more space left for component\n");
      smcdata.neidx=smcdata.ne;
      break;

    case ETTIT:
      /* Insert a component in the location specified by index */
      if(smcdata.ne<NEL) {
	/* make place for new network element */
	for(i=smcdata.ne; i>=smcdata.neidx; i--) {
	  smcdata.ELtype[i+1]=smcdata.ELtype[i];
	  smcdata.ELval0[i+1]=smcdata.ELval0[i];
	  smcdata.ELval1[i+1]=smcdata.ELval1[i];
	  smcdata.ELval2[i+1]=smcdata.ELval2[i];
	  temp=smcdata.ELplace[i+1];
	  smcdata.ELplace[i+1]=smcdata.ELplace[i];
	  smcdata.ELplace[i]=temp;
	  smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i];
	  smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i];
	}
	smcdata.ne++;

	/* and then add the network element in the place just freed */
	c='t';
        smcdata.ELtype[smcdata.neidx]=c;
       if(componentvaluestringdecode(entry_text1, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval0[smcdata.neidx]=val0;
	}
	else
	  removene();
       if(componentvaluestringdecode(entry_text2, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval1[smcdata.neidx]=val0;
	}
	else
	  removene();
	/*
       if(componentvaluestringdecode(entry_text3, &val0, &val1, &val2, &c)==0){
	  smcdata.ELval2[smcdata.neidx]=val0;
	  }
	  else
	  removene();
	*/
	
      }
      else
	fprintf(stderr, "No more space left for component\n");
      recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
      break;
      
    case ETTNULL:
    default: printf("%s\t%s\t%s\n", entry_text1, entry_text2, entry_text3);
    }
    
    recalc(); showtextstat(); showcircdesc();
    entry_text_type=ETTNULL;
    drawchart(); gtk_widget_draw(scarea, NULL);
  }
  gtk_widget_destroy(entryval);
  return TRUE;
}

gint set_spZ(void) {
  smcdata.SPtype=SPTYPE_Z;
  return TRUE;
}

gint set_spY(void) {
  smcdata.SPtype=SPTYPE_Y;
  return TRUE;
}

gint set_spRHO(void) {
  smcdata.SPtype=SPTYPE_RHO;
  return TRUE;
}

gint set_series(void) {
  smcdata.ELplace[smcdata.ne+1]='s';
  return TRUE;
}

gint set_parallel(void) {
  smcdata.ELplace[smcdata.ne+1]='p';
  return TRUE;
}

gint set_open_series(void) {
  smcdata.ELplace[smcdata.ne+1]='a';
  return TRUE;
}

gint set_short_series(void) {
  smcdata.ELplace[smcdata.ne+1]='l';
  return TRUE;
}

gint set_open_parallel(void) {
  smcdata.ELplace[smcdata.ne+1]='o';
  return TRUE;
}

gint set_short_parallel(void) {
  smcdata.ELplace[smcdata.ne+1]='c';
  return TRUE;
}

gint set_transmissive(void) {
  smcdata.ELplace[smcdata.ne+1]='t';
  return TRUE;
}


void menu_create(GtkWidget *window, GtkWidget **menu_bar) {
  GtkAccelGroup *accel_group;

  gint nmenu_items=sizeof(menu_items)/sizeof(menu_items[0]);

  accel_group=gtk_accel_group_new();
  item_factory=gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", 
				    accel_group);
  gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL);
  gtk_window_add_accel_group(GTK_WINDOW (window), accel_group);

  if(menu_bar)
    *menu_bar=gtk_item_factory_get_widget(item_factory, "<main>");
}

void delete_component_activate(GtkWidget *widget __attribute__((unused)),
			       gpointer user_data __attribute__((unused))){
  removene(); recalc(); 
  drawchart(); gtk_widget_draw(scarea, NULL);
  showtextstat(); showcircdesc();
}

void select_previous(GtkWidget *widget __attribute__((unused)),
		     gpointer user_data __attribute__((unused))){
  if(smcdata.neidx>1) {
    smcdata.neidx--; showcircdesc(); }
}

void select_next(GtkWidget *widget __attribute__((unused)),
		 gpointer user_data __attribute__((unused))){
  if(smcdata.neidx<smcdata.ne) { 
    smcdata.neidx++; showcircdesc(); }
}

void decrease_tunestep(GtkWidget *widget __attribute__((unused)),
		       gpointer user_data __attribute__((unused))){
  if(tsidx>0) tsidx--; tunestep=tunesteptab[tsidx];
  showtextstat();
}

void increase_tunestep(GtkWidget *widget __attribute__((unused)),
		       gpointer user_data __attribute__((unused))){
  if(tsidx<5) tsidx++; tunestep=tunesteptab[tsidx]; 
  showtextstat();
}

void decrease_first_activate(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))){
  smcdata.ELval0[smcdata.neidx]/=tunestep; 
  recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
  showtextstat(); showcircdesc();
}

void increase_first_activate(GtkWidget *widget __attribute__((unused)),
			     gpointer user_data __attribute__((unused))){
  smcdata.ELval0[smcdata.neidx]*=tunestep;
  recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
  showtextstat(); showcircdesc();
}

void decrease_second_activate(GtkWidget *widget __attribute__((unused)),
			      gpointer user_data __attribute__((unused))){
  smcdata.ELval1[smcdata.neidx]/=tunestep; 
  recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
  showtextstat(); showcircdesc();
}

void increase_second_activate(GtkWidget *widget __attribute__((unused)),
			      gpointer user_data __attribute__((unused))){
  smcdata.ELval1[smcdata.neidx]*=tunestep;
  recalc(); drawchart(); gtk_widget_draw(scarea, NULL);
  showtextstat(); showcircdesc();
}


void write_activate(GtkWidget *widget __attribute__((unused)),
		    gpointer user_data __attribute__((unused))) {
  filew = gtk_file_selection_new ("Write SPICE file");
  gtk_signal_connect (GTK_OBJECT (filew), "destroy",
		      (GtkSignalFunc) gtk_widget_destroy,
		      GTK_OBJECT(filew));
  gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
		      "clicked", (GtkSignalFunc) file_ok_sel, filew );
  gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION
					 (filew)->cancel_button),
			     "clicked", (GtkSignalFunc) gtk_widget_destroy,
			     GTK_OBJECT (filew));
  gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), 
				   "prova.cir");
  gtk_widget_show(filew);
}

void file_ok_sel(GtkWidget *w __attribute__((unused)), GtkFileSelection *fs ){
  
  writespice((char*)gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs)));
  gtk_widget_hide(filew);
}


void restart(GtkWidget *widget __attribute__((unused)),
	     gpointer user_data __attribute__((unused))) {

  smcdata.SPtype=SPTYPE_Z; smcdata.reentrySP=50.; smcdata.imentrySP=0.;
  smcdata.z0=50.; smcdata.f0=1e6; tsidx=3; tunestep=tunesteptab[tsidx];
  smcdata.ne=0; smcdata.neidx=0;
  recalc(); showtextstat(); drawchart(); showcircdesc();
  gtk_widget_draw(topwindow, NULL);  
}

gint cursor_motion_in_sc(GtkWidget *widget __attribute__((unused)),
			 GdkEventMotion *event){
  int x, y;
  GdkModifierType state;
  char b[80], b2[80];
  float r, j;

  if (event->is_hint)
    gdk_window_get_pointer (event->window, &x, &y, &state);
  else
    {
      x = event->x;
      y = event->y;
      state = event->state;
    }

  smcdata.rerhoCU=((float)x/(float)scdim-0.5)*2.;
  smcdata.imrhoCU=(0.5-(float)y/(float)scdim)*2.;

  /* More efficient rather than calling showtextstat() */
  rho2z(smcdata.rerhoCU, smcdata.imrhoCU, &r, &j);
  r*=smcdata.z0; j*=smcdata.z0;
  float2prefs(r, b, 0); sprintf(b2, "%cj", j>0. ? '+' : '-'); strcat(b, b2);
  float2prefs(fabs(j), b2, 0); strcat(b, b2);
  strcpy(b2, b); sprintf(b, statlabelname[labelzCU], b2);
  gtk_label_set_text(GTK_LABEL(statarr[labelzCU]), b);

  rho2y(smcdata.rerhoCU, smcdata.imrhoCU, &r, &j);
  r/=smcdata.z0; j/=smcdata.z0;
  float2prefs(r, b, 0); sprintf(b2, "%cj", j>0. ? '+' : '-'); strcat(b, b2);
  float2prefs(fabs(j), b2, 0); strcat(b, b2);  
  strcpy(b2, b); sprintf(b, statlabelname[labelyCU], b2);
  gtk_label_set_text(GTK_LABEL(statarr[labelyCU]), b);

  r=smcdata.rerhoCU; j=smcdata.imrhoCU;
  float2prefs(r, b, 0); sprintf(b2, "%cj", j>0. ? '+' : '-'); strcat(b, b2);
  float2prefs(fabs(j), b2, 0); strcat(b, b2);
  strcpy(b2, b); sprintf(b, statlabelname[labelrhoCU], b2);
  gtk_label_set_text(GTK_LABEL(statarr[labelrhoCU]), b);

  r=sqrt((smcdata.rerhoCU*smcdata.rerhoCU)+
	 (smcdata.imrhoCU*smcdata.imrhoCU));
  sprintf(b, "%5.2f", (1.+r)/(1.-r));
  strcpy(b2, b); sprintf(b, statlabelname[labelSWRCU], b2);
  gtk_label_set_text(GTK_LABEL(statarr[labelSWRCU]), b);


  return TRUE;
}

void set_first_val(GtkWidget *widget __attribute__((unused)),
		   gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Set new value");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etbn_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);


  gtk_widget_grab_focus(etb);

  entry_text_type=ETTN1;
}

void set_second_val(GtkWidget *widget __attribute__((unused)),
		    gpointer user_data __attribute__((unused))){
  GtkWidget *lb, *etb;

  /* New widget for value entry */
  entryval=gtk_dialog_new();
  gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow));

  /* Entry vbox */
  evb=gtk_vbox_new(FALSE, 0);

  /* Label */
  lb=gtk_label_new("Set new value");
  gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE);
  gtk_widget_show(lb);

  /* entry box */
  etb=gtk_entry_new_with_max_length(20);
  gtk_entry_set_editable(GTK_ENTRY(etb), TRUE);
  gtk_signal_connect(GTK_OBJECT(etb), "activate",
		     GTK_SIGNAL_FUNC(etbn_callback), GTK_OBJECT(etb));
  gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE);
  gtk_widget_show(etb);

  /* realize in entryval separate widget */
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox),
		    evb);
  gtk_widget_show(entryval);
  gtk_widget_show(evb);


  gtk_widget_grab_focus(etb);

  entry_text_type=ETTN2;
}


gint etbn_callback(GtkWidget *widget __attribute__((unused)),
		   GtkWidget *entry) {
  float val1, val2;
  char p;

  entry_text=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry));
  if(strlen(entry_text)!=0){
    switch(entry_text_type) {
    case ETTN1:
      componentvaluestringdecode(entry_text,
				 &smcdata.ELval0[smcdata.neidx], &val1,
				 &val2, &p);
      break;
    case ETTN2:
      componentvaluestringdecode(entry_text,
				 &smcdata.ELval1[smcdata.neidx], &val1,
				 &val2, &p);
      break;
    default: printf("%s\n", entry_text);
    }
    
    recalc(); showtextstat(); showcircdesc();
    entry_text_type=ETTNULL;
    drawchart(); gtk_widget_draw(scarea, NULL);
  }
  gtk_widget_destroy(entryval);

  return TRUE;
}


syntax highlighted by Code2HTML, v. 0.9.1