diff options
Diffstat (limited to 'tqtinterface/qt4/plugins/src/inputmethods/imsw-multi/tqmultiinputcontext.cpp')
-rw-r--r-- | tqtinterface/qt4/plugins/src/inputmethods/imsw-multi/tqmultiinputcontext.cpp | 379 |
1 files changed, 379 insertions, 0 deletions
diff --git a/tqtinterface/qt4/plugins/src/inputmethods/imsw-multi/tqmultiinputcontext.cpp b/tqtinterface/qt4/plugins/src/inputmethods/imsw-multi/tqmultiinputcontext.cpp new file mode 100644 index 0000000..a3caede --- /dev/null +++ b/tqtinterface/qt4/plugins/src/inputmethods/imsw-multi/tqmultiinputcontext.cpp @@ -0,0 +1,379 @@ +/**************************************************************************** +** $Id$ +** +** Implementation of TQMultiInputContext class +** +** Copyright (C) 2004 immodule for TQt Project. All rights reserved. +** +** This file is written to contribute to Trolltech AS under their own +** licence. You may use this file under your TQt license. Following +** description is copied from their original file headers. Contact +** immodule-qt@freedesktop.org if any conditions of this licensing are +** not clear to you. +** +** +** This file is part of the input method module of the TQt GUI Toolkit. +** +** This file may be distributed under the terms of the Q Public License +** as defined by Trolltech AS of Norway and appearing in the file +** LICENSE.TQPL included in the packaging of this file. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** See http://www.trolltech.com/qpl/ for TQPL licensing information. +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef TQT_NO_IM +#include "tqmultiinputcontext.h" +#include <tqinputcontextfactory.h> +#include <tqstringlist.h> +#include <tqpopupmenu.h> +#ifndef TQT_NO_IM_EXTENSIONS +#include <tqsettings.h> +#endif + +#include <cstdlib> + +#define TQT_NO_IM_TQMULTIINPUTCONTEXT_IMINDEX + +TQMultiInputContext::TQMultiInputContext() + : TQInputContext(), _slave( 0 ), imIndex( 0 ), cachedFocus( FALSE ), + cachedFocusWidget( 0 ), cachedHolderWidget( 0 ), + beIndirectlyConnected( FALSE ), popup( NULL ), currentIMKey( TQString() ) +{ + keyDict.setAutoDelete( true ); + keyDict.clear(); + + if ( getenv( "TQT_IM_MODULE" ) ) { + currentIMKey = getenv( "TQT_IM_MODULE" ); + } else { +#ifndef TQT_NO_IM_EXTENSIONS + TQSettings settings; + currentIMKey = settings.readEntry( "/qt/DefaultInputMethod", "xim" ); +#else + currentIMKey = "xim"; +#endif + } +} + +TQMultiInputContext::~TQMultiInputContext() +{ + keyDict.clear(); +} + + +TQString TQMultiInputContext::identifierName() +{ + return ( slave() ) ? slave()->identifierName() : ""; +} + +TQString TQMultiInputContext::language() +{ + return ( slave() ) ? slave()->language() : ""; +} + + +#if defined(TQ_WS_X11) +bool TQMultiInputContext::x11FilterEvent( TQWidget *keywidget, XEvent *event ) +{ + return ( slave() ) ? slave()->x11FilterEvent( keywidget, event ) : FALSE; +} +#endif // TQ_WS_X11 + + +bool TQMultiInputContext::filterEvent( const TQEvent *event ) +{ +#if !defined(TQT_NO_IM_TQMULTIINPUTCONTEXT_IMINDEX) + if ( event->type() == TQEvent::KeyPress ) { + TQKeyEvent *keyevent = (TQKeyEvent *)event; + + // filter selection key + // Control+Alt+Key_Down: change to next input method + // Control+Alt+Key_Up: change to previous input method + if ( ( keyevent->state() & TQt::ControlButton ) && + ( keyevent->state() & TQt::AltButton ) ) { + if ( keyevent->key() == TQt::Key_Up ) { + changeInputMethod( --imIndex ); + return TRUE; + } else if ( keyevent->key() == TQt::Key_Down ) { + changeInputMethod( ++imIndex ); + return TRUE; + } + } + } +#endif + + return ( slave() ) ? slave()->filterEvent( event ) : FALSE; +} + +void TQMultiInputContext::reset() +{ + if ( slave() ) + slave()->reset(); +} + + +void TQMultiInputContext::setFocus() +{ + cachedFocus = TRUE; + if ( slave() ) + slave()->setFocus(); +} + +void TQMultiInputContext::unsetFocus() +{ + cachedFocus = FALSE; + if ( slave() ) + slave()->unsetFocus(); +} + +void TQMultiInputContext::setMicroFocus( int x, int y, int w, int h, TQFont *f ) +{ + if ( slave() ) + slave()->setMicroFocus( x, y, w, h, f ); +} + +void TQMultiInputContext::mouseHandler( int x, TQEvent::Type type, + TQt::ButtonState button, + TQt::ButtonState state ) +{ + if ( slave() ) + slave()->mouseHandler( x, type, button, state ); +} + +TQFont TQMultiInputContext::font() const +{ + return ( slave() ) ? slave()->font() : TQInputContext::font(); +} + +void TQMultiInputContext::destroyInputContext() +{ + if ( _slave ) { + // _slave->reset() may not properly work in the case, so we + // manually resets the composing state of text widget + if ( _slave->tqfocusWidget() ) { + TQIMEvent *terminator = new TQIMEvent( TQEvent::IMEnd, TQString(), -1 ); + emit imEventGenerated( _slave->tqfocusWidget(), terminator ); + } + _slave->deleteLater(); + _slave = 0; + } +} + + +/*! + This function is a placeholder for future experiment or extension + such as commit string snooping. set beIndirectlyConnected = TRUE + to activate this virtual function. +*/ +void TQMultiInputContext::postIMEvent( TQObject *receiver, TQIMEvent *event ) +{ + emit imEventGenerated( receiver, event ); +} + + +#if defined(TQ_WS_X11) +TQWidget *TQMultiInputContext::tqfocusWidget() const +{ + return ( slave() ) ? slave()->tqfocusWidget() : 0; +} + +TQWidget *TQMultiInputContext::holderWidget() const +{ + return ( slave() ) ? slave()->holderWidget() : 0; +} + + +void TQMultiInputContext::setFocusWidget( TQWidget *w ) +{ + cachedFocusWidget = w; + if ( slave() ) + slave()->setFocusWidget( w ); +} + +void TQMultiInputContext::setHolderWidget( TQWidget *w ) +{ + cachedHolderWidget = w; + if ( slave() ) + slave()->setHolderWidget( w ); +} + +void TQMultiInputContext::releaseComposingWidget( TQWidget *w ) +{ + if ( slave() ) + slave()->releaseComposingWidget( w ); +} + +#endif + +bool TQMultiInputContext::isComposing() const +{ + return ( slave() ) ? slave()->isComposing() : FALSE; +} + +bool TQMultiInputContext::isPreeditRelocationEnabled() +{ + return ( slave() ) ? slave()->isPreeditRelocationEnabled() : FALSE; +} + +TQInputContext *TQMultiInputContext::slave() +{ + if ( ! _slave ) { +#if !defined(TQT_NO_IM_TQMULTIINPUTCONTEXT_IMINDEX) + changeInputMethod( imIndex ); +#else + changeInputMethod( currentIMKey ); +#endif + } + + return _slave; +} + +const TQInputContext *TQMultiInputContext::slave() const +{ + return _slave; +} + +void TQMultiInputContext::changeInputMethod( int newIndex ) +{ +#if !defined(TQT_NO_IM_TQMULTIINPUTCONTEXT_IMINDEX) + TQStringList keys = TQInputContextFactory::keys(); + if ( keys.size() == 0 ) + return; + + if ( newIndex >= (int)keys.size() ) { + imIndex = 0; + } else if ( newIndex < 0 ) { + imIndex = keys.size() - 1; + } else { + imIndex = newIndex; + } + + changeInputMethod( keys[imIndex] ); +#endif +} + +void TQMultiInputContext::changeInputMethod( TQString key ) +{ + TQStringList keys = TQInputContextFactory::keys(); + if ( keys.size() == 0 ) + return; + + if ( key.isEmpty() ) + key = keys[0]; + + if ( _slave ) { + _slave->reset(); + delete _slave; + } + + _slave = TQInputContextFactory::create( key, cachedHolderWidget ); + if ( _slave ) { + insertChild( _slave ); + + const char *method; + if ( beIndirectlyConnected ) { + method = TQT_SLOT(imEventReceived(TQObject *,TQIMEvent *)); + } else { + method = TQT_SIGNAL(imEventGenerated(TQObject *,TQIMEvent *)); + } + connect( _slave, TQT_SIGNAL(imEventGenerated(TQObject *,TQIMEvent *)), + this, method ); + connect( _slave, TQT_SIGNAL(deletionRequested()), + this, TQT_SLOT(destroyInputContext()) ); + + if ( cachedFocus ) { + _slave->setFocus(); + _slave->setFocusWidget( cachedFocusWidget ); + } + + currentIMKey = key; + + //qDebug( "TQMultiInputContext::changeInputMethod(): index=%d, slave=%s", + // imIndex, (const char *)_slave->identifierName() ); + } +} + +TQPtrList<TQInputContextMenu> *TQMultiInputContext::menus() +{ + TQInputContextMenu *imSelMenu = new TQInputContextMenu; + imSelMenu->title = tr( "Select Input &Method" ); + imSelMenu->popup = createImSelPopup(); + + TQPtrList<TQInputContextMenu> *result = new TQPtrList<TQInputContextMenu>; + result->append( imSelMenu ); + + TQPtrList<TQInputContextMenu> *slaveMenus = ( slave() ) ? slave()->menus() : 0; + if ( slaveMenus ) { + for ( TQPtrList<TQInputContextMenu>::Iterator it = slaveMenus->begin(); + it != slaveMenus->end(); + ++it ) { + TQInputContextMenu *slaveMenu = *it; + result->append( slaveMenu ); + } + delete slaveMenus; + } + + return result; +} + +TQPopupMenu *TQMultiInputContext::createImSelPopup() +{ + if ( popup ) + delete popup; + + popup = new TQPopupMenu(); + keyDict.clear(); + + TQStringList keys = TQInputContextFactory::keys(); + for ( uint i=0; i < keys.size(); i++ ) { + TQString idName = keys[i]; + bool isIMSwitcher = idName.startsWith( "imsw-" ); + + if ( ! isIMSwitcher ) { + TQString dispName = TQInputContextFactory::displayName( idName ); + if ( dispName.isEmpty() ) + dispName = idName; + + int id = popup->insertItem( dispName ); + keyDict.insert( (long)id, new TQString( idName ) ); + + if ( idName == currentIMKey ) + popup->setItemChecked( id, true ); + + TQString descriptionStr = TQInputContextFactory::description( idName ); + if ( ! descriptionStr.isEmpty() ) + popup->setWhatsThis( id, descriptionStr ); + } + } + + TQObject::connect( popup, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(changeInputMethodWithMenuId(int)) ); + + return popup; +} + +void TQMultiInputContext::changeInputMethodWithMenuId( int menuid ) +{ + TQString *key = keyDict.tqfind( (long)menuid ); + changeInputMethod( (*key) ); +} + +#endif |