#
# Machekku Auto Copy on Select
#
# Version: 0.2
# Date: 2005-03-30
#
# http://machekku.uaznia.net/jabber/psi/patches/
#
# common.h                   |    3 +++
# msgmle.cpp                 |   24 ++++++++++++++++++++++++
# msgmle.h                   |    4 ++++
# options/opt_advanced-ui.ui |    8 ++++++++
# options/opt_advanced.cpp   |    8 ++++++++
# psi_profiles.cpp           |    3 +++
# 6 files changed, 50 insertions(+)
#
diff -X exclude -x src.pro -Naru psi_cvs-2005.03.29/psi/src/common.h psi-2005.03.29-autocopy/psi/src/common.h
--- psi_cvs-2005.03.29/psi/src/common.h	Mon Feb 28 16:45:12 2005
+++ psi-2005.03.29-autocopy/psi/src/common.h	Wed Mar 30 00:36:40 2005
@@ -91,6 +91,9 @@
 	bool alwaysOnTop, noAwaySound, noAwayPopup, noUnlistedPopup, rosterAnim, autoVersion, autoVCardOnLogin, xmlConsoleOnLogin;
 	bool useDock, dockDCstyle, dockHideMW, dockToolMW, isWMDock;
 	bool smallChats, chatLineEdit, showJoins, useTabs, putTabsAtBottom, autoRosterSize, autoResolveNicksOnAdd;
+	bool autoCopy; // although this setting is ignored under linux,
+					// it is preserved in case user uses the same config file on different platforms
+
   bool oldSmallChats; //Filthy hack, see chat code.
 	int delChats, browser;
 
diff -X exclude -x src.pro -Naru psi_cvs-2005.03.29/psi/src/msgmle.cpp psi-2005.03.29-autocopy/psi/src/msgmle.cpp
--- psi_cvs-2005.03.29/psi/src/msgmle.cpp	Sat Mar  5 09:13:48 2005
+++ psi-2005.03.29-autocopy/psi/src/msgmle.cpp	Wed Mar 30 00:04:46 2005
@@ -37,6 +37,11 @@
 	setReadOnly(true);
 	setUndoRedoEnabled(false);
 	setHScrollBarMode(QScrollView::AlwaysOff);
+
+#ifndef Q_WS_X11	// linux has this feature built-in
+	connect(this, SIGNAL(copyAvailable(bool)), SLOT(autoCopy(bool)));
+#endif
+
 }
 
 ChatView::~ChatView()
@@ -78,6 +83,25 @@
 
 	QTextEdit::resizeEvent(e);
 }
+
+/*!
+	Copies any selected text (from selection 0) to the clipboard
+	if option.autoCopy is TRUE, \a copyAvailable is TRUE
+	and ChatView is in read-only mode.
+	In any other case it does nothing.
+
+	This slot is connected with copyAvailable(bool) signal
+	in ChatView's constructor.
+
+	\sa copyAvailable()
+*/                     
+
+void ChatView::autoCopy(bool copyAvailable)
+{
+	if ( isReadOnly() && copyAvailable && option.autoCopy ) {
+		copy();
+	}
+}                      
 
 //----------------------------------------------------------------------------
 // ChatEdit
diff -X exclude -x src.pro -Naru psi_cvs-2005.03.29/psi/src/msgmle.h psi-2005.03.29-autocopy/psi/src/msgmle.h
--- psi_cvs-2005.03.29/psi/src/msgmle.h	Sat Mar  5 09:13:48 2005
+++ psi-2005.03.29-autocopy/psi/src/msgmle.h	Wed Mar 30 00:05:06 2005
@@ -25,6 +25,7 @@
 
 class ChatView : public PsiTextView
 {
+	Q_OBJECT
 public:
 	ChatView(QWidget *parent, const char *name = 0);
 	~ChatView();
@@ -34,6 +35,9 @@
 	bool focusNextPrevChild(bool next);
 	void keyPressEvent(QKeyEvent *);
 	void resizeEvent(QResizeEvent *);
+
+protected slots:
+	void autoCopy(bool copyAvailable);
 };
 
 class ChatEdit : public PsiTextView
diff -X exclude -x src.pro -Naru psi_cvs-2005.03.29/psi/src/options/opt_advanced-ui.ui psi-2005.03.29-autocopy/psi/src/options/opt_advanced-ui.ui
--- psi_cvs-2005.03.29/psi/src/options/opt_advanced-ui.ui	Wed Oct 20 10:31:40 2004
+++ psi-2005.03.29-autocopy/psi/src/options/opt_advanced-ui.ui	Tue Mar 29 23:16:08 2005
@@ -40,6 +40,14 @@
         </widget>
         <widget class="QCheckBox">
             <property name="name">
