/* * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a * aplicativos mainframe. Registro no INPI sob o nome G3270. * * Copyright (C) <2008> * * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela * Free Software Foundation. * * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para * obter mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin * St, Fifth Floor, Boston, MA 02110-1301 USA * * Este programa está nomeado como - e possui - linhas de código. * * Contatos: * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) * */ #ifdef _WIN32 #include #include #endif // _WIN32 #include #include #include #include #include struct _PW3270SettingsDialog { GtkDialog parent; GtkNotebook * tabs; gboolean has_subtitle; }; struct _PW3270SettingsDialogClass { GtkDialogClass parent_class; }; G_DEFINE_TYPE(PW3270SettingsDialog, PW3270SettingsDialog, GTK_TYPE_DIALOG); static void add(GtkContainer *container, GtkWidget *widget); static void page_changed(GtkNotebook *notebook, GtkWidget *child, guint page_num, PW3270SettingsDialog *dialog); static void switch_page(GtkNotebook *notebook, PW3270Settings *page, guint page_num, PW3270SettingsDialog *dialog); static void dialog_close(GtkDialog *dialog); static void response(GtkDialog *dialog, gint response_id); /*--[ Implement ]------------------------------------------------------------------------------------*/ static void PW3270SettingsDialog_class_init(PW3270SettingsDialogClass *klass) { GTK_CONTAINER_CLASS(klass)->add = add; GTK_DIALOG_CLASS(klass)->close = dialog_close; GTK_DIALOG_CLASS(klass)->response = response; } static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) { GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); // Get use of header bar. g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL); gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); gtk_dialog_add_buttons( GTK_DIALOG(dialog), _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Apply"), GTK_RESPONSE_APPLY, NULL ); // Create notebook for settings widgets dialog->tabs = GTK_NOTEBOOK(gtk_notebook_new()); #ifdef _WIN32 gtk_widget_set_margin_bottom(GTK_WIDGET(dialog->tabs),3); // gtk_notebook_set_show_border(dialog->tabs, TRUE); #endif // _WIN32 gtk_notebook_set_scrollable(dialog->tabs,TRUE); gtk_notebook_set_show_tabs(dialog->tabs,FALSE); g_signal_connect(G_OBJECT(dialog->tabs), "page-added", G_CALLBACK(page_changed), dialog); g_signal_connect(G_OBJECT(dialog->tabs), "page-removed", G_CALLBACK(page_changed), dialog); g_signal_connect(G_OBJECT(dialog->tabs), "switch-page", G_CALLBACK(switch_page), dialog); gtk_box_pack_start(GTK_BOX(content_area),GTK_WIDGET(dialog->tabs),TRUE,TRUE,0); } GtkWidget * pw3270_settings_dialog_new(GAction *action) { #ifdef _WIN32 GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_PW3270_SETTINGS_DIALOG, "use-header-bar", FALSE, NULL )); #elif GTK_CHECK_VERSION(3,12,0) gboolean use_header; g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); GtkWidget * dialog = GTK_WIDGET(g_object_new( GTK_TYPE_PW3270_SETTINGS_DIALOG, "use-header-bar", (use_header ? 1 : 0), NULL )); #else GtkWidget * dialog = GTK_WIDGET(g_object_new(GTK_TYPE_PW3270_SETTINGS_DIALOG, NULL)); #endif // GTK 3.12 if(action) { if(PW3270_IS_ACTION(action)) { gtk_window_set_title(GTK_WINDOW(dialog),PW3270_ACTION(action)->label); } } return dialog; } void dialog_close(GtkDialog *dialog) { gtk_widget_destroy(GTK_WIDGET(dialog)); } static void apply(GtkWidget *widget, GtkWidget G_GNUC_UNUSED(*dialog)) { if(GTK_IS_PW3270_SETTINGS(widget)) { GTK_PW3270_SETTINGS(widget)->apply(widget,GTK_PW3270_SETTINGS(widget)->settings); } } static void revert(GtkWidget *widget, GtkWidget G_GNUC_UNUSED(*dialog)) { if(GTK_IS_PW3270_SETTINGS(widget)) { GTK_PW3270_SETTINGS(widget)->revert(widget,GTK_PW3270_SETTINGS(widget)->settings); } } void response(GtkDialog *dialog, gint response_id) { debug("%s(%d)",__FUNCTION__,response_id); switch(response_id) { case GTK_RESPONSE_APPLY: gtk_container_foreach( GTK_CONTAINER(GTK_PW3270_SETTINGS_DIALOG(dialog)->tabs), (GtkCallback) apply, dialog ); break; case GTK_RESPONSE_CANCEL: gtk_container_foreach( GTK_CONTAINER(GTK_PW3270_SETTINGS_DIALOG(dialog)->tabs), (GtkCallback) revert, dialog ); break; } gtk_widget_destroy(GTK_WIDGET(dialog)); } void add(GtkContainer *container, GtkWidget *widget) { GtkWidget * label = NULL; // https://developer.gnome.org/hig/stable/visual-layout.html.en gtk_container_set_border_width(GTK_CONTAINER(widget),18); if(GTK_IS_PW3270_SETTINGS(widget)) { PW3270Settings * settings = GTK_PW3270_SETTINGS(widget); label = gtk_label_new(settings->label); settings->load(widget,settings->settings); } gtk_notebook_append_page( GTK_PW3270_SETTINGS_DIALOG(container)->tabs, widget, label ); } void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog G_GNUC_UNUSED(*dialog)) { gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1); } void switch_page(GtkNotebook *notebook, PW3270Settings *page, guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog *dialog) { if(gtk_notebook_get_n_pages(notebook) > 1) { GtkWidget * header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); if(header_bar) { gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),page->title); } } }