summaryrefslogtreecommitdiffstats
path: root/src/abakuslistview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/abakuslistview.cpp')
-rw-r--r--src/abakuslistview.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/abakuslistview.cpp b/src/abakuslistview.cpp
new file mode 100644
index 0000000..964c8a7
--- /dev/null
+++ b/src/abakuslistview.cpp
@@ -0,0 +1,232 @@
+/*
+ * abakuslistview.cpp - part of abakus
+ * Copyright (C) 2004, 2005 Michael Pyne <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301 USA
+ */
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kdebug.h>
+
+#include <qdragobject.h>
+#include <qcursor.h>
+#include <qheader.h>
+
+#include "dragsupport.h"
+#include "abakuslistview.h"
+#include "valuemanager.h"
+#include "function.h"
+
+ListView::ListView(QWidget *parent, const char *name) :
+ KListView(parent, name), m_menu(0), m_usePopup(false), m_removeSingleId(0),
+ m_removeAllId(0)
+{
+ setResizeMode(LastColumn);
+ setDragEnabled(true);
+
+ connect(this, SIGNAL(contextMenuRequested(QListViewItem *, const QPoint &, int)),
+ SLOT(rightClicked(QListViewItem *, const QPoint &)));
+}
+
+QDragObject *ListView::dragObject()
+{
+ QPoint viewportPos = viewport()->mapFromGlobal(QCursor::pos());
+ QListViewItem *item = itemAt(viewportPos);
+
+ if(!item)
+ return 0;
+
+ int column = header()->sectionAt(viewportPos.x());
+ QString dragText = item->text(column);
+
+ QDragObject *drag = new QTextDrag(dragText, this, "list item drag");
+ drag->setPixmap(DragSupport::makePixmap(dragText, font()));
+
+ return drag;
+}
+
+void ListView::enablePopupHandler(bool enable)
+{
+ if(enable == m_usePopup)
+ return;
+
+ m_usePopup = enable;
+
+ if(m_usePopup) {
+ if(m_menu)
+ kdError() << "ListView menu shouldn't exist here!\n";
+
+ m_menu = new KPopupMenu(this);
+
+ m_removeSingleId = m_menu->insertItem(removeItemString(), this, SLOT(removeSelected()));
+ m_removeAllId = m_menu->insertItem("Placeholder", this, SLOT(removeAllItems()));
+ }
+ else {
+ delete m_menu;
+ m_menu = 0;
+ }
+}
+
+QString ListView::removeItemString() const
+{
+ return QString();
+}
+
+QString ListView::removeAllItemsString(unsigned count) const
+{
+ Q_UNUSED(count);
+
+ return QString();
+}
+
+void ListView::removeSelectedItem(QListViewItem *item)
+{
+ Q_UNUSED(item);
+}
+
+void ListView::removeAllItems()
+{
+}
+
+bool ListView::isItemRemovable(QListViewItem *item) const
+{
+ Q_UNUSED(item);
+
+ return false;
+}
+
+void ListView::rightClicked(QListViewItem *item, const QPoint &pt)
+{
+ if(!m_usePopup)
+ return;
+
+ m_menu->setItemEnabled(m_removeSingleId, item && isItemRemovable(item));
+ m_menu->changeItem(m_removeAllId, removeAllItemsString(childCount()));
+ m_menu->popup(pt);
+}
+
+void ListView::removeSelected()
+{
+ removeSelectedItem(selectedItem());
+}
+
+ValueListViewItem::ValueListViewItem(QListView *listView, const QString &name,
+ const Abakus::number_t &value) :
+ KListViewItem(listView, name), m_value(value)
+{
+ valueChanged();
+}
+
+void ValueListViewItem::valueChanged()
+{
+ setText(1, m_value.toString());
+ repaint();
+}
+
+void ValueListViewItem::valueChanged(const Abakus::number_t &newValue)
+{
+ m_value = newValue;
+
+ valueChanged();
+}
+
+Abakus::number_t ValueListViewItem::itemValue() const
+{
+ return m_value;
+}
+
+VariableListView::VariableListView(QWidget *parent, const char *name) :
+ ListView(parent, name)
+{
+ enablePopupHandler(true);
+}
+
+QString VariableListView::removeItemString() const
+{
+ return i18n("Remove selected variable");
+}
+
+QString VariableListView::removeAllItemsString(unsigned count) const
+{
+ // count is unreliable because not all of the elements in the list view
+ // can be removed.
+ count = 0;
+ QStringList values = ValueManager::instance()->valueNames();
+
+ for(QStringList::ConstIterator value = values.constBegin(); value != values.constEnd(); ++value)
+ if(!ValueManager::instance()->isValueReadOnly(*value))
+ ++count;
+
+ return i18n("Remove all variables (1 variable)",
+ "Remove all variables (%n variables)",
+ count);
+}
+
+bool VariableListView::isItemRemovable(QListViewItem *item) const
+{
+ return !ValueManager::instance()->isValueReadOnly(item->text(0));
+}
+
+void VariableListView::removeSelectedItem(QListViewItem *item)
+{
+ ValueManager::instance()->removeValue(item->text(0));
+}
+
+void VariableListView::removeAllItems()
+{
+ ValueManager::instance()->slotRemoveUserVariables();
+}
+
+FunctionListView::FunctionListView(QWidget *parent, const char *name) :
+ ListView(parent, name)
+{
+ enablePopupHandler(true);
+}
+
+QString FunctionListView::removeItemString() const
+{
+ return i18n("Remove selected function");
+}
+
+QString FunctionListView::removeAllItemsString(unsigned count) const
+{
+ return i18n("Remove all functions (1 function)",
+ "Remove all functions (%n functions)",
+ count);
+}
+
+bool FunctionListView::isItemRemovable(QListViewItem *item) const
+{
+ return true;
+}
+
+void FunctionListView::removeSelectedItem(QListViewItem *item)
+{
+ // Use section to get the beginning of the string up to (and not
+ // including) the first (
+ QString name = item->text(0).section('(', 0, 0);
+
+ FunctionManager::instance()->removeFunction(name);
+}
+
+void FunctionListView::removeAllItems()
+{
+ QStringList fns = FunctionManager::instance()->functionList(FunctionManager::UserDefined);
+
+ for(QStringList::ConstIterator fn = fns.constBegin(); fn != fns.constEnd(); ++fn)
+ FunctionManager::instance()->removeFunction(*fn);
+}
+
+#include "abakuslistview.moc"