+                <cstring>ck_autocopy</cstring>
+            </property>
+            <property name="text">
+                <string>Automatically copy selected text to clipboad</string>
+            </property>
+        </widget>
+        <widget class="QCheckBox">
+            <property name="name">
                 <cstring>ck_grabUrls</cstring>
             </property>
             <property name="text">
diff -X exclude -x src.pro -Naru psi_cvs-2005.03.29/psi/src/options/opt_advanced.cpp psi-2005.03.29-autocopy/psi/src/options/opt_advanced.cpp
--- psi_cvs-2005.03.29/psi/src/options/opt_advanced.cpp	Wed Oct 20 10:31:40 2004
+++ psi-2005.03.29-autocopy/psi/src/options/opt_advanced.cpp	Wed Mar 30 00:25:42 2005
@@ -32,9 +32,15 @@
 	w = new OptAdvancedUI();
 	OptAdvancedUI *d = (OptAdvancedUI *)w;
 
+#ifdef Q_WS_X11	// auto-copy is a built-in feature on linux, we don't want user to use our own one
+	d->ck_autocopy->hide();
+#endif
+
 	QWhatsThis::add(d->ck_messageevents,
 		tr("Enables the sending and requesting of message events such as "
 		"'Contact is Typing', ..."));
+	QWhatsThis::add(d->ck_autocopy,
+		tr("Check this option if you want the selected text in incoming messages and chat log to be automatically copied to clipboard"));
 	QWhatsThis::add(d->ck_singleclick,
 		tr("Normally, a double-click on a contact will invoke the default action."
 		"  Check this option if you'd rather invoke with a single-click."));
@@ -74,6 +80,7 @@
 	OptAdvancedUI *d = (OptAdvancedUI *)w;
 
 	opt->messageEvents = d->ck_messageevents->isChecked();
+	opt->autoCopy = d->ck_autocopy->isChecked();
 	opt->singleclick = d->ck_singleclick->isChecked();
 	opt->jidComplete = d->ck_jidComplete->isChecked();
 	opt->grabUrls    = d->ck_grabUrls->isChecked();
@@ -95,6 +102,7 @@
 	OptAdvancedUI *d = (OptAdvancedUI *)w;
 
 	d->ck_messageevents->setChecked( opt->messageEvents );
+	d->ck_autocopy->setChecked( opt->autoCopy );
 	d->ck_singleclick->setChecked( opt->singleclick );
 	d->ck_jidComplete->setChecked( opt->jidComplete );
 	d->ck_grabUrls->setChecked( opt->grabUrls );
diff -X exclude -x src.pro -Naru psi_cvs-2005.03.29/psi/src/psi_profiles.cpp psi-2005.03.29-autocopy/psi/src/psi_profiles.cpp
--- psi_cvs-2005.03.29/psi/src/psi_profiles.cpp	Wed Mar 16 13:42:42 2005
+++ psi-2005.03.29-autocopy/psi/src/psi_profiles.cpp	Tue Mar 29 23:25:00 2005
@@ -405,6 +405,7 @@
 	prefs.autoResolveNicksOnAdd = false;
 	prefs.chatBgImage = "";
 	prefs.rosterBgImage = "";
+	prefs.autoCopy = false;
 
 	prefs.sp.clear();
 	prefs.sp.set(QObject::tr("Away from desk"), QObject::tr("I am away from my desk.  Leave a message."));
@@ -801,6 +802,7 @@
 			p_misc.appendChild(textTag(doc, "messageEvents", prefs.messageEvents));
 			p_misc.appendChild(textTag(doc, "lastPath", prefs.lastPath));
 			p_misc.appendChild(textTag(doc, "lastSavePath", prefs.lastSavePath));
+			p_misc.appendChild(textTag(doc, "autoCopy", prefs.autoCopy));
 		}
 		{
 			QDomElement p_dock = doc.createElement("dock");
@@ -1349,6 +1351,7 @@
 				readBoolEntry(tag, "messageEvents", &prefs.messageEvents);
 				readEntry(tag, "lastPath", &prefs.lastPath);
 				readEntry(tag, "lastSavePath", &prefs.lastSavePath);
+				readBoolEntry(tag, "autoCopy", &prefs.autoCopy);
 			}
 
 			tag = findSubTag(p_general, "dock", &found);
