summaryrefslogtreecommitdiffstats
path: root/lib/kofficeui/tkaction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kofficeui/tkaction.cpp')
-rw-r--r--lib/kofficeui/tkaction.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/lib/kofficeui/tkaction.cpp b/lib/kofficeui/tkaction.cpp
new file mode 100644
index 000000000..f627df563
--- /dev/null
+++ b/lib/kofficeui/tkaction.cpp
@@ -0,0 +1,300 @@
+/*
+ * Kivio - Visual Modelling and Flowcharting
+ * Copyright (C) 2000 theKompany.com
+ *
+ * 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 "tkaction.h"
+#include "tktoolbarbutton.h"
+#include "tkcombobox.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <ktoolbar.h>
+#include <kiconloader.h>
+
+#define SET_FOR_ALL_CONTAINER(WIDGET_TYPE,METHOD_NAME,VALUE) \
+ for( int id = 0; id < containerCount(); ++id ) { \
+ QWidget* w = container(id); \
+ if ( w->inherits("KToolBar") ) { \
+ QWidget* r = static_cast<KToolBar*>(w)->getWidget(itemId(id)); \
+ if (qstrcmp(r->name(),"KTToolBarLayout")==0) \
+ r = (QWidget*)r->child("widget"); \
+ if ( r && r->inherits(#WIDGET_TYPE) ) { \
+ WIDGET_TYPE* b = static_cast<WIDGET_TYPE*>(r); \
+ b->METHOD_NAME(VALUE); \
+ } \
+ } \
+ }
+
+TKAction::TKAction(QObject* parent, const char* name)
+: KAction( "", 0, parent, name )
+{
+ m_imode = TK::IconOnly;
+}
+
+TKAction::~TKAction()
+{
+}
+
+int TKAction::plug(QWidget* widget, int index)
+{
+ if ( widget->inherits("KToolBar") ) {
+ KToolBar* bar = static_cast<KToolBar*>(widget);
+ int id_ = KAction::getToolButtonID();
+ KInstance *instance;
+
+ if ( parentCollection() )
+ instance = parentCollection()->instance();
+ else
+ instance = KGlobal::instance();
+
+ TKToolBarButton* b = new TKToolBarButton(icon(),plainText(),bar,name(),instance);
+ // we don't need clicked() and buttonClicked(), do we?
+ // connect(b,SIGNAL(clicked()),SLOT(slotActivated()));
+ b->setIconMode(m_imode);
+ initToolBarButton(b);
+
+ bar->insertWidget( id_, 100, b, index );
+ addContainer(bar,id_);
+ connect( bar, SIGNAL(destroyed()), this, SLOT(slotDestroyed()) );
+
+ return containerCount() - 1;
+ }
+ return KAction::plug(widget,index);
+}
+
+void TKAction::initToolBarButton(TKToolBarButton* button)
+{
+ connect(button,SIGNAL(buttonClicked()),SLOT(slotActivated()));
+}
+
+TK::IconMode TKAction::iconMode()
+{
+ return m_imode;
+}
+
+void TKAction::setIconMode(TK::IconMode mode)
+{
+ m_imode = mode;
+ SET_FOR_ALL_CONTAINER(TKToolBarButton,setIconMode,mode)
+}
+
+void TKAction::setText(const QString& text)
+{
+ KAction::setText(text);
+ updateLayout();
+}
+
+void TKAction::setIcon(const QString& icon)
+{
+ KAction::setIcon(icon);
+ updateLayout();
+}
+
+void TKAction::updateLayout()
+{
+ int len = containerCount();
+ for( int id = 0; id < len; ++id ) {
+ QWidget* w = container( id );
+ if (w->inherits("KToolBar")) {
+ QWidget* r = static_cast<KToolBar*>(w)->getWidget(itemId(id));
+ if (qstrcmp(r->name(),"KTToolBarLayout")==0) {
+ updateLayout(r);
+ }
+ }
+ }
+}
+
+QWidget* TKAction::createLayout(QWidget* parent, QWidget* children)
+{
+ QWidget* base = new QWidget(parent,"KTToolBarLayout");
+ QLabel* textLabel = new QLabel(base,"text");
+ textLabel->setMinimumHeight(1);
+ QLabel* pixLabel = new QLabel(base,"pixmap");
+ children->reparent(base,QPoint(0,0));
+ children->setName("widget");
+ QHBoxLayout* layout = new QHBoxLayout(base,0,3);
+ layout->setResizeMode(QLayout::Minimum);
+ layout->addWidget(textLabel);
+ layout->addWidget(pixLabel);
+ layout->addWidget(children,1);
+
+ updateLayout(base);
+ return base;
+}
+
+void TKAction::updateLayout(QWidget* base)
+{
+ QLabel* textLabel = (QLabel*)base->child("text");
+ QLabel* pixLabel = (QLabel*)base->child("pixmap");
+ QWidget* w = (QWidget*)base->child("widget");
+
+ if (!textLabel || !pixLabel || !w)
+ return;
+
+ if (!text().isEmpty() && m_imode != TK::IconOnly ) {
+ textLabel->setText(text());
+ textLabel->show();
+ } else
+ textLabel->hide();
+
+ QPixmap pix;
+ if (hasIcon())
+ pix = iconSet(KIcon::Small).pixmap();
+
+ if (!icon().isEmpty())
+ pix = BarIcon(icon());
+
+ if (!pix.isNull() && m_imode != TK::TextOnly) {
+ pixLabel->setPixmap(pix);
+ pixLabel->show();
+ } else
+ pixLabel->hide();
+
+ base->setFixedWidth( w->sizeHint().width() +
+ (textLabel->isVisible() ? textLabel->sizeHint().width():0) +
+ (pixLabel->isVisible() ? pixLabel->sizeHint().width():0) );
+}
+/******************************************************************************/
+TKBaseSelectAction::TKBaseSelectAction( QObject* parent, const char* name )
+: TKAction(parent,name)
+{
+ m_current = 0;
+ m_editable = false;
+}
+
+TKBaseSelectAction::~TKBaseSelectAction()
+{
+}
+
+int TKBaseSelectAction::plug(QWidget* widget, int index)
+{
+ if ( widget->inherits("KToolBar") )
+ {
+ KToolBar* bar = static_cast<KToolBar*>( widget );
+ int id_ = KAction::getToolButtonID();
+
+ TKComboBox* cb = new TKComboBox(m_editable,bar);
+ initComboBox(cb);
+ cb->setMinimumWidth( cb->sizeHint().width() );
+ QWidget* base = createLayout(bar,cb);
+
+ bar->insertWidget( id_, 100, base, index );
+ addContainer( bar, id_ );
+
+ connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) );
+
+ setCurrentItem(currentItem());
+
+ return containerCount() - 1;
+ }
+ return -1;
+}
+
+int TKBaseSelectAction::currentItem()
+{
+ return m_current;
+}
+
+void TKBaseSelectAction::initComboBox(TKComboBox* cb)
+{
+ connect(cb,SIGNAL(activated(int)),SLOT(slotActivated(int)));
+}
+
+void TKBaseSelectAction::setEditable(bool editable)
+{
+ m_editable = editable;
+ SET_FOR_ALL_CONTAINER(TKComboBox,setEditable,editable)
+}
+
+bool TKBaseSelectAction::isEditable()
+{
+ return m_editable;
+}
+
+void TKBaseSelectAction::setCurrentItem(int index)
+{
+ m_current = index;
+ SET_FOR_ALL_CONTAINER(TKComboBox,setCurrentItem,index)
+}
+
+void TKBaseSelectAction::slotActivated(int id)
+{
+ if ( m_current == id )
+ return;
+
+ m_current = id;
+ setCurrentItem(id);
+ activate(id);
+}
+
+void TKBaseSelectAction::activate(int id)
+{
+ emit activated(id);
+}
+/******************************************************************************/
+TKSelectAction::TKSelectAction( QObject* parent, const char* name )
+: TKBaseSelectAction(parent,name)
+{
+}
+
+TKSelectAction::~TKSelectAction()
+{
+}
+
+void TKSelectAction::initComboBox(TKComboBox* cb)
+{
+ TKBaseSelectAction::initComboBox(cb);
+ connect(cb,SIGNAL(activated(const QString&)),SLOT(slotActivated(const QString&)));
+ cb->insertStringList(items());
+}
+
+void TKSelectAction::slotActivated(const QString& text)
+{
+ emit activated(text);
+}
+
+void TKSelectAction::setItems(const QStringList& lst )
+{
+ m_list = lst;
+ m_current = -1;
+
+ SET_FOR_ALL_CONTAINER(TKComboBox,clear, )
+ SET_FOR_ALL_CONTAINER(TKComboBox,insertStringList,lst)
+
+ // Disable if empty and not editable
+ setEnabled ( lst.count() > 0 || m_editable );
+}
+
+QStringList TKSelectAction::items() const
+{
+ return m_list;
+}
+
+void TKSelectAction::clear()
+{
+ SET_FOR_ALL_CONTAINER(TKComboBox,clear, )
+}
+
+void TKSelectAction::setEditText(const QString& text)
+{
+ SET_FOR_ALL_CONTAINER(TKComboBox,setEditText,text)
+}
+
+#undef SET_FOR_ALL_CONTAINER
+#include "tkaction.moc"