#ifndef __PEDROGUI_H__ #define __PEDROGUI_H__ /* * Simple demo GUI for the Pedro mini-XMPP client. * * Authors: * Bob Jamison * * Copyright (C) 2005 Bob Jamison * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "pedroxmpp.h" #include "pedroconfig.h" namespace Pedro { class PedroGui; class GroupChatWindow; //######################################################################### //# R O S T E R //######################################################################### class Roster : public Gtk::ScrolledWindow { public: Roster() { doSetup(); } virtual ~Roster() {} /** * Clear all roster items from the list */ virtual void clear(); /** * Regenerate the roster */ virtual void refresh(); void setParent(PedroGui *val) { parent = val; } private: class CustomTreeView : public Gtk::TreeView { public: CustomTreeView() { parent = NULL; } virtual ~CustomTreeView() {} bool on_button_press_event(GdkEventButton* event) { Gtk::TreeView::on_button_press_event(event); if (parent) parent->buttonPressCallback(event); return true; } void setParent(Roster *val) { parent = val; } private: Roster *parent; }; void doubleClickCallback(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *col); void sendFileCallback(); void chatCallback(); bool buttonPressCallback(GdkEventButton* event); bool doSetup(); Glib::RefPtr pixbuf_available; Glib::RefPtr pixbuf_away; Glib::RefPtr pixbuf_chat; Glib::RefPtr pixbuf_dnd; Glib::RefPtr pixbuf_error; Glib::RefPtr pixbuf_offline; Glib::RefPtr pixbuf_xa; class RosterColumns : public Gtk::TreeModel::ColumnRecord { public: RosterColumns() { add(groupColumn); add(statusColumn); add(userColumn); add(nameColumn); add(subColumn); } Gtk::TreeModelColumn groupColumn; Gtk::TreeModelColumn > statusColumn; Gtk::TreeModelColumn userColumn; Gtk::TreeModelColumn nameColumn; Gtk::TreeModelColumn subColumn; }; RosterColumns rosterColumns; Glib::RefPtr uiManager; Glib::RefPtr treeStore; CustomTreeView rosterView; PedroGui *parent; }; //######################################################################### //# M E S S A G E L I S T //######################################################################### class MessageList : public Gtk::ScrolledWindow { public: MessageList() { doSetup(); } virtual ~MessageList() {} /** * Clear all messages from the list */ virtual void clear(); /** * Post a message to the list */ virtual void postMessage(const DOMString &from, const DOMString &msg); private: bool doSetup(); Gtk::TextView messageList; Glib::RefPtr messageListBuffer; }; //######################################################################### //# U S E R L I S T //######################################################################### class UserList : public Gtk::ScrolledWindow { public: UserList() { doSetup(); } virtual ~UserList() {} /** * Clear all messages from the list */ virtual void clear(); /** * Post a message to the list */ virtual void addUser(const DOMString &user, const DOMString &show); void setParent(GroupChatWindow *val) { parent = val; } private: class CustomTreeView : public Gtk::TreeView { public: CustomTreeView() { parent = NULL; } virtual ~CustomTreeView() {} bool on_button_press_event(GdkEventButton* event) { Gtk::TreeView::on_button_press_event(event); if (parent) parent->buttonPressCallback(event); return true; } void setParent(UserList *val) { parent = val; } private: UserList *parent; }; void doubleClickCallback(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *col); void sendFileCallback(); void chatCallback(); bool buttonPressCallback(GdkEventButton* event); bool doSetup(); Glib::RefPtr pixbuf_available; Glib::RefPtr pixbuf_away; Glib::RefPtr pixbuf_chat; Glib::RefPtr pixbuf_dnd; Glib::RefPtr pixbuf_error; Glib::RefPtr pixbuf_offline; Glib::RefPtr pixbuf_xa; class UserListColumns : public Gtk::TreeModel::ColumnRecord { public: UserListColumns() { add(statusColumn); add(userColumn); } Gtk::TreeModelColumn userColumn; Gtk::TreeModelColumn > statusColumn; }; UserListColumns userListColumns; Glib::RefPtr uiManager; Glib::RefPtr userListStore; CustomTreeView userList; GroupChatWindow *parent; }; //######################################################################### //# C H A T W I N D O W //######################################################################### class ChatWindow : public Gtk::Window { public: ChatWindow(PedroGui &par, const DOMString jid); virtual ~ChatWindow(); virtual DOMString getJid() { return jid; } virtual void setJid(const DOMString &val) { jid = val; } virtual bool postMessage(const DOMString &data); private: DOMString jid; void leaveCallback(); void hideCallback(); void textEnterCallback(); bool doSetup(); Gtk::VBox vbox; Gtk::VPaned vPaned; MessageList messageList; Gtk::Entry inputTxt; PedroGui &parent; }; //######################################################################### //# G R O U P C H A T W I N D O W //######################################################################### class GroupChatWindow : public Gtk::Window { public: GroupChatWindow(PedroGui &par, const DOMString &groupJid, const DOMString &nick); virtual ~GroupChatWindow(); virtual DOMString getGroupJid() { return groupJid; } virtual void setGroupJid(const DOMString &val) { groupJid = val; } virtual DOMString getNick() { return nick; } virtual void setNick(const DOMString &val) { nick = val; } virtual bool receiveMessage(const DOMString &from, const DOMString &data); virtual bool receivePresence(const DOMString &nick, bool presence, const DOMString &show, const DOMString &status); virtual void doSendFile(const DOMString &nick); virtual void doChat(const DOMString &nick); private: void textEnterCallback(); void leaveCallback(); void hideCallback(); bool doSetup(); Gtk::VBox vbox; Gtk::VPaned vPaned; Gtk::HPaned hPaned; MessageList messageList; UserList userList; Gtk::Entry inputTxt; DOMString groupJid; DOMString nick; PedroGui &parent; }; //######################################################################### //# C O N F I G D I A L O G //######################################################################### class ConfigDialog : public Gtk::Dialog { public: ConfigDialog (PedroGui &par) : parent(par) { doSetup(); } virtual ~ConfigDialog () {} DOMString getPass() { return passField.get_text(); } DOMString getNewPass() { return newField.get_text(); } DOMString getConfirm() { return confField.get_text(); } protected: //Overloaded from Gtk::Dialog virtual void on_response(int response_id); private: void okCallback(); void cancelCallback(); bool doSetup(); Gtk::Table table; Gtk::Label passLabel; Gtk::Entry passField; Gtk::Label newLabel; Gtk::Entry newField; Gtk::Label confLabel; Gtk::Entry confField; PedroGui &parent; }; //######################################################################### //# P A S S W O R D D I A L O G //######################################################################### class PasswordDialog : public Gtk::Dialog { public: PasswordDialog (PedroGui &par) : parent(par) { doSetup(); } virtual ~PasswordDialog () {} DOMString getPass() { return passField.get_text(); } DOMString getNewPass() { return newField.get_text(); } DOMString getConfirm() { return confField.get_text(); } protected: //Overloaded from Gtk::Dialog virtual void on_response(int response_id); private: void okCallback(); void cancelCallback(); bool doSetup(); Gtk::Table table; Gtk::Label passLabel; Gtk::Entry passField; Gtk::Label newLabel; Gtk::Entry newField; Gtk::Label confLabel; Gtk::Entry confField; PedroGui &parent; }; //######################################################################### //# C H A T D I A L O G //######################################################################### class ChatDialog : public Gtk::Dialog { public: ChatDialog(PedroGui &par) : parent(par) { doSetup(); } virtual ~ChatDialog() {} DOMString getUser() { return userField.get_text(); } DOMString getText() { return textField.get_text(); } private: void okCallback(); void cancelCallback(); bool doSetup(); Gtk::Table table; Gtk::Label userLabel; Gtk::Entry userField; Gtk::Entry textField; PedroGui &parent; }; //######################################################################### //# G R O U P C H A T D I A L O G //######################################################################### class GroupChatDialog : public Gtk::Dialog { public: GroupChatDialog(PedroGui &par) : parent(par) { doSetup(); } virtual ~GroupChatDialog() {} DOMString getGroup() { return groupField.get_text(); } DOMString getHost() { return hostField.get_text(); } DOMString getPass() { return passField.get_text(); } DOMString getNick() { return nickField.get_text(); } private: void okCallback(); void cancelCallback(); bool doSetup(); Gtk::Table table; Gtk::Label groupLabel; Gtk::Entry groupField; Gtk::Label hostLabel; Gtk::Entry hostField; Gtk::Label passLabel; Gtk::Entry passField; Gtk::Label nickLabel; Gtk::Entry nickField; PedroGui &parent; }; //######################################################################### //# C O N N E C T D I A L O G //######################################################################### class ConnectDialog : public Gtk::Dialog { public: ConnectDialog (PedroGui &par) : parent(par) { doSetup(); } virtual ~ConnectDialog () {} DOMString getHost() { return hostField.get_text(); } void setHost(const DOMString &val) { hostField.set_text(val); } int getPort() { return (int)portSpinner.get_value(); } void setPort(int val) { portSpinner.set_value(val); } DOMString getUser() { return userField.get_text(); } void setUser(const DOMString &val) { userField.set_text(val); } DOMString getPass() { return passField.get_text(); } void setPass(const DOMString &val) { passField.set_text(val); } DOMString getResource() { return resourceField.get_text(); } void setResource(const DOMString &val) { resourceField.set_text(val); } bool getRegister() { return registerButton.get_active(); } /** * Regenerate the account list */ virtual void refresh(); private: void okCallback(); void saveCallback(); void cancelCallback(); void doubleClickCallback( const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *col); void selectedCallback(); bool doSetup(); Gtk::Table table; Gtk::Label hostLabel; Gtk::Entry hostField; Gtk::Label portLabel; Gtk::SpinButton portSpinner; Gtk::Label userLabel; Gtk::Entry userField; Gtk::Label passLabel; Gtk::Entry passField; Gtk::Label resourceLabel; Gtk::Entry resourceField; Gtk::Label registerLabel; Gtk::CheckButton registerButton; Glib::RefPtr uiManager; //## Account list void buttonPressCallback(GdkEventButton* event); Gtk::ScrolledWindow accountScroll; void connectCallback(); void modifyCallback(); void deleteCallback(); class AccountColumns : public Gtk::TreeModel::ColumnRecord { public: AccountColumns() { add(nameColumn); add(hostColumn); } Gtk::TreeModelColumn nameColumn; Gtk::TreeModelColumn hostColumn; }; AccountColumns accountColumns; Glib::RefPtr accountUiManager; Glib::RefPtr accountListStore; Gtk::TreeView accountView; PedroGui &parent; }; //######################################################################### //# F I L E S E N D D I A L O G //######################################################################### class FileSendDialog : public Gtk::Dialog { public: FileSendDialog(PedroGui &par) : parent(par) { doSetup(); } virtual ~FileSendDialog() {} DOMString getFileName() { return fileName; } DOMString getJid() { return jidField.get_text(); } void setJid(const DOMString &val) { return jidField.set_text(val); } private: void okCallback(); void cancelCallback(); void buttonCallback(); bool doSetup(); Gtk::Table table; Gtk::Label jidLabel; Gtk::Entry jidField; DOMString fileName; Gtk::Entry fileNameField; Gtk::Button selectFileButton; PedroGui &parent; }; //######################################################################### //# F I L E R E C E I V E D I A L O G //######################################################################### class FileReceiveDialog : public Gtk::Dialog { public: FileReceiveDialog(PedroGui &par, const DOMString &jidArg, const DOMString &iqIdArg, const DOMString &streamIdArg, const DOMString &offeredNameArg, const DOMString &descArg, long sizeArg, const DOMString &hashArg ) : parent(par) { jid = jidArg; iqId = iqIdArg; streamId = streamIdArg; offeredName = offeredNameArg; desc = descArg; fileSize = sizeArg; hash = hashArg; doSetup(); } virtual ~FileReceiveDialog() {} DOMString getJid() { return jid; } DOMString getIq() { return iqId; } DOMString getStreamId() { return streamId; } DOMString getOfferedName() { return offeredName; } DOMString getFileName() { return fileName; } DOMString getDescription() { return desc; } long getSize() { return fileSize; } DOMString getHash() { return hash; } private: void okCallback(); void cancelCallback(); void buttonCallback(); bool doSetup(); Gtk::Table table; Gtk::Label jidLabel; Gtk::Entry jidField; Gtk::Label offeredLabel; Gtk::Entry offeredField; Gtk::Label descLabel; Gtk::Entry descField; Gtk::Label sizeLabel; Gtk::Entry sizeField; Gtk::Label hashLabel; Gtk::Entry hashField; Gtk::Entry fileNameField; Gtk::Button selectFileButton; DOMString jid; DOMString iqId; DOMString streamId; DOMString offeredName; DOMString desc; long fileSize; DOMString hash; DOMString fileName; PedroGui &parent; }; //######################################################################### //# M A I N W I N D O W //######################################################################### class PedroGui : public Gtk::Window { public: PedroGui(); virtual ~PedroGui(); //Let everyone share these XmppClient client; XmppConfig config; virtual void error(const char *fmt, ...); virtual void status(const char *fmt, ...); void handleConnectEvent(); void handleDisconnectEvent(); /** * */ virtual void doEvent(const XmppEvent &event); /** * */ bool checkEventQueue(); bool chatCreate(const DOMString &userJid); bool chatDelete(const DOMString &userJid); bool chatDeleteAll(); bool chatMessage(const DOMString &jid, const DOMString &data); bool groupChatCreate(const DOMString &groupJid, const DOMString &nick); bool groupChatDelete(const DOMString &groupJid, const DOMString &nick); bool groupChatDeleteAll(); bool groupChatMessage(const DOMString &groupJid, const DOMString &from, const DOMString &data); bool groupChatPresence(const DOMString &groupJid, const DOMString &nick, bool presence, const DOMString &show, const DOMString &status); void doChat(const DOMString &jid); void doSendFile(const DOMString &jid); void doReceiveFile(const DOMString &jid, const DOMString &iqId, const DOMString &streamId, const DOMString &offeredName, const DOMString &desc, long size, const DOMString &hash); //# File menu void connectCallback(); void chatCallback(); void groupChatCallback(); void disconnectCallback(); void quitCallback(); //# Edit menu void fontCallback(); void colorCallback(); //# Transfer menu void sendFileCallback(); //# Registration menu void regPassCallback(); void regCancelCallback(); //# Help menu void aboutCallback(); //# Configuration file bool configLoad(); bool configSave(); private: bool doSetup(); Gtk::VBox mainBox; Gtk::HBox menuBarBox; Gtk::Image padlockIcon; void padlockEnable(); void padlockDisable(); Pango::FontDescription fontDesc; Gdk::Color foregroundColor; Gdk::Color backgroundColor; Gtk::VPaned vPaned; MessageList messageList; Roster roster; Glib::RefPtr uiManager; void actionEnable(const DOMString &name, bool val); std::vectorchats; std::vectorgroupChats; static const int writeBufLen = 2048; char writeBuf[writeBufLen]; }; } //namespace Pedro #endif /* __PEDROGUI_H__ */ //######################################################################### //# E N D O F F I L E //#########################################################################