// -*- C++ -*-

/* 
 * Gnome Crystal
 * sizedlg.cc 
 *
 * Copyright (C) 2002-2007 Jean Bréfort <jean.brefort@normalesup.org>
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 */

#include "config.h"
#include "celldlg.h"
#include "document.h"
#include "application.h"
#include <glib/gi18n.h>

void on_type_changed (GtkWidget* w, gcCellDlg *pBox)
{
	pBox->OnTypeChanged ();
}

gcCellDlg::gcCellDlg (gcApplication *App, gcDocument* pDoc): Dialog (App, GLADEDIR"/cell.glade", "cell", pDoc)
{
	if (!xml) {
		delete this;
		return;
	}
	m_pDoc = pDoc;
	TypeMenu = GTK_COMBO_BOX (glade_xml_get_widget (xml, "lattice-type"));
	g_signal_connect (G_OBJECT (TypeMenu), "changed", G_CALLBACK (on_type_changed), this);
	A = (GtkEntry*) glade_xml_get_widget (xml, "a");
	B = (GtkEntry*) glade_xml_get_widget (xml, "b");
	C = (GtkEntry*) glade_xml_get_widget (xml, "c");
	Alpha = (GtkEntry*) glade_xml_get_widget (xml, "alpha");
	Beta = (GtkEntry*) glade_xml_get_widget (xml, "beta");
	Gamma = (GtkEntry*) glade_xml_get_widget (xml, "gamma");
	gcLattices i;
	m_pDoc->GetCell (&i, &m_a, &m_b, &m_c, &m_alpha, &m_beta, &m_gamma);
	snprintf (m_buf, sizeof (m_buf), "%g", m_a);
	gtk_entry_set_text (A, m_buf);
	snprintf (m_buf, sizeof (m_buf), "%g", m_b);
	gtk_entry_set_text (B, m_buf);
	snprintf (m_buf, sizeof (m_buf), "%g", m_c);
	gtk_entry_set_text (C, m_buf);
	snprintf (m_buf, sizeof (m_buf), "%g", m_alpha);
	gtk_entry_set_text (Alpha, m_buf);
	snprintf (m_buf, sizeof (m_buf), "%g", m_beta);
	gtk_entry_set_text (Beta, m_buf);
	snprintf (m_buf, sizeof (m_buf), "%g", m_gamma);
	gtk_entry_set_text (Gamma, m_buf);
	gtk_combo_box_set_active (TypeMenu, i);
	OnTypeChanged ();
}

gcCellDlg::~gcCellDlg ()
{
}

bool gcCellDlg::Apply ()
{
	gcLattices i = (gcLattices) gtk_combo_box_get_active (TypeMenu);
	switch (i)
	{
	case cubic:
	case body_centered_cubic:
	case face_centered_cubic:
		if (!GetNumber (A, &m_a, Min, 0))
			return false;
		m_alpha = m_beta = m_gamma  = 90;
		m_b = m_c = m_a;
		break;
	case hexagonal:
		if ((!GetNumber (A, &m_a, Min, 0)) ||
			(!GetNumber (C, &m_c, Min, 0)))
			return false;
		m_alpha = m_beta = 90;
		m_gamma  = 120;
		m_b = m_a;
		break;
	case tetragonal:
	case body_centered_tetragonal:
		if ((!GetNumber (A, &m_a, Min, 0)) ||
			(!GetNumber (C, &m_c, Min, 0)))
			return false;
		m_alpha = m_beta = m_gamma  = 90;
		m_b = m_a;
		break;
	case orthorhombic:
	case base_centered_orthorhombic:
	case body_centered_orthorhombic:
	case face_centered_orthorhombic:
		if ((!GetNumber (A, &m_a, Min, 0)) ||
			(!GetNumber (B, &m_b, Min, 0)) ||
			(!GetNumber (C, &m_c, Min, 0)))
			return false;
		m_alpha = m_beta = m_gamma  = 90;
		break;
	case rhombohedral:
		if ((!GetNumber (A, &m_a, Min, 0)) ||
			(!GetNumber (Alpha, &m_alpha, MinMax, 0, 180)))
			return false;
		m_beta = m_gamma = m_alpha;
		m_b = m_c = m_a;
		break;
	case monoclinic:
	case base_centered_monoclinic:
		if ((!GetNumber (A, &m_a, Min, 0)) ||
			(!GetNumber (B, &m_b, Min, 0)) ||
			(!GetNumber (C, &m_c, Min, 0)) ||
			(!GetNumber (Beta, &m_beta, MinMax, 0, 180)))
			return false;
		m_alpha = m_gamma  = 90;
		break;
	case triclinic:
		if ((!GetNumber (A, &m_a, Min, 0)) ||
			(!GetNumber (B, &m_b, Min, 0)) ||
			(!GetNumber (C, &m_c, Min, 0)) ||
			(!GetNumber (Alpha, &m_alpha, MinMax, 0, 180)) ||
			(!GetNumber (Beta, &m_beta, MinMax, 0, 180)) ||
			(!GetNumber (Gamma, &m_gamma, MinMax, 0, 180)))
			return false;
		break;
	}
	if (m_alpha + m_beta + m_gamma >= 360)
	{
		GtkDialog* box = GTK_DIALOG (gtk_message_dialog_new (GTK_WINDOW (dialog), GTK_DIALOG_MODAL,
										GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("The sum of the three angles must be less than 360°")));
		gtk_dialog_run (box);
	}
	m_pDoc->SetCell (i, m_a, m_b, m_c, m_alpha, m_beta, m_gamma);
	m_pDoc->Update ();
	m_pDoc->SetDirty (true);
	return true;
}

