summaryrefslogtreecommitdiffstats
path: root/klipper/history.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'klipper/history.cpp')
-rw-r--r--klipper/history.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/klipper/history.cpp b/klipper/history.cpp
new file mode 100644
index 000000000..068475214
--- /dev/null
+++ b/klipper/history.cpp
@@ -0,0 +1,132 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 8; -*-
+/* This file is part of the KDE project
+ Copyright (C) 2004 Esben Mose Hansen <kde@mosehansen.dk>
+ Copyright (C) by Andrew Stanley-Jones
+ Copyright (C) 2000 by Carsten Pfeiffer <pfeiffer@kde.org>
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include <kdebug.h>
+
+#include "history.h"
+#include "historystringitem.h"
+#include "klipperpopup.h"
+
+History::History( QWidget* parent, const char* name )
+ : QObject( parent, name ),
+ m_popup( new KlipperPopup( this, parent, "main_widget" ) ),
+ m_topIsUserSelected( false )
+{
+ connect( this, SIGNAL( changed() ), m_popup, SLOT( slotHistoryChanged() ) );
+ itemList.setAutoDelete( true );
+
+}
+
+
+History::~History() {
+}
+
+History::iterator History::youngest() {
+ return iterator( itemList );
+}
+
+void History::insert( const HistoryItem* item ) {
+ if ( !item )
+ return;
+
+ m_topIsUserSelected = false;
+
+ // Optimisation: Compare with top item.
+ if ( !itemList.isEmpty() && *itemList.first() == *item ) {
+ delete item;
+ return;
+ }
+
+ remove( item );
+ forceInsert( item );
+
+ emit topChanged();
+
+}
+
+void History::forceInsert( const HistoryItem* item ) {
+ if ( !item )
+ return;
+ itemList.prepend( item );
+ emit changed();
+ trim();
+}
+
+void History::trim() {
+ int i = itemList.count() - max_size();
+ if ( i <= 0 )
+ return;
+
+ while ( i-- ) {
+ itemList.removeLast();
+ }
+ emit changed();
+}
+
+void History::remove( const HistoryItem* newItem ) {
+ if ( !newItem )
+ return;
+
+ for ( const HistoryItem* item = itemList.first(); item; item=next() ) {
+ if ( *item == *newItem ) {
+ itemList.remove();
+ emit changed();
+ return;
+ }
+ }
+
+}
+
+
+void History::slotClear() {
+ itemList.clear();
+ emit changed();
+}
+
+void History::slotMoveToTop(int pos ) {
+ if ( pos < 0 || static_cast<unsigned>( pos ) >= itemList.count() ) {
+ kdDebug() << "Argument pos out of range: " << pos << endl;
+ return;
+ }
+
+ m_topIsUserSelected = true;
+
+ itemList.first();
+ for ( ; pos; pos-- ) {
+ itemList.next();
+ }
+ HistoryItem* item = itemList.take();
+ itemList.prepend( item );
+ emit changed();
+ emit topChanged();
+}
+
+void History::max_size( unsigned max_size ) {
+ m_max_size = max_size;
+ trim();
+
+}
+
+KlipperPopup* History::popup() {
+ return m_popup;
+}
+
+#include "history.moc"