summaryrefslogtreecommitdiffstats
path: root/tdeui/ktabctl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeui/ktabctl.cpp')
-rw-r--r--tdeui/ktabctl.cpp336
1 files changed, 336 insertions, 0 deletions
diff --git a/tdeui/ktabctl.cpp b/tdeui/ktabctl.cpp
new file mode 100644
index 000000000..5ec13f20e
--- /dev/null
+++ b/tdeui/ktabctl.cpp
@@ -0,0 +1,336 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 1997 Alexander Sanda (alex@darkstar.ping.at)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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.
+*/
+
+/**
+ * KTabCtl provides a universal tab control. It is in no ways limited to dialogs and
+ * can be used for whatever you want. It has no buttons or any other stuff.
+ *
+ * However, this is based on the original TQTabDialog.
+ */
+
+#include <tqtabbar.h>
+#include <tqpushbutton.h>
+#include <tqpainter.h>
+#include <tqpixmap.h>
+
+#include "ktabctl.h"
+
+KTabCtl::KTabCtl(TQWidget *parent, const char *name)
+ : TQWidget(parent, name)
+{
+ tabs = new TQTabBar(this, "_tabbar");
+ connect(tabs, TQT_SIGNAL(selected(int)), this, TQT_SLOT(showTab(int)));
+ tabs->move(2, 1);
+
+ blBorder = true;
+
+}
+
+KTabCtl::~KTabCtl()
+{
+ delete tabs;
+}
+
+void KTabCtl::resizeEvent(TQResizeEvent *)
+{
+ int i;
+ TQRect r = getChildRect();
+
+ if (tabs) {
+ for (i=0; i<(int)pages.size(); i++) {
+ pages[i]->setGeometry(r);
+ }
+ if( ( tabs->tqshape() == TQTabBar::RoundedBelow ) ||
+ ( tabs->tqshape() == TQTabBar::TriangularBelow ) ) {
+ tabs->move( 0, height()-tabs->height()-4 );
+ }
+ }
+}
+
+void KTabCtl::setFont(const TQFont & font)
+{
+ TQFont f(font);
+ f.setWeight(TQFont::Light);
+ TQWidget::setFont(f);
+
+ setSizes();
+}
+
+void KTabCtl::setTabFont(const TQFont & font)
+{
+ TQFont f(font);
+// f.setWeight(TQFont::Light);
+ tabs->setFont(f);
+
+ setSizes();
+}
+
+void KTabCtl::show()
+{
+ unsigned int i;
+
+ if(isVisible())
+ return;
+
+ setSizes();
+
+ for(i = 0; i < pages.size(); i++)
+ pages[i]->hide();
+
+ TQResizeEvent r(size(), size());
+ resizeEvent(&r);
+
+ TQWidget::show();
+}
+
+bool KTabCtl::isTabEnabled(const TQString& name)
+{
+ unsigned int i;
+
+ for(i = 0; i < pages.size(); i++)
+ if (TQString::tqfromLatin1(pages[i]->name()) == name)
+ return tabs->isTabEnabled(i); /* return the enabled status */
+ return false; /* tab does not exist */
+}
+
+void KTabCtl::setTabEnabled(const TQString& name, bool state)
+{
+ unsigned i;
+
+ if (name.isEmpty())
+ return;
+
+ for (i = 0; i < pages.size(); i++)
+ if (TQString::tqfromLatin1(pages[i]->name()) == name)
+ tabs->setTabEnabled(i, state);
+}
+
+void KTabCtl::setSizes()
+{
+ unsigned i;
+
+ TQSize min(tabs->tqsizeHint()); /* the minimum required size for the tabbar */
+ tabs->resize(min); /* make sure that the tabbar does not require more space than actually needed. */
+
+
+ TQSize max(TQCOORD_MAX,TQCOORD_MAX);
+ //int th = min.height(); /* the height of the tabbar itself (without pages and stuff) */
+
+ for (i = 0; i < pages.size(); i++) {
+
+ /*
+ * check the actual minimum and maximum sizes
+ */
+
+ if (pages[i]->tqmaximumSize().height() < max.height())
+ max.setHeight(pages[i]->tqmaximumSize().height());
+ if (pages[i]->tqmaximumSize().width() < max.width())
+ max.setWidth( pages[i]->tqmaximumSize().width());
+ if ( pages[i]->tqminimumSize().height() > min.height())
+ min.setHeight( pages[i]->tqminimumSize().height());
+ if ( pages[i]->tqminimumSize().width() > min.width())
+ min.setWidth( pages[i]->tqminimumSize().width());
+ }
+
+ // BL: min and max are sizes of children, not tabcontrol
+ // min.setHeight(min.height() + th);
+
+ if (max.width() < min.width())
+ max.setWidth(min.width());
+ if (max.height() < min.height())
+ max.setHeight(min.height());
+
+ /*
+ * now, apply the calculated size values to all of the pages
+ */
+
+ for( i=0; i<(uint)pages.size(); i++ ) {
+ pages[i]->setMinimumSize(min);
+ pages[i]->setMaximumSize(max);
+ }
+
+
+ // BL: set minimum size of tabcontrol
+ setMinimumSize(min.width()+4, min.height()+tabs->height()+4);
+
+ /*
+ * generate a resizeEvent, if we're visible
+ */
+
+ if(isVisible()) {
+ TQResizeEvent r(size(), size());
+ resizeEvent(&r);
+ }
+}
+
+void KTabCtl::setBorder( bool state )
+{
+ blBorder = state;
+}
+
+void KTabCtl::setShape( TQTabBar::Shape tqshape )
+{
+ tabs->setShape( tqshape );
+}
+
+TQSize
+KTabCtl::tqsizeHint() const
+{
+ /* desired size of the tabbar */
+ TQSize hint(tabs->tqsizeHint());
+
+ /* overall desired size of all pages */
+ TQSize pageHint;
+ for (unsigned int i = 0; i < pages.size(); i++)
+ {
+ TQSize sizeI(pages[i]->tqsizeHint());
+
+ if (sizeI.isValid())
+ {
+ /* only pages with valid size are used */
+ if (sizeI.width() > pageHint.width())
+ pageHint.setWidth(sizeI.width());
+
+ if (sizeI.height() > pageHint.height())
+ pageHint.setHeight(sizeI.height());
+ }
+ }
+
+ if (pageHint.isValid())
+ {
+ /* use maximum of width of tabbar and pages */
+ if (pageHint.width() > hint.width())
+ hint.setWidth(pageHint.width());
+
+ /* heights must just be added */
+ hint.setHeight(hint.height() + pageHint.height());
+
+ /* 1999-09-18: Espen Sand
+ I cannot get the size to be correct unless the total
+ border size is included: ie 2*2 pixels.
+ */
+ return (hint + TQSize(4,4));
+ }
+
+ /*
+ * If not at least a one page has a valid tqsizeHint we have to return
+ * an invalid size as well.
+ */
+ return (pageHint);
+}
+
+void KTabCtl::paintEvent(TQPaintEvent *)
+{
+ if (!tabs)
+ return;
+
+ if( !blBorder )
+ return;
+
+ TQPainter p;
+ p.begin(this);
+
+ int y0 = getChildRect().top() - 1;
+ int y1 = getChildRect().bottom() + 2;
+ int x1 = getChildRect().right() + 2;
+ int x0 = getChildRect().left() - 1;
+
+ p.setPen(tqcolorGroup().light());
+ p.drawLine(x0, y0 - 1, x1 - 1, y0 - 1); /* 1st top line */
+ p.setPen(tqcolorGroup().midlight());
+ p.drawLine(x0, y0, x1 - 1, y0); /* 2nd top line */
+ p.setPen(tqcolorGroup().light());
+ p.drawLine(x0, y0 + 1, x0, y1); /* left line */
+ p.setPen(black);
+ p.drawLine(x1, y1, x0, y1); /* bottom line */
+ p.drawLine(x1, y1 - 1, x1, y0);
+ p.setPen(tqcolorGroup().dark());
+ p.drawLine(x0 + 1, y1 - 1, x1 - 1, y1 - 1); /* bottom */
+ p.drawLine(x1 - 1, y1 - 2, x1 - 1, y0 + 1);
+ p.end();
+}
+
+/*
+ * return the client rect. This is the maximum size for any child
+ * widget (page).
+ */
+
+TQRect KTabCtl::getChildRect() const
+{
+ if( ( tabs->tqshape() == TQTabBar::RoundedBelow ) ||
+ ( tabs->tqshape() == TQTabBar::TriangularBelow ) ) {
+ return TQRect(2, 1, width() - 4,
+ height() - tabs->height() - 4);
+ } else {
+ return TQRect(2, tabs->height() + 1, width() - 4,
+ height() - tabs->height() - 4);
+ }
+}
+
+/*
+ * show a single page, depending on the selected tab
+ * emit tabSelected(new_pagenumber) BEFORE the page is shown
+ */
+
+void KTabCtl::showTab(int i)
+{
+ unsigned int j;
+ for (j = 0; j < pages.size(); j++) {
+ if (j != (unsigned)i) {
+ pages[j]->hide();
+ }
+ }
+
+ if((unsigned)i < pages.size()) {
+ emit(tabSelected(i));
+ if( pages.size() >= 2 ) {
+ pages[i]->raise();
+ }
+ tabs->setCurrentTab(i);
+ pages[i]->setGeometry(getChildRect());
+ pages[i]->show();
+ }
+}
+
+/*
+ * add a tab to the control. This tab will manage the given Widget w.
+ * in most cases, w will be a TQWidget and will only act as parent for the
+ * actual widgets on this page
+ * NOTE: w is not required to be of class TQWidget, but expect strange results with
+ * other types of widgets
+ */
+
+void KTabCtl::addTab(TQWidget *w, const TQString& name)
+{
+ TQTab *t = new TQTab();
+ t->setText( name );
+ t->setEnabled( true );
+ int id = tabs->addTab(t); /* add the tab itself to the tabbar */
+ if (id == (int)pages.size()) {
+ pages.resize(id + 1);
+ pages[id] = w; /* remember the widget to manage by this tab */
+ }
+ // BL: compute sizes
+ setSizes();
+}
+
+void KTabCtl::virtual_hook( int, void* )
+{ /*BASE::virtual_hook( id, data );*/ }
+
+#include "ktabctl.moc"