void gcCellDlg::OnTypeChanged ()
{
	gcLattices i = (gcLattices) gtk_combo_box_get_active (TypeMenu);
	switch(i)
	{
		case cubic:
		case body_centered_cubic:
		case face_centered_cubic:
			gtk_entry_set_text (Alpha, "90");
			gtk_entry_set_text (Beta, "90");
			gtk_entry_set_text (Gamma, "90");
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),0);
			gtk_widget_set_sensitive (GTK_WIDGET (B),0);
			gtk_widget_set_sensitive (GTK_WIDGET (C),0);
			break;
		case hexagonal:
			gtk_entry_set_text (Alpha, "90");
			gtk_entry_set_text (Beta, "90");
			gtk_entry_set_text (Gamma, "120");
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),0);
			gtk_widget_set_sensitive (GTK_WIDGET (B),0);
			gtk_widget_set_sensitive (GTK_WIDGET (C),1);
			break;
		case tetragonal:
		case body_centered_tetragonal:
			gtk_entry_set_text (Alpha, "90");
			gtk_entry_set_text (Beta, "90");
			gtk_entry_set_text (Gamma, "90");
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),0);
			gtk_widget_set_sensitive (GTK_WIDGET (B),0);
			gtk_widget_set_sensitive (GTK_WIDGET (C),1);
			break;
		case orthorhombic:
		case base_centered_orthorhombic:
		case body_centered_orthorhombic:
		case face_centered_orthorhombic:
			gtk_entry_set_text (Alpha, "90");
			gtk_entry_set_text (Beta, "90");
			gtk_entry_set_text (Gamma, "90");
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),0);
			gtk_widget_set_sensitive (GTK_WIDGET (B),1);
			gtk_widget_set_sensitive (GTK_WIDGET (C),1);
			break;
		case rhombohedral:
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),1);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),0);
			gtk_widget_set_sensitive (GTK_WIDGET (B),0);
			gtk_widget_set_sensitive (GTK_WIDGET (C),0);
			break;
		case monoclinic:
		case base_centered_monoclinic:
			gtk_entry_set_text (Alpha, "90");
			gtk_entry_set_text (Gamma, "90");
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),0);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),1);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),0);
			gtk_widget_set_sensitive (GTK_WIDGET (B),1);
			gtk_widget_set_sensitive (GTK_WIDGET (C),1);
			break;
		case triclinic:
			gtk_widget_set_sensitive (GTK_WIDGET (Alpha),1);
			gtk_widget_set_sensitive (GTK_WIDGET (Beta),1);
			gtk_widget_set_sensitive (GTK_WIDGET (Gamma),1);
			gtk_widget_set_sensitive (GTK_WIDGET (B),1);
			gtk_widget_set_sensitive (GTK_WIDGET (C),1);
			break;
	}
}


syntax highlighted by Code2HTML, v. 0.9.1