//-----------------------------------------------------------------------------
// Copyright 2007 Jonathan Westhues
//
// This file is part of LDmicro.
//
// LDmicro 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 3 of the License, or
// (at your option) any later version.
//
// LDmicro 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 LDmicro. If not, see .
//------
//
// Dialog for setting the properties of a set of contacts: negated or not,
// plus the name
// Jonathan Westhues, Oct 2004
//-----------------------------------------------------------------------------
#include
#include
//#include
#include "ldmicro.h"
static HWID ContactsDialog;
static HWID NegatedCheckbox;
static HWID SourceInternalRelayRadio;
static HWID SourceInputPinRadio;
static HWID SourceOutputPinRadio;
static HWID NameTextbox;
static HWID OkButton;
static HWID CancelButton;
static LONG_PTR PrevNameProc;
static HWID ContactsGrid;
static HWID ContactsPackingBox;
char* tmpname;
BOOL* tmpnegated;
//-----------------------------------------------------------------------------
// Don't allow any characters other than A-Za-z0-9_ in the name.
//-----------------------------------------------------------------------------
// static LRESULT CALLBACK MyNameProc(HWND hwnd, UINT msg, WPARAM wParam,
// LPARAM lParam)
// {
// if(msg == WM_CHAR) {
// if(!(isalpha(wParam) || isdigit(wParam) || wParam == '_' ||
// wParam == '\b'))
// {
// return 0;
// }
// }
// return CallWindowProc((WNDPROC)PrevNameProc, hwnd, msg, wParam, lParam);
// }
void ContactsDialogMyNameProc (GtkEditable *editable, gchar *NewText, gint length,
gint *position, gpointer data){
// gtk_widget_set_sensitive (MainWindow, TRUE);
for (int i = 0; i < length; i++){
if (!(isalpha (NewText[i]) || NewText[i] == '_' || isdigit (NewText[i])
|| NewText[i] == '\b' )){
g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text");
return;
}
}
}
//Set the closing parameters
gboolean ContactsDialogClosing(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
DestroyWindow (ContactsDialog);
ProgramChanged();
gtk_widget_set_sensitive (MainWindow, TRUE);
}
gboolean ContactsDialogDestroyed(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
DestroyWindow (ContactsDialog);
ProgramChanged();
gtk_widget_set_sensitive (MainWindow, TRUE);
}
static void MakeControls(void)
{
SourceInternalRelayRadio = gtk_radio_button_new_with_label (NULL, "Internal Relay");
SourceInputPinRadio = gtk_radio_button_new_with_label_from_widget
(GTK_RADIO_BUTTON (SourceInternalRelayRadio), "Input pin");
SourceOutputPinRadio = gtk_radio_button_new_with_label_from_widget
(GTK_RADIO_BUTTON (SourceInternalRelayRadio), "Output pin");
HWID textLabel = gtk_label_new ("Name:");
NameTextbox = gtk_entry_new();
gtk_entry_set_max_length (GTK_ENTRY (NameTextbox), 0);
NegatedCheckbox = gtk_check_button_new_with_label ("|/| Negated");
OkButton = gtk_button_new_with_label ("OK");
CancelButton = gtk_button_new_with_label ("Cancel");
gtk_grid_attach (GTK_GRID (ContactsGrid), SourceInternalRelayRadio, 1, 2, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), SourceInputPinRadio, 1, 3, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), SourceOutputPinRadio, 1, 4, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), textLabel, 2, 2, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), NegatedCheckbox, 2, 3, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), NameTextbox, 3, 2, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), OkButton, 4, 2, 1, 1);
gtk_grid_attach (GTK_GRID (ContactsGrid), CancelButton, 4, 3, 1, 1);
gtk_grid_set_column_spacing (GTK_GRID (ContactsGrid), 1);
gtk_box_pack_start(GTK_BOX(ContactsPackingBox), ContactsGrid, TRUE, TRUE, 0);
// PrevNameProc = SetWindowLongPtr(NameTextbox, GWLP_WNDPROC,
// (LONG_PTR)MyNameProc);
}
void ContactsDialogGetData (BOOL* negated, char* name){
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (NegatedCheckbox))) {
*negated = TRUE;
}
else {
*negated = FALSE;
}
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
(SourceInternalRelayRadio))) {
name[0] = 'R';
}
else if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
(SourceInputPinRadio))) {
name[0] = 'X';
}
else {
name[0] = 'Y';
}
strcpy (name+1, gtk_entry_get_text (GTK_ENTRY (NameTextbox)));
DestroyWindow (ContactsDialog);
ProgramChanged();
gtk_widget_set_sensitive (MainWindow, TRUE);
}
// Mouse click callback
void ContactsDialogMouseClick(HWID widget, gpointer data){
ContactsDialogGetData(tmpnegated, tmpname);
}
// Checks for the required key press
gboolean ContactsDialogKeyPress (HWID widget, GdkEventKey* event, gpointer data){
if (event -> keyval == GDK_KEY_Return){
ContactsDialogGetData(tmpnegated, tmpname);
}
else if (event -> keyval == GDK_KEY_Escape){
DestroyWindow (ContactsDialog);
ProgramChanged();
gtk_widget_set_sensitive (MainWindow, TRUE);
}
return FALSE;
}
void ContactsCallDestroyWindow (HWID widget, gpointer data){
DestroyWindow (ContactsDialog);
ProgramChanged();
gtk_widget_set_sensitive (MainWindow, TRUE);
}
void ShowContactsDialog(BOOL *negated, char *name)
{
ContactsGrid = gtk_grid_new();
ContactsPackingBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
ContactsDialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(ContactsDialog), "Contacts");
gtk_window_set_default_size(GTK_WINDOW(ContactsDialog), 100, 50);
gtk_window_set_resizable (GTK_WINDOW (ContactsDialog), FALSE);
gtk_container_add(GTK_CONTAINER(ContactsDialog), ContactsPackingBox);
gtk_widget_add_events (ContactsDialog, GDK_KEY_PRESS_MASK);
gtk_widget_add_events (ContactsDialog, GDK_BUTTON_PRESS_MASK);
MakeControls();
if(name[0] == 'R') {
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SourceInternalRelayRadio), TRUE);
}
else if(name[0] == 'Y') {
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SourceOutputPinRadio), TRUE);
}
else {
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SourceInputPinRadio), TRUE);
}
if(*negated) {
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (NegatedCheckbox), TRUE);
}
gtk_entry_set_text (GTK_ENTRY (NameTextbox), name + 1);
gtk_widget_set_sensitive (MainWindow, FALSE);
gtk_widget_show_all (ContactsDialog);
gtk_widget_grab_focus (NameTextbox);
tmpname = name;
tmpnegated = negated;
g_signal_connect (G_OBJECT(NameTextbox), "insert-text",
G_CALLBACK(ContactsDialogMyNameProc), NULL);
g_signal_connect (G_OBJECT (ContactsDialog), "key-press-event",
G_CALLBACK(ContactsDialogKeyPress), NULL);
g_signal_connect (G_OBJECT (OkButton), "clicked",
G_CALLBACK(ContactsDialogMouseClick), NULL);
g_signal_connect (G_OBJECT (CancelButton), "clicked",
G_CALLBACK(ContactsCallDestroyWindow), NULL);
g_signal_connect (ContactsDialog, "destroy_event", G_CALLBACK (ContactsDialogClosing), NULL);
g_signal_connect (ContactsDialog, "delete_event", G_CALLBACK (ContactsDialogDestroyed), NULL);
}