KDevelop API Documentation

ktabzoomwidget.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2001-2003                                               *
00003  *   The KDevelop Team                                                     *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00013 
00014 #include <qptrlist.h>
00015 #include <qlayout.h>
00016 #include <qlabel.h>
00017 #include <qwidgetstack.h>
00018 #include <qguardedptr.h>
00019 
00020 #include <kdebug.h>
00021 #include <kconfig.h>
00022 
00023 
00024 #include "ktabzoomframe.h"
00025 
00026 
00027 #include "ktabzoomwidget.h"
00028 
00029 
00030 class KTZWidgetInfo
00031 {
00032 public:
00033   KTZWidgetInfo( QWidget* w = 0 ): m_widget(w), m_index(0), m_barIndex(0) {}
00034 
00035   QWidget *m_widget;
00036   int     m_index, m_barIndex;
00037 
00038 };
00039 
00040 
00041 class KTabZoomWidgetPrivate
00042 {
00043 public:
00044 
00045   KTabZoomPosition::Position m_tabPosition;
00046   QWidget                    *m_content;
00047   KTabZoomBar                *m_tabBar;
00048   QBoxLayout                 *m_layout;
00049   KTabZoomFrame              *m_popup;
00050   QPtrList<KTZWidgetInfo>    m_info;
00051   bool                       m_docked;
00052   QWidget                    *m_strut;
00053   QGuardedPtr<QWidget>       m_lastActiveWidget;
00054 };
00055 
00056 
00057 KTabZoomWidget::KTabZoomWidget(QWidget *parent, KTabZoomPosition::Position pos, const char *name)
00058   : QWidget(parent, name)
00059 {
00060   d = new KTabZoomWidgetPrivate;
00061   d->m_info.setAutoDelete(true);
00062 
00063   d->m_tabPosition = pos;
00064   d->m_content = 0;
00065   d->m_docked = false;
00066   d->m_strut = 0;
00067   d->m_lastActiveWidget = 0;
00068 
00069   d->m_tabBar = new KTabZoomBar(this, pos);
00070   connect(d->m_tabBar, SIGNAL(selected(int)), this, SLOT(selected(int)));
00071   connect(d->m_tabBar, SIGNAL(unselected()), this, SLOT(unselected()));
00072 
00073   if (pos == KTabZoomPosition::Left || pos == KTabZoomPosition::Right)
00074     d->m_layout = new QHBoxLayout(this);
00075   else
00076     d->m_layout = new QVBoxLayout(this);
00077 
00078   d->m_popup = new KTabZoomFrame(parent, pos);
00079 
00080   if(pos == KTabZoomPosition::Left || pos == KTabZoomPosition::Right)
00081     d->m_popup->setMinimumWidth(110);
00082   else
00083     d->m_popup->setMinimumHeight(125);
00084 
00085   connect(d->m_popup, SIGNAL(closeClicked()), this, SLOT(unselected()));
00086   connect(d->m_popup, SIGNAL(dockToggled(bool)), this, SLOT(setDockMode(bool)));
00087   connect(d->m_popup, SIGNAL(sizeChanged()), this, SLOT(adjustStrut()));
00088 
00089   d->m_popup->hide();
00090 
00091   if (pos == KTabZoomPosition::Left || pos == KTabZoomPosition::Right)
00092     d->m_popup->resize(250, height());
00093   else
00094     d->m_popup->resize(width(), 125);
00095 }
00096 
00097 
00098 KTabZoomWidget::~KTabZoomWidget()
00099 {
00100   delete d;
00101 }
00102 
00103 
00104 void KTabZoomWidget::addTab(QWidget *widget, const QString &title, const QString& toolTip)
00105 {
00106   KTZWidgetInfo *info = new KTZWidgetInfo( widget );
00107 
00108   info->m_barIndex = d->m_tabBar->addTab( QTab(title), toolTip );
00109   info->m_index = d->m_popup->addTab(widget, title);
00110 
00111   connect(widget, SIGNAL(destroyed()), this, SLOT(widgetDeleted()));
00112 
00113   d->m_info.append(info);
00114 
00115   switch (d->m_tabPosition)
00116   {
00117   case KTabZoomPosition::Bottom:
00118   case KTabZoomPosition::Top:
00119     if(widget->minimumSizeHint().height() + 12 > d->m_popup->minimumHeight())
00120       d->m_popup->setMinimumHeight(widget->minimumSizeHint().height() + 12);
00121     break;
00122   case KTabZoomPosition::Left:
00123   case KTabZoomPosition::Right:
00124     if(widget->minimumSizeHint().width() + 12 > d->m_popup->minimumWidth())
00125       d->m_popup->setMinimumWidth(widget->minimumSizeHint().width() + 12);
00126     break;
00127   }
00128 
00129   emit tabsChanged();
00130 }
00131 
00132 
00133 void KTabZoomWidget::removeTab(QWidget *w) {
00134 
00135     for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00136     if (i->m_widget == w)
00137     {
00138       d->m_tabBar->removeTab(i->m_barIndex);
00139       d->m_popup->removeTab(i->m_index);
00140       d->m_info.remove(i);
00141       emit tabsChanged();
00142       return;
00143     }
00144 
00145 }
00146 
00147 void KTabZoomWidget::widgetDeleted()
00148 {
00149   const QWidget *w = static_cast<const QWidget*>(sender());
00150 
00151   for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00152     if (i->m_widget == w)
00153     {
00154       d->m_tabBar->removeTab(i->m_barIndex);
00155       d->m_popup->removeTab(i->m_index);
00156       d->m_info.remove(i);
00157       emit tabsChanged();
00158       return;
00159     }
00160 }
00161 
00162 
00163 void KTabZoomWidget::addContent(QWidget *content)
00164 {
00165   // only accept one child
00166   if (d->m_content != 0)
00167     return;
00168 
00169   d->m_content = content;
00170 
00171   d->m_strut = new QWidget(this);
00172 
00173   switch (d->m_tabPosition)
00174   {
00175   case KTabZoomPosition::Left:
00176   case KTabZoomPosition::Top:
00177     d->m_layout->addWidget(d->m_tabBar);
00178     d->m_layout->addWidget(d->m_strut);
00179     d->m_layout->addWidget(d->m_content,1);
00180     break;
00181 
00182   case KTabZoomPosition::Right:
00183   case KTabZoomPosition::Bottom:
00184     d->m_layout->addWidget(d->m_content,1);
00185     d->m_layout->addWidget(d->m_strut);
00186     d->m_layout->addWidget(d->m_tabBar);
00187     break;
00188   }
00189 
00190   d->m_strut->hide();
00191 
00192   content->show();
00193 }
00194 
00195 
00196 void KTabZoomWidget::selected(int index)
00197 {
00198   calculateGeometry();
00199 
00200   if (d->m_docked)
00201   {
00202     d->m_strut->show();
00203     adjustStrut();
00204   }
00205 
00206   for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00207     if (i->m_barIndex == index)
00208     {
00209       d->m_popup->selected(i->m_index);
00210       d->m_popup->show();
00211       d->m_lastActiveWidget = i->m_widget;
00212       return;
00213     }
00214 }
00215 
00216 void KTabZoomWidget::setFocus()
00217 {
00218   if ( d->m_lastActiveWidget )
00219     d->m_lastActiveWidget->setFocus();
00220 }
00221 
00222 bool KTabZoomWidget::hasFocus() const
00223 {
00224   return d->m_lastActiveWidget && d->m_lastActiveWidget->hasFocus();
00225 }
00226 
00227 bool KTabZoomWidget::isDocked() const
00228 {
00229   return d->m_docked;
00230 }
00231 
00232 bool KTabZoomWidget::isRaised() const
00233 {
00234   return d->m_popup->isVisible();
00235 }
00236 
00237 bool KTabZoomWidget::isEmpty() const
00238 {
00239   return d->m_info.isEmpty();
00240 }
00241 
00242 uint KTabZoomWidget::count() const
00243 {
00244   return d->m_info.count();
00245 }
00246 
00247 int KTabZoomWidget::indexOf(QWidget *widget) const
00248 {
00249 for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00250     if (i->m_widget == widget)
00251         return i->m_index;
00252 
00253         return -1;
00254 }
00255 
00256 QWidget *KTabZoomWidget::at(int index) const
00257 {
00258 for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00259     if (i->m_index == index)
00260         return i->m_widget;
00261 
00262         return 0;
00263 }
00264 
00265 QWidget *KTabZoomWidget::current() const
00266 {
00267 return d->m_lastActiveWidget;
00268 }
00269 
00270 void KTabZoomWidget::unselected()
00271 {
00272   d->m_popup->hide();
00273   d->m_tabBar->unsetButtons();
00274   d->m_strut->hide();
00275 }
00276 
00277 
00278 void KTabZoomWidget::raiseWidget(QWidget *widget)
00279 {
00280   if ( !widget )
00281     widget = d->m_lastActiveWidget;
00282   for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00283     if (i->m_widget == widget || !widget)
00284     {
00285       d->m_tabBar->setActiveIndex(i->m_barIndex);
00286       d->m_lastActiveWidget = i->m_widget;
00287       return;
00288     }
00289 }
00290 
00291 
00292 void KTabZoomWidget::lowerAllWidgets()
00293 {
00294   d->m_tabBar->unsetButtons();
00295 }
00296 
00297 
00298 void KTabZoomWidget::lowerWidget(QWidget *w)
00299 {
00300   if (d->m_docked)
00301     return;
00302 
00303   for (KTZWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00304     if (i->m_widget == w)
00305     {
00306       d->m_popup->hide();
00307       d->m_tabBar->unsetButtons();
00308       return;
00309     }
00310 }
00311 
00312 
00313 void KTabZoomWidget::calculateGeometry()
00314 {
00315   switch (d->m_tabPosition)
00316   {
00317   case KTabZoomPosition::Left:
00318     d->m_popup->setGeometry(d->m_tabBar->width(), y(), d->m_popup->width(), height());
00319     break;
00320 
00321   case KTabZoomPosition::Right:
00322     d->m_popup->setGeometry(d->m_tabBar->x() - d->m_popup->width(), y(), d->m_popup->width(), height());
00323     break;
00324 
00325   case KTabZoomPosition::Top:
00326     d->m_popup->setGeometry(x(), d->m_tabBar->height(), width(), d->m_popup->height());
00327     break;
00328 
00329   case KTabZoomPosition::Bottom:
00330     d->m_popup->setGeometry(x(), d->m_tabBar->y() - d->m_popup->height(), width(), d->m_popup->height());
00331     break;
00332   }
00333 }
00334 
00335 
00336 void KTabZoomWidget::resizeEvent(QResizeEvent *ev)
00337 {
00338   QWidget::resizeEvent(ev);
00339 
00340   calculateGeometry();
00341 }
00342 
00343 
00344 void KTabZoomWidget::setDockMode(bool docked)
00345 {
00346   d->m_docked = docked;
00347 
00348   d->m_tabBar->setDockMode(docked);
00349   d->m_popup->setDockMode(docked);
00350 
00351   if (!docked)
00352   {
00353     d->m_strut->hide();
00354     return;
00355   }
00356 
00357   if( !d->m_popup->isVisible() )
00358       d->m_popup->show();
00359   d->m_strut->show();
00360 
00361   adjustStrut();
00362 }
00363 
00364 
00365 void KTabZoomWidget::saveSettings(KConfig *config)
00366 {
00367   config->writeEntry("Docked", d->m_docked);
00368   if (d->m_tabPosition == KTabZoomPosition::Left || d->m_tabPosition == KTabZoomPosition::Right)
00369     config->writeEntry("Strut", d->m_popup->width());
00370   else
00371     config->writeEntry("Strut", d->m_popup->height());
00372 
00373     config->writeEntry("TabIndex", indexOf(current()));
00374 }
00375 
00376 
00377 void KTabZoomWidget::loadSettings(KConfig *config)
00378 {
00379   int s = config->readNumEntry("Strut", -1);
00380   if (s > 0)
00381   {
00382     if (d->m_tabPosition == KTabZoomPosition::Left || d->m_tabPosition == KTabZoomPosition::Right)
00383       d->m_popup->resize(s, d->m_popup->height());
00384     else
00385       d->m_popup->resize(d->m_popup->width(), s);
00386   }
00387 
00388   setDockMode(config->readBoolEntry("Docked", false));
00389 
00390   if (d->m_docked)
00391   {
00392     KTZWidgetInfo *i=d->m_info.first();
00393     if (i) {
00394       d->m_tabBar->setActiveIndex(config->readNumEntry("TabIndex", 0));
00395     } else {
00396       // np parts there to show so we just hide ourselves
00397       setDockMode( false );
00398     }
00399   }
00400 }
00401 
00402 
00403 void KTabZoomWidget::adjustStrut()
00404 {
00405   if (!d->m_docked)
00406     return;
00407 
00408   if (d->m_tabPosition == KTabZoomPosition::Left || d->m_tabPosition == KTabZoomPosition::Right)
00409     d->m_strut->setFixedWidth(d->m_popup->width());
00410   else
00411     d->m_strut->setFixedHeight(d->m_popup->height());
00412 }
00413 
00414 
00415 #include "ktabzoomwidget.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:53 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003