summaryrefslogtreecommitdiffstats
path: root/tdeprint/treecombobox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeprint/treecombobox.cpp')
-rw-r--r--tdeprint/treecombobox.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/tdeprint/treecombobox.cpp b/tdeprint/treecombobox.cpp
new file mode 100644
index 000000000..7a2adc8ef
--- /dev/null
+++ b/tdeprint/treecombobox.cpp
@@ -0,0 +1,156 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <tdeprint@swing.be>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "treecombobox.h"
+
+#include <tqpainter.h>
+
+TreeListBoxItem::TreeListBoxItem(TQListBox *lb, const TQPixmap& pix, const TQString& txt, bool oneBlock)
+ : TQListBoxPixmap(pix, txt)
+{
+ if (oneBlock)
+ m_path = TQStringList(txt);
+ else
+ m_path = TQStringList::split('/', text(), false);
+ m_depth = m_path.count()-1;
+ m_child = m_next = m_parent = 0;
+
+ // insert into QListBox
+ if (m_depth == 0)
+ {
+ TreeListBoxItem *item = static_cast<TreeListBoxItem*>(lb->item(0));
+ while (item && item->m_next)
+ item = item->m_next;
+ lb->insertItem(this);
+ if (item)
+ item->m_next = this;
+ }
+ else
+ {
+ TQString parentStr = txt.left(txt.length()-m_path[m_depth].length()-1);
+ TreeListBoxItem *parentItem = static_cast<TreeListBoxItem*>(lb->findItem(parentStr, TQt::ExactMatch));
+ if (!parentItem)
+ {
+ // parent not found, add parent first into QListBox
+ parentItem = new TreeListBoxItem(lb, TQPixmap(), parentStr);
+ }
+ // search last "child" of the parent item, to put the new one
+ // at the end
+ TreeListBoxItem *childItem = static_cast<TreeListBoxItem*>(parentItem), *prevItem = 0;
+ while (childItem->next())
+ {
+ TreeListBoxItem *nextItem = static_cast<TreeListBoxItem*>(childItem->next());
+ if (nextItem->m_depth >= m_depth)
+ {
+ childItem = nextItem;
+ if (childItem->m_depth == m_depth)
+ prevItem = childItem;
+ }
+ else
+ break;
+ }
+ // eventually insert item
+ lb->insertItem(this, childItem);
+ m_parent = parentItem;
+ if (prevItem)
+ prevItem->m_next = this;
+ else
+ parentItem->m_child = this;
+ }
+}
+
+int TreeListBoxItem::width(const TQListBox *lb) const
+{
+ int w = m_depth * stepSize() + 2;
+ if (pixmap())
+ w += (pixmap()->width() + 2);
+ if (!m_path[m_depth].isEmpty())
+ w += (lb->fontMetrics().width(m_path[m_depth]) + 2);
+ return QMAX(w, TQListBoxPixmap::width(lb));
+}
+
+void TreeListBoxItem::paint(TQPainter *p)
+{
+ if(!static_cast<TreeListBox*>(listBox())->m_painting)
+ {
+ TQListBoxPixmap::paint(p);
+ return;
+ }
+
+ const QPixmap *pix = pixmap();
+ QRect r = p->viewport();
+ int h = height(listBox());
+ int xo = (m_depth * stepSize() + 2);
+ int yo = (pix ? (h-pix->height())/2 : 0);
+
+ if (m_depth > 0)
+ {
+ QPen oldPen = p->pen();
+ p->setPen(listBox()->tqcolorGroup().mid());
+
+ TreeListBoxItem *item = this;
+ int s = xo-stepSize()/2;
+ p->drawLine(s, r.top(), s, h/2);
+ p->drawLine(s, h/2, s+stepSize()/2-2, h/2);
+ while (item->m_parent)
+ {
+ if (item->m_next)
+ p->drawLine(s, r.top(), s, h);
+ item = item->m_parent;
+ s -= stepSize();
+ }
+
+ p->setPen(oldPen);
+ }
+ if (pix)
+ {
+ p->drawPixmap(xo, yo, *pix);
+ xo += (pix->width() + 2);
+ }
+ p->drawText(xo, 0, r.width()-xo, height(listBox()), Qt::AlignLeft, m_path[m_depth]);
+}
+
+//-----------------------------------------------------------------------------------------
+
+TreeListBox::TreeListBox(TQWidget *parent, const char *name)
+ : TQListBox(parent, name)
+{
+ m_painting = false;
+}
+
+void TreeListBox::paintCell(TQPainter *p, int row, int col)
+{
+ m_painting = true;
+ TQListBox::paintCell(p, row, col);
+ m_painting = false;
+}
+
+//-----------------------------------------------------------------------------------------
+
+TreeComboBox::TreeComboBox(TQWidget *parent, const char *name)
+ : TQComboBox(parent, name)
+{
+ m_listbox = new TreeListBox(this);
+ setListBox(m_listbox);
+}
+
+void TreeComboBox::insertItem(const TQPixmap& pix, const TQString& txt, bool oneBlock)
+{
+ new TreeListBoxItem(m_listbox, pix, txt, oneBlock);
+}