/* AbiWord * Copyright (C) 2001 AbiSource, Inc. * Copyright (C) 2009 Hubert Figuiere * Copyright (C) 2011 Ben Martin * * 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 #include #include #include #include "ut_string.h" #include "ut_assert.h" #include "ut_debugmsg.h" // This header defines some functions for Unix dialogs, // like centering them, measuring them, etc. #include "xap_UnixDialogHelper.h" #include "xap_Gtk2Compat.h" #include "xap_App.h" #include "xap_UnixApp.h" #include "xap_Frame.h" #include "ap_Strings.h" #include "ap_Dialog_Id.h" #include "ap_Dialog_InsertXMLID.h" #include "ap_UnixDialog_InsertXMLID.h" #include "GTKCommon.h" /*****************************************************************/ #define BUTTON_INSERT 1 #include static gboolean __onKeyPressed(G_GNUC_UNUSED GtkWidget* widget, GdkEventKey* event, G_GNUC_UNUSED gpointer user_data ) { guint32 uc = gdk_keyval_to_unicode(event->keyval); xxx_UT_DEBUGMSG(("__onKeyPressed() uc: %u\n", uc)); if( uc >= 'A' && uc <= 'Z' ) { return false; } if( uc >= 'a' && uc <= 'z' ) { return false; } if( uc >= '0' && uc <= '9' ) { return false; } if( event->keyval == GDK_KEY_Delete || event->keyval == GDK_KEY_BackSpace || event->keyval == GDK_KEY_Left || event->keyval == GDK_KEY_Right ) { return false; } // filter the rest return true; } /*****************************************************************/ XAP_Dialog * AP_UnixDialog_InsertXMLID::static_constructor( XAP_DialogFactory * pFactory, XAP_Dialog_Id id ) { AP_UnixDialog_InsertXMLID * p = new AP_UnixDialog_InsertXMLID(pFactory,id); return p; } AP_UnixDialog_InsertXMLID::AP_UnixDialog_InsertXMLID( XAP_DialogFactory * pDlgFactory, XAP_Dialog_Id id ) : AP_Dialog_InsertXMLID(pDlgFactory,id) , m_window(NULL) , m_btInsert(NULL) { } AP_UnixDialog_InsertXMLID::~AP_UnixDialog_InsertXMLID(void) { } /*****************************************************************/ /***********************************************************************/ void AP_UnixDialog_InsertXMLID::runModal(XAP_Frame * pFrame) { UT_return_if_fail(pFrame); // Build the window's widgets and arrange them GtkWidget * mainWindow = _constructWindow(); UT_return_if_fail(mainWindow); // Populate the window's data items _setList(); switch(abiRunModalDialog( GTK_DIALOG(mainWindow), pFrame, this, BUTTON_INSERT, false)) { case BUTTON_INSERT: event_OK (); break ; case BUTTON_DELETE: event_Delete (); break ; default: event_Cancel (); break ; } abiDestroyWidget ( mainWindow ) ; } void AP_UnixDialog_InsertXMLID::event_OK(void) { UT_ASSERT(m_window); // get the bookmark name, if any (return cancel if no name given) std::string mark = tostr(m_combo); if( !mark.empty() ) { xxx_UT_DEBUGMSG(("InsertXMLID: OK pressed, first char 0x%x\n", (UT_uint32)mark[0])); setAnswer(AP_Dialog_InsertXMLID::a_OK); setString(mark); } else { setAnswer(AP_Dialog_InsertXMLID::a_CANCEL); } } void AP_UnixDialog_InsertXMLID::event_Cancel(void) { setAnswer(AP_Dialog_InsertXMLID::a_CANCEL); } void AP_UnixDialog_InsertXMLID::event_Delete(void) { setString(tostr(m_combo)); setAnswer(AP_Dialog_InsertXMLID::a_DELETE); } void AP_UnixDialog_InsertXMLID::_setList(void) { std::list bookmarks; // for(UT_sint32 i = 0; i < getExistingBookmarksCount(); i++) // { // bookmarks.push_back(getNthExistingBookmark(i)); // } GtkComboBoxText * combo = GTK_COMBO_BOX_TEXT(m_combo); bookmarks.sort(); append( combo, bookmarks ); // GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(m_combo))); // if (getBookmark() && strlen(getBookmark()) > 0) // { // gtk_entry_set_text(entry, getBookmark()); // } // else // { // const UT_UCS4String suggestion = getSuggestedBM (); // if (suggestion.size()>0) // { // UT_UTF8String utf8 (suggestion); // gtk_entry_set_text (entry, utf8.utf8_str()); // } // } } void AP_UnixDialog_InsertXMLID::_constructWindowContents(GtkWidget * container ) { XAP_String_Id msgid = AP_STRING_ID_DLG_InsertXMLID_Msg; GtkWidget *label1; const XAP_StringSet * pSS = m_pApp->getStringSet(); UT_UTF8String s; pSS->getValueUTF8(msgid,s); label1 = gtk_label_new (s.utf8_str()); gtk_widget_show (label1); gtk_box_pack_start (GTK_BOX (container), label1, FALSE, FALSE, 0); m_combo = GTK_COMBO_BOX(gtk_combo_box_text_new_with_entry()); gtk_widget_show (GTK_WIDGET(m_combo)); gtk_box_pack_start (GTK_BOX (container), GTK_WIDGET(m_combo), FALSE, FALSE, 0); GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(m_combo))); g_signal_connect (GTK_ENTRY (entry), "key-press-event", G_CALLBACK (__onKeyPressed), static_cast (this)); } GtkWidget* AP_UnixDialog_InsertXMLID::_constructWindow(void) { GtkWidget *vbox; const XAP_StringSet * pSS = m_pApp->getStringSet(); UT_UTF8String s; pSS->getValueUTF8(AP_STRING_ID_DLG_InsertXMLID_Title,s); m_window = abiDialogNew("insert RDF link dialog", TRUE, s.utf8_str()); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_widget_show (vbox); gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area(GTK_DIALOG (m_window))), vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); _constructWindowContents ( vbox ); abiAddStockButton(GTK_DIALOG(m_window), GTK_STOCK_CANCEL, BUTTON_CANCEL); abiAddStockButton(GTK_DIALOG(m_window), GTK_STOCK_DELETE, BUTTON_DELETE); m_btInsert = abiAddButton(GTK_DIALOG(m_window), "", BUTTON_INSERT); localizeButtonUnderline (m_btInsert, pSS, AP_STRING_ID_DLG_InsertButton); gtk_widget_grab_focus (GTK_WIDGET(m_combo)); return m_window; }