diff --git a/src/gui/official/Makefile.am b/src/gui/official/Makefile.am index 8fa0d163ddb9be9f280ce0da3e45928582149ca0..04671388ab1584e83af18624f6f7dae5737ea78a 100644 --- a/src/gui/official/Makefile.am +++ b/src/gui/official/Makefile.am @@ -1,20 +1,60 @@ -noinst_PROGRAMS = test - -BUILT_SOURCES = - -test_SOURCES = \ +bin_PROGRAMS = sflphonegui +noinst_PROGRAMS = servertest + +#configurationpanel.h configurationpanelui.cpp configurationpanelmoc.cpp +BUILT_SOURCES = \ + url_input.h \ + url_inputui.cpp \ + url_inputmoc.cpp \ + jpushbuttonmoc.cpp \ + trayiconmoc.cpp\ + volumecontrolmoc.cpp\ + numerickeypadmoc.cpp \ + mydisplaymoc.cpp \ + qtGUImainwindowmoc.cpp + +servertest_SOURCES = \ + account.cpp \ + answerreceiver.cpp \ + call.cpp \ + main.cpp \ + request.cpp \ + requesterimpl.cpp \ + session.cpp \ + sessionio.cpp + +sflphonegui_SOURCES = \ $(BUILT_SOURCES) \ - account.cpp answerreceiver.cpp call.cpp main.cpp request.cpp requesterimpl.cpp session.cpp sessionio.cpp - + jpushbutton.cpp \ + mydisplay.cpp \ + numerickeypad.cpp \ + numerickeypadtools.cpp \ + trayicon.cpp \ + phoneline.cpp \ + point.cpp \ + qjlistboxpixmap.cpp \ + qtGUImainwindow.cpp \ + transqwidget.cpp \ + trayicon_x11.cpp \ + vector.cpp \ + volumecontrol.cpp CLEANFILES = \ $(BUILT_SOURCES) -test_LDFLAGS = $(QT_LDFLAGS) $(X_LDFLAGS) -static -test_LDADD = ../../../utilspp/libutilspp.la -lpthread $(LIBQT) +AM_CXXFLAGS = -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" + +AM_LDFLAGS = $(QT_LDFLAGS) $(X_LDFLAGS) -static +LDADD = ../../../utilspp/libutilspp.la -lpthread $(LIBQT) KDE_CXXFLAGS = $(USE_EXCEPTIONS) AM_CPPFLAGS = $(QT_INCLUDES) $(X_INCLUDES) -I$(top_srcdir)/src +%.h: %.ui + $(UIC) -o $@ $< +%moc.cpp: %.h + $(MOC) -o $@ $< +%ui.cpp: %.ui + $(UIC) -o $@ -impl $*.h $< diff --git a/src/gui/official/configurationpanel.h b/src/gui/official/configurationpanel.h new file mode 100644 index 0000000000000000000000000000000000000000..147d9b5b85cfebe9d798c570d57a3856634cfb4e --- /dev/null +++ b/src/gui/official/configurationpanel.h @@ -0,0 +1,163 @@ +/**************************************************************************** +** Form interface generated from reading ui file 'configurationpanel.ui' +** +** Created: Sat Sep 17 14:20:22 2005 +** by: The User Interface Compiler ($Id$) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef CONFIGURATIONPANEL_H +#define CONFIGURATIONPANEL_H + +#include <qvariant.h> +#include <qpixmap.h> +#include <qdialog.h> + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class QFrame; +class QPushButton; +class QListBox; +class QListBoxItem; +class QLabel; +class QTabWidget; +class QWidget; +class QGroupBox; +class QLineEdit; +class QCheckBox; +class QButtonGroup; +class QRadioButton; +class QSpinBox; +class QComboBox; + +class ConfigurationPanel : public QDialog +{ + Q_OBJECT + +public: + ConfigurationPanel( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~ConfigurationPanel(); + + QFrame* line1; + QPushButton* buttonHelp; + QPushButton* buttonSave; + QPushButton* buttonOk; + QPushButton* buttonCancel; + QListBox* Menu; + QLabel* TitleTab; + QFrame* line2; + QTabWidget* Tab_Signalisations; + QWidget* SIPPage; + QGroupBox* groupBox1; + QLabel* textLabel2; + QLineEdit* fullName; + QLineEdit* userPart; + QLabel* textLabel3; + QLabel* textLabel2_3; + QLineEdit* username; + QLineEdit* hostPart; + QLineEdit* sipproxy; + QLabel* textLabel3_2_2; + QLineEdit* password; + QLabel* textLabel1_3; + QLabel* textLabel3_2; + QCheckBox* autoregister; + QPushButton* Register; + QWidget* STUNPage; + QGroupBox* groupBox3; + QLabel* textLabel1_5; + QLineEdit* STUNserver; + QButtonGroup* stunButtonGroup; + QRadioButton* useStunNo; + QRadioButton* useStunYes; + QWidget* DTMFPage; + QGroupBox* SettingsDTMF; + QCheckBox* playTones; + QLabel* labelPulseLength; + QSpinBox* pulseLength; + QLabel* labelSendDTMF; + QComboBox* sendDTMFas; + QTabWidget* Tab_Audio; + QWidget* DriversPage; + QButtonGroup* DriverChoice; + QWidget* CodecsPage; + QButtonGroup* CodecsChoice; + QComboBox* codec1; + QComboBox* codec2; + QComboBox* codec3; + QLabel* textLabel1_4; + QLabel* textLabel1_4_2; + QLabel* textLabel1_4_3; + QWidget* RingPage; + QComboBox* ringsChoice; + QTabWidget* Tab_Preferences; + QWidget* DriversPage_2; + QComboBox* SkinChoice; + QPushButton* buttonApplySkin; + QWidget* TabPage; + QLabel* labelToneZone; + QComboBox* zoneToneChoice; + QCheckBox* confirmationToQuit; + QCheckBox* checkedTray; + QLabel* textLabel1_6; + QLineEdit* voicemailNumber; + QTabWidget* Tab_About; + QWidget* DriversPage_3; + QLabel* pixmapLabel1; + QLabel* textLabel2_2; + QWidget* CodecsPage_2; + QLabel* textLabel1; + QLabel* pixmapLabel2; + +public slots: + virtual void saveSlot(); + virtual void changeTabSlot(); + virtual void useStunSlot( int id ); + virtual void applySkinSlot(); + virtual void driverSlot( int id ); + +protected: + QGridLayout* ConfigurationPanelLayout; + QVBoxLayout* layout19; + QHBoxLayout* layout28; + QSpacerItem* Horizontal_Spacing2; + QVBoxLayout* layout17; + QVBoxLayout* layout24; + QGridLayout* groupBox1Layout; + QVBoxLayout* layout23; + QSpacerItem* spacer9; + QHBoxLayout* layout19_2; + QSpacerItem* spacer7; + QVBoxLayout* stunButtonGroupLayout; + QGridLayout* SettingsDTMFLayout; + QVBoxLayout* layout11; + QHBoxLayout* layout10; + QSpacerItem* spacer6; + QHBoxLayout* layout7; + QSpacerItem* spacer3; + QHBoxLayout* layout8; + QSpacerItem* spacer4; + QGridLayout* layout18; + QVBoxLayout* layout17_2; + QVBoxLayout* layout18_2; + QVBoxLayout* layout17_3; + QHBoxLayout* layout16; + QSpacerItem* spacer5; + QHBoxLayout* layout16_2; + QSpacerItem* spacer6_2; + +protected slots: + virtual void languageChange(); + +private: + QPixmap image0; + QPixmap image1; + + void init(); + +}; + +#endif // CONFIGURATIONPANEL_H diff --git a/src/gui/official/configurationpanel.ui b/src/gui/official/configurationpanel.ui new file mode 100644 index 0000000000000000000000000000000000000000..b06767a7d95d4a7273d17ece47382f091dcc4108 --- /dev/null +++ b/src/gui/official/configurationpanel.ui @@ -0,0 +1,1273 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>ConfigurationPanel</class> +<widget class="QDialog"> + <property name="name"> + <cstring>ConfigurationPanel</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>561</width> + <height>552</height> + </rect> + </property> + <property name="caption"> + <string>Configuration panel</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="Line"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout28</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <string>F1</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>160</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonSave</cstring> + </property> + <property name="text"> + <string>&Save</string> + </property> + <property name="accel"> + <string>Alt+S</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="accel"> + <string>Alt+O</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <string>F, Backspace</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QListBox" row="0" column="0"> + <property name="name"> + <cstring>Menu</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="cursor"> + <cursor>13</cursor> + </property> + <property name="currentItem"> + <number>-1</number> + </property> + <property name="selectionMode"> + <enum>Single</enum> + </property> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>TitleTab</cstring> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Setup signalisation</string> + </property> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line2</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Signalisations</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>SIPPage</cstring> + </property> + <attribute name="title"> + <string>SIP Authentication</string> + </attribute> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout24</cstring> + </property> + <property name="geometry"> + <rect> + <x>16</x> + <y>12</y> + <width>401</width> + <height>393</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox1</cstring> + </property> + <property name="title"> + <string></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Full name</string> + </property> + </widget> + <widget class="QLineEdit" row="1" column="0"> + <property name="name"> + <cstring>fullName</cstring> + </property> + </widget> + <widget class="QLineEdit" row="3" column="0"> + <property name="name"> + <cstring>userPart</cstring> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>User Part of SIP URL</string> + </property> + </widget> + <widget class="QLabel" row="4" column="0"> + <property name="name"> + <cstring>textLabel2_3</cstring> + </property> + <property name="text"> + <string>Authorization user</string> + </property> + </widget> + <widget class="QLineEdit" row="5" column="0"> + <property name="name"> + <cstring>username</cstring> + </property> + </widget> + <widget class="QLineEdit" row="9" column="0"> + <property name="name"> + <cstring>hostPart</cstring> + </property> + </widget> + <widget class="QLineEdit" row="11" column="0"> + <property name="name"> + <cstring>sipproxy</cstring> + </property> + </widget> + <widget class="QLabel" row="10" column="0"> + <property name="name"> + <cstring>textLabel3_2_2</cstring> + </property> + <property name="text"> + <string>SIP proxy</string> + </property> + </widget> + <widget class="QLineEdit" row="7" column="0"> + <property name="name"> + <cstring>password</cstring> + </property> + <property name="echoMode"> + <enum>Password</enum> + </property> + </widget> + <widget class="QLabel" row="6" column="0"> + <property name="name"> + <cstring>textLabel1_3</cstring> + </property> + <property name="text"> + <string>Password</string> + </property> + </widget> + <widget class="QLabel" row="8" column="0"> + <property name="name"> + <cstring>textLabel3_2</cstring> + </property> + <property name="text"> + <string>Host part of SIP URL</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout23</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>autoregister</cstring> + </property> + <property name="text"> + <string>Auto-register</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>201</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>Register</cstring> + </property> + <property name="text"> + <string>Register</string> + </property> + </widget> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer9</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>21</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>STUNPage</cstring> + </property> + <attribute name="title"> + <string>STUN</string> + </attribute> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox3</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>110</y> + <width>253</width> + <height>100</height> + </rect> + </property> + <property name="title"> + <string>Settings </string> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_5</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>38</y> + <width>229</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>STUN server (address:port)</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>STUNserver</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>60</y> + <width>229</width> + <height>23</height> + </rect> + </property> + </widget> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>stunButtonGroup</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>90</width> + <height>81</height> + </rect> + </property> + <property name="title"> + <string>Use STUN</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QRadioButton"> + <property name="name"> + <cstring>useStunNo</cstring> + </property> + <property name="text"> + <string>No</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>useStunYes</cstring> + </property> + <property name="text"> + <string>Yes</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>DTMFPage</cstring> + </property> + <attribute name="title"> + <string>DTMF</string> + </attribute> + <widget class="QGroupBox"> + <property name="name"> + <cstring>SettingsDTMF</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>301</width> + <height>130</height> + </rect> + </property> + <property name="title"> + <string>Settings</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout11</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>playTones</cstring> + </property> + <property name="text"> + <string>Play tones locally</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>111</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelPulseLength</cstring> + </property> + <property name="text"> + <string>Pulse length</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>115</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QSpinBox"> + <property name="name"> + <cstring>pulseLength</cstring> + </property> + <property name="suffix"> + <string> ms</string> + </property> + <property name="maxValue"> + <number>1500</number> + </property> + <property name="minValue"> + <number>10</number> + </property> + <property name="value"> + <number>250</number> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelSendDTMF</cstring> + </property> + <property name="text"> + <string>Send DTMF as</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>85</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>SIP INFO</string> + </property> + </item> + <property name="name"> + <cstring>sendDTMFas</cstring> + </property> + <property name="currentItem"> + <number>0</number> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Audio</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>Drivers</string> + </attribute> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>DriverChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>410</width> + <height>180</height> + </rect> + </property> + <property name="title"> + <string>Drivers list</string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>CodecsPage</cstring> + </property> + <attribute name="title"> + <string>Codecs</string> + </attribute> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>CodecsChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>10</y> + <width>133</width> + <height>157</height> + </rect> + </property> + <property name="title"> + <string>Supported codecs</string> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>110</width> + <height>120</height> + </rect> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec1</cstring> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec2</cstring> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec3</cstring> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4</cstring> + </property> + <property name="text"> + <string>1</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4_2</cstring> + </property> + <property name="text"> + <string>2</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4_3</cstring> + </property> + <property name="text"> + <string>3</string> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>RingPage</cstring> + </property> + <attribute name="title"> + <string>Ringtones</string> + </attribute> + <widget class="QComboBox"> + <property name="name"> + <cstring>ringsChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>21</y> + <width>150</width> + <height>30</height> + </rect> + </property> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Preferences</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>Themes</string> + </attribute> + <widget class="QComboBox"> + <property name="name"> + <cstring>SkinChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>12</x> + <y>42</y> + <width>110</width> + <height>27</height> + </rect> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonApplySkin</cstring> + </property> + <property name="geometry"> + <rect> + <x>136</x> + <y>40</y> + <width>80</width> + <height>32</height> + </rect> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="accel"> + <string>Alt+A</string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>Options</string> + </attribute> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>262</width> + <height>200</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelToneZone</cstring> + </property> + <property name="text"> + <string>Zone tone:</string> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>North America</string> + </property> + </item> + <item> + <property name="text"> + <string>France</string> + </property> + </item> + <item> + <property name="text"> + <string>Australia</string> + </property> + </item> + <item> + <property name="text"> + <string>United Kingdom</string> + </property> + </item> + <item> + <property name="text"> + <string>Spain</string> + </property> + </item> + <item> + <property name="text"> + <string>Italy</string> + </property> + </item> + <item> + <property name="text"> + <string>Japan</string> + </property> + </item> + <property name="name"> + <cstring>zoneToneChoice</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>31</width> + <height>21</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>confirmationToQuit</cstring> + </property> + <property name="text"> + <string>Show confirmation to quit.</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkedTray</cstring> + </property> + <property name="text"> + <string>Minimize to tray</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_6</cstring> + </property> + <property name="text"> + <string>Voicemail:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>voicemailNumber</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>61</width> + <height>21</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_About</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>About SFLPhone</string> + </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>pixmapLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>50</x> + <y>40</y> + <width>312</width> + <height>91</height> + </rect> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>170</y> + <width>371</width> + <height>121</height> + </rect> + </property> + <property name="text"> + <string><p align="center"> +Copyright (C) 2004-2005 Savoir-faire Linux inc.<br><br> +Laurielle LEA &lt;laurielle.lea@savoirfairelinux.com&gt;<br><br> +SFLPhone-0.4.1-pre1 is released under <br>the General Public License.<br> +For more information, see http://www.sflphone.org<br> +</p></string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>CodecsPage</cstring> + </property> + <attribute name="title"> + <string>About Savoir-faire Linux inc.</string> + </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>85</x> + <y>126</y> + <width>291</width> + <height>131</height> + </rect> + </property> + <property name="text"> + <string><p align="center">Website: http://www.savoirfairelinux.com<br><br> +5505, Saint-Laurent - bureau 3030<br> +Montreal, Quebec H2T 1S6</p></string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>pixmapLabel2</cstring> + </property> + <property name="geometry"> + <rect> + <x>130</x> + <y>50</y> + <width>173</width> + <height>48</height> + </rect> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </widget> + </widget> + </vbox> + </widget> + </grid> +</widget> +<images> + <image name="image0"> + <data format="XPM.GZ" length="58862">789ced5d596fe3b8b27e9f5f114cbd0d0eea6475625cdc878eb3b4b34ca72799e9745f9c07c74b76c776363b07e7bfdf629194488ad49249e4f40151109292488a923e7dac85a2fff9dbc2e9d1e1c26ffffce5fea1f370d95de85e74260bbff51e6f6f67fff7affffdf72fbfae2c2d2f34971696165717967ffdc72fbfe21f0bdd05682c37d61a52ffcc7a87f40eebbb4a6f2a7d47e93da57f17fafa4aa3b7be2274e8487d7d49eab8a4f43575fc96f533d2cf58df547a53e953a5f794fe22f48d95f5de866caf2df58d25a9c34ce96beaf8b9d4cf96cf56f9f890f5333a2edb1b2bbd29757c547a4f1d1f495dd7c78b44efb13e507a43e9db426fae6ef49af27c7da93797943e50fa9ad4f145ea49fd65a577947ea8f5ee1ad7df557a5f1e872dadcbe3f8c47a97daefb2fea0f4a6d2ef95de53faa5d4757de849bdbbacf496d03babcd5e47f6ff52ea9d25a583d2d7a48e7da927f59f125d5ecf27a537947ec47a97eacbfe4c94de51fab1d2fb528767a927f5af94de913a74b5de93e7df577a5f955f14fad96aa7af9ee758eac9f36d28bda1f0b22775dd1e9e28bdaff403a9f79695bece7a2f799e23a5ebe7f9ac74f5fc7045eaba3e7c4af43e1f5f557a43eac0f8eaae25cffb4eeafa7ee354e90da5f7a4aeebe3b5d23baa3d7e3fba3d7d3fe14ee9ea7ee250e9eafec195d4757dfc5debfd06eb6b4aefabf62fb42e8fc367a9f79795ceef5b6f2db99f33a927f7734fe90da57f937a52ff20d1657fba4a6fa8fefc99e8f238bf2fd43b7d3f51e9fa7a6e95aefa8f9b52d7f5e14ce91dd5de86d0fb0d7d7df855eaba7fd854baea0fec285dd587b6d607f2f8b5d2fbaafd2f5a57c7f97dee27fdc153a5ebf6264ad7f5ffd2baac8f37521f2c2bfd4ce90da5ff10fa20391fee4b3d29df52ba2edf49f4019fff46e91da533df0c06fa3882d2d5f1af0f4a1f683d4a94fa24622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d7f177308d821399bf77544f979e4b598c32ef6b08f033cc70bb55de2155ee3cdbcafe8e30bdee210ef7084639ce03d3ee0233ed1df09e9cf38c519decebb87ef2bd53147ac768d2f8cb601612dfbf7136ecefbaa3ea2600bb70855dbb883bbf8b960dbc5366171847bb83fef7ebfbd54c51c1e58dc16da0e3f0eeef81df91dbfbc4bdbfb848b23622d282cf99570f4c7abb6e379dfc1b7962a98c31b1a3ffddce6fb7b52aac53f091107344a5ff2d87c42e8f8eb2daf0fbf25fd7973d4e1293392e0a5eff8a3a0ec6221b785b6a5b7eef7bca53ce6e8e915f39bbd2de7f916c43f57c17a2b7ebb903c966f6447ae166c6b29be08cdbaddde5bdf3b6c187c342a28bbe4e1b0255c278edcc0267e05c42d00e8f8b80ef0ad7b3e5f298b39465c96cb06849b2b42c8359ce1267433c797b1e36d0d88db2e0ab8f2c41db108a56539f602bfa9f324fbe1cd31077d838f724740ea4786bf60e02b07e7597b0fcedfbae7f3957298f372dc00d7ac327f911597e5ac818fb108a7699915dc14c8c40e9cc105f48cba874ead9ea7fdd0c67da3676df8d56f7defc8df4cb928b7751a855deeea602b507694e1bac5b7eef97ca50ce6f08b974baecd32c47321cec93c0db2e0521f37c38364e3ad32838ae3dfac73749df69709bb3d204e931bc915fd774dffabbec14d5e3ffeae900f9a72513ee6006e1d9edb0a9786a1c373776fddf3f94a29cc2dfbb8c4ba4b6730cae19c15abb52fc9fee073a267744163ab331a1242cd7657a13016581fcf6151d99151760727b9656fd9fa53e561f8d6fd9eb714638ec63eafdd649559ceb7afe0dadb5ec5f8b1652f96b2ce98e7743fde97e7c685a587e42734b3f13698900771ef29dfa211f9166790d766618c46956bc2234ee9fca76f7d0f5e234598a3912ec45f3725caa80d9e8c7bfca4f62f57ed2b3c57e5ac6a3c87fb70477e64533c49dcc7198ef101a6f81d66788477d9676ff1dc1fd2d2a7e7fa0c973084195c12b70523bad4b3676a7da6f90c3a30a61acd40e91f7847e567844260940e71421ecc928e1e877009f7e40bbfa49c293816c80dae7ae7df568a30079fcac4df380b96ef4b265137b6d5c4fe4f55fb6ad87307256b54b0e70861a94fd9f1c6ca1c5bdee439e6ba4e12af4bda8147efb9a6b0e9cf3f402bcb4584c5cf057ddbf58dd6701eb80eb204ca32e47b4821cf0d82fc3548fb4dcfd66bf319db956a2fe144c8b1a2037d49ec39b82859a302cf116b14e604888b8c676bf35cb0ceb6739e0d62a6dc3a84310311706ff154f83cb6853d8171ee39a64551ecf7937ccc4149eee2d859418e425bfc894ffa37ecb9b29833edb97c8cc343b9bc00f99f498cc3e539ff465c6322085d2ef46e064e7156a65fcca98955483ed8b0b04e7b5e5c5780b96e0e772dbb1126f20ef2b84e656089add27c43a5ab4eed3928392e97e7395f3e1436c9f619e13d8f50e9fe84e9caf11c6d897f41c8dec91cff4ee36cb64edab359e9dc6ce2e11253da1cb8497bc66401dad7f72131c7fe68c817ddf194ff421e4288eb5655995563ff7295b900863d57d287b0ecb9c3dc92599e3347d16d63ffae1e95b23c0703c2e83159edf6fe84b518a5d639a4f5c6734edaceb199aa93e1397811ef029dcbe52e957f33f2c09f79144d7c06f2904d3bf27b282efdbe92873908fba397e18c395c046cc0849bac5cc33969d7e5f2ef567ceeba548dd7f39ce32fc038cb412ecfe9d82db6c0e226d00c3fb4b8a7a351a5fbca2832b849ed77788ed84af11379d98e1da86a3c18fb3fdb769b7d9daead598fe4610ebf0438ab2036a66c3bb75e12d123241c7a8ef7b1879b79715e279fbb92df0bae61c6e772633336cfd93618f779cb3caef6d93c67645c9969b2e56d2ef5cc0ae051362dc3fce4f09cc54d60e571a1aff6764c4ecc9c636a5c67e6681d928bb96e96af60b7242765e78c185164c2c20a86e6e1898cd6375f9b467c4ee57269cf09b1a42d9be96c1693e7f27d0887e71a9eb34f8de3724434796ed78ec5391cc8c74c5b0ebc36059c5b9cc628b679ce9e1940bd36cb735c86fc629b17ad5929ecc398c7e71025ce1d5bcf325c5421a606570e9739f32838bf15f6750fb3a36726df1afeab50f76a7bce1335b5388547c5bc3c04581c28222c840593af02790b93a3a41de8f09c937b25de73cb8f1c3b8fd80cef69ef049f4c8e53dbccdf8ff7945c9edb7478a56214173edbf5bde7001ac1d788ad2e3dbce7ccb374f2ad79db4dd27aba2f17738e9de3cb45ad1bfcf0cc7bcc7925ce1be5d85a6453c1a3c55781f94966ec0ea6bcc7b6e79cecabe5f34a9e9b94f673c5f6fc1628aa26b93cd7b6b8a354ae8afcd6d574ae0878edb990e00d95bfb238cb9a7f97999f774863ab98a3796d6e84f4c4267c9d3d07de397f8c22cd5b6ced59f69c930720567379cea8af6d35cf3dc8f4c3e1b90da757e30ccfdd67b82c67f3e749de577279cef65bd3b9b7c44df464fd3697f4493fe9a33c37d3f15bf385ce7a62d88f8615e6d873d725be427815cff96d2df23a537e38e23da6cde662ceb60f7f64e6c505ec28b8346d446ec9e63907ab561f183fe4d796e5b85d7a6be610a32b88cfa5398313b56713b59de68d3d305e64fcaec7333121c9af96f0339356560dae4bfc34d39e2b9789b0ecb9f27eab27f2e8f014fb9c16cfb9b195877c9e0bcd37b7da6cf31e8be7dc6cbe555ef2dc83cd6564cd1d1147cf5c216fe263c68493f9bc623612f9142f066f9c786b98b9089e73492894ba971773ceece42fac7c6bc95cadc573b963bbc34b9ef920786c1c67abaa22cfd97c159887697d3721f754e4393cb2ec46af9d305f29c0dcb5b68792586f9abff4320d5c383ee441e29b56fad69ff854b7b39ab49dda732539d3b2e7cef3de6b87973c2c0426dfb0556571cc716e7b82e79a165f79470998581cb5ce67a9ca730dab8dc2797df54b01e63a094f64e36dde6f02c907f5fb92157d5e6c2575137e34f2adaf9957720139b90bc76fcde484a83fd9785b259e7338cc6bd1d9795299d7a8cc73b7561b7e0b08e6397bb370fedc5e300ee6650d62466f79a8b8a289f18d57ea8526f65cd9d62c7bee22ef8b5b273eb7eb8eae3831b84667a52ad9733cea99e7c85eb39527d57da8ca734e1ee2366b27e0a2884e136fcf213627a4107367c118981f7327deb2b93ea3b79d6b6d131afbd2f85cc9595036cfe5f1a39b6fd579247517d0e21a9d4bafca734de71c1607e186fd0dace6daaa3ca7a2d7693b632b5b36219426b6dec7cbf1ababfa1488f5fba3584f5e4eec5a2d7e29c20c8d6487b23e18350d7baee437f98e3d27da7bc26bfe4aec0c76f026b5313df34a1e93f9235bc416296725b9d86af61cd77062678487a9980bcf2b99d8f3eabeeb79ead5790ef7ed6f64a9f777c4a12d7a73d6ad3cc72eeebd359eca4809cc75d03f4fe44f4fd91b1f278215eb861ecab973413f965a39d4fc68bda3697cae24e65c9ef36df024d8cfbf9e08bc40dfcab38a2dc9c556e539f12e79e7cae5e607aaf31cc7654a9c43e639ea9752df1afee9e52e8f756ac5d5923cab3d57c498537268e62cd4d18ecafecbfa16b68cf85ce9b547f025688f5a9c5d7a9ef0d8988d6bd671fc43e215b3debeb17fa9c479ccb97b95798ef717ae8f42e89fd3ecf492dff11f7839c2f10369b4cae44c61e4ceedc41bd8b2ca5c72066b8dc6bc7dec9bf1347b44b66276a5a39999b928be6d10e2b90cefb5cc33e3c4389659338e9ea93e66dd01f12d56ee7976ecd89df33d843b37fbd8386665897196c7a9e4417cd0ef218c2b58f172841127232bed30cb21bed9c41cc53bcce59e174260c6e6c3dfd5f10a1e49609d15fbef75a9ef2176325fd3fc20ab4b1e6b7bce7cac8e7dcfe6f3f1ab9527357dd5a32c16f029e1a6ec9a08a9afbbebe662bf8a6fd9be67cf43e79e8b1da7a5c2ba4c2b7e8e202611ab21f9befbbac89b794e185dc1cb6c7be4b3acf96b243c7a55e50af10b5c65e6d8a5f24d62db89cf6d8ad506f116ce0939c46770e7fff29438eb0e4710f2e167b01d5ef781fcd4291e93bdb8091db21bc70070e79bcfc2e74142cfc8df07f2b7ee704cfdf0f7615f7c718b47d4fe0c0506a7f3febab5e2fa73df8cfc6be15ff2154a45d1e89e7dc12e1c10a20af334342e1f54cba1951587e7d6dfe31c51a4545b67932cfcb273d856e77d65d5c4b1e7fecb57f49daf545f4f18ce3cebcc59f3e4b057cc581f4d2c9efb3ecfafdcfffbe575eba613dfadaa58b1c96dcb7812b2c53eba58f3e7e6f265cacf254994fb156b6cffbddf87c01659619bbcc666096bec230b790c29cfcdbd37957b7f1b9a1bf54ee79b605bcc3026ff7b884fc15253ff4c82f83b385ae025b1e77e8a95cac9537dd4cf148f0803019ff75dcedda7bbb52efa407f3d7122eed30f98fa675245cc6949e69ded64e35c1f51a08f6d9d8703a0ff6bf47b08ed7c6e62b2761073b774ccfbf646cca5c22b03ce7e8e5f01c12631db4b92d53f224ea9317b8adb74be06af36360dadb543e3ee4be4b9aa8220a2baf82c249d394c96df3eaf8ad8247c9a6b81006ee008c5bccb75f5053e582b324d6cfe34d6779af1d7a723dc4a66ac00b5b108e7380cc589517c952884bf06123c074311b9a636c4b70fd64a50740d47b84eef53c1db04f738c6276a690cad74bd46c2ce3936685ba7f6f5fcaa323c774ac7bcbf60103117161abd8e047a080153fdcee20f7a26e24edf132a1e04d7c84c83989706537af6e2c91fd3336b094b3bcd55c13d3dc9699a3d23dc3e0a1c93d5d3a2273862643cc240cdeedc127692380fb5ef99274f3d7a54fd78e49537c56a9a6dfebda60798d179fa12a9544eac43774c489ca2f82e312707c1f938d9c63db5a1381487b84d75c53b764af7635baf6020ed39be2f219e8310f746cc85c5e405badb6da103f38bcea0121bb465665d7872aebf4b8c933c0f40ae97cc04854769f513e2da3ac34a3ca34ac09d6431f20a037379457d3ece7599e7668a5d9b023bb28764a3b6d3160889399683b8428d4a14efceb6ea53bab2a5e895fc46a304cf718b5e8c47cc95131ecbf6388ed74e5732a7777906721d89470fe6c8e6d2775da09339418f4e13815562b7a9594bd86522064123aae0b87e78ee07f1a4e04048eb19ebe22d4aeb9d38746622826c84b66f25163ec69c9a9ffbc73d7d8d65ec3931c3c0bf3f62ae8c306371448a79cef8f681ac37f915ea3a3353c35979eb51e7f84539168dc16dc144b2969e1387fb0223e249499ecbff5d0818a4f612fbad49691a0fd9cee335eddae96a13c2560bc51e39da92fb8d188fad8a87cbf15c287a1331972fbc7afabde4288101c173e69a21642bb5d53aeb6c0d11f7b4d2df39c4b1b4e8041f12beee68ec92df729dca919af889ed3042e494acf47b14489ae9b857becd0f2de2448d6830ed3ee6e24bf9a6703bf41fa1f888da7e0afd2e19db0ea17b704a0c3911f6a8b01f794f097b2e2c117321c1167b09fcf536bde3438939e639e38b6ec154fa7fb27deea43f49a5e52a3a5bd25aa367ced8a3b148f2c4a2fcc2465873f42cd14597e4b982fedda74cc83c675a9fcc73b0adbcd912d11fb6e63c5fe4d01508bbe007db78e2ad929e45299e0b49c45c48c4334d474acef69c2b9e33ec7ab6d2adf71c26621c250e427e4ec2b34cd0c156d8808f4b5d708767652469cf15f58fb84dfb32c29e4b7a21ceca3c37947fcb5e6d766c657b33b100c5fb26cb94b3e7421231e717810ecbba9f04786e94c58688a7249ee391b2e3b46fda521ea9f47685e5e5fb6587923c67d973e6ac7969cf9d9a9e72416b23ee97b326077be3497e83af3df2dcbb094cf819682ff394b5a987e746ca9e33c625b6a75ea4b720d0435c90c6e59e9903d3b89df00492f9bf34864ba40ec379cca4ec84da51dfae727c2ec3733c86bfa4ab7d91b5300dfa98fb6caf6d2719dc0deaa988eebda416204764c6b2d7ca9e1be6d97310f855b388b990f00828be09ddc031fb93722685e00e234a4b969a8c9534e8dd5f17bf8e04d2a6532312790f633342c1f113834f84374825d6a9ddafb00d331561c6222f52fbd26a55b2a30ccfc9d8728bfde545dc00b16eec76deec059cb1cd3aa41a138ef08937e996e37e77e25de0b743c70f5b9263a5671c686f3fe621aa0bee894c02bdef7b34aaece9cc8fbd8616dd5995d1a2e313fe052f61bf19712ef1bcac1a5fed118cd8846a127300e156b10c79230d7745cdac48bb51b02e21d62a0d8f464e6e28fa457d1a17fdde35e1f252bc5d847cd01904eafdb6f88e82aeee2b217028475a7a0ff95706443fc3bf688c81bc47c4dccf2c345abef91783ef3fc721622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b7efdcffffcf2ff6d14cd7e</data> + </image> + <image name="image1"> + <data format="PNG" length="3625">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000df049444154789ced5d5f681cc71dfe6d21c529a69c4b1f24438b14eac0a9b4b0aa52904a83566f91e440a4bed8322ebdb31c1af925919d87da71b89c5f94cba5b8951ecef11904920d8ea4827c4a4145e7a0700ad8d5a918ee0c0e9c835a4e460f6721ccc9e8e5ebc3deeeed9f99ddd9bd9323c737603e4b3b7f7e33fb9b6fbff9edcc8a40445789a86e0800eb0000642a885da0eeed34f085c59a1d34f5a0080090134ba0084091192e2a93c0e8e22a00e0bbee78039f5ff45530b7a91268606c0694af38a6470c1480d03c1a0edc40cfe8ad000065d29d51bda2320914b7cb0d09d1402114ca885d9511fd30aa178c2ee71a8edb405774cd90db2c414ed497599d504e2c352443031dd1310336814061ef19d68a81b19986e336908bdc0bb9cd1202633e187322054a009458022580de39355a30932f562586403d75715c00e389ab080d876cff62f11800a0582c3e3f9204406a3e55d7095dde2e23168f21341c4267b782d070c87ffd7b601f0bebc3b01507c3361c53a68067c2b8d8069007821d32721d05043b64fd1febe7f391e873c1ece72351ddfebad9bb08db78bc736ed4d744de13fb18689f79bbf0ccb02229f4c5aa2f8debc77143c321d38d50fa7b319eb80a00989a9e02e280d2df6bcab39a5dddff8cabd95f2f8780d961831d72cd4c5b57fb3868fb8552f6a84137dd1d569eced4a47195c925718782996171873f80780060b7f24873a8170f50fb8d702b5f43fd28fab00f4067b7627b0261dd65bc9e817d6ef9a5ab441426a224118501481fcd12d120118961e8b52c25df68275e0aff334bd7eeb60bd7c7c3a9b71ed2d0af5f9192467b1998cdaee2c4e9537afb8ad24313b1b86b391302183c3e44f7bfb9cfec93a2f4d0d9e1116a7df515a9ab5bc1d6932d0a1c0cd0caed3425254932d6975ecee0c2c50bb4f5648b824782d47be3baa4d999bcd14e6b777b68ebc996a9fee091207576c874f6bdb3e6fae240db0d75acc73f1da79ed77f274d24ae62e2b309bd6c5353333d7ab4414444f977b3941c32dba3a166372be5ef66d57601f41cedd3eb33a6c0c100ad2869da18dea0e6c3872551fb0207037a7f75fb004c5c49d2ecad395b5b4d4dcd943eba403bc776e8e51fff484a1299679e9f375c4ec9ab86757b8326b48701768da6f4f702ebc0d2724668c66b653bbb15b52315a67de7dca8ce489ddd0ab00d14bb4b261962adafd45fb65d8fc56376fb1681d070c8549f551b9a18b154f93d43936aff3f1f89f2c76b97adf97107eadac4d09ed2df0b00aa84aa8c8396bfd45faecd3e0be397facbeaefd7818163c7cde35d617a9d69c3f3abb8b6e683119bd284d33dcc191b26a26b1e99db09a31707a9596233879529db5ee3b33f913ae383475aa9a7bb87868e0f99190d40762d4bededbfb131745b870cad8efcdd2c4d5c4992914996e617aacc63b1237f374b0bb716e8dc471fe8368c0c876968e884b99d69a0edafe672494992e286b647864768e4ed5352783884afd7d64c7d0b1e0952e8d871ea7bb35f9a9e9ec2ca7f86e8e956988888da3bba68e47458edafa59d81a303d4fae107eee3c0e8972ffb8ef651f87498b4eb8ad243edb1b8e9fe5e884431776b8e88883a6599ba3ebb26a91a62b7b6786c8ea76b37ebc7b49ea309801ad69a138b22e8ccc0a86f35bb0aec9a176fb98e029085ce1436862175356d6524a5c2bcb98e82ba68e1d99faf3294b69a67dabb68d1f0967eb0faabb58b2cecfd71185764a18f83b13e6d11ebd53e3c30b73f70ecb889d1b10cdbfd030095697d685923cabf18a4ec7162a64fbe7e48e7fed5eaabde5ab4ad15378a4534373753faab15eab9df45835fda35ab51cb8dbc7f96d6ee666d7a9395ff713c866b37ae1311e9daf6e1370f69e874582f1fbb18a5be37fb252b535b35b0510b9f79ef8c5e67f8cbdb424c36faef351b536dfcefa17efd40e0104d7cfc89de4f16631a19d5cb3878b64fe089684c8183015a9a5f503d5e4ed4ce884e29b6523fc62d3830a2574ccda74c8c319eb80a23c375762baa8eaeac66a7a6a7980c83a29931989abad22eabbc5b14442b2fa219bdf47f35bbcaec8f9521354d6b1c0716437bb5cfdabe68bcfc071bdb65ac3d22a2cf2b8ce61367efdb57985a3adb4934431b4407fcd7afe12b7f9fa53000374d9bcdaec22d5fdfd13efa030dea76ee3c794c6d27dbf559bd723b4dc91f4a121d96a4a42449434327a4334d67f4fced723b2589880e4bd2c0d1012222537ddacfe9a30b7abb71f9927e2d79e33af7c930787ca85afe35b5bcb1fe89cf93ea5ae4f3b0a93d2f4fa076b9dd64afd69f3080b6bfa8e370ea6098d2b716282919c6a1629b6e8f4cbeecb3b67fe9e205ee9367a35884f633017560c0899423d3eaa9f2c6acd6f6a6ee39682fd8e3b45ac05b6b7f69396362544d7362d941e3c1bc6a665d6769662dcae0649f29fe09c6aab958653257cdc81b1706f234adf109d4d9ad9819d8629f674d6bb563bd7a5d8bd6e8f66d032855d70c7af420e4376aa0e14f1708eff491d7245d49133deaf1d5eee8c5410a7266e4ce761927de3ec58db1b252f048903e895ca2d623ad648dcf363535d3d3273b4c4d67d38011a0ed9659a369dacefa24e0c53f8da9a9a999929f8e53ebabaa864f1a62ab2ccdd8d4d44c43a92fdca32bc4d694464ddfa598e3c722e330dddf0bad4f2cfb346d6eb5c3b826e0a5e09120cd5e9f5619bfe4f50d9801b5cd307ed3683ae7f30d9903d352951162f118787142cc81ada15061e64adc148b2ac362b7b2aa2da99b70b00b338312e97b1eb472b178ccd1ced47cca94df54ce6a97965fb347bb8e6ab9a5e58cf73756a8f687f97b835de72351b5df5998c641d43ec7378f8cf642c321200f358a60c84f9e7771456640f1eaaead5a53a650024d786b3f30b6ff37b73470ef90bc325d1970ddcde5396d03855d8fd10a878e69272d461701a55c3d4cd93815fcfd4071a61d13dbcd556b12b5c7a9632d97d9e5e444ed0c5dae4c88cc7a0900a73ec3f5cc7aa9ae13a5cc99785a7bd1e51ca2a89c92ae437be3770a08a1b26909406ed3dc9fd483229449f5ba8651f83ff397db2c210a737d0396fac49856343a50a7542bd3fa2d278285923d3e6d75585e1cbb260742756f889c804d4bb3fa9b59474dfd1dbf63af375010eb2fe52b4f380ffd1bb8c9df0d681c3f77a67d460c6b4db530addf72428f264b7dd6c3980337335cbb954980c794228cc7ed0767bca2a8adbf514ebd46072aefaa0b63de780b9df903d07239c51d376b7957a6dd8b94db5435ec4c5ec071f719d3ba31a8e2128d914b95bd1a5edb07bf1f997536d346977db463c0e8b20706077f97a0e39e1187722d97d94777c8c9c3e5e9bd7059834356ce94c550d12c96d40b8e5d2edaf4bb645a91ef4204c6bc6bdde872ce33d3721dc5eb4411ad17ce5f1a6ab95cd5dca38babe0ad3d28e2fc25227e9cb6006e94a0770ea0922a1d280fd0a40fa7dd64b43b993167da0668dd9e6fe026f62dd37a897b3bbed9e33910a31fe0326d6ddf91882eb3e3e870d1ca3c8616c140c1bd7edb0cd6d0fae260349d03c5f933cfb3d3f266a44543f7ced9cf96591de579635a2386e6c5162b7e98f659685a1e66d6bd9fe69613629adf71b5ab3bd844ca7186b86953a6d396f8f5d9da17d15456c7da279a562e0129e31933a88e6edcbf3c7053e04405f8fdd8179a96815e4e75b714211c47e73293c9615d66889fc4655ae3cc9bb6e70b8cb93bde7e625a1e739477810154f3b9adb2471757f9fd00ffbed4d4df5aebe59467216fd1c5665a221ab8699f510040716786a5c88cd0695ca6d3ba30ad48bc6e3f32ad51d30a9d2286bd3eebae3056bcd4c468fb4cd36a767b3d7328fa49acda4f2eb4ac104e7691d7e4779757e64f8fa9ebe73f713cb9702a02f0ca17dfdda1e6caa94e2f271f3494223330d61755f274e1f55feaf5f54c2ee1f6b76abf9496411afaa3d899b6431fcfd2d653f171b8faa1f98401ebfe099fa9e3e07d007146bdb838c8ddf7bab30bbcfc12915f7f0a1c98a5c7eff3eb379dc66d29fa67be67c5b4caa4c00c2772665a81995c2f4d2b6aaf1f663296cf71cee2796a9f812d97d94f5aae865d079cfc484ea8f73eba9c035079a1c0e95fa90cdb2e3a33d312d1f4bd024efcc3fb59aede5f6569e12df1733e5af233139d66b828d312cd52e8e22085fffb98ba7e7648a8be3d675aaa3266fb9534ad093c814c4c4b44ad9753f876abcf96cf6a9f28f24e6787e42c25dfb49fce3dfbaf2cc5bf66efcb969b0669fc0df61372e24e01176eb7d2d6537bb9c08141baa43ca491df9acf049a3c58995cf21e5f2bf9a0591fdf4350cae20ce9e789e134e35386930575d7b40c0ccdbb8f8f17a656b438bacbea5cdb1dc76340a6e674614c91271bb601d9e1c9abd96f635a276d24c2805e92d7ef21040e0c52fecfe25ad48d69fda0c66c6e4c6b6428cf4c6b40b7279f9569b5fbd7fab7056231ae864a4b9a0e9dec21f9ab3cd1efdb88beca53fa611b6d3d756678a5254de9933dfa93696717f8e0252296e615d5a6565c01c0f30b637daeab59111c4de73c11ad5054c2809ede1c51253c5427a6b5aec28d9a95c92486f11b5df466374b23b218484e3833f8d43dc0ba1bcd2f02fcbd067c66ace1c3d80e4f0ccd1e66c1906690e89b9d31f5048248f2faf544d1374656b4ee7bf58bbc8175bb5ed7bf2161b5cb43b9a97b05d3fe54de5e1339a15e1fb899a9eec77570bca97b05289315078b54f7bdd6651f2f80f13b057d3fad16c75526d571e56a1b278dc1c44df5db5d4ec9ebf70ffc6ac2067ebfd191a9fcfcad05de6147799abfcf948542af361bf842a27b46d44f1b8aa25f49d0c01703c532a2aa5dbc32af170c8ca91a6c3f0c4c03f72f8a17a888f9bd6258c5e10d48031b6844cf0532eb25c733415eb1a6f048035f48f45f01d438a49f3d0bda36b406b336d00fd6a7a24a3c105057fd5a7c4dc30154374934fe066e036bc5ff03859b69b81278b6550000000049454e44ae426082</data> + </image> +</images> +<connections> + <connection> + <sender>Menu</sender> + <signal>clicked(QListBoxItem*)</signal> + <receiver>Tab_Signalisations</receiver> + <slot>setFocus()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>Menu</sender> + <signal>clicked(QListBoxItem*)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>changeTabSlot()</slot> + </connection> + <connection> + <sender>buttonSave</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>saveSlot()</slot> + </connection> + <connection> + <sender>stunButtonGroup</sender> + <signal>clicked(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>useStunSlot(int)</slot> + </connection> + <connection> + <sender>buttonApplySkin</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>applySkinSlot()</slot> + </connection> + <connection> + <sender>DriverChoice</sender> + <signal>clicked(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>driverSlot(int)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>accept()</slot> + </connection> +</connections> +<tabstops> + <tabstop>fullName</tabstop> + <tabstop>userPart</tabstop> + <tabstop>username</tabstop> + <tabstop>password</tabstop> + <tabstop>hostPart</tabstop> + <tabstop>sipproxy</tabstop> + <tabstop>autoregister</tabstop> + <tabstop>Register</tabstop> + <tabstop>buttonSave</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>Tab_Signalisations</tabstop> + <tabstop>buttonHelp</tabstop> + <tabstop>SkinChoice</tabstop> + <tabstop>zoneToneChoice</tabstop> + <tabstop>confirmationToQuit</tabstop> + <tabstop>checkedTray</tabstop> + <tabstop>voicemailNumber</tabstop> + <tabstop>useStunYes</tabstop> + <tabstop>STUNserver</tabstop> + <tabstop>playTones</tabstop> + <tabstop>pulseLength</tabstop> + <tabstop>sendDTMFas</tabstop> + <tabstop>Menu</tabstop> + <tabstop>Tab_Audio</tabstop> + <tabstop>codec1</tabstop> + <tabstop>codec2</tabstop> + <tabstop>codec3</tabstop> + <tabstop>Tab_Preferences</tabstop> + <tabstop>Tab_About</tabstop> + <tabstop>useStunNo</tabstop> + <tabstop>ringsChoice</tabstop> + <tabstop>buttonApplySkin</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">configurationpanel.ui.h</include> +</includes> +<slots> + <slot>saveSlot()</slot> + <slot>changeTabSlot()</slot> + <slot>useStunSlot( int id )</slot> + <slot>applySkinSlot()</slot> + <slot>driverSlot( int id )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/src/gui/official/configurationpanel.ui.h b/src/gui/official/configurationpanel.ui.h new file mode 100644 index 0000000000000000000000000000000000000000..15bf76339dc288d94cd7f646b1f0f237052970fc --- /dev/null +++ b/src/gui/official/configurationpanel.ui.h @@ -0,0 +1,246 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ +#include <qdir.h> +#include <qstringlist.h> + +#include "../../configuration.h" +#include "../../global.h" +#include "../../manager.h" +#include "../../skin.h" +#include "../../user_cfg.h" +#include "../../audio/audiolayer.h" +#include "qjlistboxpixmap.h" +#include "qmessagebox.h" +#include "qtGUImainwindow.h" + +void ConfigurationPanel::init() +{ + // For reading settings at application startup + // List skin choice from "skins" directory + QDir dir(Skin::getPath(QString(SKINDIR))); + if ( !dir.exists() ) { + _debug("\nCannot find 'skins' directory\n"); + return; + } else { + dir.setFilter( QDir::Dirs | QDir::NoSymLinks); + dir.setSorting( QDir::Name ); + + QStringList list; + list = dir.entryList(); + for (unsigned int i = 0; i < dir.count(); i++) { + if (list[i] != "." && list[i] != ".." && list[i] != "CVS") { + SkinChoice->insertItem(list[i]); + } + } + } + + // List ring choice from "rings" directory + QDir ringdir(Skin::getPath(QString(RINGDIR))); + if ( !ringdir.exists() ) { + _debug ("\nCannot find 'rings' directory\n"); + return; + } else { + ringdir.setFilter( QDir::Files | QDir::NoSymLinks); + ringdir.setSorting( QDir::Name ); + + QStringList ringlist; + ringlist = ringdir.entryList(); + for (unsigned int i = 0; i < ringdir.count(); i++) { + if (ringlist[i] != "." && ringlist[i] != ".." && ringlist[i] != "CVS") { + ringsChoice->insertItem(ringlist[i]); + } + } + } + // List audio devices + const char* devicename ; + const char* hostapiname; + + int top = 0; + AudioDevice devStruct; + + portaudio::AutoSystem autoSys; + // For each device + for (int i = 0; i < Manager::instance().deviceCount(); i++) { + // Fill the device structure + devStruct = Manager::instance().deviceList(i); + hostapiname = devStruct.hostApiName; + devicename = devStruct.deviceName; + + QString hostNameApi(hostapiname) ; + QString name = hostNameApi + " (device #" + QString::number(i) + ")"; + + // New radio button with found device name + QRadioButton* device = new QRadioButton(DriverChoice); + device->setGeometry( QRect( 10, 30 + top, 390, 21 ) ); + + // Set label of radio button + device->setText(devicename); + + // Add tooltip for each one + QToolTip::add(device , name ); + + top += 30; + if (Manager::instance().defaultDevice(i)) { + device->setChecked(true); + } + } + // Set position of the button group, with appropriate length + DriverChoice->setGeometry( QRect( 10, 10, 410, top + 30 ) ); + + // For signalisations tab + fullName->setText(QString(get_config_fields_str(SIGNALISATION, FULL_NAME))); + userPart->setText(QString(get_config_fields_str(SIGNALISATION, USER_PART))); + username->setText(QString(get_config_fields_str(SIGNALISATION, AUTH_USER_NAME))); + password->setText(QString(get_config_fields_str(SIGNALISATION, PASSWORD))); + hostPart->setText(QString(get_config_fields_str(SIGNALISATION, HOST_PART))); + sipproxy->setText(QString(get_config_fields_str(SIGNALISATION, PROXY))); + autoregister->setChecked(get_config_fields_int(SIGNALISATION, AUTO_REGISTER)); + playTones->setChecked(get_config_fields_int(SIGNALISATION, PLAY_TONES)); + pulseLength->setValue(get_config_fields_int(SIGNALISATION, PULSE_LENGTH)); + sendDTMFas->setCurrentItem(get_config_fields_int(SIGNALISATION, SEND_DTMF_AS)); + STUNserver->setText(QString(get_config_fields_str(SIGNALISATION, STUN_SERVER))); +((QRadioButton*)stunButtonGroup->find(get_config_fields_int(SIGNALISATION, USE_STUN)))->setChecked(true); + // For audio tab + +((QRadioButton*)DriverChoice->find(get_config_fields_int(AUDIO, DRIVER_NAME)))->setChecked(true); + + codec1->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC1))); + codec2->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC2))); + codec3->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC3))); + + ringsChoice->setCurrentText(QString(get_config_fields_str(AUDIO, RING_CHOICE))); + + // For preferences tab + SkinChoice->setCurrentText(QString(get_config_fields_str( + PREFERENCES, SKIN_CHOICE))); + confirmationToQuit->setChecked(get_config_fields_int( + PREFERENCES, CONFIRM_QUIT)); + zoneToneChoice->setCurrentText(QString(get_config_fields_str( + PREFERENCES, ZONE_TONE))); + checkedTray->setChecked(get_config_fields_int( + PREFERENCES, CHECKED_TRAY)); + voicemailNumber->setText(QString(get_config_fields_str( + PREFERENCES, VOICEMAIL_NUM))); + + // Init tab view order + Tab_Signalisations->show(); + Tab_Audio->hide(); + Tab_Preferences->hide(); + Tab_About->hide(); + + // Set items for QListBox + new QjListBoxPixmap (QjListBoxPixmap::Above, + QPixmap(Skin::getPathPixmap(QString(PIXDIR),QString(PIXMAP_SIGNALISATIONS))), "Signalisation", Menu ); + new QjListBoxPixmap (QjListBoxPixmap::Above, + QPixmap(Skin::getPathPixmap(QString(PIXDIR), QString(PIXMAP_AUDIO))) , + "Audio", Menu ); + + new QjListBoxPixmap (QjListBoxPixmap::Above, + QPixmap(Skin::getPathPixmap(QString(PIXDIR), QString(PIXMAP_PREFERENCES))), + "Preferences", Menu ); + new QjListBoxPixmap (QjListBoxPixmap::Above, + QPixmap(Skin::getPathPixmap(QString(PIXDIR), QString(PIXMAP_ABOUT))), + "About", Menu ); +} + +// For saving settings at application 'save' +void ConfigurationPanel::saveSlot() +{ + Config::set("VoIPLink", "SIP.fullName", string(fullName->text().ascii())); + Config::set("VoIPLink", "SIP.userPart", string(userPart->text().ascii())); + Config::set("VoIPLink", "SIP.username", string(username->text().ascii())); + Config::set("VoIPLink", "SIP.password", string(password->text().ascii())); + Config::set("VoIPLink", "SIP.hostPart", string(hostPart->text().ascii())); + Config::set("VoIPLink", "SIP.proxy", string(sipproxy->text().ascii())); + Config::set("VoIPLink", "SIP.autoregister",autoregister->isChecked()); + Config::set("VoIPLink", "DTMF.pulseLength", pulseLength->value()); + Config::set("VoIPLink", "DTMF.playTones", playTones->isChecked()); + Config::set("VoIPLink", "DTMF.sendDTMFas" , sendDTMFas->currentItem()); + Config::set("VoIPLink", "STUN.STUNserver", string(STUNserver->text().ascii())); + + Config::set("Audio", "Codecs.codec1", string(codec1->currentText().ascii())); + Config::set("Audio", "Codecs.codec2", string(codec2->currentText().ascii())); + Config::set("Audio", "Codecs.codec3", string(codec3->currentText().ascii())); + + if (ringsChoice->currentText() != NULL) + Config::set("Audio", "Rings.ringChoice", + string(ringsChoice->currentText().ascii())); + + Config::set("Preferences", "Themes.skinChoice", + string(SkinChoice->currentText().ascii())); + Config::set("Preferences", "Options.zoneToneChoice", + string(zoneToneChoice->currentText().ascii())); + Config::set("Preferences", "Options.confirmQuit", + confirmationToQuit->isChecked()); + Config::set("Preferences", "Options.checkedTray", checkedTray->isChecked()); + + Config::set("Preferences", "Options.voicemailNumber", + string(voicemailNumber->text().ascii())); +#if 0 + QMessageBox::information(this, "Save settings", + "You must restart SFLPhone", + QMessageBox::Yes); +#endif +} + +// Handle tab view according to current item of listbox +void ConfigurationPanel::changeTabSlot() +{ + switch (Menu->currentItem()) { + case 0: + TitleTab->setText("Setup signalisation"); + Tab_Signalisations->show(); + Tab_Audio->hide(); + Tab_Preferences->hide(); + Tab_About->hide(); + break; + case 1: + TitleTab->setText("Setup audio"); + Tab_Signalisations->hide(); + Tab_Audio->show(); + Tab_Preferences->hide(); + Tab_About->hide(); + break; + case 2: + TitleTab->setText("Setup preferences"); + Tab_Signalisations->hide(); + Tab_Audio->hide(); + Tab_Preferences->show(); + Tab_About->hide(); + break; + case 3: + TitleTab->setText("About"); + Tab_Signalisations->hide(); + Tab_Audio->hide(); + Tab_Preferences->hide(); + Tab_About->show(); + break; + } +} + + +void ConfigurationPanel::useStunSlot(int id) +{ + Config::set("VoIPLink", "STUN.useStun", id); +} + + +void ConfigurationPanel::applySkinSlot() +{ + Config::set("Preferences", "Themes.skinChoice", string(SkinChoice->currentText().ascii())); +} + + +void ConfigurationPanel::driverSlot(int id) +{ +Config::set("Audio", "Drivers.driverName", id); +} diff --git a/src/gui/official/configurationpanelui.h b/src/gui/official/configurationpanelui.h new file mode 100644 index 0000000000000000000000000000000000000000..701dddf0aa5929ce900c960e8e15d8d7e0b28015 --- /dev/null +++ b/src/gui/official/configurationpanelui.h @@ -0,0 +1,163 @@ +/**************************************************************************** +** Form interface generated from reading ui file 'configurationpanel.ui' +** +** Created: Wed Jul 6 11:32:13 2005 +** by: The User Interface Compiler ($Id$) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef CONFIGURATIONPANEL_H +#define CONFIGURATIONPANEL_H + +#include <qvariant.h> +#include <qpixmap.h> +#include <qdialog.h> + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class QFrame; +class QPushButton; +class QListBox; +class QListBoxItem; +class QLabel; +class QTabWidget; +class QWidget; +class QGroupBox; +class QLineEdit; +class QCheckBox; +class QButtonGroup; +class QRadioButton; +class QSpinBox; +class QComboBox; + +class ConfigurationPanel : public QDialog +{ + Q_OBJECT + +public: + ConfigurationPanel( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~ConfigurationPanel(); + + QFrame* line1; + QPushButton* buttonHelp; + QPushButton* buttonSave; + QPushButton* buttonOk; + QPushButton* buttonCancel; + QListBox* Menu; + QLabel* TitleTab; + QFrame* line2; + QTabWidget* Tab_Signalisations; + QWidget* SIPPage; + QGroupBox* groupBox1; + QLabel* textLabel2; + QLineEdit* fullName; + QLineEdit* userPart; + QLabel* textLabel3; + QLabel* textLabel2_3; + QLineEdit* username; + QLineEdit* hostPart; + QLineEdit* sipproxy; + QLabel* textLabel3_2_2; + QLineEdit* password; + QLabel* textLabel1_3; + QLabel* textLabel3_2; + QCheckBox* autoregister; + QPushButton* Register; + QWidget* STUNPage; + QGroupBox* groupBox3; + QLabel* textLabel1_5; + QLineEdit* STUNserver; + QButtonGroup* stunButtonGroup; + QRadioButton* useStunNo; + QRadioButton* useStunYes; + QWidget* DTMFPage; + QGroupBox* SettingsDTMF; + QCheckBox* playTones; + QLabel* labelPulseLength; + QSpinBox* pulseLength; + QLabel* labelSendDTMF; + QComboBox* sendDTMFas; + QTabWidget* Tab_Audio; + QWidget* DriversPage; + QButtonGroup* DriverChoice; + QWidget* CodecsPage; + QButtonGroup* CodecsChoice; + QComboBox* codec1; + QComboBox* codec2; + QComboBox* codec3; + QLabel* textLabel1_4; + QLabel* textLabel1_4_2; + QLabel* textLabel1_4_3; + QWidget* RingPage; + QComboBox* ringsChoice; + QTabWidget* Tab_Preferences; + QWidget* DriversPage_2; + QComboBox* SkinChoice; + QPushButton* buttonApplySkin; + QWidget* TabPage; + QLabel* labelToneZone; + QComboBox* zoneToneChoice; + QCheckBox* confirmationToQuit; + QCheckBox* checkedTray; + QLabel* textLabel1_6; + QLineEdit* voicemailNumber; + QTabWidget* Tab_About; + QWidget* DriversPage_3; + QLabel* pixmapLabel1; + QLabel* textLabel2_2; + QWidget* CodecsPage_2; + QLabel* textLabel1; + QLabel* pixmapLabel2; + +public slots: + virtual void saveSlot(); + virtual void changeTabSlot(); + virtual void useStunSlot( int id ); + virtual void applySkinSlot(); + virtual void driverSlot( int id ); + +protected: + QGridLayout* ConfigurationPanelLayout; + QVBoxLayout* layout19; + QHBoxLayout* layout28; + QSpacerItem* Horizontal_Spacing2; + QVBoxLayout* layout17; + QVBoxLayout* layout24; + QGridLayout* groupBox1Layout; + QVBoxLayout* layout23; + QSpacerItem* spacer9; + QHBoxLayout* layout19_2; + QSpacerItem* spacer7; + QVBoxLayout* stunButtonGroupLayout; + QGridLayout* SettingsDTMFLayout; + QVBoxLayout* layout11; + QHBoxLayout* layout10; + QSpacerItem* spacer6; + QHBoxLayout* layout7; + QSpacerItem* spacer3; + QHBoxLayout* layout8; + QSpacerItem* spacer4; + QGridLayout* layout18; + QVBoxLayout* layout17_2; + QVBoxLayout* layout18_2; + QVBoxLayout* layout17_3; + QHBoxLayout* layout16; + QSpacerItem* spacer5; + QHBoxLayout* layout16_2; + QSpacerItem* spacer6_2; + +protected slots: + virtual void languageChange(); + +private: + QPixmap image0; + QPixmap image1; + + void init(); + +}; + +#endif // CONFIGURATIONPANEL_H diff --git a/src/gui/official/jpushbutton.cpp b/src/gui/official/jpushbutton.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4259b5acc695e27c99b33794c56b1891ac0a8d18 --- /dev/null +++ b/src/gui/official/jpushbutton.cpp @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Jerome Oufella (jerome.oufella@savoirfairelinux.com) + * + * Portions (c) Valentin Heinitz + * + * This 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, + * or (at your option) any later version. + * + * This 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 dpkg; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <qcursor.h> +#include <qwidget.h> +#include <qlabel.h> +#include <qimage.h> +#include <qbitmap.h> +#include <qevent.h> + +#include "jpushbutton.h" +#include "../../skin.h" +#include "qtGUImainwindow.h" + +// This is the default constructor, it must be called with pixname being +// the base name for the picture used as button pixmap. +JPushButton::JPushButton (QWidget* parent, const char* name, + const char* pixname) : QLabel (parent, name) { + + guiWidget = (QtGUIMainWindow*)parent; + + // Load pictures + this->loadPixmaps(pixname); + + // Create transparency bitmasks + QImage tmpImg[2]; + MyCreateHeuristicMask (*(this->btnImg[0]), tmpImg[0]); + mask[0] = tmpImg[0]; + + MyCreateHeuristicMask (*(this->btnImg[1]), tmpImg[1]); + mask[1] = tmpImg[1]; + + // Resize ourself + resize (this->btnImg[0]->width(), this->btnImg[0]->height() ); + + // Set default pixmap (released) + setMask (mask[0]); + setPixmap (*(this->btnImg[0])); + + // Default cursor is pointing hand + setCursor (QCursor (Qt::PointingHandCursor)); + + setFocusPolicy(QWidget::NoFocus); + show(); +} + +// Delete allocated items +JPushButton::~JPushButton (void) { + delete this->btnImg[0]; + delete this->btnImg[1]; +} + +// This loads the pixmaps used for pressed/released state. +void +JPushButton::loadPixmaps (const char* pixname) { + QString pressedPixmapPath, releasedPixmapPath; + + pressedPixmapPath = Skin::getPath(QString(SKINDIR), + guiWidget->setPathSkin(), + QString(pixname) + PRESS_PREFIX + ".png"); + releasedPixmapPath = Skin::getPath(QString(SKINDIR), + guiWidget->setPathSkin(), + QString(pixname) + REL_PREFIX + ".png"); + + this->btnImg[0] = new QImage (releasedPixmapPath); + this->btnImg[1] = new QImage (pressedPixmapPath); +} + +// This function was derived from QImage::createHeuristicMask() +// It creates the heuristic mask that will allow transparency. +int +JPushButton::MyCreateHeuristicMask (const QImage & img_XX, QImage &m, + long transp_col) { + if (img_XX.isNull()) { + return -1; + } + + QImage img = img_XX.convertDepth(32); + + int w = img.width(); + int h = img.height(); + m = QImage(w, h, 1, 2, QImage::LittleEndian); + m.setColor( 0, 0xffffff ); + m.setColor( 1, 0 ); + m.fill( 0xff ); + QRgb bg; + // User defined transp. color not set. get it from pixel at 0x0 + if (transp_col == -1) { + // Pixel im Punkt 0x0 + bg = *((QRgb*)img.scanLine(0)+0) & 0x00ffffff ; + } + + // Use user defined color for transparency + else { + bg = transp_col & 0x00ffffff; + } + + + QRgb *p; + QRgb p24; + uchar * mp; + int x,y; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + p = (QRgb *) img.scanLine(y) + x ; + + p24 = (*p & 0x00ffffff ); + if (p24 == bg) { + mp = m.scanLine(y); + + *(mp + (x >> 3)) &= ~(1 << (x & 7)); + } + p++; + } + } + return 0; +} + +// This slot is toggled when the button is pressed +// It changes the picture. +void +JPushButton::iAmPressed (void) { + setPixmap (*(this->btnImg[1])); + setMask (mask[1]); +} + +// This slot is toggled when the button is released +// It changes the picture. +void +JPushButton::iAmReleased (void) { + setPixmap (*(this->btnImg[0])); + setMask (mask[0]); +} + +// Mouse button released +void +JPushButton::mousePressEvent (QMouseEvent *e) { + switch (e->button()) { + case Qt::LeftButton: + iAmPressed(); + break; + + default: + e->ignore(); + break; + } +} + +// Mouse button released +void +JPushButton::mouseReleaseEvent (QMouseEvent *e) { + switch (e->button()) { + case Qt::LeftButton: + iAmReleased(); + // Emulate the left mouse click + if (this->rect().contains(e->pos())) { + emit clicked(); + } + break; + + default: + e->ignore(); + break; + } +} + +void +JPushButton::mouseMoveEvent (QMouseEvent *e) { + e->accept(); +} + diff --git a/src/gui/official/jpushbutton.h b/src/gui/official/jpushbutton.h new file mode 100644 index 0000000000000000000000000000000000000000..0ef7ac7fa964f31c55fa3c65ad62f576d01f35b2 --- /dev/null +++ b/src/gui/official/jpushbutton.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Jerome Oufella (jerome.oufella@savoirfairelinux.com) + * + * Portions (c) Valentin Heinitz + * + * This 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, + * or (at your option) any later version. + * + * This 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 dpkg; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __J_PUSH_BUTTON_H__ +#define __J_PUSH_BUTTON_H__ + +#include <qbitmap.h> +#include <qevent.h> +#include <qimage.h> +#include <qobject.h> +#include <qlabel.h> +#include <qwidget.h> +#include <qstring.h> + +#define PRESS_PREFIX "_on" +#define REL_PREFIX "_off" + +class QtGUIMainWindow; + +class JPushButton : public QLabel { +Q_OBJECT + +public: + JPushButton (QWidget*, const char*, const char*); + ~JPushButton (void); + +private: + QtGUIMainWindow* guiWidget; + + void iAmPressed (void); + void iAmReleased (void); + QImage* btnImg[2]; + QBitmap mask[2]; + void loadPixmaps (const char*); + + // This function was derived from QImage::createHeuristicMask() + int MyCreateHeuristicMask (const QImage &, QImage &, long = -1 ); + + +protected: + void mousePressEvent (QMouseEvent *); + void mouseReleaseEvent (QMouseEvent *); + void mouseMoveEvent (QMouseEvent *); + +signals: + void clicked (void); +}; + +#endif // defined(__J_PUSH_BUTTON_H__) diff --git a/src/gui/official/main.cpp b/src/gui/official/main.cpp index 48af641a24f307790e80b1853eebe34774195ab8..7ce48fb77222f0c6e38e886399817dde30a851bb 100644 --- a/src/gui/official/main.cpp +++ b/src/gui/official/main.cpp @@ -20,13 +20,16 @@ #include <iostream> #include <stdexcept> -#include <unistd.h> +#include <string> #include "session.h" int main(int, char **) { try { + while(std::cin.good()) { + std::string line; + std::getline(&std::cin, line); Session session; Account account = session.getAccount("patate"); account.registerAccount(); diff --git a/src/gui/official/mydisplay.cpp b/src/gui/official/mydisplay.cpp new file mode 100644 index 0000000000000000000000000000000000000000..107a112f7cb1d163f37fb2f36ba8b3794073f7cf --- /dev/null +++ b/src/gui/official/mydisplay.cpp @@ -0,0 +1,497 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <qapplication.h> +#include <qdatetime.h> +#include <qfont.h> +#include <qpainter.h> +#include <qstring.h> +#include <stdio.h> +#include <math.h> + +#include "../../skin.h" +#include "mydisplay.h" +#include "qtGUImainwindow.h" + +#define TABULATION 1 +#define TEXT_LINE 2 +#define TIMER_LINE 4 +#define FONT_FAMILY "Courier" +// Others fixed font support "Monospace", "Fixed", "MiscFixed" +#define FONT_SIZE 10 + +/////////////////////////////////////////////////////////////////////////////// +// MyDisplayThread Implementation // +/////////////////////////////////////////////////////////////////////////////// + +/** + * Default constructor. + */ +MyDisplayThread::MyDisplayThread (QWidget *thewidget) : QThread () { + alive = false; + widget = thewidget; +} + +/** + * Reimplementation of run() to update widget + */ +void +MyDisplayThread::run (void) { + alive = true; + + while (alive) { + msleep (120); + if (widget != NULL) { + widget->update(); + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// MyDisplay Implementation // +/////////////////////////////////////////////////////////////////////////////// + +/** + * Default constructor. + */ +MyDisplay::MyDisplay (void) : QWidget () { + this->initGraphics(); + this->initText(); +} + +/** + * Constructor wtih 3 parameters. + * + * @param widget parent + * parent name + * QtGUIMainWindow + */ +MyDisplay::MyDisplay (QWidget *parent, const char *name, QtGUIMainWindow* qtgui) + : QWidget (parent, name) { + _qtgui = qtgui; + this->initGraphics(); + this->initText(); + + // For scrolling text + _timerForScrollingText = new QTimer(this); + connect (_timerForScrollingText, SIGNAL(timeout()), SLOT(shift())); + //emit signal every second + _timerForScrollingText->start(2000); + + // Graphics engine animation thread + _animationThread = new MyDisplayThread (this); + _animationThread->start(); +} + +/** + * Destructor. + */ +MyDisplay::~MyDisplay (void) { + delete _animationThread; + delete _textBuffer; + delete _qtgui; + delete _status; + delete _time; + _timerForScrollingText->stop(); + delete _timerForScrollingText; +} + +/** + * Reimplementation of paintEvent() to render text in the display with + * specified font, a fixed-size font. + */ +void +MyDisplay::paintEvent (QPaintEvent *e) { + if (e); + + QPixmap pm(_centerImage.width(),_centerImage.height()); + + // Painter settings + QFont font(FONT_FAMILY, FONT_SIZE); + font.setBold(true); + QFontMetrics fm(font); + + QPainter p; + p.begin(&pm); + p.setFont(font); + + // Text image (static) + bitBlt (&pm, 0, 0, + &(_centerImage), 0, 0, + _centerImage.width(), + _centerImage.height(), + Qt::CopyROP); + + // Display text render + renderText (p, fm, *_textBuffer); + // Display status + renderStatus (p, fm, *_status); + // Display time + renderTime (p, fm); + + // Overscreen image + bitBlt (&pm, 0, 0, + &(_overImage), 0, 0, + _overImage.width(), + _overImage.height(), + Qt::CopyROP); + + p.end(); + + // "Swap" buffers + bitBlt (this, 0, 0, + &pm, 0, 0, + _centerImage.width(), + _centerImage.height(), + Qt::CopyROP); +} + +/** + * Load display image, set geometry and start the thread to redraw LCD display. + */ +void +MyDisplay::initGraphics (void) { + // This widget is 100% painted by hand + this->setBackgroundMode (Qt::NoBackground); + + // Load display screen image + QPixmap *pixcenter = new QPixmap(Skin::getPath(QString(SKINDIR), + _qtgui->setPathSkin(), + QString(PIXMAP_SCREEN))); + _centerImage = pixcenter->convertToImage(); + delete pixcenter; + + // Load overscreen image + QPixmap *pixover = new QPixmap(Skin::getPath(QString(SKINDIR), + _qtgui->setPathSkin(), + QString(PIXMAP_OVERSCREEN))); + _overImage = pixover->convertToImage(); + delete pixover; + + // Adjust our size to the picture's one + this->setGeometry (0, 0, _centerImage.width(), _centerImage.height()); +} + +/** + * Create new buffer to compose. + */ +void +MyDisplay::initText (void) { + _textBuffer = new QString (); + // Init status to free-status + _status = new QString(FREE_STATUS); + // No display call-timer + _inFunction = false; + // No scrolling + _isScrolling = false; + _reset = false; + len_to_shift = 0; +} + +/** + * Draw text in the appropriate position. + * Scroll text on the left when text is over than width display. + * + * @param painter + * fm size of font + * str text to draw + */ +void +MyDisplay::renderText (QPainter &painter, QFontMetrics &fm, QString &str) { + // cpl = how many chars per line. + static unsigned int cpl = _centerImage.width() / fm.width("a"); + + // If the texts length is greater than the screen, we have to + // scroll the WHOLE text towards the left. + uint x_offset = 0; + uint extra_chars = 0; + QString backup_string("."); + QString str_tmp = str; + + // If call is closed, reset len_to_shift to 0 + if (getReset()) { + len_to_shift = 0; + } + + // If don't need scrolling message + if (!getIsScrolling()) { + // If the string is larger than the screen... + if (fm.width(str) > (_centerImage.width() - 5)) { + extra_chars = str.length() - cpl; + x_offset = fm.width(str[0]) * extra_chars; + + // Hack the scrolled string to inform the user + backup_string[0] = str[extra_chars]; + str.replace (extra_chars, backup_string.length(),QString("<")); + } + // Render text + _mutex.enterMutex(); + painter.drawText (TABULATION - x_offset, fm.height() * TEXT_LINE, str); + _mutex.leaveMutex(); + if (fm.width(str) > (_centerImage.width() - 5)) { + // Restore initial string. + str.replace(extra_chars, backup_string.length(), backup_string); + } + } else { + // if need scrolling text + if (_shift) { + len_to_shift += 1; + } + + if (str.length() > cpl) { + str_tmp = str.left(len_to_shift); + } + if (len_to_shift == cpl) { + str_tmp = str.right(len_to_shift); + } + if (len_to_shift == str.length()*2) { + str_tmp = str.left(len_to_shift); + len_to_shift = 0; + } + + _mutex.enterMutex(); + painter.drawText (TABULATION + _centerImage.width() - + len_to_shift * fm.width(str[0]), + fm.height() * TEXT_LINE, str_tmp); + _mutex.leaveMutex(); + } + +} + + +/** + * Draw status text. + * + * @param painter + * fm size of font + * str text to draw + */ +void +MyDisplay::renderStatus (QPainter &painter, QFontMetrics &fm, QString &str) { + painter.drawText (TABULATION, fm.height(), str); +} + +/** + * Render current time when line is free, or call timer when line is busy. + * + * @param painter + * fm size of font + */ +void +MyDisplay::renderTime (QPainter &painter, QFontMetrics &fm) { + static unsigned int minute = 0; + static unsigned int elapse; + QString minStr,secStr; + + // If conversation, display call-timer + if (_inFunction) { + elapse = _qtgui->getElapse(); + // To calculate minutes + if (elapse % 60 == 0) { + minute = elapse / 60; + elapse = elapse - minute * 60; + } + // Two digits for seconds + if ((elapse % 60) < 10) { + secStr = (QString("0" + QString::number(elapse % 60))); + } else { + secStr = QString::number(elapse % 60); + } + // Two digits for minutes + if (minute < 10) { + minStr = (QString("0" + QString::number(minute))); + } else { + minStr = QString::number(minute); + } + + _time = new QString(minStr + ":" + secStr); + + } else { + // If no conversation, display the current time + _time = new QString(QDateTime::currentDateTime().toString("hh:mm")); + + /** For english time format: + * time = new QString(QDateTime::currentDateTime().toString("h:m AP")); + */ + + // Handle time separator blinking. + static unsigned int i = 0; + if (i++ % 12 > 5) { + _time->replace (':', ' '); + } + } + painter.drawText (TABULATION, fm.height() * TIMER_LINE, *_time); +} + +/** + * To modify status. + * + * @param status + */ +void +MyDisplay::setStatus (const QString &status) { + // Free if previously allocated + if (_status != NULL) { + delete _status; + } + + _status = new QString (status); +} + +/** + * To access status. + * + *@return status + */ +QString & +MyDisplay::getStatus (void) { + return *_status; +} + +/** + * To modify timer line. + * + * @param time + */ +void +MyDisplay::setTimer (const QString &time) { + // Free if previously allocated + if (_time != NULL) { + delete _time; + } + _time = new QString (time); +} + +/** + * To access timer. + * + * @return time + */ +QString & +MyDisplay::getTimer (void) { + return *_time; +} + +/** + * To modify text buffer. + * + * @param text buffer + */ +void +MyDisplay::setTextBuffer (const QString& text) { + // Free if previously allocated + if (_textBuffer != NULL) { + delete _textBuffer; + } + _textBuffer = new QString (text); +} + +/** + * To access text buffer. + * + * @return text buffer + */ +QString & +MyDisplay::getTextBuffer (void) { + return *_textBuffer; +} + +void +MyDisplay::setIsScrolling (bool s) +{ + _mutex.enterMutex(); + _isScrolling = s; + _mutex.leaveMutex(); +} + +void +MyDisplay::resetForScrolling (bool r) +{ + _mutex.enterMutex(); + _reset = r; + _mutex.leaveMutex(); +} + +void +MyDisplay::setLenToShift (unsigned int len) +{ + _mutex.enterMutex(); + len_to_shift = len; + _mutex.leaveMutex(); +} + +/////////////////////////////////////////////////////////////////////////////// +// Implementation of the public slots // +/////////////////////////////////////////////////////////////////////////////// +void +MyDisplay::appendText (const QString &strToAdd) { + _textBuffer->append(strToAdd); +} + +void +MyDisplay::appendText (const char *text) { + _textBuffer->append(QString(text)); +} + +void +MyDisplay::appendText (const QChar &key) { + _textBuffer->append(QChar(key)); +} + +void +MyDisplay::clear (void) { + // Remove everything in the buffer. + _textBuffer->remove(0, _textBuffer->length()); + setStatus(QString(FREE_STATUS)); +} + +void +MyDisplay::clearBuffer (void) { + _textBuffer->remove(0, _textBuffer->length()); +} + +void +MyDisplay::clear (const QString &newstatus) { + // Remove everything in the buffer and set the new status. + _textBuffer->remove(0, _textBuffer->length()); + setStatus(newstatus); +} + +void +MyDisplay::backspace (void) { + // Remove the last char of the string + _textBuffer->remove(_textBuffer->length() - 1, 1); +} + +void +MyDisplay::shift (void) +{ + _mutex.enterMutex(); + if (getReset()) { + _shift = false; + len_to_shift = 0; + } else { + _shift = true; + } + _mutex.leaveMutex(); +} + +#include "mydisplaymoc.cpp" +// EOF diff --git a/src/gui/official/mydisplay.h b/src/gui/official/mydisplay.h new file mode 100644 index 0000000000000000000000000000000000000000..0c9e6a902a4f8474b4d281cb3ae51f86d4b33faf --- /dev/null +++ b/src/gui/official/mydisplay.h @@ -0,0 +1,155 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __MYDISPLAY_H__ +#define __MYDISPLAY_H__ + + +#include <cc++/thread.h> + +#include <qevent.h> +#include <qimage.h> +#include <qsettings.h> +#include <qstring.h> +#include <qthread.h> +#include <qtimer.h> +#include <qwidget.h> + +#include "../../global.h" + + +#define FREE_STATUS "Welcome to SFLPhone" + + +/* + * The screen looks like this: + * + * --------------------- + * | STATUS | + * | | + * | TextBuffer | + * | | + * | call-timer | + * --------------------- + */ + +using namespace ost; +/////////////////////////////////////////////////////////////////////////////// +// Screen animation thread +/////////////////////////////////////////////////////////////////////////////// +class MyDisplayThread : public QThread { +public: + MyDisplayThread (QWidget *); + +public: + virtual void run (); + +private: + QWidget *widget; + bool alive; +}; + + +class QtGUIMainWindow; + +/////////////////////////////////////////////////////////////////////////////// +// Display +/////////////////////////////////////////////////////////////////////////////// +class MyDisplay : public QWidget { + Q_OBJECT +public: + // Constructors and destructor + MyDisplay (); + MyDisplay (QWidget *, const char *, QtGUIMainWindow *); + ~MyDisplay (); + + void setStatus (const QString &); + QString & getStatus (void); + void setTimer (const QString &); + QString & getTimer (void); + void setTextBuffer (const QString &); + QString & getTextBuffer (void); + + // To initialize screen image, position + void initGraphics (void); + + // To switch between time and call-timer function + inline bool getInFunction (void) { return _inFunction; } + inline void setInFunction (bool b) { _inFunction = b; } + + // To set/unset in scrolling mode + inline bool getIsScrolling (void) { return _isScrolling; } + void setIsScrolling (bool s); + + // To setup to zero X-position for displaying text + inline bool getReset (void) { return _reset; } + void resetForScrolling (bool r) ; + void setLenToShift (unsigned int len) ; + +public slots: + // To append text which you type + void appendText (const QString &); + void appendText (const char *); + void appendText (const QChar &); + + // To clear caller-id line and set FREE status + void clear (void); + + // To clear just caller-id line + void clearBuffer (void); + + // To clear caller-id line and set new status in parameter + void clear (const QString &); + + // To remove the last char of the string + void backspace (void); + + // Slot for the timeout of the scrolling mode + void shift (void); + +protected: + void paintEvent (QPaintEvent *); + +private: + Mutex _mutex; + QImage _centerImage; // text zone + QImage _overImage; + QString* _status; + MyDisplayThread* _animationThread; + QtGUIMainWindow* _qtgui; + QString* _textBuffer; + QString* _time; + bool _inFunction; + bool _shift; + QTimer* _timerForScrollingText; + bool _isScrolling; + bool _reset; + unsigned int len_to_shift; + + // To initialize status, textbuffer and variables + void initText (void); + + void renderText (QPainter &, QFontMetrics &, QString &); + void renderStatus (QPainter &, QFontMetrics &, QString &); + void renderTime (QPainter &, QFontMetrics &); +}; + +#endif // __MYDISPLAY_H__ + +// EOF diff --git a/src/gui/official/numerickeypad.cpp b/src/gui/official/numerickeypad.cpp new file mode 100644 index 0000000000000000000000000000000000000000..21f4fb5e10fba68977add740ed5df72fc1b4976f --- /dev/null +++ b/src/gui/official/numerickeypad.cpp @@ -0,0 +1,118 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <string> +#include <qapplication.h> + +#include "jpushbutton.h" +#include "numerickeypad.h" +#include "qtGUImainwindow.h" +#include "../../skin.h" + +using namespace std; + + +NumericKeypad::NumericKeypad (QWidget *parent, const char *name, WFlags f) + : TransQWidget (NULL, name, f) { + mainWindow = (TransQWidget *)parent; + gui = (QtGUIMainWindow*)parent; + this->setCaption("DTMF keypad"); + + // Load background image phone + setbgPixmap (new QPixmap (Skin::getPath(QString(SKINDIR), + gui->setPathSkin(), + QString(PIXMAP_KEYPAD)))); + + // Transform pixmap to QImage + setSourceImage (); + + setMaximumSize (getSourceImage().width(), getSourceImage().height()); + + // Calculate just one time the transparency mask bit to bit + transparencyMask (); + + string skinfilename(Skin::getPath(QString(SKINDIR), + gui->setPathSkin(), + QString(FILE_INI))); + pt = new Point(skinfilename); + + // Buttons initialisation + key0 = new JPushButton(this, NULL, DTMF_0); + key1 = new JPushButton(this, NULL, DTMF_1); + key2 = new JPushButton(this, NULL, DTMF_2); + key3 = new JPushButton(this, NULL, DTMF_3); + key4 = new JPushButton(this, NULL, DTMF_4); + key5 = new JPushButton(this, NULL, DTMF_5); + key6 = new JPushButton(this, NULL, DTMF_6); + key7 = new JPushButton(this, NULL, DTMF_7); + key8 = new JPushButton(this, NULL, DTMF_8); + key9 = new JPushButton(this, NULL, DTMF_9); + keyStar = new JPushButton(this, NULL, DTMF_STAR); + keyHash = new JPushButton(this, NULL, DTMF_POUND); + keyClose = new JPushButton(this, NULL, DTMF_CLOSE); + + // Buttons position + key0->move (pt->getX(DTMF_0), pt->getY(DTMF_0)); + key1->move (pt->getX(DTMF_1), pt->getY(DTMF_1)); + key2->move (pt->getX(DTMF_2), pt->getY(DTMF_2)); + key3->move (pt->getX(DTMF_3), pt->getY(DTMF_3)); + key4->move (pt->getX(DTMF_4), pt->getY(DTMF_4)); + key5->move (pt->getX(DTMF_5), pt->getY(DTMF_5)); + key6->move (pt->getX(DTMF_6), pt->getY(DTMF_6)); + key7->move (pt->getX(DTMF_7), pt->getY(DTMF_7)); + key8->move (pt->getX(DTMF_8), pt->getY(DTMF_8)); + key9->move (pt->getX(DTMF_9), pt->getY(DTMF_9)); + keyStar->move (pt->getX(DTMF_STAR), pt->getY(DTMF_STAR)); + keyHash->move (pt->getX(DTMF_POUND), pt->getY(DTMF_POUND)); + keyClose->move (pt->getX(DTMF_CLOSE), pt->getY(DTMF_CLOSE)); +} + +NumericKeypad::~NumericKeypad (void) { + delete key0; + delete key1; + delete key2; + delete key3; + delete key4; + delete key5; + delete key6; + delete key7; + delete key8; + delete key9; + delete keyStar; + delete keyHash; + delete keyClose; + delete pt; +} + +void +NumericKeypad::keyPressEvent (QKeyEvent* e) { + QApplication::sendEvent (mainWindow, e); + + // TODO: Key appears pressed when done. + if ((e->key() >= Qt::Key_0 and + e->key() <= Qt::Key_9) or + e->key() == Qt::Key_Asterisk or + e->key() == Qt::Key_NumberSign) { + //QApplication::sendEvent(bouton, QEvent(QEvent::MouseButtonPress)); + } else { + //QApplication::sendEvent (mainWindow, e); + } +} + + diff --git a/src/gui/official/numerickeypad.h b/src/gui/official/numerickeypad.h new file mode 100644 index 0000000000000000000000000000000000000000..513929ae7d4ff6e31fb513e8ab5f0391594eb1d7 --- /dev/null +++ b/src/gui/official/numerickeypad.h @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __NUMERIC_KEYPAD_H__ +#define __NUMERIC_KEYPAD_H__ + +#include "jpushbutton.h" +#include "point.h" +#include "transqwidget.h" + +class QtGUIMainwindow; + +class NumericKeypad : public TransQWidget { + Q_OBJECT +public: + // Default Constructor and destructor + NumericKeypad (QWidget* = 0, const char* = 0,WFlags = 0); + ~NumericKeypad (void); + + JPushButton *key0; + JPushButton *key1; + JPushButton *key2; + JPushButton *key3; + JPushButton *key4; + JPushButton *key5; + JPushButton *key6; + JPushButton *key7; + JPushButton *key8; + JPushButton *key9; + JPushButton *keyStar; + JPushButton *keyHash; + JPushButton *keyClose; + +private: + Point *pt; + TransQWidget* mainWindow; + QtGUIMainWindow* gui; + void keyPressEvent (QKeyEvent*); +}; + +#endif // __NUMERIC_KEYPAD_H__ diff --git a/src/gui/official/numerickeypadtools.cpp b/src/gui/official/numerickeypadtools.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a2e9a432d863a1e547cec936b16e7a98e16580fb --- /dev/null +++ b/src/gui/official/numerickeypadtools.cpp @@ -0,0 +1,42 @@ +/** + * Copyright (C) 2004 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <qstring.h> +#include <stdio.h> + +#include "numerickeypadtools.h" + + + +NumericKeypadTools::NumericKeypadTools (void) { +} + +NumericKeypadTools::~NumericKeypadTools (void) { +} + +int +NumericKeypadTools::keyToNumber (int key) { + QChar tchar(key); + + if (!tchar.isLetter()) { + return -1; + } else { + return Qt::Key_0 + keymapTable[tchar.upper() - Qt::Key_A]; + } +} diff --git a/src/gui/official/numerickeypadtools.h b/src/gui/official/numerickeypadtools.h new file mode 100644 index 0000000000000000000000000000000000000000..b7238440519d48c11f53187c05346bfc352b826a --- /dev/null +++ b/src/gui/official/numerickeypadtools.h @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2004 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __NUM_KPAD_TOOLS__ +#define __NUM_KPAD_TOOLS__ +#include <qapplication.h> + +#define KEYPAD_ID_1 0 +#define KEYPAD_ID_2 1 +#define KEYPAD_ID_3 2 +#define KEYPAD_ID_4 3 +#define KEYPAD_ID_5 4 +#define KEYPAD_ID_6 5 +#define KEYPAD_ID_7 6 +#define KEYPAD_ID_8 7 +#define KEYPAD_ID_9 8 +#define KEYPAD_ID_STAR 9 +#define KEYPAD_ID_0 10 +#define KEYPAD_ID_HASH 11 + +#ifdef __cplusplus +extern "C" { +#endif + +// 26 letters mapped to keypad numbers. +const int keymapTable[] = { + 2, 2, 2, // ABC + 3, 3, 3, // DEF + 4, 4, 4, // GHI + 5, 5, 5, // JKL + 6, 6, 6, // MNO + 7, 7, 7, 7, // PQRS + 8, 8, 8, // TUV + 9, 9, 9, 9 // WXYZ + }; +#ifdef __cplusplus +} +#endif + +class NumericKeypadTools { +public: + NumericKeypadTools (); + ~NumericKeypadTools (); + static int keyToNumber (int); + +private: +}; + +#endif // __NUM_KPAD_TOOLS__ + +// EOF diff --git a/src/gui/official/phoneline.cpp b/src/gui/official/phoneline.cpp new file mode 100644 index 0000000000000000000000000000000000000000..db964bc8cbb37cf74b53da0ee0539969461c7f35 --- /dev/null +++ b/src/gui/official/phoneline.cpp @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <qpushbutton.h> + +#include "jpushbutton.h" +#include "phoneline.h" + +PhoneLine::PhoneLine (void) { + jpb = NULL; + setState (FREE); + first = true; + timer = new QTime(); + b_ringing = false; + _callid = 0; + _status = ""; + _scrolling = false; + _stopScrolling = false; +} + +PhoneLine::~PhoneLine (void) { + if (timer != NULL) { + delete timer; + } +} + +enum line_state +PhoneLine::getState (void) { + return state; +} + +void +PhoneLine::setState (enum line_state state) { + this->state = state; +} + +bool +PhoneLine::isFree (void) { + if (getState() == FREE) { + return true; + } else { + return false; + } +} + +bool +PhoneLine::isBusy (void) { + if (getState() == BUSY) { + return true; + } else { + return false; + } +} + +bool +PhoneLine::isOnHold (void) { + if (getState() == ONHOLD) { + return true; + } else { + return false; + } +} + +void +PhoneLine::toggleState (void) { + if (isBusy()){ + setState(ONHOLD); + } else if (isFree() || isOnHold()) { + setState (BUSY); + } +} + +void +PhoneLine::setButton (JPushButton *jpb) { + this->jpb = jpb; +} + +JPushButton * +PhoneLine::button (void) { + return this->jpb; +} + +void +PhoneLine::startTimer(void) { + if (timer == NULL) + timer = new QTime(); + timer->start(); +} + +void +PhoneLine::stopTimer(void) { + delete timer; + timer = NULL; +} + + +// EOF diff --git a/src/gui/official/phoneline.h b/src/gui/official/phoneline.h new file mode 100644 index 0000000000000000000000000000000000000000..e07a077a062808ada04568c79d0b49f79cfc930b --- /dev/null +++ b/src/gui/official/phoneline.h @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __PHONE_LINE_H__ +#define __PHONE_LINE_H__ + +#include <qpushbutton.h> +#include <qdatetime.h> + + +#define NUMBER_OF_LINES 6 +#define NUMBER_OF_STATES 2 // for the init of phoneline button pixmap + +/** Defines the state of a line. */ +enum line_state { + FREE = 0, // Line is available + BUSY, // Line is busy + ONHOLD, // Line is on hold + OFFHOLD // Line is on hold +}; + +class JPushButton; +class PhoneLine { + public: + PhoneLine (void); + ~PhoneLine (void); + + // Handle different state + enum line_state getState(); + void setState(enum line_state); + bool isFree(void); + bool isBusy(void); + bool isOnHold(void); + void toggleState(void); + + // Handle a line like a push-button + void setButton(JPushButton *); + JPushButton *button(void); + + // Handle timer for call-timer + void startTimer(void); + void stopTimer(void); + + // Handle status for each phoneline + QString getStatus(void) { return _status; } + void setStatus(const QString& status) { _status = status; } + + // Manage a ringtone notification if there is an incoming call + bool getbRinging(void) {return b_ringing;} + void setbRinging(bool ring) { + if (this->b_ringing != ring) + this->b_ringing = ring; + } + + + // Handle call-id for each phoneline + short getCallId(void) + {return _callid;} + + void setCallId(short id) + {_callid = id;} + + // Handle if need scrolling or not + bool scrolling(void) + {return _scrolling;} + + void setScrolling(bool s) + {_scrolling = s;} + + // Handle stop scrolling + bool stopScrolling() + {return _stopScrolling;} + + void setStopScrolling(bool s) + {_stopScrolling = s;} + + // For call-timer + QTime *timer; + // To start just one time the call-timer per call + bool first; + + private: + short _callid; + QString _status; + bool _scrolling; + bool _stopScrolling; + + JPushButton* jpb; + enum line_state state; + + // if incoming call, + // before IP-phone user answers (->true) + bool b_ringing; + +}; + +#endif // __PHONE_LINE_H__ diff --git a/src/gui/official/point.cpp b/src/gui/official/point.cpp new file mode 100644 index 0000000000000000000000000000000000000000..348692f6b5233c37a882af4622338862743d19b7 --- /dev/null +++ b/src/gui/official/point.cpp @@ -0,0 +1,132 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "../../configurationtree.h" +#include "point.h" + +#include <string> +using namespace std; + +/** + * Create a config-tree from file 'filename' + */ +Point::Point (const string& filename) { + int opened = 1; + skinConfigTree = new ConfigurationTree(); + opened = skinConfigTree->populateFromFile (filename); + if (opened != 1) { + // If opening failed, stop the application + exit(0); + } +} + +Point::~Point (void) { + if (skinConfigTree != NULL) { + delete skinConfigTree; + skinConfigTree = NULL; + } +} + + +/** + * Extract the substring before the comma + */ +string +Point::getSubstrX (const char* key) { + string value = skinConfigTree->getValue("", string(key)); + int index = value.find(','); + return value.substr(0, index); +} + +/** + * Extract the substring after the comma + */ +string +Point::getSubstrY (const char* key) { + string value = skinConfigTree->getValue("", string(key)); + int index = value.find(','); + return value.substr(index + 1, value.length() - index); +} + +/** + * Return the x-value of 'key' + */ +int +Point::getX (const char* key) { + int index; + string tmp = getSubstrX(key); + + if (getDirection(key) == HORIZONTAL) { + index = tmp.find('-'); + return atoi((tmp.substr(0, tmp.length() - index)).data()); + } else { + return atoi(tmp.data()); + } +} + +/** + * Return the y-value of 'key' + */ +int +Point::getY (const char* key) { + int index; + string tmp = getSubstrY(key); + + if (getDirection(key) == VERTICAL) { + index = tmp.find('-'); + return atoi((tmp.substr(0, tmp.length() - index)).data()); + } else { + return atoi(tmp.data()); + } +} + +/** + * Return the variation-value of 'key' (for volume) + */ +int +Point::getVariation (const char* key) { + int index; + string str; + + if (getDirection(key) == HORIZONTAL) { + str = getSubstrX(key); + } else if (getDirection(key) == VERTICAL) { + str = getSubstrY(key); + } + index = str.find('-'); + return atoi((str.substr(index + 1, str.length() - index)).data()); +} + + +/** + * Get the direction of the variation for 'key' + * + * @return 1 -> horizontal or 2 -> vertical + * (0 if no variation) + */ +int +Point::getDirection (const char* key) { + if (getSubstrX(key).find('-') != string::npos) { + return HORIZONTAL; + } else if (getSubstrY(key).find('-') != string::npos) { + return VERTICAL; + } else { + return NO_DIRECTION; + } +} diff --git a/src/gui/official/point.h b/src/gui/official/point.h new file mode 100644 index 0000000000000000000000000000000000000000..8b814815e7641c1e0d43950eff5b57108bc0e004 --- /dev/null +++ b/src/gui/official/point.h @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __POINT_H__ +#define __POINT_H__ + +#include <string> +using namespace std; + +#define NO_DIRECTION 0 +#define HORIZONTAL 1 +#define VERTICAL 2 + +class ConfigurationTree; + +class Point { +public: + Point (const string&); + ~Point (void); + + int getX (const char*); + int getY (const char*); + int getVariation (const char*); + int getDirection (const char*); + +private: + ConfigurationTree* skinConfigTree; + string getSubstrX (const char*); + string getSubstrY (const char*); +}; + +#endif // __POINT_H__ diff --git a/src/gui/official/qjlistboxpixmap.cpp b/src/gui/official/qjlistboxpixmap.cpp new file mode 100644 index 0000000000000000000000000000000000000000..270b45cf5193b3fa3e370ff3cc362d9b15e5bf00 --- /dev/null +++ b/src/gui/official/qjlistboxpixmap.cpp @@ -0,0 +1,159 @@ +/* + Copyright(C)2004 Johan Thelin + johan.thelin -at- digitalfanatics.org + + Visit: http://www.digitalfanatics.org/e8johan/projects/jseries/index.html + + This file is part of the JSeries. + + JSeries 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. + + JSeries 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 JSeries; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <qpainter.h> +#include <qstyle.h> + +#include "qjlistboxpixmap.h" + +QjListBoxPixmap::QjListBoxPixmap( PixmapLocation location, const QPixmap &pixmap, const QString &text, QListBox *listbox ) : QListBoxItem( listbox ) +{ + m_location = location; + m_pixmap = pixmap; + setText( text ); +} + +QjListBoxPixmap::QjListBoxPixmap( PixmapLocation location, const QPixmap &pixmap, const QString &text, QListBox *listbox, QListBoxItem *after ) : QListBoxItem( listbox, after ) +{ + m_location = location; + m_pixmap = pixmap; + setText( text ); +} + +QjListBoxPixmap::PixmapLocation QjListBoxPixmap::location() const +{ + return m_location; +} + +const QPixmap *QjListBoxPixmap::pixmap() const +{ + return &m_pixmap; +} + +void QjListBoxPixmap::setPixmap( const QPixmap &pixmap ) +{ + m_pixmap = pixmap; + listBox()->repaint(); +} + +int QjListBoxPixmap::height( const QListBox *lb ) const +{ + switch( m_location ) + { + case Above: + case Under: + + return 6 + m_pixmap.height() + lb->fontMetrics().height(); + + case Left: + case Right: + + if( m_pixmap.height() > lb->fontMetrics().height() ) + return 4 + m_pixmap.height(); + else + return 4 + lb->fontMetrics().height(); + + default: + return 0; + } +} + +int QjListBoxPixmap::width( const QListBox *lb ) const +{ + int tw; + + switch( m_location ) + { + case Above: + case Under: + + tw = lb->fontMetrics().width( text() ); + + if( tw > m_pixmap.width() ) + return 4 + tw; + else + return 4 + m_pixmap.width(); + + case Left: + case Right: + + return 6 + m_pixmap.width() + lb->fontMetrics().width( text() ); + + default: + return 0; + } +} + +void QjListBoxPixmap::setLocation( PixmapLocation location ) +{ + if( m_location == location ) + return; + + m_location = location; + listBox()->repaint(); +} + +void QjListBoxPixmap::paint( QPainter *p ) +{ + if( !( listBox() && listBox()->viewport() == p->device() ) ) + return; + + QRect r( 0, 0, listBox()->width(), height( listBox() ) ); + + if( isSelected() ) + p->eraseRect( r ); + + int tw = listBox()->fontMetrics().width( text() ); + int th = listBox()->fontMetrics().height(); + int pw = m_pixmap.width(); + int ph = m_pixmap.height(); + int xo = (listBox()->width() - width( listBox() ))/2; + int tyo = listBox()->fontMetrics().ascent(); + + switch( m_location ) + { + case Above: + p->drawText( (listBox()->width()-tw)/2, ph+4+tyo, text() ); + p->drawPixmap( (listBox()->width()-pw)/2, 2, m_pixmap ); + + break; + case Under: + p->drawText( (listBox()->width()-tw)/2, 2+tyo, text() ); + p->drawPixmap( (listBox()->width()-pw)/2, 4+th, m_pixmap ); + + break; + case Left: + p->drawText( xo+2+pw, (height( listBox() )-th)/2+tyo, text() ); + p->drawPixmap( xo, (height( listBox() )-ph)/2, m_pixmap ); + + break; + case Right: + p->drawText( xo, (height( listBox() )-th)/2+tyo, text() ); + p->drawPixmap( xo+2+tw, (height( listBox() )-ph)/2, m_pixmap ); + + break; + } + + if( isCurrent() ) + listBox()->style().drawPrimitive( QStyle::PE_FocusRect, p, r, listBox()->colorGroup() ); +} diff --git a/src/gui/official/qjlistboxpixmap.h b/src/gui/official/qjlistboxpixmap.h new file mode 100644 index 0000000000000000000000000000000000000000..d8839e30f48f521a40ee9d99d04b9a9c6f607584 --- /dev/null +++ b/src/gui/official/qjlistboxpixmap.h @@ -0,0 +1,73 @@ +/* + Copyright(C)2004 Johan Thelin + johan.thelin -at- digitalfanatics.org + + Visit: http://www.digitalfanatics.org/e8johan/projects/jseries/index.html + + This file is part of the JSeries. + + JSeries 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. + + JSeries 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 JSeries; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef QjLISTBOXPIXMAP_H +#define QjLISTBOXPIXMAP_H + +#include <qlistbox.h> +#include <qstring.h> +#include <qpixmap.h> + +/** \brief The JPixmapItem is a listbox item showing a pixmap and a text. The location of the pixmap in relation to the text can be altered. + * + * \image html jpmi.png + * The location of the pixmap in relation to the text can be altered using the location and setLocation members. + */ +class QjListBoxPixmap : public QListBoxItem +{ +public: + /** Specifies the location of the pixmap in relation to the text. */ + enum PixmapLocation + { Above, /**< The pixmap is above the text. */ + Under, /**< The pixmap is under the text. */ + Left, /**< The pixmap is to the left of the text. */ + Right /**< The pixmap is to the right of the text. */ + }; + + /** Creates a JPixmapItem. */ + QjListBoxPixmap( PixmapLocation location, const QPixmap &pixmap, const QString &text, QListBox *listbox=0 ); + /** Creates a JPixmapItem at a certain position in the listbox. */ + QjListBoxPixmap( PixmapLocation location, const QPixmap &pixmap, const QString &text, QListBox *listbox, QListBoxItem *after ); + + /** Returns the pixmap location in relation to the text. */ + PixmapLocation location() const; + /** Sets the pixmap location in relation to the text. This does not generate a re-paint of the listbox. */ + void setLocation( PixmapLocation ); + + /** Returns the pixmap. */ + const QPixmap *pixmap() const; + /** Sets the pixmap. This does not generate a re-paint of the listbox. */ + void setPixmap( const QPixmap &pixmap ); + + int height( const QListBox *lb ) const; + int width( const QListBox *lb ) const; + +protected: + void paint( QPainter *p ); + +private: + QPixmap m_pixmap; + PixmapLocation m_location; +}; + +#endif // QjLISTBOXPIXMAP_H diff --git a/src/gui/official/qtGUImainwindow.cpp b/src/gui/official/qtGUImainwindow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..af9879dbb696b8884fa47d0c23de0039119ec74a --- /dev/null +++ b/src/gui/official/qtGUImainwindow.cpp @@ -0,0 +1,1961 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include "../../configurationtree.h" +#include <stdio.h> + +#include <qcheckbox.h> +#include <qcombobox.h> +#include <qevent.h> +#include <qlineedit.h> +#include <qmessagebox.h> +#include <qpushbutton.h> +#include <qregexp.h> +#include <qspinbox.h> +#include <qtimer.h> +#include <qtooltip.h> + +#include "global.h" +#include "qtGUImainwindow.h" + +#include "skin.h" +#include "configurationpanelui.h" +#include "jpushbutton.h" +#include "mydisplay.h" +#include "numerickeypad.h" +#include "numerickeypadtools.h" +#include "point.h" +#include "phoneline.h" +#include "vector.h" +#include "volumecontrol.h" + +#define QCHAR_TO_STRIP "-" +#define REG_EXPR "(-|\\(|\\)| )" + +using namespace std; + +/////////////////////////////////////////////////////////////////////////////// +// Tray Icon implementation +/////////////////////////////////////////////////////////////////////////////// +MyTrayIcon::MyTrayIcon(const QPixmap &icon, const QString &tooltip, + QPopupMenu *_mypop, QObject *parent, const char *name) + : TrayIcon (icon, tooltip, _mypop, parent, name) +{ + menu = _mypop; +} + +void +MyTrayIcon::mousePressEvent (QMouseEvent *e) +{ + switch ( e->button() ) { + case RightButton: + menu->popup( e->globalPos() ); + e->accept(); + break; + + case LeftButton: + emit clickedLeft(); + break; + + case MidButton: + break; + + default: + break; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// QtGUIMainWindow implementation +/////////////////////////////////////////////////////////////////////////////// + +/** + * Default Constructor + * Init, Connections + */ +QtGUIMainWindow::QtGUIMainWindow (QWidget *parent, + const char *name, + WFlags f) + : TransQWidget (parent, name, f), + GuiFramework() +{ + for (int i = 0; i < NUMBER_OF_LINES; i++) { + phLines[i] = new PhoneLine(); + phLines[i]->setState(FREE); + _TabIncomingCalls[i] = -1; + } + + // Create configuration_panel + // _panel = new ConfigurationPanel (0, 0, false); + + // URL input dialog + _urlinput = new URL_Input (this); + + + // For DTMF + _key = new DTMF (); + _buf = new int16[SIZEBUF]; + + // Create new display and numeric _keypad + _lcd = new MyDisplay(this, 0, this); + _keypad = new NumericKeypad (this, NULL, Qt::WDestructiveClose | + Qt::WStyle_Customize | + Qt::WStyle_NoBorder); + _currentLine = -1; + _chosenLine = -1; + _prevLine = -1; + _first = true; + _chooseLine = false; + _transfer = false; + _dialtone = false; + _msgVar = false; + _apply = false; + + // Initialisation of all that concern the skin + initSkin(); + + this->initBlinkTimer(); + + + // By default, keyboard mapping mode is numerical mode + this->setMode(NUM_MODE); + + // Move + setMainLCD (); + + // Change window title and Icon. + this->setCaption(PROGNAME); + this->setIcon(QPixmap(Skin::getPathPixmap(QString(PIXDIR), + QString(SFLPHONE_LOGO)))); + + // Show the GUI + this->show(); + + // Handle the tray icon system menu + _mypop = new QPopupMenu(this); + _mypop->insertItem ("Compose", _urlinput, SLOT(show())); + _mypop->insertItem ("Setup", this, SLOT(configuration())); + _mypop->insertItem ("Quit", qApp, SLOT(quit())); + + _trayicon = new MyTrayIcon(QPixmap( + Skin::getPathPixmap(QString(PIXDIR), QString(TRAY_ICON))), + NULL, _mypop, parent, name); + _trayicon->show(); + + // Connect to handle _trayicon + connect(_trayicon, SIGNAL(clickedLeft()), this, SLOT(clickHandle())); + // Connect _blinkTimer signals to blink slot + connect(_blinkTimer, SIGNAL(timeout()),this, SLOT(blinkMessageSlot())); + connect (_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkRingSlot()) ); + connect (_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkLineSlot())); + // Connect to append url in display + connect (_urlinput->buttonOK, SIGNAL(clicked()), this, SLOT(stripSlot())); + // Connect to save settings + connect (_panel->buttonSave, SIGNAL(clicked()), this, SLOT(save())); + // Connect to apply skin + connect (_panel->buttonApplySkin, SIGNAL(clicked()), this,SLOT(applySkin())); + // Connect to register manually + connect (_panel->Register, SIGNAL(clicked()), this, SLOT(registerSlot())); +} + +/** + * Destructor + */ +QtGUIMainWindow::~QtGUIMainWindow(void) { + deleteButtons(); + delete _panel; + delete _blinkTimer; + delete _keypad; + delete _lcd; + delete _urlinput; + delete _mypop; + delete _trayicon; + delete pt; + delete _key; + delete[] _buf; + delete[] phLines; +} + +void +QtGUIMainWindow::deleteButtons (void) { + delete phoneKey_transf; + delete phoneKey_msg; + delete phoneKey_conf; + delete reduce_button; + delete quit_button; + delete addr_book_button; + delete configuration_button; + delete hangup_button; + delete dial_button; + delete mute_button; + delete dtmf_button; + delete vol_mic; + delete vol_spkr; + delete micVolVector; + delete spkrVolVector; + + for (int j = 0; j < NUMBER_OF_LINES; j++) { + delete phLines[j]->button(); + } + +} + +/////////////////////////////////////////////////////////////////////////////// +// Private Methods implementations +/////////////////////////////////////////////////////////////////////////////// +/** + * Init and start blink timer for all blinking pixmap, with 500 ms timeout. + */ +void +QtGUIMainWindow::initBlinkTimer(void) { + _blinkTimer = new QTimer(this); + _blinkTimer->start(500); +} + +/** + * Init variable with skin choice + */ +QString +QtGUIMainWindow::setPathSkin (void) { + return QString(Config::getchar( + "Preferences", "Themes.skinChoice", "metal")); +} + +/** + * Init variable with ring choice + */ +string +QtGUIMainWindow::ringFile(void) { + return get_config_fields_str(AUDIO, RING_CHOICE); +} + +/** + * Get whole path for rings + */ +string +QtGUIMainWindow::getRingtoneFile (void) { + string ringFilename(Skin::getPathRing(string(RINGDIR), ringFile())); + return ringFilename; +} + +void +QtGUIMainWindow::initSkin (void) { + // Load file configuration skin + string skinfilename(Skin::getPath(QString(SKINDIR), setPathSkin(), + QString(FILE_INI))); + + if (!_apply) { + this->pt = new Point(skinfilename); + } else { + // If click on apply button + delete pt; + deleteButtons(); + this->pt = new Point(skinfilename); + } + // Initialisation of the buttons + initSpkrVolumePosition(); + initMicVolumePosition(); + initButtons(); + initVolume(); + // Connections of the buttons + connections(); + + // Load background image phone + setbgPixmap (new QPixmap (Skin::getPath(QString(SKINDIR), + setPathSkin(), + QString(PIXMAP_PHONE)))); + // Transform pixmap to QImage + setSourceImage (); + this->setMaximumSize (getSourceImage().width(), getSourceImage().height()); + this->setGeometry (MAIN_INITIAL_POSITION, + MAIN_INITIAL_POSITION, + getSourceImage().width(), + getSourceImage().height()); + // Calculate just one time the transparency mask bit to bit + transparencyMask (); + + // Line pixmaps initialisation + for (int i = 0; i < NUMBER_OF_LINES; i++) { + for (int j = 0; j < NUMBER_OF_STATES; j++) { + TabLinePixmap[i][j] = QPixmap(Skin::getPath(QString(SKINDIR), + setPathSkin(), + QString(PIXMAP_LINE(i, j)))); + } + } + // Message pixmaps initialisation + TabMsgPixmap[0] = QPixmap(Skin::getPath(QString(SKINDIR), setPathSkin(), + PIXMAP_MESSAGE_OFF)); + TabMsgPixmap[1] = QPixmap(Skin::getPath(QString(SKINDIR), setPathSkin(), + PIXMAP_MESSAGE_ON)); +} + +void +QtGUIMainWindow::initSpkrVolumePosition (void) { + if (pt->getDirection(VOL_SPKR) == VERTICAL) { + vol_spkr_x = Config::get("Audio", "Volume.speakers_x", + pt->getX(VOL_SPKR)); + vol_spkr_y = Config::get("Audio", "Volume.speakers_y", + pt->getVariation(VOL_SPKR)); + } else if (pt->getDirection(VOL_SPKR) == HORIZONTAL) { + vol_spkr_x = Config::get("Audio", "Volume.speakers_x", + pt->getX(VOL_SPKR) + pt->getVariation(VOL_SPKR)); + vol_spkr_y = Config::get("Audio", "Volume.speakers_y", + pt->getY(VOL_SPKR)); + } +} + +void +QtGUIMainWindow::initMicVolumePosition (void) { + if (pt->getDirection(VOL_MIC) == VERTICAL) { + vol_mic_x = Config::get("Audio", "Volume.micro_x", pt->getX(VOL_MIC)); + vol_mic_y = Config::get("Audio", "Volume.micro_y", + pt->getVariation(VOL_MIC)); + } else if (pt->getDirection(VOL_MIC) == HORIZONTAL) { + vol_mic_x = Config::get("Audio", "Volume.micro_x", + pt->getX(VOL_MIC) + pt->getVariation(VOL_MIC)); + vol_mic_y = Config::get("Audio", "Volume.micro_y", pt->getY(VOL_MIC)); + } +} + +void +QtGUIMainWindow::initVolume (void) +{ + Manager::instance().setSpkrVolume(spkrVolVector->Y() - vol_spkr_y); + Manager::instance().setMicroVolume(micVolVector->Y() - vol_mic_y); +} + +/** + * Inits all phonekey buttons. + * Create new QPushButtons, set up tool tip, disable focus, set button geometry + * set palette. + */ +void +QtGUIMainWindow::initButtons (void) { + // Buttons initialisation + phoneKey_msg= new JPushButton(this, NULL, VOICEMAIL); + phoneKey_transf = new JPushButton(this, NULL, TRANSFER); + phoneKey_conf = new JPushButton(this, NULL, CONFERENCE); + reduce_button = new JPushButton(this, NULL, MINIMIZE); + quit_button = new JPushButton(this, NULL, CLOSE); + addr_book_button = new JPushButton(this, NULL, DIRECTORY); + configuration_button = new JPushButton(this, NULL, SETUP); + hangup_button = new JPushButton(this, NULL, HANGUP); + dial_button = new JPushButton(this, NULL, CONNECT); + mute_button = new JPushButton(this, NULL, MUTE); + dtmf_button = new JPushButton(this, NULL, DTMF_SHOW); + + // Set tooltip buttons + QToolTip::add(reduce_button, tr("Minimize window")); + QToolTip::add(quit_button, tr("Close window (Ctrl+Q)")); + QToolTip::add(phoneKey_msg, tr("Get your message")); + QToolTip::add(phoneKey_transf, tr("Call transfer (Ctrl+T)")); + QToolTip::add(phoneKey_conf, tr("Conference")); + QToolTip::add(addr_book_button, tr("Address book")); + QToolTip::add(configuration_button, tr("Configuration tools (Ctrl+C)")); + QToolTip::add(hangup_button, tr("Hangup (Esc)")); + QToolTip::add(dial_button, tr("Dial (Enter)")); + QToolTip::add(mute_button, tr("Mute (Ctrl+M)")); + QToolTip::add(dtmf_button, tr("Show DTMF _keypad (Ctrl+D)")); + + // Buttons position + phoneKey_msg->move (pt->getX(VOICEMAIL), pt->getY(VOICEMAIL)); + phoneKey_transf->move (pt->getX(TRANSFER), pt->getY(TRANSFER)); + phoneKey_conf->move (pt->getX(CONFERENCE), pt->getY(CONFERENCE)); + reduce_button->move (pt->getX(MINIMIZE), pt->getY(MINIMIZE)); + addr_book_button->move (pt->getX(DIRECTORY), pt->getY(DIRECTORY)); + quit_button->move (pt->getX(CLOSE), pt->getY(CLOSE)); + configuration_button->move (pt->getX(SETUP), pt->getY(SETUP)); + hangup_button->move (pt->getX(HANGUP), pt->getY(HANGUP)); + dial_button->move (pt->getX(CONNECT), pt->getY(CONNECT)); + mute_button->move (pt->getX(MUTE), pt->getY(MUTE)); + dtmf_button->move (pt->getX(DTMF_SHOW), pt->getY(DTMF_SHOW)); + + // Loop for line buttons + // Initialisation, set no focus, set geometry, set palette, pixmap + for (int j = 0; j < NUMBER_OF_LINES; j++) { + QString lnum; + + lnum = "l" + lnum.setNum (j + 1); + phLines[j]->setButton(new JPushButton( + this, NULL, lnum.ascii())); + phLines[j]->button()->move (pt->getX(lnum),pt->getY(lnum)); + } + + // Set pixmaps volume + micVolVector = new Vector(this, VOL_MIC, pt); + spkrVolVector = new Vector(this, VOL_SPKR, pt); + + vol_mic = new VolumeControl(this, NULL, VOLUME, micVolVector); + vol_spkr = new VolumeControl(this, NULL, VOLUME, spkrVolVector); + vol_mic->move(vol_mic_x, vol_mic_y); + vol_spkr->move(vol_spkr_x, vol_spkr_y); +} + +void +QtGUIMainWindow::connections (void) { + // Connect for clicked numeric _keypad button + connect ((QObject*)_keypad->key0, SIGNAL(clicked()), this, + SLOT(pressedKey0())); + connect ((QObject*)_keypad->key1, SIGNAL(clicked()), this, + SLOT(pressedKey1())); + connect ((QObject*)_keypad->key2, SIGNAL(clicked()), this, + SLOT(pressedKey2())); + connect ((QObject*)_keypad->key3, SIGNAL(clicked()), this, + SLOT(pressedKey3())); + connect ((QObject*)_keypad->key4, SIGNAL(clicked()), this, + SLOT(pressedKey4())); + connect ((QObject*)_keypad->key5, SIGNAL(clicked()), this, + SLOT(pressedKey5())); + connect ((QObject*)_keypad->key6, SIGNAL(clicked()), this, + SLOT(pressedKey6())); + connect ((QObject*)_keypad->key7, SIGNAL(clicked()), this, + SLOT(pressedKey7())); + connect ((QObject*)_keypad->key8, SIGNAL(clicked()), this, + SLOT(pressedKey8())); + connect ((QObject*)_keypad->key9, SIGNAL(clicked()), this, + SLOT(pressedKey9())); + connect ((QObject*)_keypad->keyStar, SIGNAL(clicked()), this, + SLOT(pressedKeyStar())); + connect ((QObject*)_keypad->keyHash, SIGNAL(clicked()), this, + SLOT(pressedKeyHash())); + connect ((QObject*)_keypad->keyClose, SIGNAL(clicked()), this, + SLOT(dtmfKeypad())); + + // Connections for the lines + connect (phLines[0]->button(), SIGNAL(clicked()), this, + SLOT(button_line0())); + connect (phLines[1]->button(), SIGNAL(clicked()), this, + SLOT(button_line1())); + connect (phLines[2]->button(), SIGNAL(clicked()), this, + SLOT(button_line2())); + connect (phLines[3]->button(), SIGNAL(clicked()), this, + SLOT(button_line3())); + connect (phLines[4]->button(), SIGNAL(clicked()), this, + SLOT(button_line4())); + connect (phLines[5]->button(), SIGNAL(clicked()), this, + SLOT(button_line5())); + + // Misc + connect (phoneKey_msg, SIGNAL(clicked()), this, SLOT(button_msg())); + connect (phoneKey_transf, SIGNAL(clicked()), this, SLOT(button_transfer())); + connect (phoneKey_conf, SIGNAL(clicked()), this, SLOT(button_conf())); + connect (dial_button, SIGNAL(clicked()), this, SLOT(dial())); + connect (mute_button, SIGNAL(clicked()), this, SLOT(button_mute())); + connect (hangup_button, SIGNAL(clicked()), this, SLOT(hangupLine())); + connect (configuration_button,SIGNAL(clicked()),this,SLOT(configuration())); + connect (addr_book_button, SIGNAL(clicked()), this,SLOT(addressBook())); + connect (dtmf_button, SIGNAL(clicked()), this, SLOT(dtmfKeypad())); + + // Connect to reduce + connect (reduce_button, SIGNAL(clicked()), this, SLOT(reduceHandle())); + // Connect to quit with keyboard + connect (this, SIGNAL(keyPressed(int)), this, SLOT(qt_quitApplication())); + // Connect to quit with quit button + connect (quit_button, SIGNAL(clicked()), this, SLOT(qt_quitApplication())); + + // Connections for volume control + connect(vol_spkr, SIGNAL(setVolumeValue(int)), this, + SLOT(volumeSpkrChanged(int))); + connect(vol_mic, SIGNAL(setVolumeValue(int)), this, + SLOT(volumeMicChanged(int))); + +} + +/** + * Returns true if the keyboard mapping returns letters. + * + * @return bool + */ +bool +QtGUIMainWindow::isInTextMode (void) { + if (modeType == TEXT_MODE) { + return true; + } else { + return false; + } +} + +/** + * Returns true if the keyboard mapping returns digits. + * + * @return bool + */ +bool +QtGUIMainWindow::isInNumMode (void) { + if (modeType == NUM_MODE) { + return true; + } else { + return false; + } +} + +/** + * Sets up the keyboard mapping mode. + */ +void +QtGUIMainWindow::setMode (int mode) { + this->modeType = mode; +} + +short +QtGUIMainWindow::isThereIncomingCall (void) +{ + for (int i = 0; i < NUMBER_OF_LINES; i++) { + if (_TabIncomingCalls[i] > 0) { + return _TabIncomingCalls[i]; + } + } + + return -1; +} + +short +QtGUIMainWindow::isIncomingCall (int line) +{ + if (_TabIncomingCalls[line] > 0) { + return _TabIncomingCalls[line]; + } else { + return -1; + } +} + +int +QtGUIMainWindow::id2line (short id) +{ + int i; + for (i = 0; i < NUMBER_OF_LINES; i++) { + if (phLines[i]->getCallId() == id) { + return i; + } + } + if (i == NUMBER_OF_LINES) { + _debug("Id is not attributed to a phoneline\n"); + return -1; + } + return -1; +} + +short +QtGUIMainWindow::line2id (int line) +{ + short i; + if (line != -1) { + i = phLines[line]->getCallId(); + } else { + return -1; + } + + if (i > 0) { + return i; + } else { + return -1; + } +} + +void +QtGUIMainWindow::changeLineStatePixmap (int line, line_state state) +{ + // Set free-status for current line + phLines[line]->setState(state); + // Set free-pixmap + if (state == ONHOLD) { + // Because for the state of line pixmap there are just 2 states + // (FREE and BUSY), so we associate ONHOLD to BUSY + state = BUSY; + } + phLines[line]->button()->setPixmap(TabLinePixmap[line][state]); +} + +int +QtGUIMainWindow::busyLineNumber (void) +{ + int temp = -1; + for (int i = 0; i < NUMBER_OF_LINES; i++) { + if (phLines[i]->isBusy() and i != _currentLine) { + temp = i; + } + } + return temp; +} + +int +QtGUIMainWindow::putOnHoldBusyLine (int line) +{ + if (line != -1 and !phLines[line]->getbRinging()) { + if (!getCall(line2id(line))->isRinging() and !getCall(line2id(line))->isProgressing()) { + // Occurs when newly off-hook line replaces another one. + _debug("On hold line %d [id=%d]\n", line, line2id(line)); + if (qt_onHoldCall(line2id(line)) != 1) { + return -1; + } + } + changeLineStatePixmap(line, ONHOLD); + return 1; + } + return 0; +} + +void +QtGUIMainWindow::dialtone (bool var) { + if (Manager::instance().isDriverLoaded()) { + if (_dialtone != var) { + _dialtone = var; + } + Manager::instance().setZonetone(var); + Manager::instance().getTonegenerator()->toneHandle(ZT_TONE_DIALTONE); + } else { + Manager::instance().error()->errorName(OPEN_FAILED_DEVICE); + } +} + +void +QtGUIMainWindow::callIsRinging(int id, int line, int busyLine) +{ + changeLineStatePixmap(line, BUSY); + putOnHoldBusyLine(busyLine); + displayContext(id); + if (getChooseLine()) { + // If a free line is off-hook, set this line to free state + setChooseLine(false); + changeLineStatePixmap(getChosenLine(), FREE); + dialtone(false); + } +} + +void +QtGUIMainWindow::callIsProgressing (int id, int line, int busyLine) +{ + // Same function of callIsRinging + callIsRinging(id, line, busyLine); +} + +int +QtGUIMainWindow::callIsBusy (Call* call, int id, int line, int busyLine) +{ + if(call->isAnswered() and getPrevLine() != line) { + // If the current line is not the line which is answered + _debug("CASE 3 Call %d already answered\n", id); + changeLineStatePixmap(line, BUSY); + putOnHoldBusyLine(busyLine); + if (getChooseLine()) { + // If a free line is off-hook, set this line to free state + changeLineStatePixmap(getChosenLine(), FREE); + dialtone(false); + } + peerAnsweredCall(id); + displayContext(id); + } else { + // If call is busy, put this call on hold + _debug("CASE 4 Put Call %d on-hold\n", id); + changeLineStatePixmap(line, ONHOLD); + displayStatus(ONHOLD_STATUS); + if (qt_onHoldCall(id) != 1) { + Manager::instance().displayErrorText(id, "On-hold call failed !\n"); + return -1; + } + } + return 1; +} + +int +QtGUIMainWindow::callIsOnHold(int id, int line, int busyLine) +{ + changeLineStatePixmap(line, BUSY); + if (putOnHoldBusyLine(busyLine) == -1) { + Manager::instance().displayErrorText(id, "Off-hold call failed !\n"); + return -1; + } + if (getChooseLine()) { + // If a free line is off-hook, set this line to free state + setChooseLine(false); + dialtone(false); + if (busyLine == -1) { + changeLineStatePixmap(getChosenLine(), FREE); + } + } + _lcd->setInFunction(true); + if (qt_offHoldCall(id) != 1) { + Manager::instance().displayErrorText(id, "Off-hold call failed !\n"); + return -1; + } + + displayContext(id); + _lcd->setLenToShift(0); + return 1; +} + +int +QtGUIMainWindow::callIsIncoming (int id, int line, int busyLine) +{ + _TabIncomingCalls[line] = -1; + changeLineStatePixmap(line, BUSY); + putOnHoldBusyLine(busyLine); + if (qt_answerCall(id) != 1) { + Manager::instance().displayErrorText(id, "Answered call failed !\n"); + return -1; + } + return 1; +} + +void +QtGUIMainWindow::clickOnFreeLine(int line, int busyLine) +{ + phLines[line]->button()->setPixmap(TabLinePixmap[line][BUSY]); + displayStatus(ENTER_NUMBER_STATUS); + setChooseLine(true); + setChosenLine(line); + + if (!Manager::instance().getbCongestion()) { + putOnHoldBusyLine(busyLine); + } else { + // When a new line is off-hook -> hangup the previous line + // which runs congestion tone + changeLineStatePixmap(busyLine, FREE); + _lcd->clear(QString(ENTER_NUMBER_STATUS)); + Manager::instance().congestion(false); + phLines[busyLine]->setCallId(0); + } + if (getPrevLine() != -1 and getPrevLine() != line + and phLines[getPrevLine()]->isFree()) { + changeLineStatePixmap(getPrevLine(), FREE); + } + + setPrevLine(line); + + _lcd->setInFunction(false); + _lcd->clearBuffer(); + dialtone(true); +} + +//////////////////////////////////////////////////////////////////////////// +// Public functions +//////////////////////////////////////////////////////////////////////////// +Call* +QtGUIMainWindow::getCall (short id) +{ + return Manager::instance().getCall(id); +} + +int +QtGUIMainWindow::associateCall2Line (short id) +{ + int i; + + if (getChooseLine()) { + i = getCurrentLine(); + phLines[i]->setState(BUSY); + phLines[i]->setCallId(id); + return i; + } else { + for (i = 0 ; i < NUMBER_OF_LINES; i++) { + if (phLines[i]->isFree()) { + phLines[i]->setState(BUSY); + phLines[i]->setCallId(id); + return i; + } + } + if (i == NUMBER_OF_LINES) { + displayError("All the lines are busy"); + return -1; + } + return -1; + } +} + +PhoneLine* +QtGUIMainWindow::getPhoneLine (short id) +{ + int i; + for (i = 0; i < NUMBER_OF_LINES; i++) { + if (phLines[i]->getCallId() == id) { + return phLines[i]; + } + } + if (i == NUMBER_OF_LINES) { + _debug("getPhoneLine(id): Id %d is not attributed to a phoneline\n", id); + return NULL; + } + return NULL; +} + +int +QtGUIMainWindow::getCurrentLine (void) +{ + return _currentLine; +} + +void +QtGUIMainWindow::setCurrentLine (int current) +{ + _currentLine = current; +} + +bool +QtGUIMainWindow::isCurrentId (short id) +{ + if (line2id(getCurrentLine()) == id) { + return true; + } else { + return false; + } +} + +int +QtGUIMainWindow::getElapse (void) +{ + int line = getCurrentLine(); + return (phLines[line]->timer->elapsed() / 1000); +} + +///////////////////////////////////////////////////////////////////////////// +// Reimplementation of virtual functions +///////////////////////////////////////////////////////////////////////////// + +int +QtGUIMainWindow::incomingCall (short id) +{ + int i; + // Associate call id with a phoneline i. + i = associateCall2Line(id); + if (i >= 0) { + _TabIncomingCalls[i] = id; + _debug("Phoneline %d associated to id %d\n", i, id); + if (getPhoneLine(id) != NULL) { + _lcd->setInFunction(false); + // Set boolean to true to blink pixmap to notify the ringing line + getPhoneLine(id)->setbRinging(true); + // Set the status to the phoneline + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + } + + // To store information about stop scrolling text + _lcd->resetForScrolling (false); + phLines[i]->setStopScrolling(false); + // Set scrolling mode + phLines[i]->setScrolling(true); + _lcd->setIsScrolling(true); + } + + return i; +} + +void +QtGUIMainWindow::peerAnsweredCall (short id) +{ + dialtone(false); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + // Afficher call-timer + startCallTimer(id); + Manager::instance().displayStatus(CONNECTED_STATUS); + setChooseLine(false); +} + +int +QtGUIMainWindow::peerRingingCall (short id) +{ + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + return 1; +} + + +int +QtGUIMainWindow::peerHungupCall (short id) +{ + int line = id2line(id); + + // To store information about scrolling text + _lcd->resetForScrolling (true); + phLines[line]->setStopScrolling(true); + // Unset scrolling mode + _lcd->setIsScrolling(false); + phLines[getCurrentLine()]->setScrolling(false); + + if (line == getCurrentLine() or getCurrentLine() == -1) { + stopCallTimer(id); + Manager::instance().displayStatus(HUNGUP_STATUS); + setCurrentLine(-1); + } else { + // Stop the call timer when hang up + if (getPhoneLine(id)->timer != NULL) { + getPhoneLine(id)->stopTimer(); + } + getPhoneLine(id)->first = true; + } + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + changeLineStatePixmap(line, FREE); + getPhoneLine(id)->setbRinging(false); + getPhoneLine(id)->setCallId(0); + setChooseLine(false); + _TabIncomingCalls[line] = -1; + + return 1; +} + +void +QtGUIMainWindow::displayTextMessage (short id, const string& message) +{ + (void)id; // To remove warning message of unused parameter + _lcd->clearBuffer(); + _lcd->appendText(message); +} + +void +QtGUIMainWindow::displayErrorText (short id, const string& message) +{ + _lcd->clearBuffer(); + _lcd->appendText(message); + + // Set scrolling mode + _lcd->setIsScrolling(true); + phLines[id2line(id)]->setScrolling(true); +} + +void +QtGUIMainWindow::displayError (const string& error) +{ + _lcd->clearBuffer(); + _lcd->appendText(error); +} + +void +QtGUIMainWindow::displayStatus (const string& status) +{ + if (status.compare(HUNGUP_STATUS) == 0 or + status.compare(TRANSFER_STATUS) == 0) { + _lcd->clearBuffer(); + } + _lcd->setStatus(status); +} + +void +QtGUIMainWindow::displayContext (short id) +{ + displayStatus(getCall(id)->getStatus()); + + // To fetch information about scrolling text according to the context + // of the phoneline. + _lcd->setIsScrolling(phLines[id2line(id)]->scrolling()); + _lcd->resetForScrolling(phLines[id2line(id)]->stopScrolling()); + + if (getCall(id)->isIncomingType()) { + displayTextMessage (id, getCall(id)->getCallerIdName()); + } else if (getCall(id)->isOutgoingType()) { + displayTextMessage (id, getCall(id)->getCallerIdNumber()); + } else { + _debug("No call with id %d\n", id); + } +} + +void +QtGUIMainWindow::setup (void) +{ + configuration(); +} + +int +QtGUIMainWindow::selectedCall (void) +{ + int id = -1; + if (getChooseLine()) { + id = line2id(getChosenLine()); + } + return id; +} + +//////////////////////////////////////////////////////////////////////////// +// IP-phone user actions +//////////////////////////////////////////////////////////////////////////// + +int +QtGUIMainWindow::qt_outgoingCall (void) +{ + int id; + int line = -1; + + + if (_lcd->getTextBuffer() == NULL) { + Manager::instance().displayStatus(ENTER_NUMBER_STATUS); + return -1; + } + const string to(_lcd->getTextBuffer().ascii()); + if (to.empty()) { + Manager::instance().displayStatus(ENTER_NUMBER_STATUS); + return -1; + } + + id = outgoingCall(to); + if (id > 0) { + line = associateCall2Line(id); + if(line == -1) { + _debug("Call %d -> there's no available lines\n", id); + return -1; + } + _debug("Call %d -> line %d\n", id, line); + + + // To store information about stop scrolling text + _lcd->resetForScrolling (false); + phLines[line]->setStopScrolling(false); + + setCurrentLine(line); + displayStatus(TRYING_STATUS); + Manager::instance().getCall(id)->setCallerIdNumber(to); + changeLineStatePixmap(line, BUSY); + } + + return line; +} + +int +QtGUIMainWindow::qt_hangupCall (short id) +{ + int i; + i = hangupCall(id); + stopCallTimer(id); + displayStatus(HUNGUP_STATUS); + setCurrentLine(-1); + return i; +} + +int +QtGUIMainWindow::qt_cancelCall (short id) +{ + int i; + i = cancelCall(id); + displayStatus(HUNGUP_STATUS); + setCurrentLine(-1); + return i; +} + +int +QtGUIMainWindow::qt_answerCall (short id) +{ + int i; + i = answerCall(id); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + startCallTimer(id); + displayStatus(CONNECTED_STATUS); + getPhoneLine(id)->setbRinging(false); + return i; +} + +int +QtGUIMainWindow::qt_onHoldCall (short id) +{ + int i; + i = onHoldCall(id); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + return i; +} + +int +QtGUIMainWindow::qt_offHoldCall (short id) +{ + int i; + i = offHoldCall(id); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + displayStatus(CONNECTED_STATUS); + return i; +} + +int +QtGUIMainWindow::qt_transferCall (short id) +{ + int i; + + if (id != -1) { + const string to(_lcd->getTextBuffer().ascii());; + _debug("qt_transferCall: Transfer call %d to %s number\n", id, to.data()); + i = transferCall(id, to); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + return i; + } else { + return 0; + } +} + +void +QtGUIMainWindow::qt_muteOn (short id) +{ + muteOn(id); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + displayStatus(MUTE_ON_STATUS); +} + +void +QtGUIMainWindow::qt_muteOff (short id) +{ + muteOff(id); + getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus())); + displayStatus(CONNECTED_STATUS); +} + +int +QtGUIMainWindow::qt_refuseCall (short id) +{ + int i; + i = refuseCall(id); + displayStatus(HUNGUP_STATUS); + getPhoneLine(id)->setbRinging(false); + _TabIncomingCalls[id2line(id)] = -1; + setCurrentLine(-1); + return i; +} + +/////////////////////////////////////////////////////////////////////////////// +// Public Methods implementations // +/////////////////////////////////////////////////////////////////////////////// + + +/** + * Initializes LCD display, and move it at the configuration file position. + */ +void +QtGUIMainWindow::setMainLCD (void) { + // Screen initialisation + this->_lcd->move (pt->getX(SCREEN), pt->getY(SCREEN)); +} + + +int +QtGUIMainWindow::toggleLine (int line) +{ + int id; + int busyLine; + int ret = 1; + + Call* call; + + if (line == -1) { + return -1; + } + + setCurrentLine(line); + busyLine = busyLineNumber(); + setTransfer(false); + + id = line2id(line); + if (id > 0) { + // If the call-id already exists + call = getCall(id); + if (call == NULL) { + // Check if the call exists + return -1; + } else if (call->isRinging()) { + // If call is ringing + _debug("CASE 1: Call %d is ringing\n", id); + callIsRinging(id, line, busyLine); + } else if (!call->isIncomingType() and call->isProgressing()) { + // If call is progressing + _debug("CASE 2: Call %d is progressing\n", id); + callIsProgressing (id, line, busyLine); + } else if (call->isBusy()) { + ret = callIsBusy (call, id, line, busyLine); + } else if (call->isOnHold()) { + // If call is on hold, put this call on busy state + _debug("CASE 5: Put Call %d off-hold\n", id); + ret = callIsOnHold(id, line, busyLine); + } else if (call->isIncomingType()) { + // If incoming call occurs + _debug("CASE 6: Answer call %d\n", id); + ret = callIsIncoming (id, line, busyLine); + } else { + _debug("Others cases to handle\n"); + ret = -1; + } + setPrevLine(line); + } else { + // If just click on free line + _debug("CASE 7: New line off-hook\n"); + clickOnFreeLine(line, busyLine); + } + return ret; +} + +/** + * Actions occur when click on hang off button. + * Use to validate incoming and outgoing call, transfer call. + */ +void +QtGUIMainWindow::dial (void) +{ + short i; + int line = -1; + + if ((i = isThereIncomingCall()) > 0) { + // If new incoming call + line = id2line(i); + if (line != -1) { + _TabIncomingCalls[line] = -1; + toggleLine(line); + } else { + return; + } + } else if (getTransfer()){ + // If call transfer + setTransfer(false); + int id = line2id(getCurrentLine()); + if(qt_transferCall (id) != 1) { + Manager::instance().displayErrorText(id, "Transfer failed !\n"); + } + } else { + // If new outgoing call + if (getCurrentLine() < 0 or getChooseLine()) { + line = qt_outgoingCall(); + if (line == -1) { + return; + } else { + setPrevLine(line); + } + } + } +} + +/** + * Hangup the current call. + */ +void +QtGUIMainWindow::hangupLine (void) +{ + int i; + int line = getCurrentLine(); + int id = phLines[line]->getCallId(); + + setTransfer(false); + + // To store information about stop scrolling text + _lcd->resetForScrolling (true); + phLines[line]->setStopScrolling(true); + // Unset scrolling mode + _lcd->setIsScrolling(false); + phLines[getCurrentLine()]->setScrolling(false); + + if (Manager::instance().getbCongestion() and line != -1) { + // If congestion tone + if (id > 0 and qt_hangupCall(id)) { + changeLineStatePixmap(line, FREE); + _lcd->clear(QString(ENTER_NUMBER_STATUS)); + Manager::instance().congestion(false); + phLines[line]->setCallId(0); + } else if (id == 0) { + changeLineStatePixmap(line, FREE); + } + } else if ((i = isThereIncomingCall()) > 0){ + // To refuse new incoming call + _debug("Refuse call %d\n", id); + if (!qt_refuseCall(i)) { + Manager::instance().displayErrorText(id, "Refused call failed !\n"); + } + changeLineStatePixmap(id2line(i), FREE); + phLines[id2line(i)]->setCallId(0); + } else if (line >= 0 and id > 0 and getCall(id)->isProgressing()) { + // If I want to cancel a call before ringing. + if (!qt_cancelCall(id)) { + Manager::instance().displayErrorText(id, "Cancelled call failed !\n"); + } + changeLineStatePixmap(line, FREE); + phLines[line]->setCallId(0); + setChooseLine(false); + } else if (line >= 0 and id > 0) { + // If hangup current line normally + _debug("Hangup line %d\n", line); + if (!qt_hangupCall(id)) { + Manager::instance().displayErrorText(id, "Hangup call failed !\n"); + } + changeLineStatePixmap(line, FREE); + phLines[line]->setCallId(0); + setChooseLine(false); + } else if (line >= 0) { + _debug("Just load free pixmap for the line %d\n", line); + changeLineStatePixmap(line, FREE); + dialtone(false); + setChooseLine(false); + setCurrentLine(-1); + } +} + +/** + * Stop the blinking message slot and load the message-off button pixmap. + */ +void +QtGUIMainWindow::stopVoiceMessageNotification (void) { + _msgVar = false; + phoneKey_msg->setPixmap(TabMsgPixmap[FREE]); +} + +void +QtGUIMainWindow::startVoiceMessageNotification (void) { + _msgVar = true; +} + +/** + * Stop the call timer. + * + * @param line: number of line + */ +void +QtGUIMainWindow::stopCallTimer (short id) { + // Stop the call timer when hang up + if (getPhoneLine(id)->timer != NULL) { + getPhoneLine(id)->stopTimer(); + } + // No display call timer, display current hour + _lcd->setInFunction(false); + getPhoneLine(id)->first = true; +} + +/** + * Start the call timer. + * + * @param line: number of line + */ +void +QtGUIMainWindow::startCallTimer (short id) { + // Call-timer enable + _lcd->setInFunction(true); + + // To start the timer for display text just one time + if (getPhoneLine(id)->first) { + getPhoneLine(id)->startTimer(); + getPhoneLine(id)->first = false; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// Public slot implementations // +/////////////////////////////////////////////////////////////////////////////// +void +QtGUIMainWindow::volumeSpkrChanged (int val) { + Manager::instance().setSpkrVolume(val); +} + +void +QtGUIMainWindow::volumeMicChanged (int val) { + Manager::instance().setMicroVolume(val); +} + +void +QtGUIMainWindow::registerSlot (void) { + _panel->saveSlot(); + registerVoIPLink(); +} + +/** + * Slot to blink with free and busy pixmaps when line is hold. + */ +void +QtGUIMainWindow::blinkLineSlot (void) { + static bool isOn = false; + int state = BUSY; + if (!isOn) { + state = FREE; + } + + for (int i = 0; i < NUMBER_OF_LINES; i++) { + // If lines are hold on, set blinking pixmap + if (phLines[i]->isOnHold()) { + phLines[i]->button()->setPixmap(TabLinePixmap[i][state]); + } + } + isOn = !isOn; +} + +// Dial the voicemail Number automatically when button is clicked +void +QtGUIMainWindow::button_msg (void) { + stopVoiceMessageNotification(); + _lcd->clearBuffer(); + _lcd->appendText(get_config_fields_str(PREFERENCES, VOICEMAIL_NUM)); + if (qt_outgoingCall() == -1) { + return; + } +} + +// Allow to enter a phone number to transfer the current call. +// This number is validated by ok-button or typing Enter +void +QtGUIMainWindow::button_transfer (void) { + int line_num = getCurrentLine(); + if (line_num != -1 and phLines[line_num]->isBusy() + and !Manager::instance().getbCongestion()) { + setTransfer(true); + onHoldCall(line2id(getCurrentLine())); + displayStatus(TRANSFER_STATUS); + } +} + +void +QtGUIMainWindow::button_conf (void) { + //TODO: This feature is not implemented yet + QMessageBox::information(this, "Conference", + "This feature is not implemented yet", QMessageBox::Yes); +} + +void +QtGUIMainWindow::button_line0 (void) { + toggleLine (0); + +} + +void +QtGUIMainWindow::button_line1 (void) { + toggleLine (1); +} + +void +QtGUIMainWindow::button_line2 (void) { + toggleLine (2); +} + +void +QtGUIMainWindow::button_line3 (void) { + toggleLine (3); +} + +void +QtGUIMainWindow::button_line4 (void) { + toggleLine (4); +} + +void +QtGUIMainWindow::button_line5 (void) { + toggleLine (5); +} + +void +QtGUIMainWindow::button_mute(void) +{ + // Disable micro sound + static bool isOn = true; + + int id = line2id(getCurrentLine()); + + if (id != -1 and Manager::instance().getNumberOfCalls() > 0) { + // If there is at least a pending call + if(!isOn) { + qt_muteOff(id); + } else { + qt_muteOn(id); + } + isOn = !isOn; + } +} + +// Show the setup _panel +void +QtGUIMainWindow::configuration (void) { + _panel->show(); +} + +void +QtGUIMainWindow::addressBook (void) { + QMessageBox::information(this, "Directory", + "This feature is not implemented yet", QMessageBox::Yes); +} + +// Handle the dtmf-button click +void +QtGUIMainWindow::dtmfKeypad (void) { + if (_keypad->isVisible()) { + // Hide _keypad if it's visible. + _keypad->hide(); + } else { + + if (_first and !getMoved()) { + // If it's the first time that _keypad is shown. + // The position is fixed with the main initial position. + _first = false; + _keypad->setGeometry (MAIN_INITIAL_POSITION + + this->getSourceImage().width(), + MAIN_INITIAL_POSITION, + _keypad->getSourceImage().width(), + _keypad->getSourceImage().height()); + } else { + // If main window is moved, we calculate the _keypad new position + // to fix it with main window + if (getMoved()) { + _keypad->setGeometry (positionOffsetX(), + getGlobalMouseY() - getMouseY(), + _keypad->getSourceImage().width(), + _keypad->getSourceImage().height()); + } + if (_keypad->getMoved()) { + // If _keypad is moved, it shows at the previous position + _keypad->setGeometry ( + _keypad->getGlobalMouseX()-_keypad->getMouseX(), + _keypad->getGlobalMouseY()-_keypad->getMouseY(), + _keypad->getSourceImage().width(), + _keypad->getSourceImage().height()); + } + } + + // Show _keypad if it's hidden. + _keypad->show(); + } + +} + +// Get x-position offset, related to the screen size, to show numeric _keypad +int +QtGUIMainWindow::positionOffsetX (void) { + QRect screenRect; + int offset; + + // Get the screen geometry + screenRect = (QApplication::desktop())->screenGeometry (0); + + offset = this->getSourceImage().width() - getMouseX() + getGlobalMouseX(); + if (offset + _keypad->getSourceImage().width() > screenRect.right()) { + return getGlobalMouseX() - ( + getMouseX() + _keypad->getSourceImage().width()); + } else { + return offset; + } +} + +/** + * Slot when receive a message, blink pixmap. + */ +void +QtGUIMainWindow::blinkMessageSlot (void) { + static bool isOn = false; + int stateMsg = BUSY; + + if(!isOn) { + stateMsg = FREE; + } + + if (_msgVar) { + phoneKey_msg->setPixmap(TabMsgPixmap[stateMsg]); + } + isOn = !isOn; +} + + +/** + * Slot when phone is ringing, blink pixmap. + */ +void +QtGUIMainWindow::blinkRingSlot (void) +{ + static bool isOn = false; + int state = BUSY; + int i; + + if (isThereIncomingCall() != -1) { + // For the line + if (!isOn) { + state = FREE; + } + for (i = 0; i < NUMBER_OF_LINES; i++) { + if (isIncomingCall(i) != -1 and phLines[i]->getbRinging()) { + phLines[i]->button()->setPixmap(TabLinePixmap[i][state]); + } + } + isOn = !isOn; + } +} + +/** + * Slot to quit application with or without QMessageBox confirmation + */ +void +QtGUIMainWindow::qt_quitApplication (void) +{ + // Save volume positions + // TODO: save position if direction is horizontal + Config::set("Audio", "Volume.speakers_x", pt->getX(VOL_SPKR)); + if (vol_spkr->getValue() != 0) { + Config::set("Audio", "Volume.speakers_y", pt->getY(VOL_SPKR) - + vol_spkr->getValue()); + } + Config::set("Audio", "Volume.micro_x", pt->getX(VOL_MIC)); + if (vol_mic->getValue() != 0) { + Config::set("Audio", "Volume.micro_y", pt->getY(VOL_MIC) - + vol_mic->getValue()); + } + // Save current position of the controls volume + save(); + + if (get_config_fields_int(PREFERENCES, CONFIRM_QUIT) == YES) { + // If message-box + if (QMessageBox::question(this, "Confirm quit", + "Are you sure you want to quit SFLPhone ?", + QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { + QApplication::exit(0); + if (!quitApplication()) { + _debug("Your data didn't be saved\n"); + } + } + } else { + // If no message-box + QApplication::exit(0); + if (!quitApplication()) { + _debug("Your data didn't be saved\n"); + } + } +} + +/** + * Slot to strip _urlinput. + */ +void +QtGUIMainWindow::stripSlot (void) { + QRegExp rx(REG_EXPR); + _lcd->appendText(_urlinput->url->text().remove(rx)); + _urlinput->close(); + dial(); +} + +/** + * Slot when numeric _keypad phonekey is pressed, append the key text and setup + * the DTMF _keypad . + * + * @param button group id + */ +void +QtGUIMainWindow::pressedKeySlot (int id) { + char code = 0; + int pulselen = 0; + int callid; + int k, spkrVolume; + int16* buf_ctrl_vol; + + // Stop dial tone because we started dialing. + if (_dialtone) { + dialtone(false); + } + + switch (id) { + case KEYPAD_ID_0: code = '0'; break; + case KEYPAD_ID_1: code = '1'; break; + case KEYPAD_ID_2: code = '2'; break; + case KEYPAD_ID_3: code = '3'; break; + case KEYPAD_ID_4: code = '4'; break; + case KEYPAD_ID_5: code = '5'; break; + case KEYPAD_ID_6: code = '6'; break; + case KEYPAD_ID_7: code = '7'; break; + case KEYPAD_ID_8: code = '8'; break; + case KEYPAD_ID_9: code = '9'; break; + case KEYPAD_ID_STAR: code = '*'; break; + case KEYPAD_ID_HASH: code = '#'; break; + } + + callid = line2id(getCurrentLine()); + if (callid != -1 and getCall(callid)->isBusy()) { + // To send DTMF during call, no display of them + sendDtmf(callid, code); + } else if (Manager::instance().isDriverLoaded() + and Manager::instance().error()->getError() == 0) { + // To compose, phone number appears in the screen if the driver is loaded + // and there is no error in configuration setup + _lcd->appendText (code); + + // Unset scrolling mode + _lcd->setIsScrolling(false); + phLines[getCurrentLine()]->setScrolling(false); + } + + // To generate the dtmf if there is no error in configuration + if (Manager::instance().error()->getError() == 0) { + // Handle dtmf + _key->startTone(code); + _key->generateDTMF(_buf, SAMPLING_RATE); + + // Determine dtmf pulse length + pulselen = get_config_fields_int(SIGNALISATION, PULSE_LENGTH); + int size = pulselen * (OCTETS /1000); + + buf_ctrl_vol = new int16[size*CHANNELS]; + spkrVolume = Manager::instance().getSpkrVolume(); + + // Control volume and format mono->stereo + for (int j = 0; j < size; j++) { + k = j*2; + buf_ctrl_vol[k] = buf_ctrl_vol[k+1] = _buf[j] * spkrVolume/100; + } + + Manager::instance().getAudioDriver()->urgentRingBuffer().flush(); + // Put buffer to urgentRingBuffer + Manager::instance().getAudioDriver()->urgentRingBuffer().Put(buf_ctrl_vol, + size * CHANNELS); + + // We activate the stream if it's not active yet. + if (!Manager::instance().getAudioDriver()->isStreamActive()) { + Manager::instance().getAudioDriver()->startStream(); + Manager::instance().getAudioDriver()->sleep(pulselen); + Manager::instance().getAudioDriver()->stopStream(); + Manager::instance().getAudioDriver()->urgentRingBuffer().flush(); + } else { + Manager::instance().getAudioDriver()->sleep(pulselen); + } + + delete[] buf_ctrl_vol; + } +} + +// Save settings in config-file +void +QtGUIMainWindow::save() { + saveConfig(); +} + +void +QtGUIMainWindow::applySkin (void) { + _apply = true; + // For skin of the screen + _lcd->initGraphics(); + setMainLCD(); + // For skin of the gui + initSkin(); +} + + +// Handle operation to minimize the application +void +QtGUIMainWindow::reduceHandle (void) { + if (get_config_fields_int(PREFERENCES, CHECKED_TRAY)) { + clickHandle(); + } else { + showMinimized(); + } +} + +// Handle mouse left-button click to minimize/maximize the application +void +QtGUIMainWindow::clickHandle (void) { + if (this->isShown()) { + hide(); + } + + else if (this->isMinimized()) { + showMaximized(); + } + + else { + show(); + } +} + +void +QtGUIMainWindow::pressedKey0 (void) { + pressedKeySlot (KEYPAD_ID_0); +} + +void +QtGUIMainWindow::pressedKey1 (void) { + pressedKeySlot (KEYPAD_ID_1); +} + +void +QtGUIMainWindow::pressedKey2 (void) { + pressedKeySlot (KEYPAD_ID_2); +} +void +QtGUIMainWindow::pressedKey3 (void) { + pressedKeySlot (KEYPAD_ID_3); +} +void +QtGUIMainWindow::pressedKey4 (void) { + pressedKeySlot (KEYPAD_ID_4); +} +void +QtGUIMainWindow::pressedKey5 (void) { + pressedKeySlot (KEYPAD_ID_5); +} +void +QtGUIMainWindow::pressedKey6 (void) { + pressedKeySlot (KEYPAD_ID_6); +} +void +QtGUIMainWindow::pressedKey7 (void) { + pressedKeySlot (KEYPAD_ID_7); +} +void +QtGUIMainWindow::pressedKey8 (void) { + pressedKeySlot (KEYPAD_ID_8); +} +void +QtGUIMainWindow::pressedKey9 (void) { + pressedKeySlot (KEYPAD_ID_9); +} +void +QtGUIMainWindow::pressedKeyStar (void) { + pressedKeySlot (KEYPAD_ID_STAR); +} +void +QtGUIMainWindow::pressedKeyHash (void) { + pressedKeySlot (KEYPAD_ID_HASH); +} + +/////////////////////////////////////////////////////////////////////////////// +// Protected Methods implementations // +/////////////////////////////////////////////////////////////////////////////// +/** + * Reimplementation of keyPressEvent() to handle the keyboard mapping. + */ +void +QtGUIMainWindow::keyPressEvent(QKeyEvent *e) { + // Misc. key + switch (e->key()) { + case Qt::Key_At: + case Qt::Key_Colon: + case Qt::Key_Period: + case Qt::Key_Comma: + case Qt::Key_Plus: + case Qt::Key_Minus: + case Qt::Key_Slash: + _lcd->appendText(QChar(e->key())); + return; + break; + + case Qt::Key_Backspace: + _lcd->backspace(); + return; + break; + + case Qt::Key_Escape: + hangupLine(); + return; + break; + + case Qt::Key_Return: + case Qt::Key_Enter: + dial(); + return; + break; + + case Qt::Key_F1: + case Qt::Key_F2: + case Qt::Key_F3: + case Qt::Key_F4: + case Qt::Key_F5: + case Qt::Key_F6: + this->toggleLine(e->key() - Qt::Key_F1); + return; + break; + + // To clear the screen + case Qt::Key_L: + if (e->state() == Qt::ControlButton ) { + _lcd->clear(); + return; + } + break; + // To quit the application + case Qt::Key_Q : + if (e->state() == Qt::ControlButton ) { + emit keyPressed(e->key()); + return; + } + break; + + // To open input line + case Qt::Key_O : + if (e->state() == Qt::ControlButton ) { + _urlinput->show(); + return; + } + break; + + // To show window setup + case Qt::Key_C : + if (e->state() == Qt::ControlButton ) { + configuration(); + return; + } + break; + + // To show/hide dtmf-keypad + case Qt::Key_D : + if (e->state() == Qt::ControlButton ) { + dtmfKeypad(); + return; + } + break; + + // To set mode (text/num) + case Qt::Key_Space: + if (this->isInNumMode()) { + this->setMode(TEXT_MODE); + } else { + this->setMode(NUM_MODE); + } + return; + break; + + // To put mute on/off the mike sound + case Qt::Key_M : + if (e->state() == Qt::ControlButton ) { + button_mute(); + return; + } + break; + + // To transfer call + case Qt::Key_T : + if (e->state() == Qt::ControlButton ) { + button_transfer(); + return; + } + break; + + case Qt::Key_Alt: + case Qt::Key_CapsLock: + case Qt::Key_Shift: + case Qt::Key_Tab: + case Qt::Key_Control: + return; + break; + + default: + break; + } + + if (QChar(e->key()).isDigit() ) { + // Numeric _keypad + if (e->key() == Qt::Key_0) { + pressedKeySlot(KEYPAD_ID_0); + } else { + pressedKeySlot(e->key() - Qt::Key_0 - 1); + } + } + + // Handle * and # too. + else if ((e->key() == Qt::Key_Asterisk) + or (e->key() == Qt::Key_NumberSign)) { + (e->key() == Qt::Key_Asterisk) ? + pressedKeySlot(KEYPAD_ID_STAR) + : pressedKeySlot(KEYPAD_ID_HASH); + } + + // If letter _keypad and numeric mode, display digit. + else if (QChar(e->key()).isLetter() && this->isInNumMode() ) { + pressedKeySlot( + (NumericKeypadTools::keyToNumber(e->key())- Qt::Key_0) - 1); + } + + // If letter _keypad and text mode, display letter. + else if (QChar(e->key()).isLetter() && this->isInTextMode()) { + _lcd->appendText(QChar(e->key()).lower()); + } +} + +// EOF diff --git a/src/gui/official/qtGUImainwindow.h b/src/gui/official/qtGUImainwindow.h new file mode 100644 index 0000000000000000000000000000000000000000..54bdf5eb773114f913622a1e51ec6f60dcd6247f --- /dev/null +++ b/src/gui/official/qtGUImainwindow.h @@ -0,0 +1,441 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __QT_GUI_MAIN_WINDOW_H__ +#define __QT_GUI_MAIN_WINDOW_H__ + +#include <qimage.h> +#include <qpixmap.h> +#include <qpopupmenu.h> +#include <qwidget.h> + +#include "skin.h" +#include "configurationpanelui.h" +#include "phoneline.h" +#include "transqwidget.h" +#include "trayicon.h" +#include "url_input.h" + +#define MAIN_INITIAL_POSITION 20 + +// To type with keyboard what you want to appear in the screen. +#define TEXT_MODE 0 +#define NUM_MODE 1 + +class JPushButton; +class MyDisplay; +class MyTrayIcon; +class NumericKeypad; +class PhoneLine; +class Point; +class URL_Input; +class VolumeControl; +/////////////////////////////////////////////////////////////////////////////// +// Tray Icon class +/////////////////////////////////////////////////////////////////////////////// +class MyTrayIcon : public TrayIcon +{ + Q_OBJECT +public: + MyTrayIcon(const QPixmap &, const QString &, QPopupMenu *popup = 0, + QObject *parent = 0, const char *name = 0 ); + ~MyTrayIcon(){}; + + QPopupMenu *menu; + +signals: + void clickedLeft(void); +protected: + void mousePressEvent (QMouseEvent *); +}; + +/////////////////////////////////////////////////////////////////////////////// +// GUI main window +/////////////////////////////////////////////////////////////////////////////// +class QtGUIMainWindow : public TransQWidget { + Q_OBJECT +public: + // Default Constructor and destructor + QtGUIMainWindow (QWidget* = 0, const char* = 0,WFlags = 0); + ~QtGUIMainWindow(void); + + // To build an array of pixmap according to the state + QPixmap TabLinePixmap[NUMBER_OF_LINES][NUMBER_OF_STATES]; + + /* + // Reimplementation of virtual functions + virtual int incomingCall (short id); + virtual void peerAnsweredCall (short id); + virtual int peerRingingCall (short id); + virtual int peerHungupCall (short id); + virtual void displayTextMessage (short id, const string& message); + virtual void displayErrorText (short id, const string& message); + virtual void displayError (const string& error); + virtual void displayStatus (const string& status); + virtual void displayContext (short id); + virtual string getRingtoneFile (void); + virtual void setup (void); + */ + + /* + * Return the id matching to the chosen line + */ + virtual int selectedCall (void); + + // Handle IP-phone user actions + int qt_outgoingCall (void); + int qt_hangupCall (short id); + int qt_cancelCall (short id); + int qt_answerCall (short id); + int qt_onHoldCall (short id); + int qt_offHoldCall (short id); + int qt_transferCall (short id); + void qt_muteOn (short id); + void qt_muteOff (short id); + int qt_refuseCall (short id); + + /* + * Return the call corresponding to the id + */ + Call* getCall (short id); + + /* + * Return the phoneline corresponding to the call-id + */ + PhoneLine* getPhoneLine (short id); + + /* + * Accessor of the current line + */ + int getCurrentLine (void); + + /* + * Modifior of the current line + */ + void setCurrentLine (int current); + + /* + * Check if 'id' is the current id + */ + bool isCurrentId (short id); + + /* + * Return elapse for call-timer + */ + int getElapse (void); + + /* + * Set the skin path from the setup + */ + QString setPathSkin (void); + + /** + * Sets the corresponding pixmap button according to its state. + * Handle operations between lines (on hold, off hold) when you click on + * a line. Manage the different cases which could occur. + * + * @param line: number of the current line + */ + int toggleLine (int); + + /* + * Functions to handle timer call + */ + void stopCallTimer (short); + void startCallTimer (short); + + /* + * Stop the blinking-signal when you check your voicemail (not used yet) + */ + void stopVoiceMessageNotification (void); + void startVoiceMessageNotification (void); + + /* + * Manage if you selected a line before dialing + */ + inline void setChooseLine (bool b) { _chooseLine = b; } + inline bool getChooseLine (void) { return _chooseLine; } + + /* + * Store the line you selected before dialing + */ + inline void setChosenLine (int line) { _chosenLine = line; } + inline int getChosenLine (void) { return _chosenLine; } + + /* + * Manage if you are in transfer mode + */ + inline void setTransfer (bool b) { _transfer = b; } + inline bool getTransfer (void) { return _transfer; } + +signals: + void keyPressed (int); + +public slots: + // Slot when you click on ok-button or type Enter + void dial (void); + + // Notification when you have received incoming call + void blinkRingSlot (void); + + // Notification when you have put on-hold a call + void blinkLineSlot (void); + + // Notification when you have received message in your mailbox + void blinkMessageSlot (void); + + // Slot to use numeric keypad + void pressedKeySlot (int); + + // To remove specified characters before appending the text in url-input + void stripSlot (void); + + // To show the address book (not implemented yet) + void addressBook (void); + + // To show keypad at the specified position + void dtmfKeypad (void); + + // To show setup windows + void configuration (void); + + // Slot to hangup call + void hangupLine (void); + + // Slot to quit application + void qt_quitApplication (void); + + // Manage different buttons in the phone + void button_mute (void); + void button_line0 (void); + void button_line1 (void); + void button_line2 (void); + void button_line3 (void); + void button_line4 (void); + void button_line5 (void); + void button_msg (void); + void button_transfer (void); + void button_conf (void); + void clickHandle (void); + void reduceHandle (void); + + // Handle pressed key of the dtmf keypad + void pressedKey0 (void); + void pressedKey1 (void); + void pressedKey2 (void); + void pressedKey3 (void); + void pressedKey4 (void); + void pressedKey5 (void); + void pressedKey6 (void); + void pressedKey7 (void); + void pressedKey8 (void); + void pressedKey9 (void); + void pressedKeyStar (void); // (*) + void pressedKeyHash (void); // (#) + + // Manage volume control + void volumeSpkrChanged (int); + void volumeMicChanged (int); + + // To register manually + void registerSlot (void); + // To save configuration + void save (void); + // To apply selected skin + void applySkin (void); + +protected: + // To handle the key pressed event + void keyPressEvent (QKeyEvent *); + +private: + NumericKeypad* _keypad; + MyDisplay* _lcd; + QTimer* _blinkTimer; + URL_Input* _urlinput; + ConfigurationPanel* _panel; + QPopupMenu* _mypop; + MyTrayIcon* _trayicon; + DTMF* _key; + PhoneLine* phLines[NUMBER_OF_LINES]; + + JPushButton* phoneKey_msg; + JPushButton* phoneKey_transf; + JPushButton* phoneKey_conf; + JPushButton* phoneKey_line0; + JPushButton* phoneKey_line1; + JPushButton* phoneKey_line2; + JPushButton* phoneKey_line3; + JPushButton* reduce_button; + JPushButton* quit_button; + JPushButton* addr_book_button; + JPushButton* configuration_button; + JPushButton* hangup_button; + JPushButton* dial_button; + JPushButton* mute_button; + JPushButton* dtmf_button; + int16* _buf; + // Configuration skin file + Point* pt; + + // For volume buttons + VolumeControl* vol_mic; + VolumeControl* vol_spkr; + Vector* micVolVector; + Vector* spkrVolVector; + int vol_mic_x, + vol_mic_y; + int vol_spkr_x, + vol_spkr_y; + + // To construct ring rect pixmap + QImage imageRing; + QImage imageNoRing; + + QPixmap TabMsgPixmap[NUMBER_OF_STATES]; + int modeType; + bool _apply; + + bool b_dialtone; + + // For numeric keypad + bool _first; + + bool _transfer; + bool _msgVar; + + // For outgoing call, if it occurs on the first free line or on the chosen + // line by the user + bool _chooseLine; + int _chosenLine; + int _prevLine; + + // Array of incoming calls, contains call-id + int _TabIncomingCalls[NUMBER_OF_LINES]; + + // The current phoneline + int _currentLine; + + bool _dialtone; + + //////////////////// + // Private functions + //////////////////// + + inline void setPrevLine(int line) { _prevLine = line; } + inline int getPrevLine(void) { return _prevLine; } + + // Set position for screen + void setMainLCD (void); + + // Handle num/text mode + void setMode (int); + bool isInTextMode (void); + bool isInNumMode (void); + + // Initialize all the skin + void initSkin (void); + void initButtons (void); + void initVolume (void); + void initSpkrVolumePosition (void); + void initMicVolumePosition (void); + + // Delete buttons called in destructor + void deleteButtons (void); + + // Initialize timer for blinking notification + void initBlinkTimer (void); + + // Initialize all the connections (SIGNAL->SLOT) + void connections (void); + + // Set the ringtone file path + string ringFile (void); + + // Set position for numeric keypad + int positionOffsetX (void); + + /* + * Associate a phoneline number to a call identifiant + * @param identifiant call + * @return phoneline number + */ + int associateCall2Line (short id); + + /** + * Search the busy line number among all lines and different with + * current line number. + * + * @return number of busy line + */ + int busyLineNumber (void); + + /* + * Put in state on-hold the line 'line' + */ + int putOnHoldBusyLine (int line); + + /* + * Return the id of the first line number if incoming call occurs + * Otherwise return -1 + */ + short isThereIncomingCall (void); + + /* + * Return the id of the line number 'line' if an incoming call occurs + * Otherwise return -1 + */ + short isIncomingCall (int line); + + /* + * Return phoneline number according to the identifiant 'id' + * id2line returns -1 if phoneline number is not found + */ + int id2line (short id); + + /* + * Return id according to the phoneline number 'line' + * line2id returns -1 if id is not found + */ + short line2id (int line); + + /* + * Change state and pixmap of the line 'line' according to the state 'state' + */ + void changeLineStatePixmap (int line, line_state state); + + /* + * Handle dial tone + */ + void dialtone (bool var); + + /* + * Functions used in toggle function + */ + void callIsRinging(int id, int line, int busyLine); + void callIsProgressing (int id, int line, int busyLine); + int callIsBusy (Call* call, int id, int line, int busyLine); + int callIsOnHold(int id, int line, int busyLine); + int callIsIncoming (int id, int line, int busyLine); + void clickOnFreeLine(int line, int busyLine); + +}; + + +#endif // __QT_GUI_MAIN_WIDOW_H__ diff --git a/src/gui/official/sessionmanager.h b/src/gui/official/sessionmanager.h new file mode 100644 index 0000000000000000000000000000000000000000..5e82fdbee54af5c0841bb9422337ec9f2b86abb8 --- /dev/null +++ b/src/gui/official/sessionmanager.h @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Jean-Philippe Barrette-LaPierre + * <jean-philippe.barrette-lapierre@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef SFLPHONEGUI_SESSIONMANAGER_H +#define SFLPHONEGUI_SESSIONMANAGER_H + +#include <qthread.h> + + + + +#endif diff --git a/src/gui/official/skin.cpp b/src/gui/official/skin.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b4d98092612bd11a6019b3b1423bcc92b142401f --- /dev/null +++ b/src/gui/official/skin.cpp @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include "skin.h" + + +const char* PIXMAP_LINE_NAMES[] = { + PIXMAP_LINE0_OFF, + PIXMAP_LINE0_BUSY, + PIXMAP_LINE1_OFF, + PIXMAP_LINE1_BUSY, + PIXMAP_LINE2_OFF, + PIXMAP_LINE2_BUSY, + PIXMAP_LINE3_OFF, + PIXMAP_LINE3_BUSY, + PIXMAP_LINE4_OFF, + PIXMAP_LINE4_BUSY, + PIXMAP_LINE5_OFF, + PIXMAP_LINE5_BUSY, +}; + +Skin::Skin (void) { +} + +Skin::~Skin (void) { +} + +string +Skin::getPath (const string & prefix, const string & progname, + const string & skindir, const string & skin, + const string & filename) { + return (prefix + "/" + progname + "/" + skindir + "/" + skin + "/" + + filename); +} + +string +Skin::getPath (const string & skindir, const string & skintype, + const string & filename) { + return (string(PROGSHAREDIR) + "/" + skindir + "/" + skintype + "/" + filename); +} + +string +Skin::getPath (const string & dir) { + return (string(PROGSHAREDIR) + "/" + dir); +} + +string +Skin::getPathPixmap (const string & pixdir, const string & filename) { + return (string(PROGSHAREDIR) + "/" + pixdir + "/" + filename); +} + +string +Skin::getPathRing (const string & ringdir, const string & filename) { + return (string(PROGSHAREDIR) + "/" + ringdir + "/" + filename); +} + +// EOF diff --git a/src/gui/official/skin.h b/src/gui/official/skin.h new file mode 100644 index 0000000000000000000000000000000000000000..025a0bcfbda31dac1756cb253cb542b7d1e5b72e --- /dev/null +++ b/src/gui/official/skin.h @@ -0,0 +1,118 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __SKIN_H__ +#define __SKIN_H__ + +#include <string> + +#include "global.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define PIXMAP_PHONE "main.png" +#define PIXMAP_KEYPAD "dtmf_main.png" +#define PIXMAP_SCREEN "screen_main.png" +#define PIXMAP_OVERSCREEN "overscreen.png" +#define PIXMAP_VOLUME "volume.png" + +#define PIXMAP_IS_RINGING "ring.png" +#define PIXMAP_NO_RINGING "no_ring.png" +#define PIXMAP_MESSAGE_ON "voicemail_on.png" +#define PIXMAP_MESSAGE_OFF "voicemail_off.png" +#define PIXMAP_LINE0_OFF "l1_off.png" +#define PIXMAP_LINE1_OFF "l2_off.png" +#define PIXMAP_LINE2_OFF "l3_off.png" +#define PIXMAP_LINE3_OFF "l4_off.png" +#define PIXMAP_LINE4_OFF "l5_off.png" +#define PIXMAP_LINE5_OFF "l6_off.png" +#define PIXMAP_LINE0_BUSY "l1_on.png" +#define PIXMAP_LINE1_BUSY "l2_on.png" +#define PIXMAP_LINE2_BUSY "l3_on.png" +#define PIXMAP_LINE3_BUSY "l4_on.png" +#define PIXMAP_LINE4_BUSY "l5_on.png" +#define PIXMAP_LINE5_BUSY "l6_on.png" + +#define LINE1 "l1" +#define LINE2 "l2" +#define LINE3 "l3" +#define LINE4 "l4" +#define LINE5 "l5" +#define LINE6 "l6" + +#define VOICEMAIL "voicemail" +#define DIRECTORY "directory" +#define CONFERENCE "conference" +#define TRANSFER "transfer" +#define CLOSE "close" +#define MINIMIZE "minimize" +#define SETUP "setup" +#define HANGUP "hangup" +#define CONNECT "ok" +#define MUTE "mute" +#define DTMF_SHOW "dtmf" +#define VOLUME "volume" +#define VOL_MIC "vol_mic" +#define VOL_SPKR "vol_spkr" +#define SCREEN "screen" + +#define DTMF_0 "dtmf_0" +#define DTMF_1 "dtmf_1" +#define DTMF_2 "dtmf_2" +#define DTMF_3 "dtmf_3" +#define DTMF_4 "dtmf_4" +#define DTMF_5 "dtmf_5" +#define DTMF_6 "dtmf_6" +#define DTMF_7 "dtmf_7" +#define DTMF_8 "dtmf_8" +#define DTMF_9 "dtmf_9" +#define DTMF_STAR "dtmf_star" +#define DTMF_POUND "dtmf_pound" +#define DTMF_CLOSE "dtmf_close" + + +extern const char* PIXMAP_LINE_NAMES[]; + +#define PIXMAP_LINE(n,t) PIXMAP_LINE_NAMES[2*n+t] +// n = {0..3} and t = {FREE, BUSY, ONHOLD} + +#define FILE_INI "skin.ini" + +#ifdef __cplusplus +} +#endif + +using namespace std; + +class Skin { +public: + Skin (void); + ~Skin (void); + + static string getPath(const string &, const string &, const string &, + const string &, const string &); + static string getPath(const string &,const string &, const string &); + static string getPath(const string &); + static string getPathPixmap (const string &, const string &); + static string getPathRing (const string &, const string &); +}; + +#endif // __SKIN_H__ diff --git a/src/gui/official/transqwidget.cpp b/src/gui/official/transqwidget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7a91cbed12a0743b46ff91ac428b6007866659cc --- /dev/null +++ b/src/gui/official/transqwidget.cpp @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <qpoint.h> + +#include "transqwidget.h" + +TransQWidget::TransQWidget (QWidget *parent, const char *name, WFlags f) + : QWidget (parent, name, f) { + pixmap = NULL; + _moved = false; +} + +void +TransQWidget::setbgPixmap (QPixmap *pix) { + this->pixmap = pix; +} + +void +TransQWidget::setSourceImage (void) { + this->SourceImage = pixmap->convertToImage (); +} + +QImage +TransQWidget::getSourceImage (void) { + return this->SourceImage; +} + +void +TransQWidget::transparencyMask (void) { + this->ShowedImage = SourceImage; + this->ImageMask = ShowedImage.createAlphaMask (); +} + +/** + * Reimplementation of paintEvent() to handle the transparency of the + * widget. + * This method is called everytime when the widget is redrawn. + */ +void +TransQWidget::paintEvent (QPaintEvent *e) { + if (e);// boring warning + bitBlt (this, 0, 0, &ShowedImage, 0, Qt::CopyROP); + setMask (ImageMask); +} + +/** + * Reimplementation of mouseMoveEvent() to handle the borderless window drag. + */ +void +TransQWidget::mouseMoveEvent (QMouseEvent *e) { + move (e->globalPos() - QPoint(mouse_x, mouse_y)); + global_x = e->globalX(); + global_y = e->globalY(); + _moved = true; +} + +/** + * Reimplementation of mousePressEvent() to register mouse positions. + */ +void +TransQWidget::mousePressEvent (QMouseEvent *e) { + mouse_x = e->x(); + mouse_y = e->y(); +} + diff --git a/src/gui/official/transqwidget.h b/src/gui/official/transqwidget.h new file mode 100644 index 0000000000000000000000000000000000000000..5083aa30e40752461150b414a43a5a58fa2ad0b9 --- /dev/null +++ b/src/gui/official/transqwidget.h @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __TRANS_QWIDGET_H__ +#define __TRANS_QWIDGET_H__ + +#include <qbitmap.h> +#include <qimage.h> +#include <qpixmap.h> +#include <qwidget.h> + +class TransQWidget : public QWidget { +public: + TransQWidget (QWidget* = 0, const char* = 0, WFlags = 0); + ~TransQWidget (void) {delete pixmap;}; + + QImage getSourceImage (void); + + inline + int getMouseX (void) { return mouse_x; }; + inline + int getMouseY (void) { return mouse_y; }; + inline + int getGlobalMouseX (void) { return global_x; }; + inline + int getGlobalMouseY (void) { return global_y; }; + inline + bool getMoved (void) { return _moved; }; + +protected: + QPixmap *pixmap; + + void setbgPixmap (QPixmap *); + void setSourceImage (void); + void transparencyMask (void); + + // To handle the tranparency + void paintEvent (QPaintEvent *); + + // To handle the drag window with mouse event + void mouseMoveEvent (QMouseEvent *); + void mousePressEvent (QMouseEvent *); + +private: + // Private member variables + QImage SourceImage; + QImage ShowedImage; + QBitmap ImageMask; + + int mouse_x, + mouse_y; + int global_x, + global_y; + bool _moved; +}; + + +#endif // __TRANS_QWIDGET_H__ diff --git a/src/gui/official/trayicon.cpp b/src/gui/official/trayicon.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4eb1d3e7db82cd4bc192358fbf2eba496d5de1bc --- /dev/null +++ b/src/gui/official/trayicon.cpp @@ -0,0 +1,295 @@ +/* + * trayicon.cpp - system-independent trayicon class (adapted from Qt example) + * Copyright (C) 2003 Justin Karneges + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "trayicon.h" +#include "qpopupmenu.h" + +/*! + \class TrayIcon qtrayicon.h + \brief The TrayIcon class implements an entry in the system tray. +*/ + +/*! + Creates a TrayIcon object. \a parent and \a name are propagated + to the QObject constructor. The icon is initially invisible. + + \sa show +*/ +TrayIcon::TrayIcon( QObject *parent, const char *name ) +: QObject(parent, name), pop(0), d(0) +{ + v_isWMDock = FALSE; +} + +/*! + Creates a TrayIcon object displaying \a icon and \a tooltip, and opening + \a popup when clicked with the right mousebutton. \a parent and \a name are + propagated to the QObject constructor. The icon is initially invisible. + + \sa show +*/ +TrayIcon::TrayIcon( const QPixmap &icon, const QString &tooltip, QPopupMenu *popup, QObject *parent, const char *name ) +: QObject(parent, name), pop(popup), pm(icon), tip(tooltip), d(0) +{ + v_isWMDock = FALSE; + + if ( !pm.width() || !pm.height() ) + pm = QPixmap( 16, 16 ); +} + +/*! + Removes the icon from the system tray and frees all allocated resources. +*/ +TrayIcon::~TrayIcon() +{ + sysRemove(); +} + +/*! + Informs the trayicon that the notification owner has probably been changed; + and that it should attempt to register or re-register. +*/ +void TrayIcon::newTrayOwner() +{ + // detach ourself from any existing notification area. + hide(); + // show ourself on the new notification area + show(); +} + + +/*! + Sets the context menu to \a popup. The context menu will pop up when the + user clicks the system tray entry with the right mouse button. +*/ +void TrayIcon::setPopup( QPopupMenu* popup ) +{ + pop = popup; +} + +/*! + Returns the current popup menu. + + \sa setPopup +*/ +QPopupMenu* TrayIcon::popup() const +{ + return pop; +} + +/*! + \property TrayIcon::icon + \brief the system tray icon. +*/ +void TrayIcon::setIcon( const QPixmap &icon ) +{ + //if(!popup()) { + // tip = ""; + //} + + pm = icon; + sysUpdateIcon(); +} + +QPixmap TrayIcon::icon() const +{ + return pm; +} + +/*! + \property TrayIcon::toolTip + \brief the tooltip for the system tray entry + + On some systems, the tooltip's length is limited and will be truncated as necessary. +*/ +void TrayIcon::setToolTip( const QString &tooltip ) +{ + tip = tooltip; + sysUpdateToolTip(); +} + +QString TrayIcon::toolTip() const +{ + return tip; +} + +/*! + Shows the icon in the system tray. + + \sa hide +*/ +void TrayIcon::show() +{ + sysInstall(); +} + +/*! + Hides the system tray entry. +*/ +void TrayIcon::hide() +{ + sysRemove(); +} + +/*! + \reimp +*/ +bool TrayIcon::event( QEvent *e ) +{ + switch ( e->type() ) { + case QEvent::MouseMove: + mouseMoveEvent( (QMouseEvent*)e ); + break; + + case QEvent::MouseButtonPress: + mousePressEvent( (QMouseEvent*)e ); + break; + + case QEvent::MouseButtonRelease: + mouseReleaseEvent( (QMouseEvent*)e ); + break; + + case QEvent::MouseButtonDblClick: + mouseDoubleClickEvent( (QMouseEvent*)e ); + break; + + default: + return QObject::event( e ); + break; + } + + return TRUE; +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse move events for the system tray entry. + + \sa mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(), QMouseEvent +*/ +void TrayIcon::mouseMoveEvent( QMouseEvent *e ) +{ + e->ignore(); +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse press events for the system tray entry. + + \sa mouseReleaseEvent(), mouseDoubleClickEvent(), + mouseMoveEvent(), QMouseEvent +*/ +void TrayIcon::mousePressEvent( QMouseEvent *e ) +{ +#ifndef Q_WS_WIN +// This is for X11, menus appear on mouse press +// I'm not sure whether Mac should be here or below.. Somebody check? + switch ( e->button() ) { + case RightButton: + if ( pop ) { + pop->popup( e->globalPos() ); + e->accept(); + } + break; + case LeftButton: + case MidButton: + emit clicked( e->globalPos(), e->button() ); + break; + default: + break; + } +#endif + e->ignore(); +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse release events for the system tray entry. + + The default implementations opens the context menu when the entry + has been clicked with the right mouse button. + + \sa setPopup(), mousePressEvent(), mouseDoubleClickEvent(), + mouseMoveEvent(), QMouseEvent +*/ +void TrayIcon::mouseReleaseEvent( QMouseEvent *e ) +{ +#ifdef Q_WS_WIN +// This is for Windows, where menus appear on mouse release + switch ( e->button() ) { + case RightButton: + if ( pop ) { + // Necessary to make keyboard focus + // and menu closing work on Windows. + pop->setActiveWindow(); + pop->popup( e->globalPos() ); + pop->setActiveWindow(); + e->accept(); + } + break; + case LeftButton: + case MidButton: + emit clicked( e->globalPos(), e->button() ); + break; + default: + break; + } +#endif + e->ignore(); +} + +/*! + This event handler can be reimplemented in a subclass to receive + mouse double click events for the system tray entry. + + Note that the system tray entry gets a mousePressEvent() and a + mouseReleaseEvent() before the mouseDoubleClickEvent(). + + \sa mousePressEvent(), mouseReleaseEvent(), + mouseMoveEvent(), QMouseEvent +*/ +void TrayIcon::mouseDoubleClickEvent( QMouseEvent *e ) +{ + if ( e->button() == LeftButton ) + emit doubleClicked( e->globalPos() ); + e->accept(); +} + +/*! + \fn void TrayIcon::clicked( const QPoint &p ) + + This signal is emitted when the user clicks the system tray icon + with the left mouse button, with \a p being the global mouse position + at that moment. +*/ + +/*! + \fn void TrayIcon::doubleClicked( const QPoint &p ) + + This signal is emitted when the user double clicks the system tray + icon with the left mouse button, with \a p being the global mouse position + at that moment. +*/ + +void TrayIcon::gotCloseEvent() +{ + closed(); +} + diff --git a/src/gui/official/trayicon.h b/src/gui/official/trayicon.h new file mode 100644 index 0000000000000000000000000000000000000000..10775ee26f88c54c71ae9d2e515080fb04cf2437 --- /dev/null +++ b/src/gui/official/trayicon.h @@ -0,0 +1,95 @@ +/* + * trayicon.h - system-independent trayicon class (adapted from Qt example) + * Copyright (C) 2003 Justin Karneges + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_TRAYICON_H +#define CS_TRAYICON_H + +#include <qobject.h> +#include <qimage.h> + +class QPopupMenu; + +class TrayIcon : public QObject +{ + Q_OBJECT + + Q_PROPERTY( QString toolTip READ toolTip WRITE setToolTip ) + Q_PROPERTY( QPixmap icon READ icon WRITE setIcon ) + +public: + TrayIcon( QObject *parent = 0, const char *name = 0 ); + TrayIcon( const QPixmap &, const QString &, QPopupMenu *popup = 0, QObject *parent = 0, const char *name = 0 ); + ~TrayIcon(); + + // use WindowMaker dock mode. ignored on non-X11 platforms + void setWMDock(bool use) { v_isWMDock = use; } + bool isWMDock() { return v_isWMDock; } + + // Set a popup menu to handle RMB + void setPopup( QPopupMenu * ); + QPopupMenu* popup() const; + + QPixmap icon() const; + QString toolTip() const; + + void gotCloseEvent(); + +public slots: + void setIcon( const QPixmap &icon ); + void setToolTip( const QString &tip ); + + void show(); + void hide(); + + void newTrayOwner(); + +signals: + void clicked( const QPoint&, int); + void doubleClicked( const QPoint& ); + void closed(); + +protected: + bool event( QEvent * ); + virtual void mouseMoveEvent( QMouseEvent *e ); + virtual void mousePressEvent( QMouseEvent *e ); + virtual void mouseReleaseEvent( QMouseEvent *e ); + virtual void mouseDoubleClickEvent( QMouseEvent *e ); + +private: + QPopupMenu *pop; + QPixmap pm; + QString tip; + bool v_isWMDock; + + // system-dependant part +public: + class TrayIconPrivate; +private: + TrayIconPrivate *d; + void sysInstall(); + void sysRemove(); + void sysUpdateIcon(); + void sysUpdateToolTip(); + + friend class TrayIconPrivate; +}; + +#endif // CS_TRAYICON_H + diff --git a/src/gui/official/trayicon_x11.cpp b/src/gui/official/trayicon_x11.cpp new file mode 100644 index 0000000000000000000000000000000000000000..053eeda9c4f6baedbd11a19adbdf21a0ec401fcd --- /dev/null +++ b/src/gui/official/trayicon_x11.cpp @@ -0,0 +1,407 @@ +/* + * trayicon_x11.cpp - X11 trayicon (for use with KDE and GNOME) + * Copyright (C) 2003 Justin Karneges + * GNOME2 Notification Area support: Tomasz Sterna + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "trayicon.h" + +#include<qapplication.h> +#include<qimage.h> +#include<qpixmap.h> +#include<qtooltip.h> +#include<qpainter.h> + +#include<X11/Xlib.h> +#include<X11/Xutil.h> +#include<X11/Xatom.h> + +//#if QT_VERSION < 0x030200 +extern Time qt_x_time; +//#endif + +//---------------------------------------------------------------------------- +// common stuff +//---------------------------------------------------------------------------- + +// for Gnome2 Notification Area +static XErrorHandler old_handler = 0; +static int dock_xerror = 0; +extern "C" int dock_xerrhandler(Display* dpy, XErrorEvent* err) +{ + dock_xerror = err->error_code; + return old_handler(dpy, err); +} + +static void trap_errors() +{ + dock_xerror = 0; + old_handler = XSetErrorHandler(dock_xerrhandler); +} + +static bool untrap_errors() +{ + XSetErrorHandler(old_handler); + return (dock_xerror == 0); +} + +static bool send_message( + Display* dpy, /* display */ + Window w, /* sender (tray icon window) */ + long message, /* message opcode */ + long data1, /* message data 1 */ + long data2, /* message data 2 */ + long data3 /* message data 3 */ +) { + XEvent ev; + + memset(&ev, 0, sizeof(ev)); + ev.xclient.type = ClientMessage; + ev.xclient.window = w; + ev.xclient.message_type = XInternAtom (dpy, "_NET_SYSTEM_TRAY_OPCODE", False ); + ev.xclient.format = 32; + ev.xclient.data.l[0] = CurrentTime; + ev.xclient.data.l[1] = message; + ev.xclient.data.l[2] = data1; + ev.xclient.data.l[3] = data2; + ev.xclient.data.l[4] = data3; + + trap_errors(); + XSendEvent(dpy, w, False, NoEventMask, &ev); + XSync(dpy, False); + return untrap_errors(); +} + +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +//---------------------------------------------------------------------------- +// TrayIcon::TrayIconPrivate +//---------------------------------------------------------------------------- + +class TrayIcon::TrayIconPrivate : public QWidget +{ +public: + TrayIconPrivate(TrayIcon *object, int size); + ~TrayIconPrivate() { } + + virtual void initWM(WId icon); + + virtual void setPixmap(const QPixmap &pm); + + virtual void paintEvent(QPaintEvent *); + virtual void enterEvent(QEvent *); + virtual void mouseMoveEvent(QMouseEvent *e); + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + virtual void mouseDoubleClickEvent(QMouseEvent *e); + virtual void closeEvent(QCloseEvent *e); + +private: + TrayIcon *iconObject; + QPixmap pix; + int size; +}; + +TrayIcon::TrayIconPrivate::TrayIconPrivate(TrayIcon *object, int _size) + : QWidget(0, "psidock", WRepaintNoErase) +{ + iconObject = object; + size = _size; + + setFocusPolicy(NoFocus); + setBackgroundMode(X11ParentRelative); + + setMinimumSize(size, size); + setMaximumSize(size, size); +} + +// This base stuff is required by both FreeDesktop specification and WindowMaker +void TrayIcon::TrayIconPrivate::initWM(WId icon) +{ + Display *dsp = x11Display(); + WId leader = winId(); + + // set the class hint + XClassHint classhint; + classhint.res_name = (char*)"psidock"; + classhint.res_class = (char*)"Psi"; + XSetClassHint(dsp, leader, &classhint); + + // set the Window Manager hints + XWMHints *hints; + hints = XGetWMHints(dsp, leader); // init hints + hints->flags = WindowGroupHint | IconWindowHint | StateHint; // set the window group hint + hints->window_group = leader; // set the window hint + hints->initial_state = WithdrawnState; // initial state + hints->icon_window = icon; // in WM, this should be winId() of separate widget + hints->icon_x = 0; + hints->icon_y = 0; + XSetWMHints(dsp, leader, hints); // set the window hints for WM to use. + XFree( hints ); +} + +void TrayIcon::TrayIconPrivate::setPixmap(const QPixmap &pm) +{ + pix = pm; + setIcon(pix); + repaint(); +} + +void TrayIcon::TrayIconPrivate::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.drawPixmap((width() - pix.width())/2, (height() - pix.height())/2, pix); +} + +void TrayIcon::TrayIconPrivate::enterEvent(QEvent *e) +{ + // Taken from KSystemTray.. +//#if QT_VERSION < 0x030200 + //if ( !qApp->focusWidget() ) { + XEvent ev; + memset(&ev, 0, sizeof(ev)); + ev.xfocus.display = qt_xdisplay(); + ev.xfocus.type = FocusIn; + ev.xfocus.window = winId(); + ev.xfocus.mode = NotifyNormal; + ev.xfocus.detail = NotifyAncestor; + Time time = qt_x_time; + qt_x_time = 1; + qApp->x11ProcessEvent( &ev ); + qt_x_time = time; + //} +//#endif + QWidget::enterEvent(e); +} + +void TrayIcon::TrayIconPrivate::mouseMoveEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::mousePressEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::mouseReleaseEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::mouseDoubleClickEvent(QMouseEvent *e) +{ + QApplication::sendEvent(iconObject, e); +} + +void TrayIcon::TrayIconPrivate::closeEvent(QCloseEvent *e) +{ + iconObject->gotCloseEvent(); + e->accept(); +} + +//---------------------------------------------------------------------------- +// TrayIconFreeDesktop +//---------------------------------------------------------------------------- + +class TrayIconFreeDesktop : public TrayIcon::TrayIconPrivate +{ +public: + TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm); +protected: + virtual bool x11Event(XEvent*); +}; + +TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm) + : TrayIconPrivate(object, 22) +{ + initWM( winId() ); + + // initialize NetWM + Display *dsp = x11Display(); + + // dock the widget (adapted from SIM-ICQ) + Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen + int screen_id = XScreenNumberOfScreen(screen); // and it's number + + // tell X that we want to see ClientMessage and Deleted events, which + // are picked up by QApplication::x11EventFilter + Window root_window = QApplication::desktop()->winId(); + XWindowAttributes attr; + + XGetWindowAttributes(dsp, root_window, &attr); + XSelectInput(dsp, root_window, attr.your_event_mask | StructureNotifyMask); + + char buf[32]; + snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id); + Atom selection_atom = XInternAtom(dsp, buf, false); + XGrabServer(dsp); + Window manager_window = XGetSelectionOwner(dsp, selection_atom); + if ( manager_window != None ) + XSelectInput(dsp, manager_window, StructureNotifyMask); + XUngrabServer(dsp); + XFlush(dsp); + + if ( manager_window != None ) + send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0); + else + { + object->hide(); + return; + } + + // some KDE mumbo-jumbo... why is it there? anybody? + Atom kwm_dockwindow_atom = XInternAtom(dsp, "KWM_DOCKWINDOW", false); + Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false); + + long data = 0; + XChangeProperty(dsp, winId(), kwm_dockwindow_atom, kwm_dockwindow_atom, 32, PropModeReplace, (uchar*)&data, 1); + XChangeProperty(dsp, winId(), kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (uchar*)&data, 1); + + setPixmap(pm); +} + +bool TrayIconFreeDesktop::x11Event(XEvent *ev) +{ + switch(ev->type) + { + case ReparentNotify: + show(); + + } + return false; +} + +//---------------------------------------------------------------------------- +// TrayIconWindowMaker +//---------------------------------------------------------------------------- + +class TrayIconWharf : public TrayIcon::TrayIconPrivate +{ +public: + TrayIconWharf(TrayIcon *object, const QPixmap &pm) + : TrayIconPrivate(object, 44) + { + // set the class hint + XClassHint classhint; + classhint.res_name = (char*)"psidock-wharf"; + classhint.res_class = (char*)"Psi"; + XSetClassHint(x11Display(), winId(), &classhint); + + setPixmap(pm); + } + + void setPixmap(const QPixmap &_pm) + { + QPixmap pm; + QImage i = _pm.convertToImage(); + i = i.scale(i.width() * 2, i.height() * 2); + pm.convertFromImage(i); + + TrayIconPrivate::setPixmap(pm); + + // thanks to Robert Spier for this: + // for some reason the repaint() isn't being honored, or isn't for + // the icon. So force one on the widget behind the icon + erase(); + QPaintEvent pe( rect() ); + paintEvent(&pe); + } +}; + +class TrayIconWindowMaker : public TrayIcon::TrayIconPrivate +{ +public: + TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm); + ~TrayIconWindowMaker(); + + void setPixmap(const QPixmap &pm); + +private: + TrayIconWharf *wharf; +}; + +TrayIconWindowMaker::TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm) + : TrayIconPrivate(object, 32) +{ + wharf = new TrayIconWharf(object, pm); + + initWM( wharf->winId() ); +} + +TrayIconWindowMaker::~TrayIconWindowMaker() +{ + delete wharf; +} + +void TrayIconWindowMaker::setPixmap(const QPixmap &pm) +{ + wharf->setPixmap(pm); +} + +//---------------------------------------------------------------------------- +// TrayIcon +//---------------------------------------------------------------------------- + +void TrayIcon::sysInstall() +{ + if ( d ) + return; + + if ( v_isWMDock ) + d = (TrayIconPrivate *)(new TrayIconWindowMaker(this, pm)); + else + d = (TrayIconPrivate *)(new TrayIconFreeDesktop(this, pm)); + + sysUpdateToolTip(); + + if ( v_isWMDock ) + d->show(); +} + +void TrayIcon::sysRemove() +{ + if ( !d ) + return; + + delete d; + d = 0; +} + +void TrayIcon::sysUpdateIcon() +{ + if ( !d ) + return; + + QPixmap pix = pm; + d->setPixmap(pix); +} + +void TrayIcon::sysUpdateToolTip() +{ + if ( !d ) + return; + + if ( tip.isEmpty() ) + QToolTip::remove(d); + else + QToolTip::add(d, tip); +} + diff --git a/src/gui/official/url_input.ui b/src/gui/official/url_input.ui new file mode 100644 index 0000000000000000000000000000000000000000..b06767a7d95d4a7273d17ece47382f091dcc4108 --- /dev/null +++ b/src/gui/official/url_input.ui @@ -0,0 +1,1273 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>ConfigurationPanel</class> +<widget class="QDialog"> + <property name="name"> + <cstring>ConfigurationPanel</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>561</width> + <height>552</height> + </rect> + </property> + <property name="caption"> + <string>Configuration panel</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="Line"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout28</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <string>F1</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>160</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonSave</cstring> + </property> + <property name="text"> + <string>&Save</string> + </property> + <property name="accel"> + <string>Alt+S</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="accel"> + <string>Alt+O</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <string>F, Backspace</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QListBox" row="0" column="0"> + <property name="name"> + <cstring>Menu</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="cursor"> + <cursor>13</cursor> + </property> + <property name="currentItem"> + <number>-1</number> + </property> + <property name="selectionMode"> + <enum>Single</enum> + </property> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>TitleTab</cstring> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Setup signalisation</string> + </property> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line2</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Signalisations</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>SIPPage</cstring> + </property> + <attribute name="title"> + <string>SIP Authentication</string> + </attribute> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout24</cstring> + </property> + <property name="geometry"> + <rect> + <x>16</x> + <y>12</y> + <width>401</width> + <height>393</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox1</cstring> + </property> + <property name="title"> + <string></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Full name</string> + </property> + </widget> + <widget class="QLineEdit" row="1" column="0"> + <property name="name"> + <cstring>fullName</cstring> + </property> + </widget> + <widget class="QLineEdit" row="3" column="0"> + <property name="name"> + <cstring>userPart</cstring> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>User Part of SIP URL</string> + </property> + </widget> + <widget class="QLabel" row="4" column="0"> + <property name="name"> + <cstring>textLabel2_3</cstring> + </property> + <property name="text"> + <string>Authorization user</string> + </property> + </widget> + <widget class="QLineEdit" row="5" column="0"> + <property name="name"> + <cstring>username</cstring> + </property> + </widget> + <widget class="QLineEdit" row="9" column="0"> + <property name="name"> + <cstring>hostPart</cstring> + </property> + </widget> + <widget class="QLineEdit" row="11" column="0"> + <property name="name"> + <cstring>sipproxy</cstring> + </property> + </widget> + <widget class="QLabel" row="10" column="0"> + <property name="name"> + <cstring>textLabel3_2_2</cstring> + </property> + <property name="text"> + <string>SIP proxy</string> + </property> + </widget> + <widget class="QLineEdit" row="7" column="0"> + <property name="name"> + <cstring>password</cstring> + </property> + <property name="echoMode"> + <enum>Password</enum> + </property> + </widget> + <widget class="QLabel" row="6" column="0"> + <property name="name"> + <cstring>textLabel1_3</cstring> + </property> + <property name="text"> + <string>Password</string> + </property> + </widget> + <widget class="QLabel" row="8" column="0"> + <property name="name"> + <cstring>textLabel3_2</cstring> + </property> + <property name="text"> + <string>Host part of SIP URL</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout23</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>autoregister</cstring> + </property> + <property name="text"> + <string>Auto-register</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>201</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>Register</cstring> + </property> + <property name="text"> + <string>Register</string> + </property> + </widget> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer9</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>21</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>STUNPage</cstring> + </property> + <attribute name="title"> + <string>STUN</string> + </attribute> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox3</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>110</y> + <width>253</width> + <height>100</height> + </rect> + </property> + <property name="title"> + <string>Settings </string> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_5</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>38</y> + <width>229</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>STUN server (address:port)</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>STUNserver</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>60</y> + <width>229</width> + <height>23</height> + </rect> + </property> + </widget> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>stunButtonGroup</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>90</width> + <height>81</height> + </rect> + </property> + <property name="title"> + <string>Use STUN</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QRadioButton"> + <property name="name"> + <cstring>useStunNo</cstring> + </property> + <property name="text"> + <string>No</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>useStunYes</cstring> + </property> + <property name="text"> + <string>Yes</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>DTMFPage</cstring> + </property> + <attribute name="title"> + <string>DTMF</string> + </attribute> + <widget class="QGroupBox"> + <property name="name"> + <cstring>SettingsDTMF</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>301</width> + <height>130</height> + </rect> + </property> + <property name="title"> + <string>Settings</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout11</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>playTones</cstring> + </property> + <property name="text"> + <string>Play tones locally</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>111</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelPulseLength</cstring> + </property> + <property name="text"> + <string>Pulse length</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>115</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QSpinBox"> + <property name="name"> + <cstring>pulseLength</cstring> + </property> + <property name="suffix"> + <string> ms</string> + </property> + <property name="maxValue"> + <number>1500</number> + </property> + <property name="minValue"> + <number>10</number> + </property> + <property name="value"> + <number>250</number> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelSendDTMF</cstring> + </property> + <property name="text"> + <string>Send DTMF as</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>85</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>SIP INFO</string> + </property> + </item> + <property name="name"> + <cstring>sendDTMFas</cstring> + </property> + <property name="currentItem"> + <number>0</number> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Audio</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>Drivers</string> + </attribute> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>DriverChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>410</width> + <height>180</height> + </rect> + </property> + <property name="title"> + <string>Drivers list</string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>CodecsPage</cstring> + </property> + <attribute name="title"> + <string>Codecs</string> + </attribute> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>CodecsChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>10</y> + <width>133</width> + <height>157</height> + </rect> + </property> + <property name="title"> + <string>Supported codecs</string> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>110</width> + <height>120</height> + </rect> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec1</cstring> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec2</cstring> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec3</cstring> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4</cstring> + </property> + <property name="text"> + <string>1</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4_2</cstring> + </property> + <property name="text"> + <string>2</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4_3</cstring> + </property> + <property name="text"> + <string>3</string> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>RingPage</cstring> + </property> + <attribute name="title"> + <string>Ringtones</string> + </attribute> + <widget class="QComboBox"> + <property name="name"> + <cstring>ringsChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>21</y> + <width>150</width> + <height>30</height> + </rect> + </property> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Preferences</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>Themes</string> + </attribute> + <widget class="QComboBox"> + <property name="name"> + <cstring>SkinChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>12</x> + <y>42</y> + <width>110</width> + <height>27</height> + </rect> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonApplySkin</cstring> + </property> + <property name="geometry"> + <rect> + <x>136</x> + <y>40</y> + <width>80</width> + <height>32</height> + </rect> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="accel"> + <string>Alt+A</string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>Options</string> + </attribute> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>262</width> + <height>200</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelToneZone</cstring> + </property> + <property name="text"> + <string>Zone tone:</string> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>North America</string> + </property> + </item> + <item> + <property name="text"> + <string>France</string> + </property> + </item> + <item> + <property name="text"> + <string>Australia</string> + </property> + </item> + <item> + <property name="text"> + <string>United Kingdom</string> + </property> + </item> + <item> + <property name="text"> + <string>Spain</string> + </property> + </item> + <item> + <property name="text"> + <string>Italy</string> + </property> + </item> + <item> + <property name="text"> + <string>Japan</string> + </property> + </item> + <property name="name"> + <cstring>zoneToneChoice</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>31</width> + <height>21</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>confirmationToQuit</cstring> + </property> + <property name="text"> + <string>Show confirmation to quit.</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkedTray</cstring> + </property> + <property name="text"> + <string>Minimize to tray</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_6</cstring> + </property> + <property name="text"> + <string>Voicemail:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>voicemailNumber</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>61</width> + <height>21</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_About</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>About SFLPhone</string> + </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>pixmapLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>50</x> + <y>40</y> + <width>312</width> + <height>91</height> + </rect> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>170</y> + <width>371</width> + <height>121</height> + </rect> + </property> + <property name="text"> + <string><p align="center"> +Copyright (C) 2004-2005 Savoir-faire Linux inc.<br><br> +Laurielle LEA &lt;laurielle.lea@savoirfairelinux.com&gt;<br><br> +SFLPhone-0.4.1-pre1 is released under <br>the General Public License.<br> +For more information, see http://www.sflphone.org<br> +</p></string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>CodecsPage</cstring> + </property> + <attribute name="title"> + <string>About Savoir-faire Linux inc.</string> + </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>85</x> + <y>126</y> + <width>291</width> + <height>131</height> + </rect> + </property> + <property name="text"> + <string><p align="center">Website: http://www.savoirfairelinux.com<br><br> +5505, Saint-Laurent - bureau 3030<br> +Montreal, Quebec H2T 1S6</p></string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>pixmapLabel2</cstring> + </property> + <property name="geometry"> + <rect> + <x>130</x> + <y>50</y> + <width>173</width> + <height>48</height> + </rect> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </widget> + </widget> + </vbox> + </widget> + </grid> +</widget> +<images> + <image name="image0"> + <data format="XPM.GZ" length="58862">789ced5d596fe3b8b27e9f5f114cbd0d0eea6475625cdc878eb3b4b34ca72799e9745f9c07c74b76c776363b07e7bfdf629194488ad49249e4f40151109292488a923e7dac85a2fff9dbc2e9d1e1c26ffffce5fea1f370d95de85e74260bbff51e6f6f67fff7affffdf72fbfae2c2d2f34971696165717967ffdc72fbfe21f0bdd05682c37d61a52ffcc7a87f40eebbb4a6f2a7d47e93da57f17fafa4aa3b7be2274e8487d7d49eab8a4f43575fc96f533d2cf58df547a53e953a5f794fe22f48d95f5de866caf2df58d25a9c34ce96beaf8b9d4cf96cf56f9f890f5333a2edb1b2bbd29757c547a4f1d1f495dd7c78b44efb13e507a43e9db426fae6ef49af27c7da93797943e50fa9ad4f145ea49fd65a577947ea8f5ee1ad7df557a5f1e872dadcbe3f8c47a97daefb2fea0f4a6d2ef95de53faa5d4757de849bdbbacf496d03babcd5e47f6ff52ea9d25a583d2d7a48e7da927f59f125d5ecf27a537947ec47a97eacbfe4c94de51fab1d2fb528767a927f5af94de913a74b5de93e7df577a5f955f14fad96aa7af9ee758eac9f36d28bda1f0b22775dd1e9e28bdaff403a9f79695bece7a2f799e23a5ebe7f9ac74f5fc7045eaba3e7c4af43e1f5f557a43eac0f8eaae25cffb4eeafa7ee354e90da5f7a4aeebe3b5d23baa3d7e3fba3d7d3fe14ee9ea7ee250e9eafec195d4757dfc5debfd06eb6b4aefabf62fb42e8fc367a9f79795ceef5b6f2db99f33a927f7734fe90da57f937a52ff20d1657fba4a6fa8fefc99e8f238bf2fd43b7d3f51e9fa7a6e95aefa8f9b52d7f5e14ce91dd5de86d0fb0d7d7df855eaba7fd854baea0fec285dd587b6d607f2f8b5d2fbaafd2f5a57c7f97dee27fdc153a5ebf6264ad7f5ffd2baac8f37521f2c2bfd4ce90da5ff10fa20391fee4b3d29df52ba2edf49f4019fff46e91da533df0c06fa3882d2d5f1af0f4a1f683d4a94fa24622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d7f177308d821399bf77544f979e4b598c32ef6b08f033cc70bb55de2155ee3cdbcafe8e30bdee210ef7084639ce03d3ee0233ed1df09e9cf38c519decebb87ef2bd53147ac768d2f8cb601612dfbf7136ecefbaa3ea2600bb70855dbb883bbf8b960dbc5366171847bb83fef7ebfbd54c51c1e58dc16da0e3f0eeef81df91dbfbc4bdbfb848b23622d282cf99570f4c7abb6e379dfc1b7962a98c31b1a3ffddce6fb7b52aac53f091107344a5ff2d87c42e8f8eb2daf0fbf25fd7973d4e1293392e0a5eff8a3a0ec6221b785b6a5b7eef7bca53ce6e8e915f39bbd2de7f916c43f57c17a2b7ebb903c966f6447ae166c6b29be08cdbaddde5bdf3b6c187c342a28bbe4e1b0255c278edcc0267e05c42d00e8f8b80ef0ad7b3e5f298b39465c96cb06849b2b42c8359ce1267433c797b1e36d0d88db2e0ab8f2c41db108a56539f602bfa9f324fbe1cd31077d838f724740ea4786bf60e02b07e7597b0fcedfbae7f3957298f372dc00d7ac327f911597e5ac818fb108a7699915dc14c8c40e9cc105f48cba874ead9ea7fdd0c67da3676df8d56f7defc8df4cb928b7751a855deeea602b507694e1bac5b7eef97ca50ce6f08b974baecd32c47321cec93c0db2e0521f37c38364e3ad32838ae3dfac73749df69709bb3d204e931bc915fd774dffabbec14d5e3ffeae900f9a72513ee6006e1d9edb0a9786a1c373776fddf3f94a29cc2dfbb8c4ba4b6730cae19c15abb52fc9fee073a267744163ab331a1242cd7657a13016581fcf6151d99151760727b9656fd9fa53e561f8d6fd9eb714638ec63eafdd649559ceb7afe0dadb5ec5f8b1652f96b2ce98e7743fde97e7c685a587e42734b3f13698900771ef29dfa211f9166790d766618c46956bc2234ee9fca76f7d0f5e234598a3912ec45f3725caa80d9e8c7bfca4f62f57ed2b3c57e5ac6a3c87fb70477e64533c49dcc7198ef101a6f81d66788477d9676ff1dc1fd2d2a7e7fa0c973084195c12b70523bad4b3676a7da6f90c3a30a61acd40e91f7847e567844260940e71421ecc928e1e877009f7e40bbfa49c293816c80dae7ae7df568a30079fcac4df380b96ef4b265137b6d5c4fe4f55fb6ad87307256b54b0e70861a94fd9f1c6ca1c5bdee439e6ba4e12af4bda8147efb9a6b0e9cf3f402bcb4584c5cf057ddbf58dd6701eb80eb204ca32e47b4821cf0d82fc3548fb4dcfd66bf319db956a2fe144c8b1a2037d49ec39b82859a302cf116b14e604888b8c676bf35cb0ceb6739e0d62a6dc3a84310311706ff154f83cb6853d8171ee39a64551ecf7937ccc4149eee2d859418e425bfc894ffa37ecb9b29833edb97c8cc343b9bc00f99f498cc3e539ff465c6322085d2ef46e064e7156a65fcca98955483ed8b0b04e7b5e5c5780b96e0e772dbb1126f20ef2b84e656089add27c43a5ab4eed3928392e97e7395f3e1436c9f619e13d8f50e9fe84e9caf11c6d897f41c8dec91cff4ee36cb64edab359e9dc6ce2e11253da1cb8497bc66401dad7f72131c7fe68c817ddf194ff421e4288eb5655995563ff7295b900863d57d287b0ecb9c3dc92599e3347d16d63ffae1e95b23c0703c2e83159edf6fe84b518a5d639a4f5c6734edaceb199aa93e1397811ef029dcbe52e957f33f2c09f79144d7c06f2904d3bf27b282efdbe92873908fba397e18c395c046cc0849bac5cc33969d7e5f2ef567ceeba548dd7f39ce32fc038cb412ecfe9d82db6c0e226d00c3fb4b8a7a351a5fbca2832b849ed77788ed84af11379d98e1da86a3c18fb3fdb769b7d9daead598fe4610ebf0438ab2036a66c3bb75e12d123241c7a8ef7b1879b79715e279fbb92df0bae61c6e772633336cfd93618f779cb3caef6d93c67645c9969b2e56d2ef5cc0ae051362dc3fce4f09cc54d60e571a1aff6764c4ecc9c636a5c67e6681d928bb96e96af60b7242765e78c185164c2c20a86e6e1898cd6375f9b467c4ee57269cf09b1a42d9be96c1693e7f27d0887e71a9eb34f8de3724434796ed78ec5391cc8c74c5b0ebc36059c5b9cc628b679ce9e1940bd36cb735c86fc629b17ad5929ecc398c7e71025ce1d5bcf325c5421a606570e9739f32838bf15f6750fb3a36726df1afeab50f76a7bce1335b5388547c5bc3c04581c28222c840593af02790b93a3a41de8f09c937b25de73cb8f1c3b8fd80cef69ef049f4c8e53dbccdf8ff7945c9edb7478a56214173edbf5bde7001ac1d788ad2e3dbce7ccb374f2ad79db4dd27aba2f17738e9de3cb45ad1bfcf0cc7bcc7925ce1be5d85a6453c1a3c55781f94966ec0ea6bcc7b6e79cecabe5f34a9e9b94f673c5f6fc1628aa26b93cd7b6b8a354ae8afcd6d574ae0878edb990e00d95bfb238cb9a7f97999f774863ab98a3796d6e84f4c4267c9d3d07de397f8c22cd5b6ced59f69c930720567379cea8af6d35cf3dc8f4c3e1b90da757e30ccfdd67b82c67f3e749de577279cef65bd3b9b7c44df464fd3697f4493fe9a33c37d3f15bf385ce7a62d88f8615e6d873d725be427815cff96d2df23a537e38e23da6cde662ceb60f7f64e6c505ec28b8346d446ec9e63907ab561f183fe4d796e5b85d7a6be610a32b88cfa5398313b56713b59de68d3d305e64fcaec7333121c9af96f0339356560dae4bfc34d39e2b9789b0ecb9f27eab27f2e8f014fb9c16cfb9b195877c9e0bcd37b7da6cf31e8be7dc6cbe555ef2dc83cd6564cd1d1147cf5c216fe263c68493f9bc623612f9142f066f9c786b98b9089e73492894ba971773ceece42fac7c6bc95cadc573b963bbc34b9ef920786c1c67abaa22cfd97c159887697d3721f754e4393cb2ec46af9d305f29c0dcb5b68792586f9abff4320d5c383ee441e29b56fad69ff854b7b39ab49dda732539d3b2e7cef3de6b87973c2c0426dfb0556571cc716e7b82e79a165f79470998581cb5ce67a9ca730dab8dc2797df54b01e63a094f64e36dde6f02c907f5fb92157d5e6c2575137e34f2adaf9957720139b90bc76fcde484a83fd9785b259e7338cc6bd1d9795299d7a8cc73b7561b7e0b08e6397bb370fedc5e300ee6650d62466f79a8b8a289f18d57ea8526f65cd9d62c7bee22ef8b5b273eb7eb8eae3831b84667a52ad9733cea99e7c85eb39527d57da8ca734e1ee2366b27e0a2884e136fcf213627a4107367c118981f7327deb2b93ea3b79d6b6d131afbd2f85cc9595036cfe5f1a39b6fd579247517d0e21a9d4bafca734de71c1607e186fd0dace6daaa3ca7a2d7693b632b5b36219426b6dec7cbf1ababfa1488f5fba3584f5e4eec5a2d7e29c20c8d6487b23e18350d7baee437f98e3d27da7bc26bfe4aec0c76f026b5313df34a1e93f9235bc416296725b9d86af61cd77062678487a9980bcf2b99d8f3eabeeb79ead5790ef7ed6f64a9f777c4a12d7a73d6ad3cc72eeebd359eca4809cc75d03f4fe44f4fd91b1f278215eb861ecab973413f965a39d4fc68bda3697cae24e65c9ef36df024d8cfbf9e08bc40dfcab38a2dc9c556e539f12e79e7cae5e607aaf31cc7654a9c43e639ea9752df1afee9e52e8f756ac5d5923cab3d57c498537268e62cd4d18ecafecbfa16b68cf85ce9b547f025688f5a9c5d7a9ef0d8988d6bd671fc43e215b3debeb17fa9c479ccb97b95798ef717ae8f42e89fd3ecf492dff11f7839c2f10369b4cae44c61e4ceedc41bd8b2ca5c72066b8dc6bc7dec9bf1347b44b66276a5a39999b928be6d10e2b90cefb5cc33e3c4389659338e9ea93e66dd01f12d56ee7976ecd89df33d843b37fbd8386665897196c7a9e4417cd0ef218c2b58f172841127232bed30cb21bed9c41cc53bcce59e174260c6e6c3dfd5f10a1e49609d15fbef75a9ef2176325fd3fc20ab4b1e6b7bce7cac8e7dcfe6f3f1ab9527357dd5a32c16f029e1a6ec9a08a9afbbebe662bf8a6fd9be67cf43e79e8b1da7a5c2ba4c2b7e8e202611ab21f9befbbac89b794e185dc1cb6c7be4b3acf96b243c7a55e50af10b5c65e6d8a5f24d62db89cf6d8ad506f116ce0939c46770e7fff29438eb0e4710f2e167b01d5ef781fcd4291e93bdb8091db21bc70070e79bcfc2e74142cfc8df07f2b7ee704cfdf0f7615f7c718b47d4fe0c0506a7f3febab5e2fa73df8cfc6be15ff2154a45d1e89e7dc12e1c10a20af334342e1f54cba1951587e7d6dfe31c51a4545b67932cfcb273d856e77d65d5c4b1e7fecb57f49daf545f4f18ce3cebcc59f3e4b057cc581f4d2c9efb3ecfafdcfffbe575eba613dfadaa58b1c96dcb7812b2c53eba58f3e7e6f265cacf254994fb156b6cffbddf87c01659619bbcc666096bec230b790c29cfcdbd37957b7f1b9a1bf54ee79b605bcc3026ff7b884fc15253ff4c82f83b385ae025b1e77e8a95cac9537dd4cf148f0803019ff75dcedda7bbb52efa407f3d7122eed30f98fa675245cc6949e69ded64e35c1f51a08f6d9d8703a0ff6bf47b08ed7c6e62b2761073b774ccfbf646cca5c22b03ce7e8e5f01c12631db4b92d53f224ea9317b8adb74be06af36360dadb543e3ee4be4b9aa8220a2baf82c249d394c96df3eaf8ad8247c9a6b81006ee008c5bccb75f5053e582b324d6cfe34d6779af1d7a723dc4a66ac00b5b108e7380cc589517c952884bf06123c074311b9a636c4b70fd64a50740d47b84eef53c1db04f738c6276a690cad74bd46c2ce3936685ba7f6f5fcaa323c774ac7bcbf60103117161abd8e047a080153fdcee20f7a26e24edf132a1e04d7c84c83989706537af6e2c91fd3336b094b3bcd55c13d3dc9699a3d23dc3e0a1c93d5d3a2273862643cc240cdeedc127692380fb5ef99274f3d7a54fd78e49537c56a9a6dfebda60798d179fa12a9544eac43774c489ca2f82e312707c1f938d9c63db5a1381487b84d75c53b764af7635baf6020ed39be2f219e8310f746cc85c5e405badb6da103f38bcea0121bb465665d7872aebf4b8c933c0f40ae97cc04854769f513e2da3ac34a3ca34ac09d6431f20a037379457d3ece7599e7668a5d9b023bb28764a3b6d3160889399683b8428d4a14efceb6ea53bab2a5e895fc46a304cf718b5e8c47cc95131ecbf6388ed74e5732a7777906721d89470fe6c8e6d2775da09339418f4e13815562b7a9594bd86522064123aae0b87e78ee07f1a4e04048eb19ebe22d4aeb9d38746622826c84b66f25163ec69c9a9ffbc73d7d8d65ec3931c3c0bf3f62ae8c306371448a79cef8f681ac37f915ea3a3353c35979eb51e7f84539168dc16dc144b2969e1387fb0223e249499ecbff5d0818a4f612fbad49691a0fd9cee335eddae96a13c2560bc51e39da92fb8d188fad8a87cbf15c287a1331972fbc7afabde4288101c173e69a21642bb5d53aeb6c0d11f7b4d2df39c4b1b4e8041f12beee68ec92df729dca919af889ed3042e494acf47b14489ae9b857becd0f2de2448d6830ed3ee6e24bf9a6703bf41fa1f888da7e0afd2e19db0ea17b704a0c3911f6a8b01f794f097b2e2c117321c1167b09fcf536bde3438939e639e38b6ec154fa7fb27deea43f49a5e52a3a5bd25aa367ced8a3b148f2c4a2fcc2465873f42cd14597e4b982fedda74cc83c675a9fcc73b0adbcd912d11fb6e63c5fe4d01508bbe007db78e2ad929e45299e0b49c45c48c4334d474acef69c2b9e33ec7ab6d2adf71c26621c250e427e4ec2b34cd0c156d8808f4b5d708767652469cf15f58fb84dfb32c29e4b7a21ceca3c37947fcb5e6d766c657b33b100c5fb26cb94b3e7421231e717810ecbba9f04786e94c58688a7249ee391b2e3b46fda521ea9f47685e5e5fb6587923c67d973e6ac7969cf9d9a9e72416b23ee97b326077be3497e83af3df2dcbb094cf819682ff394b5a987e746ca9e33c625b6a75ea4b720d0435c90c6e59e9903d3b89df00492f9bf34864ba40ec379cca4ec84da51dfae727c2ec3733c86bfa4ab7d91b5300dfa98fb6caf6d2719dc0deaa988eebda416204764c6b2d7ca9e1be6d97310f855b388b990f00828be09ddc031fb93722685e00e234a4b969a8c9534e8dd5f17bf8e04d2a6532312790f633342c1f113834f84374825d6a9ddafb00d331561c6222f52fbd26a55b2a30ccfc9d8728bfde545dc00b16eec76deec059cb1cd3aa41a138ef08937e996e37e77e25de0b743c70f5b9263a5671c686f3fe621aa0bee894c02bdef7b34aaece9cc8fbd8616dd5995d1a2e313fe052f61bf19712ef1bcac1a5fed118cd8846a127300e156b10c79230d7745cdac48bb51b02e21d62a0d8f464e6e28fa457d1a17fdde35e1f252bc5d847cd01904eafdb6f88e82aeee2b217028475a7a0ff95706443fc3bf688c81bc47c4dccf2c345abef91783ef3fc721622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b7efdcffffcf2ff6d14cd7e</data> + </image> + <image name="image1"> + <data format="PNG" length="3625">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000df049444154789ced5d5f681cc71dfe6d21c529a69c4b1f24438b14eac0a9b4b0aa52904a83566f91e440a4bed8322ebdb31c1af925919d87da71b89c5f94cba5b8951ecef11904920d8ea4827c4a4145e7a0700ad8d5a918ee0c0e9c835a4e460f6721ccc9e8e5ebc3deeeed9f99ddd9bd9323c737603e4b3b7f7e33fb9b6fbff9edcc8a40445789a86e0800eb0000642a885da0eeed34f085c59a1d34f5a0080090134ba0084091192e2a93c0e8e22a00e0bbee78039f5ff45530b7a91268606c0694af38a6470c1480d03c1a0edc40cfe8ad000065d29d51bda2320914b7cb0d09d1402114ca885d9511fd30aa178c2ee71a8edb405774cd90db2c414ed497599d504e2c352443031dd1310336814061ef19d68a81b19986e336908bdc0bb9cd1202633e187322054a009458022580de39355a30932f562586403d75715c00e389ab080d876cff62f11800a0582c3e3f9204406a3e55d7095dde2e23168f21341c4267b782d070c87ffd7b601f0bebc3b01507c3361c53a68067c2b8d8069007821d32721d05043b64fd1febe7f391e873c1ece72351ddfebad9bb08db78bc736ed4d744de13fb18689f79bbf0ccb02229f4c5aa2f8debc77143c321d38d50fa7b319eb80a00989a9e02e280d2df6bcab39a5dddff8cabd95f2f8780d961831d72cd4c5b57fb3868fb8552f6a84137dd1d569eced4a47195c925718782996171873f80780060b7f24873a8170f50fb8d702b5f43fd28fab00f4067b7627b0261dd65bc9e817d6ef9a5ab441426a224118501481fcd12d120118961e8b52c25df68275e0aff334bd7eeb60bd7c7c3a9b71ed2d0af5f9192467b1998cdaee2c4e9537afb8ad24313b1b86b391302183c3e44f7bfb9cfec93a2f4d0d9e1116a7df515a9ab5bc1d6932d0a1c0cd0caed3425254932d6975ecee0c2c50bb4f5648b824782d47be3baa4d999bcd14e6b777b68ebc996a9fee091207576c874f6bdb3e6fae240db0d75acc73f1da79ed77f274d24ae62e2b309bd6c5353333d7ab4414444f977b3941c32dba3a166372be5ef66d57601f41cedd3eb33a6c0c100ad2869da18dea0e6c3872551fb0207037a7f75fb004c5c49d2ecad395b5b4d4dcd943eba403bc776e8e51fff484a1299679e9f375c4ec9ab86757b8326b48701768da6f4f702ebc0d2724668c66b653bbb15b52315a67de7dca8ce489ddd0ab00d14bb4b261962adafd45fb65d8fc56376fb1681d070c8549f551b9a18b154f93d43936aff3f1f89f2c76b97adf97107eadac4d09ed2df0b00aa84aa8c8396bfd45faecd3e0be397facbeaefd7818163c7cde35d617a9d69c3f3abb8b6e683119bd284d33dcc191b26a26b1e99db09a31707a9596233879529db5ee3b33f913ae383475aa9a7bb87868e0f99190d40762d4bededbfb131745b870cad8efcdd2c4d5c4992914996e617aacc63b1237f374b0bb716e8dc471fe8368c0c876968e884b99d69a0edafe672494992e286b647864768e4ed5352783884afd7d64c7d0b1e0952e8d871ea7bb35f9a9e9ec2ca7f86e8e956988888da3bba68e47458edafa59d81a303d4fae107eee3c0e8972ffb8ef651f87498b4eb8ad243edb1b8e9fe5e884431776b8e88883a6599ba3ebb26a91a62b7b6786c8ea76b37ebc7b49ea309801ad69a138b22e8ccc0a86f35bb0aec9a176fb98e029085ce1436862175356d6524a5c2bcb98e82ba68e1d99faf3294b69a67dabb68d1f0967eb0faabb58b2cecfd71185764a18f83b13e6d11ebd53e3c30b73f70ecb889d1b10cdbfd030095697d685923cabf18a4ec7162a64fbe7e48e7fed5eaabde5ab4ad15378a4534373753faab15eab9df45835fda35ab51cb8dbc7f96d6ee666d7a9395ff713c866b37ae1311e9daf6e1370f69e874582f1fbb18a5be37fb252b535b35b0510b9f79ef8c5e67f8cbdb424c36faef351b536dfcefa17efd40e0104d7cfc89de4f16631a19d5cb3878b64fe089684c8183015a9a5f503d5e4ed4ce884e29b6523fc62d3830a2574ccda74c8c319eb80a23c375762baa8eaeac66a7a6a7980c83a29931989abad22eabbc5b14442b2fa219bdf47f35bbcaec8f9521354d6b1c0716437bb5cfdabe68bcfc071bdb65ac3d22a2cf2b8ce61367efdb57985a3adb4934431b4407fcd7afe12b7f9fa53000374d9bcdaec22d5fdfd13efa030dea76ee3c794c6d27dbf559bd723b4dc91f4a121d96a4a42449434327a4334d67f4fced723b2589880e4bd2c0d1012222537ddacfe9a30b7abb71f9927e2d79e33af7c930787ca85afe35b5bcb1fe89cf93ea5ae4f3b0a93d2f4fa076b9dd64afd69f3080b6bfa8e370ea6098d2b716282919c6a1629b6e8f4cbeecb3b67fe9e205ee9367a35884f633017560c0899423d3eaa9f2c6acd6f6a6ee39682fd8e3b45ac05b6b7f69396362544d7362d941e3c1bc6a665d6769662dcae0649f29fe09c6aab958653257cdc81b1706f234adf109d4d9ad9819d8629f674d6bb563bd7a5d8bd6e8f66d032855d70c7af420e4376aa0e14f1708eff491d7245d49133deaf1d5eee8c5410a7266e4ce761927de3ec58db1b252f048903e895ca2d623ad648dcf363535d3d3273b4c4d67d38011a0ed9659a369dacefa24e0c53f8da9a9a999929f8e53ebabaa864f1a62ab2ccdd8d4d44c43a92fdca32bc4d694464ddfa598e3c722e330dddf0bad4f2cfb346d6eb5c3b826e0a5e09120cd5e9f5619bfe4f50d9801b5cd307ed3683ae7f30d9903d352951162f118787142cc81ada15061e64adc148b2ac362b7b2aa2da99b70b00b338312e97b1eb472b178ccd1ced47cca94df54ce6a97965fb347bb8e6ab9a5e58cf73756a8f687f97b835de72351b5df5998c641d43ec7378f8cf642c321200f358a60c84f9e7771456640f1eaaead5a53a650024d786b3f30b6ff37b73470ef90bc325d1970ddcde5396d03855d8fd10a878e69272d461701a55c3d4cd93815fcfd4071a61d13dbcd556b12b5c7a9632d97d9e5e444ed0c5dae4c88cc7a0900a73ec3f5cc7aa9ae13a5cc99785a7bd1e51ca2a89c92ae437be3770a08a1b26909406ed3dc9fd483229449f5ba8651f83ff397db2c210a737d0396fac49856343a50a7542bd3fa2d278285923d3e6d75585e1cbb260742756f889c804d4bb3fa9b59474dfd1dbf63af375010eb2fe52b4f380ffd1bb8c9df0d681c3f77a67d460c6b4db530addf72428f264b7dd6c3980337335cbb954980c794228cc7ed0767bca2a8adbf514ebd46072aefaa0b63de780b9df903d07239c51d376b7957a6dd8b94db5435ec4c5ec071f719d3ba31a8e2128d914b95bd1a5edb07bf1f997536d346977db463c0e8b20706077f97a0e39e1187722d97d94777c8c9c3e5e9bd7059834356ce94c550d12c96d40b8e5d2edaf4bb645a91ef4204c6bc6bdde872ce33d3721dc5eb4411ad17ce5f1a6ab95cd5dca38babe0ad3d28e2fc25227e9cb6006e94a0770ea0922a1d280fd0a40fa7dd64b43b993167da0668dd9e6fe026f62dd37a897b3bbed9e33910a31fe0326d6ddf91882eb3e3e870d1ca3c8616c140c1bd7edb0cd6d0fae260349d03c5f933cfb3d3f266a44543f7ced9cf96591de579635a2386e6c5162b7e98f659685a1e66d6bd9fe69613629adf71b5ab3bd844ca7186b86953a6d396f8f5d9da17d15456c7da279a562e0129e31933a88e6edcbf3c7053e04405f8fdd8179a96815e4e75b714211c47e73293c9615d66889fc4655ae3cc9bb6e70b8cb93bde7e625a1e739477810154f3b9adb2471757f9fd00ffbed4d4df5aebe59467216fd1c5665a221ab8699f510040716786a5c88cd0695ca6d3ba30ad48bc6e3f32ad51d30a9d2286bd3eebae3056bcd4c468fb4cd36a767b3d7328fa49acda4f2eb4ac104e7691d7e4779757e64f8fa9ebe73f713cb9702a02f0ca17dfdda1e6caa94e2f271f3494223330d61755f274e1f55feaf5f54c2ee1f6b76abf9496411afaa3d899b6431fcfd2d653f171b8faa1f98401ebfe099fa9e3e07d007146bdb838c8ddf7bab30bbcfc12915f7f0a1c98a5c7eff3eb379dc66d29fa67be67c5b4caa4c00c2772665a81995c2f4d2b6aaf1f663296cf71cee2796a9f812d97d94f5aae865d079cfc484ea8f73eba9c035079a1c0e95fa90cdb2e3a33d312d1f4bd024efcc3fb59aede5f6569e12df1733e5af233139d66b828d312cd52e8e22085fffb98ba7e7648a8be3d675aaa3266fb9534ad093c814c4c4b44ad9753f876abcf96cf6a9f28f24e6787e42c25dfb49fce3dfbaf2cc5bf66efcb969b0669fc0df61372e24e01176eb7d2d6537bb9c08141baa43ca491df9acf049a3c58995cf21e5f2bf9a0591fdf4350cae20ce9e789e134e35386930575d7b40c0ccdbb8f8f17a656b438bacbea5cdb1dc76340a6e674614c91271bb601d9e1c9abd96f635a276d24c2805e92d7ef21040e0c52fecfe25ad48d69fda0c66c6e4c6b6428cf4c6b40b7279f9569b5fbd7fab7056231ae864a4b9a0e9dec21f9ab3cd1efdb88beca53fa611b6d3d756678a5254de9933dfa93696717f8e0252296e615d5a6565c01c0f30b637daeab59111c4de73c11ad5054c2809ede1c51253c5427a6b5aec28d9a95c92486f11b5df466374b23b218484e3833f8d43dc0ba1bcd2f02fcbd067c66ace1c3d80e4f0ccd1e66c1906690e89b9d31f5048248f2faf544d1374656b4ee7bf58bbc8175bb5ed7bf2161b5cb43b9a97b05d3fe54de5e1339a15e1fb899a9eec77570bca97b05289315078b54f7bdd6651f2f80f13b057d3fad16c75526d571e56a1b278dc1c44df5db5d4ec9ebf70ffc6ac2067ebfd191a9fcfcad05de6147799abfcf948542af361bf842a27b46d44f1b8aa25f49d0c01703c532a2aa5dbc32af170c8ca91a6c3f0c4c03f72f8a17a888f9bd6258c5e10d48031b6844cf0532eb25c733415eb1a6f048035f48f45f01d438a49f3d0bda36b406b336d00fd6a7a24a3c105057fd5a7c4dc30154374934fe066e036bc5ff03859b69b81278b6550000000049454e44ae426082</data> + </image> +</images> +<connections> + <connection> + <sender>Menu</sender> + <signal>clicked(QListBoxItem*)</signal> + <receiver>Tab_Signalisations</receiver> + <slot>setFocus()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>Menu</sender> + <signal>clicked(QListBoxItem*)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>changeTabSlot()</slot> + </connection> + <connection> + <sender>buttonSave</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>saveSlot()</slot> + </connection> + <connection> + <sender>stunButtonGroup</sender> + <signal>clicked(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>useStunSlot(int)</slot> + </connection> + <connection> + <sender>buttonApplySkin</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>applySkinSlot()</slot> + </connection> + <connection> + <sender>DriverChoice</sender> + <signal>clicked(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>driverSlot(int)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>accept()</slot> + </connection> +</connections> +<tabstops> + <tabstop>fullName</tabstop> + <tabstop>userPart</tabstop> + <tabstop>username</tabstop> + <tabstop>password</tabstop> + <tabstop>hostPart</tabstop> + <tabstop>sipproxy</tabstop> + <tabstop>autoregister</tabstop> + <tabstop>Register</tabstop> + <tabstop>buttonSave</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>Tab_Signalisations</tabstop> + <tabstop>buttonHelp</tabstop> + <tabstop>SkinChoice</tabstop> + <tabstop>zoneToneChoice</tabstop> + <tabstop>confirmationToQuit</tabstop> + <tabstop>checkedTray</tabstop> + <tabstop>voicemailNumber</tabstop> + <tabstop>useStunYes</tabstop> + <tabstop>STUNserver</tabstop> + <tabstop>playTones</tabstop> + <tabstop>pulseLength</tabstop> + <tabstop>sendDTMFas</tabstop> + <tabstop>Menu</tabstop> + <tabstop>Tab_Audio</tabstop> + <tabstop>codec1</tabstop> + <tabstop>codec2</tabstop> + <tabstop>codec3</tabstop> + <tabstop>Tab_Preferences</tabstop> + <tabstop>Tab_About</tabstop> + <tabstop>useStunNo</tabstop> + <tabstop>ringsChoice</tabstop> + <tabstop>buttonApplySkin</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">configurationpanel.ui.h</include> +</includes> +<slots> + <slot>saveSlot()</slot> + <slot>changeTabSlot()</slot> + <slot>useStunSlot( int id )</slot> + <slot>applySkinSlot()</slot> + <slot>driverSlot( int id )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/src/gui/official/url_input.ui.h b/src/gui/official/url_input.ui.h new file mode 100644 index 0000000000000000000000000000000000000000..799834218081035ecd7ba791fe2ae519f9f59de7 --- /dev/null +++ b/src/gui/official/url_input.ui.h @@ -0,0 +1,12 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + diff --git a/src/gui/official/vector.cpp b/src/gui/official/vector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c58d02b1f3bd2bb12b48afcc363a607858a55cf8 --- /dev/null +++ b/src/gui/official/vector.cpp @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "vector.h" +#include "point.h" +#include "transqwidget.h" + +Vector::Vector (QtGUIMainWindow* gui, const char* name, Point* pt) { + this->x = pt->getX (name); + this->y = pt->getY (name); + this->variation = pt->getVariation (name); + this->direction = pt->getDirection (name); + + this->gui = (TransQWidget*)gui; +} + +Vector::~Vector (void) { +} + +/** + * Return the y-offset of the gui + */ +int +Vector::offsetY (void) { + return (gui->getGlobalMouseY() - gui->getMouseY()); +} + +/** + * Return the x-offset of the gui + */ +int +Vector::offsetX (void) { + return (gui->getGlobalMouseX() - gui->getMouseX()); +} diff --git a/src/gui/official/vector.h b/src/gui/official/vector.h new file mode 100644 index 0000000000000000000000000000000000000000..ef0774808578582a46f7ff06ca146a182a290ba9 --- /dev/null +++ b/src/gui/official/vector.h @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __VECTOR_H__ +#define __VECTOR_H__ + + +class TransQWidget; +class Point; +class QtGUIMainWindow; + +class Vector { +public: + Vector (QtGUIMainWindow* = 0, const char* = 0, Point* = 0); + ~Vector (void); + + inline int X (void) { return x; } + inline int Y (void) { return y; } + inline int Direction (void) { return direction; } + inline int Variation (void) { return variation; } + + int offsetY (void); + int offsetX (void); + +private: + int x; + int y; + int direction; + int variation; + + TransQWidget* gui; +}; + +#endif // __VECTOR_H__ diff --git a/src/gui/official/volumecontrol.cpp b/src/gui/official/volumecontrol.cpp new file mode 100644 index 0000000000000000000000000000000000000000..adbc86af96533d6851b76286cc1635b8e0d82f54 --- /dev/null +++ b/src/gui/official/volumecontrol.cpp @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <qapplication.h> + +#include "point.h" +#include "qtGUImainwindow.h" +#include "vector.h" +#include "volumecontrol.h" +#include "../../skin.h" + +VolumeControl::VolumeControl (QWidget *parent, const char *name, + const char* pixname, Vector *v) : JPushButton(parent, name, pixname) { + this->vect = v; + volumeValue = 0; +} + +VolumeControl::~VolumeControl (void) { +} + +int +VolumeControl::offset (int dir) { + if (dir == VERTICAL) { + if (vect->offsetY() == 0) + return mouse_y + MAIN_INITIAL_POSITION; + else if (vect->offsetY() > 0) + return mouse_y + vect->offsetY(); + else + return 0; + } else if (dir == HORIZONTAL) { + if (vect->offsetX() == 0) + return mouse_x + MAIN_INITIAL_POSITION; + else if (vect->offsetX() > 0) + return mouse_x + vect->offsetX(); + else + return 0; + } else + return -1; +} + +void +VolumeControl::mouseMoveEvent (QMouseEvent *e) { + if (vect->Direction() == VERTICAL) { + // If the slider for the volume is vertical + QPoint ptref(e->globalX() - mouse_x, e->globalY() - offset(VERTICAL)); + if (ptref.y() >= vect->Variation() and ptref.y() <= vect->Y()) { + volumeValue = vect->Y() - ptref.y(); + // Emit a signal + emit setVolumeValue (volumeValue); + move (QPoint(vect->X(), ptref.y())); + } + } + if (vect->Direction() == HORIZONTAL) { + // If the slider for the volume is horizontal + QPoint ptref(e->globalX() - offset(HORIZONTAL), e->globalY() - mouse_y); + if (ptref.x() >= vect->X() and ptref.x() <= vect->Variation()) { + volumeValue = vect->X() - ptref.x(); + // Emit a signal + emit setVolumeValue (volumeValue); + move (QPoint(ptref.x(), vect->Y())); + } + } +} + +void +VolumeControl::mousePressEvent (QMouseEvent *e) { + mouse_x = e->x(); + mouse_y = e->y(); +} + +#include "volumecontrolmoc.cpp" + +// EOF diff --git a/src/gui/official/volumecontrol.h b/src/gui/official/volumecontrol.h new file mode 100644 index 0000000000000000000000000000000000000000..41816c82ca8e81e8e6dd96db5e0397c6be120bd4 --- /dev/null +++ b/src/gui/official/volumecontrol.h @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __VOLUME_CONTROL_H__ +#define __VOLUME_CONTROL_H__ + +#include "jpushbutton.h" + +class Vector; +class VolumeControl : public JPushButton { + Q_OBJECT +public: + VolumeControl (QWidget* = 0, const char* = 0, const char* = 0, Vector* = 0); + ~VolumeControl (void); + + int getValue (void) { return volumeValue; } + inline void setValue (int val) { volumeValue = val; } + Vector* vect; +signals: + void setVolumeValue (int); +private: + + void mouseMoveEvent (QMouseEvent*); + void mousePressEvent (QMouseEvent*); + int offset (int); + + int mouse_x, + mouse_y; + int volumeValue; +}; + +#endif // __VOLUME_CONTROL_H__ diff --git a/src/gui/qt/url_input.ui b/src/gui/qt/url_input.ui index f213aa8d942ca95968190b8470e11c394b3ed936..b06767a7d95d4a7273d17ece47382f091dcc4108 100644 --- a/src/gui/qt/url_input.ui +++ b/src/gui/qt/url_input.ui @@ -1,126 +1,1273 @@ <!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>URL_Input</class> +<class>ConfigurationPanel</class> <widget class="QDialog"> <property name="name"> - <cstring>URL_Input</cstring> + <cstring>ConfigurationPanel</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>250</width> - <height>21</height> + <width>561</width> + <height>552</height> </rect> </property> <property name="caption"> - <string>URL_Input</string> + <string>Configuration panel</string> </property> - <widget class="QPushButton"> - <property name="name"> - <cstring>buttonOK</cstring> - </property> - <property name="geometry"> - <rect> - <x>208</x> - <y>-1</y> - <width>20</width> - <height>23</height> - </rect> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>23</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>23</height> - </size> - </property> - <property name="focusPolicy"> - <enum>StrongFocus</enum> - </property> - <property name="text"> - <string>1</string> - </property> - <property name="accel"> - <string></string> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>buttonCancel</cstring> - </property> - <property name="geometry"> - <rect> - <x>228</x> - <y>-1</y> - <width>20</width> - <height>23</height> - </rect> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>23</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>23</height> - </size> - </property> - <property name="focusPolicy"> - <enum>TabFocus</enum> - </property> - <property name="text"> - <string>0</string> - </property> - <property name="accel"> - <string></string> - </property> - </widget> - <widget class="QLineEdit"> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> <property name="name"> - <cstring>url</cstring> - </property> - <property name="geometry"> - <rect> - <x>-1</x> - <y>0</y> - <width>210</width> - <height>23</height> - </rect> - </property> - <property name="minimumSize"> - <size> - <width>210</width> - <height>0</height> - </size> + <cstring>unnamed</cstring> </property> - <property name="focusPolicy"> - <enum>StrongFocus</enum> - </property> - </widget> + <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="Line"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout28</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <string>F1</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>160</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonSave</cstring> + </property> + <property name="text"> + <string>&Save</string> + </property> + <property name="accel"> + <string>Alt+S</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="accel"> + <string>Alt+O</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <string>F, Backspace</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QListBox" row="0" column="0"> + <property name="name"> + <cstring>Menu</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="cursor"> + <cursor>13</cursor> + </property> + <property name="currentItem"> + <number>-1</number> + </property> + <property name="selectionMode"> + <enum>Single</enum> + </property> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>TitleTab</cstring> + </property> + <property name="font"> + <font> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string>Setup signalisation</string> + </property> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line2</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Signalisations</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>SIPPage</cstring> + </property> + <attribute name="title"> + <string>SIP Authentication</string> + </attribute> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout24</cstring> + </property> + <property name="geometry"> + <rect> + <x>16</x> + <y>12</y> + <width>401</width> + <height>393</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox1</cstring> + </property> + <property name="title"> + <string></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Full name</string> + </property> + </widget> + <widget class="QLineEdit" row="1" column="0"> + <property name="name"> + <cstring>fullName</cstring> + </property> + </widget> + <widget class="QLineEdit" row="3" column="0"> + <property name="name"> + <cstring>userPart</cstring> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>User Part of SIP URL</string> + </property> + </widget> + <widget class="QLabel" row="4" column="0"> + <property name="name"> + <cstring>textLabel2_3</cstring> + </property> + <property name="text"> + <string>Authorization user</string> + </property> + </widget> + <widget class="QLineEdit" row="5" column="0"> + <property name="name"> + <cstring>username</cstring> + </property> + </widget> + <widget class="QLineEdit" row="9" column="0"> + <property name="name"> + <cstring>hostPart</cstring> + </property> + </widget> + <widget class="QLineEdit" row="11" column="0"> + <property name="name"> + <cstring>sipproxy</cstring> + </property> + </widget> + <widget class="QLabel" row="10" column="0"> + <property name="name"> + <cstring>textLabel3_2_2</cstring> + </property> + <property name="text"> + <string>SIP proxy</string> + </property> + </widget> + <widget class="QLineEdit" row="7" column="0"> + <property name="name"> + <cstring>password</cstring> + </property> + <property name="echoMode"> + <enum>Password</enum> + </property> + </widget> + <widget class="QLabel" row="6" column="0"> + <property name="name"> + <cstring>textLabel1_3</cstring> + </property> + <property name="text"> + <string>Password</string> + </property> + </widget> + <widget class="QLabel" row="8" column="0"> + <property name="name"> + <cstring>textLabel3_2</cstring> + </property> + <property name="text"> + <string>Host part of SIP URL</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout23</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>autoregister</cstring> + </property> + <property name="text"> + <string>Auto-register</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>201</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>Register</cstring> + </property> + <property name="text"> + <string>Register</string> + </property> + </widget> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer9</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>21</height> + </size> + </property> + </spacer> + </vbox> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>STUNPage</cstring> + </property> + <attribute name="title"> + <string>STUN</string> + </attribute> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox3</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>110</y> + <width>253</width> + <height>100</height> + </rect> + </property> + <property name="title"> + <string>Settings </string> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_5</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>38</y> + <width>229</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>STUN server (address:port)</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>STUNserver</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>60</y> + <width>229</width> + <height>23</height> + </rect> + </property> + </widget> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>stunButtonGroup</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>90</width> + <height>81</height> + </rect> + </property> + <property name="title"> + <string>Use STUN</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QRadioButton"> + <property name="name"> + <cstring>useStunNo</cstring> + </property> + <property name="text"> + <string>No</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>useStunYes</cstring> + </property> + <property name="text"> + <string>Yes</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>DTMFPage</cstring> + </property> + <attribute name="title"> + <string>DTMF</string> + </attribute> + <widget class="QGroupBox"> + <property name="name"> + <cstring>SettingsDTMF</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>301</width> + <height>130</height> + </rect> + </property> + <property name="title"> + <string>Settings</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout11</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>playTones</cstring> + </property> + <property name="text"> + <string>Play tones locally</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>111</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelPulseLength</cstring> + </property> + <property name="text"> + <string>Pulse length</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>115</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QSpinBox"> + <property name="name"> + <cstring>pulseLength</cstring> + </property> + <property name="suffix"> + <string> ms</string> + </property> + <property name="maxValue"> + <number>1500</number> + </property> + <property name="minValue"> + <number>10</number> + </property> + <property name="value"> + <number>250</number> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelSendDTMF</cstring> + </property> + <property name="text"> + <string>Send DTMF as</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>85</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>SIP INFO</string> + </property> + </item> + <property name="name"> + <cstring>sendDTMFas</cstring> + </property> + <property name="currentItem"> + <number>0</number> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Audio</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>Drivers</string> + </attribute> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>DriverChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>410</width> + <height>180</height> + </rect> + </property> + <property name="title"> + <string>Drivers list</string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>CodecsPage</cstring> + </property> + <attribute name="title"> + <string>Codecs</string> + </attribute> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>CodecsChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>10</y> + <width>133</width> + <height>157</height> + </rect> + </property> + <property name="title"> + <string>Supported codecs</string> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>110</width> + <height>120</height> + </rect> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec1</cstring> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec2</cstring> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>G711u</string> + </property> + </item> + <item> + <property name="text"> + <string>G711a</string> + </property> + </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> + <property name="name"> + <cstring>codec3</cstring> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4</cstring> + </property> + <property name="text"> + <string>1</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4_2</cstring> + </property> + <property name="text"> + <string>2</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_4_3</cstring> + </property> + <property name="text"> + <string>3</string> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>RingPage</cstring> + </property> + <attribute name="title"> + <string>Ringtones</string> + </attribute> + <widget class="QComboBox"> + <property name="name"> + <cstring>ringsChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>21</y> + <width>150</width> + <height>30</height> + </rect> + </property> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_Preferences</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>Themes</string> + </attribute> + <widget class="QComboBox"> + <property name="name"> + <cstring>SkinChoice</cstring> + </property> + <property name="geometry"> + <rect> + <x>12</x> + <y>42</y> + <width>110</width> + <height>27</height> + </rect> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>buttonApplySkin</cstring> + </property> + <property name="geometry"> + <rect> + <x>136</x> + <y>40</y> + <width>80</width> + <height>32</height> + </rect> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="accel"> + <string>Alt+A</string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>Options</string> + </attribute> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>262</width> + <height>200</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelToneZone</cstring> + </property> + <property name="text"> + <string>Zone tone:</string> + </property> + </widget> + <widget class="QComboBox"> + <item> + <property name="text"> + <string>North America</string> + </property> + </item> + <item> + <property name="text"> + <string>France</string> + </property> + </item> + <item> + <property name="text"> + <string>Australia</string> + </property> + </item> + <item> + <property name="text"> + <string>United Kingdom</string> + </property> + </item> + <item> + <property name="text"> + <string>Spain</string> + </property> + </item> + <item> + <property name="text"> + <string>Italy</string> + </property> + </item> + <item> + <property name="text"> + <string>Japan</string> + </property> + </item> + <property name="name"> + <cstring>zoneToneChoice</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>31</width> + <height>21</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>confirmationToQuit</cstring> + </property> + <property name="text"> + <string>Show confirmation to quit.</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkedTray</cstring> + </property> + <property name="text"> + <string>Minimize to tray</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_6</cstring> + </property> + <property name="text"> + <string>Voicemail:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>voicemailNumber</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>61</width> + <height>21</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + </widget> + </widget> + <widget class="QTabWidget"> + <property name="name"> + <cstring>Tab_About</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>DriversPage</cstring> + </property> + <attribute name="title"> + <string>About SFLPhone</string> + </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>pixmapLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>50</x> + <y>40</y> + <width>312</width> + <height>91</height> + </rect> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="geometry"> + <rect> + <x>20</x> + <y>170</y> + <width>371</width> + <height>121</height> + </rect> + </property> + <property name="text"> + <string><p align="center"> +Copyright (C) 2004-2005 Savoir-faire Linux inc.<br><br> +Laurielle LEA &lt;laurielle.lea@savoirfairelinux.com&gt;<br><br> +SFLPhone-0.4.1-pre1 is released under <br>the General Public License.<br> +For more information, see http://www.sflphone.org<br> +</p></string> + </property> + </widget> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>CodecsPage</cstring> + </property> + <attribute name="title"> + <string>About Savoir-faire Linux inc.</string> + </attribute> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="geometry"> + <rect> + <x>85</x> + <y>126</y> + <width>291</width> + <height>131</height> + </rect> + </property> + <property name="text"> + <string><p align="center">Website: http://www.savoirfairelinux.com<br><br> +5505, Saint-Laurent - bureau 3030<br> +Montreal, Quebec H2T 1S6</p></string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>pixmapLabel2</cstring> + </property> + <property name="geometry"> + <rect> + <x>130</x> + <y>50</y> + <width>173</width> + <height>48</height> + </rect> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </widget> + </widget> + </vbox> + </widget> + </grid> </widget> +<images> + <image name="image0"> + <data format="XPM.GZ" length="58862">789ced5d596fe3b8b27e9f5f114cbd0d0eea6475625cdc878eb3b4b34ca72799e9745f9c07c74b76c776363b07e7bfdf629194488ad49249e4f40151109292488a923e7dac85a2fff9dbc2e9d1e1c26ffffce5fea1f370d95de85e74260bbff51e6f6f67fff7affffdf72fbfae2c2d2f34971696165717967ffdc72fbfe21f0bdd05682c37d61a52ffcc7a87f40eebbb4a6f2a7d47e93da57f17fafa4aa3b7be2274e8487d7d49eab8a4f43575fc96f533d2cf58df547a53e953a5f794fe22f48d95f5de866caf2df58d25a9c34ce96beaf8b9d4cf96cf56f9f890f5333a2edb1b2bbd29757c547a4f1d1f495dd7c78b44efb13e507a43e9db426fae6ef49af27c7da93797943e50fa9ad4f145ea49fd65a577947ea8f5ee1ad7df557a5f1e872dadcbe3f8c47a97daefb2fea0f4a6d2ef95de53faa5d4757de849bdbbacf496d03babcd5e47f6ff52ea9d25a583d2d7a48e7da927f59f125d5ecf27a537947ec47a97eacbfe4c94de51fab1d2fb528767a927f5af94de913a74b5de93e7df577a5f955f14fad96aa7af9ee758eac9f36d28bda1f0b22775dd1e9e28bdaff403a9f79695bece7a2f799e23a5ebe7f9ac74f5fc7045eaba3e7c4af43e1f5f557a43eac0f8eaae25cffb4eeafa7ee354e90da5f7a4aeebe3b5d23baa3d7e3fba3d7d3fe14ee9ea7ee250e9eafec195d4757dfc5debfd06eb6b4aefabf62fb42e8fc367a9f79795ceef5b6f2db99f33a927f7734fe90da57f937a52ff20d1657fba4a6fa8fefc99e8f238bf2fd43b7d3f51e9fa7a6e95aefa8f9b52d7f5e14ce91dd5de86d0fb0d7d7df855eaba7fd854baea0fec285dd587b6d607f2f8b5d2fbaafd2f5a57c7f97dee27fdc153a5ebf6264ad7f5ffd2baac8f37521f2c2bfd4ce90da5ff10fa20391fee4b3d29df52ba2edf49f4019fff46e91da533df0c06fa3882d2d5f1af0f4a1f683d4a94fa24622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d7f177308d821399bf77544f979e4b598c32ef6b08f033cc70bb55de2155ee3cdbcafe8e30bdee210ef7084639ce03d3ee0233ed1df09e9cf38c519decebb87ef2bd53147ac768d2f8cb601612dfbf7136ecefbaa3ea2600bb70855dbb883bbf8b960dbc5366171847bb83fef7ebfbd54c51c1e58dc16da0e3f0eeef81df91dbfbc4bdbfb848b23622d282cf99570f4c7abb6e379dfc1b7962a98c31b1a3ffddce6fb7b52aac53f091107344a5ff2d87c42e8f8eb2daf0fbf25fd7973d4e1293392e0a5eff8a3a0ec6221b785b6a5b7eef7bca53ce6e8e915f39bbd2de7f916c43f57c17a2b7ebb903c966f6447ae166c6b29be08cdbaddde5bdf3b6c187c342a28bbe4e1b0255c278edcc0267e05c42d00e8f8b80ef0ad7b3e5f298b39465c96cb06849b2b42c8359ce1267433c797b1e36d0d88db2e0ab8f2c41db108a56539f602bfa9f324fbe1cd31077d838f724740ea4786bf60e02b07e7597b0fcedfbae7f3957298f372dc00d7ac327f911597e5ac818fb108a7699915dc14c8c40e9cc105f48cba874ead9ea7fdd0c67da3676df8d56f7defc8df4cb928b7751a855deeea602b507694e1bac5b7eef97ca50ce6f08b974baecd32c47321cec93c0db2e0521f37c38364e3ad32838ae3dfac73749df69709bb3d204e931bc915fd774dffabbec14d5e3ffeae900f9a72513ee6006e1d9edb0a9786a1c373776fddf3f94a29cc2dfbb8c4ba4b6730cae19c15abb52fc9fee073a267744163ab331a1242cd7657a13016581fcf6151d99151760727b9656fd9fa53e561f8d6fd9eb714638ec63eafdd649559ceb7afe0dadb5ec5f8b1652f96b2ce98e7743fde97e7c685a587e42734b3f13698900771ef29dfa211f9166790d766618c46956bc2234ee9fca76f7d0f5e234598a3912ec45f3725caa80d9e8c7bfca4f62f57ed2b3c57e5ac6a3c87fb70477e64533c49dcc7198ef101a6f81d66788477d9676ff1dc1fd2d2a7e7fa0c973084195c12b70523bad4b3676a7da6f90c3a30a61acd40e91f7847e567844260940e71421ecc928e1e877009f7e40bbfa49c293816c80dae7ae7df568a30079fcac4df380b96ef4b265137b6d5c4fe4f55fb6ad87307256b54b0e70861a94fd9f1c6ca1c5bdee439e6ba4e12af4bda8147efb9a6b0e9cf3f402bcb4584c5cf057ddbf58dd6701eb80eb204ca32e47b4821cf0d82fc3548fb4dcfd66bf319db956a2fe144c8b1a2037d49ec39b82859a302cf116b14e604888b8c676bf35cb0ceb6739e0d62a6dc3a84310311706ff154f83cb6853d8171ee39a64551ecf7937ccc4149eee2d859418e425bfc894ffa37ecb9b29833edb97c8cc343b9bc00f99f498cc3e539ff465c6322085d2ef46e064e7156a65fcca98955483ed8b0b04e7b5e5c5780b96e0e772dbb1126f20ef2b84e656089add27c43a5ab4eed3928392e97e7395f3e1436c9f619e13d8f50e9fe84e9caf11c6d897f41c8dec91cff4ee36cb64edab359e9dc6ce2e11253da1cb8497bc66401dad7f72131c7fe68c817ddf194ff421e4288eb5655995563ff7295b900863d57d287b0ecb9c3dc92599e3347d16d63ffae1e95b23c0703c2e83159edf6fe84b518a5d639a4f5c6734edaceb199aa93e1397811ef029dcbe52e957f33f2c09f79144d7c06f2904d3bf27b282efdbe92873908fba397e18c395c046cc0849bac5cc33969d7e5f2ef567ceeba548dd7f39ce32fc038cb412ecfe9d82db6c0e226d00c3fb4b8a7a351a5fbca2832b849ed77788ed84af11379d98e1da86a3c18fb3fdb769b7d9daead598fe4610ebf0438ab2036a66c3bb75e12d123241c7a8ef7b1879b79715e279fbb92df0bae61c6e772633336cfd93618f779cb3caef6d93c67645c9969b2e56d2ef5cc0ae051362dc3fce4f09cc54d60e571a1aff6764c4ecc9c636a5c67e6681d928bb96e96af60b7242765e78c185164c2c20a86e6e1898cd6375f9b467c4ee57269cf09b1a42d9be96c1693e7f27d0887e71a9eb34f8de3724434796ed78ec5391cc8c74c5b0ebc36059c5b9cc628b679ce9e1940bd36cb735c86fc629b17ad5929ecc398c7e71025ce1d5bcf325c5421a606570e9739f32838bf15f6750fb3a36726df1afeab50f76a7bce1335b5388547c5bc3c04581c28222c840593af02790b93a3a41de8f09c937b25de73cb8f1c3b8fd80cef69ef049f4c8e53dbccdf8ff7945c9edb7478a56214173edbf5bde7001ac1d788ad2e3dbce7ccb374f2ad79db4dd27aba2f17738e9de3cb45ad1bfcf0cc7bcc7925ce1be5d85a6453c1a3c55781f94966ec0ea6bcc7b6e79cecabe5f34a9e9b94f673c5f6fc1628aa26b93cd7b6b8a354ae8afcd6d574ae0878edb990e00d95bfb238cb9a7f97999f774863ab98a3796d6e84f4c4267c9d3d07de397f8c22cd5b6ced59f69c930720567379cea8af6d35cf3dc8f4c3e1b90da757e30ccfdd67b82c67f3e749de577279cef65bd3b9b7c44df464fd3697f4493fe9a33c37d3f15bf385ce7a62d88f8615e6d873d725be427815cff96d2df23a537e38e23da6cde662ceb60f7f64e6c505ec28b8346d446ec9e63907ab561f183fe4d796e5b85d7a6be610a32b88cfa5398313b56713b59de68d3d305e64fcaec7333121c9af96f0339356560dae4bfc34d39e2b9789b0ecb9f27eab27f2e8f014fb9c16cfb9b195877c9e0bcd37b7da6cf31e8be7dc6cbe555ef2dc83cd6564cd1d1147cf5c216fe263c68493f9bc623612f9142f066f9c786b98b9089e73492894ba971773ceece42fac7c6bc95cadc573b963bbc34b9ef920786c1c67abaa22cfd97c159887697d3721f754e4393cb2ec46af9d305f29c0dcb5b68792586f9abff4320d5c383ee441e29b56fad69ff854b7b39ab49dda732539d3b2e7cef3de6b87973c2c0426dfb0556571cc716e7b82e79a165f79470998581cb5ce67a9ca730dab8dc2797df54b01e63a094f64e36dde6f02c907f5fb92157d5e6c2575137e34f2adaf9957720139b90bc76fcde484a83fd9785b259e7338cc6bd1d9795299d7a8cc73b7561b7e0b08e6397bb370fedc5e300ee6650d62466f79a8b8a289f18d57ea8526f65cd9d62c7bee22ef8b5b273eb7eb8eae3831b84667a52ad9733cea99e7c85eb39527d57da8ca734e1ee2366b27e0a2884e136fcf213627a4107367c118981f7327deb2b93ea3b79d6b6d131afbd2f85cc9595036cfe5f1a39b6fd579247517d0e21a9d4bafca734de71c1607e186fd0dace6daaa3ca7a2d7693b632b5b36219426b6dec7cbf1ababfa1488f5fba3584f5e4eec5a2d7e29c20c8d6487b23e18350d7baee437f98e3d27da7bc26bfe4aec0c76f026b5313df34a1e93f9235bc416296725b9d86af61cd77062678487a9980bcf2b99d8f3eabeeb79ead5790ef7ed6f64a9f777c4a12d7a73d6ad3cc72eeebd359eca4809cc75d03f4fe44f4fd91b1f278215eb861ecab973413f965a39d4fc68bda3697cae24e65c9ef36df024d8cfbf9e08bc40dfcab38a2dc9c556e539f12e79e7cae5e607aaf31cc7654a9c43e639ea9752df1afee9e52e8f756ac5d5923cab3d57c498537268e62cd4d18ecafecbfa16b68cf85ce9b547f025688f5a9c5d7a9ef0d8988d6bd671fc43e215b3debeb17fa9c479ccb97b95798ef717ae8f42e89fd3ecf492dff11f7839c2f10369b4cae44c61e4ceedc41bd8b2ca5c72066b8dc6bc7dec9bf1347b44b66276a5a39999b928be6d10e2b90cefb5cc33e3c4389659338e9ea93e66dd01f12d56ee7976ecd89df33d843b37fbd8386665897196c7a9e4417cd0ef218c2b58f172841127232bed30cb21bed9c41cc53bcce59e174260c6e6c3dfd5f10a1e49609d15fbef75a9ef2176325fd3fc20ab4b1e6b7bce7cac8e7dcfe6f3f1ab9527357dd5a32c16f029e1a6ec9a08a9afbbebe662bf8a6fd9be67cf43e79e8b1da7a5c2ba4c2b7e8e202611ab21f9befbbac89b794e185dc1cb6c7be4b3acf96b243c7a55e50af10b5c65e6d8a5f24d62db89cf6d8ad506f116ce0939c46770e7fff29438eb0e4710f2e167b01d5ef781fcd4291e93bdb8091db21bc70070e79bcfc2e74142cfc8df07f2b7ee704cfdf0f7615f7c718b47d4fe0c0506a7f3febab5e2fa73df8cfc6be15ff2154a45d1e89e7dc12e1c10a20af334342e1f54cba1951587e7d6dfe31c51a4545b67932cfcb273d856e77d65d5c4b1e7fecb57f49daf545f4f18ce3cebcc59f3e4b057cc581f4d2c9efb3ecfafdcfffbe575eba613dfadaa58b1c96dcb7812b2c53eba58f3e7e6f265cacf254994fb156b6cffbddf87c01659619bbcc666096bec230b790c29cfcdbd37957b7f1b9a1bf54ee79b605bcc3026ff7b884fc15253ff4c82f83b385ae025b1e77e8a95cac9537dd4cf148f0803019ff75dcedda7bbb52efa407f3d7122eed30f98fa675245cc6949e69ded64e35c1f51a08f6d9d8703a0ff6bf47b08ed7c6e62b2761073b774ccfbf646cca5c22b03ce7e8e5f01c12631db4b92d53f224ea9317b8adb74be06af36360dadb543e3ee4be4b9aa8220a2baf82c249d394c96df3eaf8ad8247c9a6b81006ee008c5bccb75f5053e582b324d6cfe34d6779af1d7a723dc4a66ac00b5b108e7380cc589517c952884bf06123c074311b9a636c4b70fd64a50740d47b84eef53c1db04f738c6276a690cad74bd46c2ce3936685ba7f6f5fcaa323c774ac7bcbf60103117161abd8e047a080153fdcee20f7a26e24edf132a1e04d7c84c83989706537af6e2c91fd3336b094b3bcd55c13d3dc9699a3d23dc3e0a1c93d5d3a2273862643cc240cdeedc127692380fb5ef99274f3d7a54fd78e49537c56a9a6dfebda60798d179fa12a9544eac43774c489ca2f82e312707c1f938d9c63db5a1381487b84d75c53b764af7635baf6020ed39be2f219e8310f746cc85c5e405badb6da103f38bcea0121bb465665d7872aebf4b8c933c0f40ae97cc04854769f513e2da3ac34a3ca34ac09d6431f20a037379457d3ece7599e7668a5d9b023bb28764a3b6d3160889399683b8428d4a14efceb6ea53bab2a5e895fc46a304cf718b5e8c47cc95131ecbf6388ed74e5732a7777906721d89470fe6c8e6d2775da09339418f4e13815562b7a9594bd86522064123aae0b87e78ee07f1a4e04048eb19ebe22d4aeb9d38746622826c84b66f25163ec69c9a9ffbc73d7d8d65ec3931c3c0bf3f62ae8c306371448a79cef8f681ac37f915ea3a3353c35979eb51e7f84539168dc16dc144b2969e1387fb0223e249499ecbff5d0818a4f612fbad49691a0fd9cee335eddae96a13c2560bc51e39da92fb8d188fad8a87cbf15c287a1331972fbc7afabde4288101c173e69a21642bb5d53aeb6c0d11f7b4d2df39c4b1b4e8041f12beee68ec92df729dca919af889ed3042e494acf47b14489ae9b857becd0f2de2448d6830ed3ee6e24bf9a6703bf41fa1f888da7e0afd2e19db0ea17b704a0c3911f6a8b01f794f097b2e2c117321c1167b09fcf536bde3438939e639e38b6ec154fa7fb27deea43f49a5e52a3a5bd25aa367ced8a3b148f2c4a2fcc2465873f42cd14597e4b982fedda74cc83c675a9fcc73b0adbcd912d11fb6e63c5fe4d01508bbe007db78e2ad929e45299e0b49c45c48c4334d474acef69c2b9e33ec7ab6d2adf71c26621c250e427e4ec2b34cd0c156d8808f4b5d708767652469cf15f58fb84dfb32c29e4b7a21ceca3c37947fcb5e6d766c657b33b100c5fb26cb94b3e7421231e717810ecbba9f04786e94c58688a7249ee391b2e3b46fda521ea9f47685e5e5fb6587923c67d973e6ac7969cf9d9a9e72416b23ee97b326077be3497e83af3df2dcbb094cf819682ff394b5a987e746ca9e33c625b6a75ea4b720d0435c90c6e59e9903d3b89df00492f9bf34864ba40ec379cca4ec84da51dfae727c2ec3733c86bfa4ab7d91b5300dfa98fb6caf6d2719dc0deaa988eebda416204764c6b2d7ca9e1be6d97310f855b388b990f00828be09ddc031fb93722685e00e234a4b969a8c9534e8dd5f17bf8e04d2a6532312790f633342c1f113834f84374825d6a9ddafb00d331561c6222f52fbd26a55b2a30ccfc9d8728bfde545dc00b16eec76deec059cb1cd3aa41a138ef08937e996e37e77e25de0b743c70f5b9263a5671c686f3fe621aa0bee894c02bdef7b34aaece9cc8fbd8616dd5995d1a2e313fe052f61bf19712ef1bcac1a5fed118cd8846a127300e156b10c79230d7745cdac48bb51b02e21d62a0d8f464e6e28fa457d1a17fdde35e1f252bc5d847cd01904eafdb6f88e82aeee2b217028475a7a0ff95706443fc3bf688c81bc47c4dccf2c345abef91783ef3fc721622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b7efdcffffcf2ff6d14cd7e</data> + </image> + <image name="image1"> + <data format="PNG" length="3625">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000df049444154789ced5d5f681cc71dfe6d21c529a69c4b1f24438b14eac0a9b4b0aa52904a83566f91e440a4bed8322ebdb31c1af925919d87da71b89c5f94cba5b8951ecef11904920d8ea4827c4a4145e7a0700ad8d5a918ee0c0e9c835a4e460f6721ccc9e8e5ebc3deeeed9f99ddd9bd9323c737603e4b3b7f7e33fb9b6fbff9edcc8a40445789a86e0800eb0000642a885da0eeed34f085c59a1d34f5a0080090134ba0084091192e2a93c0e8e22a00e0bbee78039f5ff45530b7a91268606c0694af38a6470c1480d03c1a0edc40cfe8ad000065d29d51bda2320914b7cb0d09d1402114ca885d9511fd30aa178c2ee71a8edb405774cd90db2c414ed497599d504e2c352443031dd1310336814061ef19d68a81b19986e336908bdc0bb9cd1202633e187322054a009458022580de39355a30932f562586403d75715c00e389ab080d876cff62f11800a0582c3e3f9204406a3e55d7095dde2e23168f21341c4267b782d070c87ffd7b601f0bebc3b01507c3361c53a68067c2b8d8069007821d32721d05043b64fd1febe7f391e873c1ece72351ddfebad9bb08db78bc736ed4d744de13fb18689f79bbf0ccb02229f4c5aa2f8debc77143c321d38d50fa7b319eb80a00989a9e02e280d2df6bcab39a5dddff8cabd95f2f8780d961831d72cd4c5b57fb3868fb8552f6a84137dd1d569eced4a47195c925718782996171873f80780060b7f24873a8170f50fb8d702b5f43fd28fab00f4067b7627b0261dd65bc9e817d6ef9a5ab441426a224118501481fcd12d120118961e8b52c25df68275e0aff334bd7eeb60bd7c7c3a9b71ed2d0af5f9192467b1998cdaee2c4e9537afb8ad24313b1b86b391302183c3e44f7bfb9cfec93a2f4d0d9e1116a7df515a9ab5bc1d6932d0a1c0cd0caed3425254932d6975ecee0c2c50bb4f5648b824782d47be3baa4d999bcd14e6b777b68ebc996a9fee091207576c874f6bdb3e6fae240db0d75acc73f1da79ed77f274d24ae62e2b309bd6c5353333d7ab4414444f977b3941c32dba3a166372be5ef66d57601f41cedd3eb33a6c0c100ad2869da18dea0e6c3872551fb0207037a7f75fb004c5c49d2ecad395b5b4d4dcd943eba403bc776e8e51fff484a1299679e9f375c4ec9ab86757b8326b48701768da6f4f702ebc0d2724668c66b653bbb15b52315a67de7dca8ce489ddd0ab00d14bb4b261962adafd45fb65d8fc56376fb1681d070c8549f551b9a18b154f93d43936aff3f1f89f2c76b97adf97107eadac4d09ed2df0b00aa84aa8c8396bfd45faecd3e0be397facbeaefd7818163c7cde35d617a9d69c3f3abb8b6e683119bd284d33dcc191b26a26b1e99db09a31707a9596233879529db5ee3b33f913ae383475aa9a7bb87868e0f99190d40762d4bededbfb131745b870cad8efcdd2c4d5c4992914996e617aacc63b1237f374b0bb716e8dc471fe8368c0c876968e884b99d69a0edafe672494992e286b647864768e4ed5352783884afd7d64c7d0b1e0952e8d871ea7bb35f9a9e9ec2ca7f86e8e956988888da3bba68e47458edafa59d81a303d4fae107eee3c0e8972ffb8ef651f87498b4eb8ad243edb1b8e9fe5e884431776b8e88883a6599ba3ebb26a91a62b7b6786c8ea76b37ebc7b49ea309801ad69a138b22e8ccc0a86f35bb0aec9a176fb98e029085ce1436862175356d6524a5c2bcb98e82ba68e1d99faf3294b69a67dabb68d1f0967eb0faabb58b2cecfd71185764a18f83b13e6d11ebd53e3c30b73f70ecb889d1b10cdbfd030095697d685923cabf18a4ec7162a64fbe7e48e7fed5eaabde5ab4ad15378a4534373753faab15eab9df45835fda35ab51cb8dbc7f96d6ee666d7a9395ff713c866b37ae1311e9daf6e1370f69e874582f1fbb18a5be37fb252b535b35b0510b9f79ef8c5e67f8cbdb424c36faef351b536dfcefa17efd40e0104d7cfc89de4f16631a19d5cb3878b64fe089684c8183015a9a5f503d5e4ed4ce884e29b6523fc62d3830a2574ccda74c8c319eb80a23c375762baa8eaeac66a7a6a7980c83a29931989abad22eabbc5b14442b2fa219bdf47f35bbcaec8f9521354d6b1c0716437bb5cfdabe68bcfc071bdb65ac3d22a2cf2b8ce61367efdb57985a3adb4934431b4407fcd7afe12b7f9fa53000374d9bcdaec22d5fdfd13efa030dea76ee3c794c6d27dbf559bd723b4dc91f4a121d96a4a42449434327a4334d67f4fced723b2589880e4bd2c0d1012222537ddacfe9a30b7abb71f9927e2d79e33af7c930787ca85afe35b5bcb1fe89cf93ea5ae4f3b0a93d2f4fa076b9dd64afd69f3080b6bfa8e370ea6098d2b716282919c6a1629b6e8f4cbeecb3b67fe9e205ee9367a35884f633017560c0899423d3eaa9f2c6acd6f6a6ee39682fd8e3b45ac05b6b7f69396362544d7362d941e3c1bc6a665d6769662dcae0649f29fe09c6aab958653257cdc81b1706f234adf109d4d9ad9819d8629f674d6bb563bd7a5d8bd6e8f66d032855d70c7af420e4376aa0e14f1708eff491d7245d49133deaf1d5eee8c5410a7266e4ce761927de3ec58db1b252f048903e895ca2d623ad648dcf363535d3d3273b4c4d67d38011a0ed9659a369dacefa24e0c53f8da9a9a999929f8e53ebabaa864f1a62ab2ccdd8d4d44c43a92fdca32bc4d694464ddfa598e3c722e330dddf0bad4f2cfb346d6eb5c3b826e0a5e09120cd5e9f5619bfe4f50d9801b5cd307ed3683ae7f30d9903d352951162f118787142cc81ada15061e64adc148b2ac362b7b2aa2da99b70b00b338312e97b1eb472b178ccd1ced47cca94df54ce6a97965fb347bb8e6ab9a5e58cf73756a8f687f97b835de72351b5df5998c641d43ec7378f8cf642c321200f358a60c84f9e7771456640f1eaaead5a53a650024d786b3f30b6ff37b73470ef90bc325d1970ddcde5396d03855d8fd10a878e69272d461701a55c3d4cd93815fcfd4071a61d13dbcd556b12b5c7a9632d97d9e5e444ed0c5dae4c88cc7a0900a73ec3f5cc7aa9ae13a5cc99785a7bd1e51ca2a89c92ae437be3770a08a1b26909406ed3dc9fd483229449f5ba8651f83ff397db2c210a737d0396fac49856343a50a7542bd3fa2d278285923d3e6d75585e1cbb260742756f889c804d4bb3fa9b59474dfd1dbf63af375010eb2fe52b4f380ffd1bb8c9df0d681c3f77a67d460c6b4db530addf72428f264b7dd6c3980337335cbb954980c794228cc7ed0767bca2a8adbf514ebd46072aefaa0b63de780b9df903d07239c51d376b7957a6dd8b94db5435ec4c5ec071f719d3ba31a8e2128d914b95bd1a5edb07bf1f997536d346977db463c0e8b20706077f97a0e39e1187722d97d94777c8c9c3e5e9bd7059834356ce94c550d12c96d40b8e5d2edaf4bb645a91ef4204c6bc6bdde872ce33d3721dc5eb4411ad17ce5f1a6ab95cd5dca38babe0ad3d28e2fc25227e9cb6006e94a0770ea0922a1d280fd0a40fa7dd64b43b993167da0668dd9e6fe026f62dd37a897b3bbed9e33910a31fe0326d6ddf91882eb3e3e870d1ca3c8616c140c1bd7edb0cd6d0fae260349d03c5f933cfb3d3f266a44543f7ced9cf96591de579635a2386e6c5162b7e98f659685a1e66d6bd9fe69613629adf71b5ab3bd844ca7186b86953a6d396f8f5d9da17d15456c7da279a562e0129e31933a88e6edcbf3c7053e04405f8fdd8179a96815e4e75b714211c47e73293c9615d66889fc4655ae3cc9bb6e70b8cb93bde7e625a1e739477810154f3b9adb2471757f9fd00ffbed4d4df5aebe59467216fd1c5665a221ab8699f510040716786a5c88cd0695ca6d3ba30ad48bc6e3f32ad51d30a9d2286bd3eebae3056bcd4c468fb4cd36a767b3d7328fa49acda4f2eb4ac104e7691d7e4779757e64f8fa9ebe73f713cb9702a02f0ca17dfdda1e6caa94e2f271f3494223330d61755f274e1f55feaf5f54c2ee1f6b76abf9496411afaa3d899b6431fcfd2d653f171b8faa1f98401ebfe099fa9e3e07d007146bdb838c8ddf7bab30bbcfc12915f7f0a1c98a5c7eff3eb379dc66d29fa67be67c5b4caa4c00c2772665a81995c2f4d2b6aaf1f663296cf71cee2796a9f812d97d94f5aae865d079cfc484ea8f73eba9c035079a1c0e95fa90cdb2e3a33d312d1f4bd024efcc3fb59aede5f6569e12df1733e5af233139d66b828d312cd52e8e22085fffb98ba7e7648a8be3d675aaa3266fb9534ad093c814c4c4b44ad9753f876abcf96cf6a9f28f24e6787e42c25dfb49fce3dfbaf2cc5bf66efcb969b0669fc0df61372e24e01176eb7d2d6537bb9c08141baa43ca491df9acf049a3c58995cf21e5f2bf9a0591fdf4350cae20ce9e789e134e35386930575d7b40c0ccdbb8f8f17a656b438bacbea5cdb1dc76340a6e674614c91271bb601d9e1c9abd96f635a276d24c2805e92d7ef21040e0c52fecfe25ad48d69fda0c66c6e4c6b6428cf4c6b40b7279f9569b5fbd7fab7056231ae864a4b9a0e9dec21f9ab3cd1efdb88beca53fa611b6d3d756678a5254de9933dfa93696717f8e0252296e615d5a6565c01c0f30b637daeab59111c4de73c11ad5054c2809ede1c51253c5427a6b5aec28d9a95c92486f11b5df466374b23b218484e3833f8d43dc0ba1bcd2f02fcbd067c66ace1c3d80e4f0ccd1e66c1906690e89b9d31f5048248f2faf544d1374656b4ee7bf58bbc8175bb5ed7bf2161b5cb43b9a97b05d3fe54de5e1339a15e1fb899a9eec77570bca97b05289315078b54f7bdd6651f2f80f13b057d3fad16c75526d571e56a1b278dc1c44df5db5d4ec9ebf70ffc6ac2067ebfd191a9fcfcad05de6147799abfcf948542af361bf842a27b46d44f1b8aa25f49d0c01703c532a2aa5dbc32af170c8ca91a6c3f0c4c03f72f8a17a888f9bd6258c5e10d48031b6844cf0532eb25c733415eb1a6f048035f48f45f01d438a49f3d0bda36b406b336d00fd6a7a24a3c105057fd5a7c4dc30154374934fe066e036bc5ff03859b69b81278b6550000000049454e44ae426082</data> + </image> +</images> <connections> + <connection> + <sender>Menu</sender> + <signal>clicked(QListBoxItem*)</signal> + <receiver>Tab_Signalisations</receiver> + <slot>setFocus()</slot> + </connection> <connection> <sender>buttonCancel</sender> <signal>clicked()</signal> - <receiver>URL_Input</receiver> + <receiver>ConfigurationPanel</receiver> <slot>reject()</slot> </connection> + <connection> + <sender>Menu</sender> + <signal>clicked(QListBoxItem*)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>changeTabSlot()</slot> + </connection> + <connection> + <sender>buttonSave</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>saveSlot()</slot> + </connection> + <connection> + <sender>stunButtonGroup</sender> + <signal>clicked(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>useStunSlot(int)</slot> + </connection> + <connection> + <sender>buttonApplySkin</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>applySkinSlot()</slot> + </connection> + <connection> + <sender>DriverChoice</sender> + <signal>clicked(int)</signal> + <receiver>ConfigurationPanel</receiver> + <slot>driverSlot(int)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>ConfigurationPanel</receiver> + <slot>accept()</slot> + </connection> </connections> <tabstops> - <tabstop>url</tabstop> - <tabstop>buttonOK</tabstop> + <tabstop>fullName</tabstop> + <tabstop>userPart</tabstop> + <tabstop>username</tabstop> + <tabstop>password</tabstop> + <tabstop>hostPart</tabstop> + <tabstop>sipproxy</tabstop> + <tabstop>autoregister</tabstop> + <tabstop>Register</tabstop> + <tabstop>buttonSave</tabstop> + <tabstop>buttonOk</tabstop> <tabstop>buttonCancel</tabstop> + <tabstop>Tab_Signalisations</tabstop> + <tabstop>buttonHelp</tabstop> + <tabstop>SkinChoice</tabstop> + <tabstop>zoneToneChoice</tabstop> + <tabstop>confirmationToQuit</tabstop> + <tabstop>checkedTray</tabstop> + <tabstop>voicemailNumber</tabstop> + <tabstop>useStunYes</tabstop> + <tabstop>STUNserver</tabstop> + <tabstop>playTones</tabstop> + <tabstop>pulseLength</tabstop> + <tabstop>sendDTMFas</tabstop> + <tabstop>Menu</tabstop> + <tabstop>Tab_Audio</tabstop> + <tabstop>codec1</tabstop> + <tabstop>codec2</tabstop> + <tabstop>codec3</tabstop> + <tabstop>Tab_Preferences</tabstop> + <tabstop>Tab_About</tabstop> + <tabstop>useStunNo</tabstop> + <tabstop>ringsChoice</tabstop> + <tabstop>buttonApplySkin</tabstop> </tabstops> <includes> - <include location="local" impldecl="in implementation">url_input.ui.h</include> + <include location="local" impldecl="in implementation">configurationpanel.ui.h</include> </includes> +<slots> + <slot>saveSlot()</slot> + <slot>changeTabSlot()</slot> + <slot>useStunSlot( int id )</slot> + <slot>applySkinSlot()</slot> + <slot>driverSlot( int id )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> <layoutdefaults spacing="6" margin="11"/> </UI>