/*
 * abakuslistview.cpp - part of abakus
 * Copyright (C) 2004, 2005 Michael Pyne <michael.pyne@kdemail.net>
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
#include <tdelocale.h>
#include <tdepopupmenu.h>
#include <kdebug.h>

#include <tqdragobject.h>
#include <tqcursor.h>
#include <tqheader.h>

#include "dragsupport.h"
#include "abakuslistview.h"
#include "valuemanager.h"
#include "function.h"

ListView::ListView(TQWidget *parent, const char *name) :
    TDEListView(parent, name), m_menu(0), m_usePopup(false), m_removeSingleId(0),
    m_removeAllId(0)
{
    setResizeMode(LastColumn);
    setDragEnabled(true);

    connect(this, TQ_SIGNAL(contextMenuRequested(TQListViewItem *, const TQPoint &, int)),
	          TQ_SLOT(rightClicked(TQListViewItem *, const TQPoint &)));
}

TQDragObject *ListView::dragObject()
{
    TQPoint viewportPos = viewport()->mapFromGlobal(TQCursor::pos());
    TQListViewItem *item = itemAt(viewportPos);

    if(!item)
	return 0;

    int column = header()->sectionAt(viewportPos.x());
    TQString dragText = item->text(column);

    TQDragObject *drag = new TQTextDrag(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 TDEPopupMenu(this);

	m_removeSingleId = m_menu->insertItem(removeItemString(), this, TQ_SLOT(removeSelected()));
	m_removeAllId = m_menu->insertItem("Placeholder", this, TQ_SLOT(removeAllItems()));
    }
    else {
	delete m_menu;
	m_menu = 0;
    }
}

TQString ListView::removeItemString() const
{
    return TQString();
}

TQString ListView::removeAllItemsString(unsigned count) const
{
    Q_UNUSED(count);

    return TQString();
}

void ListView::removeSelectedItem(TQListViewItem *item)
{
    Q_UNUSED(item);
}

void ListView::removeAllItems()
{
}

bool ListView::isItemRemovable(TQListViewItem *item) const
{
    Q_UNUSED(item);

    return false;
}

void ListView::rightClicked(TQListViewItem *item, const TQPoint &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(TQListView *listView, const TQString &name,
	const Abakus::number_t &value) :
    TDEListViewItem(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(TQWidget *parent, const char *name) :
    ListView(parent, name)
{
    enablePopupHandler(true);
}

TQString VariableListView::removeItemString() const
{
    return i18n("Remove selected variable");
}

TQString VariableListView::removeAllItemsString(unsigned count) const
{
    // count is unreliable because not all of the elements in the list view
    // can be removed.
    count = 0;
    TQStringList values = ValueManager::instance()->valueNames();

    for(TQStringList::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(TQListViewItem *item) const
{
    return !ValueManager::instance()->isValueReadOnly(item->text(0));
}

void VariableListView::removeSelectedItem(TQListViewItem *item)
{
    ValueManager::instance()->removeValue(item->text(0));
}

void VariableListView::removeAllItems()
{
    ValueManager::instance()->slotRemoveUserVariables();
}

FunctionListView::FunctionListView(TQWidget *parent, const char *name) :
    ListView(parent, name)
{
    enablePopupHandler(true);
}

TQString FunctionListView::removeItemString() const
{
    return i18n("Remove selected function");
}

TQString FunctionListView::removeAllItemsString(unsigned count) const
{
    return i18n("Remove all functions (1 function)",
	        "Remove all functions (%n functions)",
		count);
}

bool FunctionListView::isItemRemovable(TQListViewItem *item) const
{
    return true;
}

void FunctionListView::removeSelectedItem(TQListViewItem *item)
{
    // Use section to get the beginning of the string up to (and not
    // including) the first (
    TQString name = item->text(0).section('(', 0, 0);

    FunctionManager::instance()->removeFunction(name);
}

void FunctionListView::removeAllItems()
{
    TQStringList fns = FunctionManager::instance()->functionList(FunctionManager::UserDefined);

    for(TQStringList::ConstIterator fn = fns.constBegin(); fn != fns.constEnd(); ++fn)
       FunctionManager::instance()->removeFunction(*fn);
}

#include "abakuslistview.moc"
