Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #if OSL_DEBUG_LEVEL > 1
22 : #include <stdio.h>
23 : #endif
24 : #include <sal/alloca.h>
25 :
26 : #include <tools/prex.h>
27 : #include <X11/Xlib.h>
28 : #include <unx/XIM.h>
29 : #include <tools/postx.h>
30 :
31 : #include <unx/salunx.h>
32 : #include <unx/i18n_status.hxx>
33 : #include <unx/i18n_ic.hxx>
34 : #include <unx/saldisp.hxx>
35 : #include <unx/salframe.h>
36 : #include <unx/saldata.hxx>
37 :
38 : #include <vcl/wrkwin.hxx>
39 : #include <vcl/fixed.hxx>
40 : #include <vcl/menubtn.hxx>
41 : #include <vcl/menu.hxx>
42 : #include <vcl/svapp.hxx>
43 : #include <vcl/sysdata.hxx>
44 :
45 : #include <svdata.hxx>
46 :
47 : using namespace vcl;
48 :
49 : namespace vcl {
50 :
51 : class StatusWindow : public WorkWindow
52 : {
53 : protected:
54 : StatusWindow( WinBits nWinBits );
55 : public:
56 : virtual ~StatusWindow();
57 :
58 : virtual void setPosition( SalFrame* );
59 : virtual void setText( const String & ) = 0;
60 : virtual String getText() const = 0;
61 : virtual void show( bool bShow, I18NStatus::ShowReason eReason ) = 0;
62 : virtual void toggle( bool bOn ) = 0;
63 : };
64 :
65 : }
66 :
67 0 : StatusWindow::StatusWindow( WinBits nWinBits ) :
68 0 : WorkWindow( NULL, nWinBits )
69 : {
70 0 : }
71 :
72 0 : StatusWindow::~StatusWindow() {}
73 :
74 0 : void StatusWindow::setPosition( SalFrame* )
75 : {
76 0 : }
77 :
78 : // --------------------------------------------------------------------------
79 :
80 : namespace vcl {
81 :
82 : class XIMStatusWindow : public StatusWindow
83 : {
84 : FixedText m_aStatusText;
85 : SalFrame* m_pLastParent;
86 : Size m_aWindowSize;
87 : bool m_bAnchoredAtRight;
88 : // true if the right edge (instead of the left edge) should stay at a
89 : // fixed position when re-sizing the window
90 :
91 : // for delayed showing
92 : bool m_bDelayedShow;
93 : I18NStatus::ShowReason m_eDelayedReason;
94 : sal_uLong m_nDelayedEvent;
95 : // for toggling
96 : bool m_bOn;
97 :
98 : Point updatePosition();
99 : void layout();
100 : bool checkLastParent() const;
101 :
102 : DECL_LINK( DelayedShowHdl, void* );
103 : public:
104 : XIMStatusWindow( bool bOn );
105 : virtual ~XIMStatusWindow();
106 :
107 : virtual void setPosition( SalFrame* );
108 : virtual void setText( const String & );
109 : virtual String getText() const;
110 : virtual void show( bool bShow, I18NStatus::ShowReason eReason );
111 : virtual void toggle( bool bOn );
112 :
113 : // overload WorkWindow::DataChanged
114 : virtual void DataChanged( const DataChangedEvent& rEvt );
115 : };
116 :
117 : }
118 :
119 0 : XIMStatusWindow::XIMStatusWindow( bool bOn ) :
120 : StatusWindow( WB_BORDER | WB_SYSTEMFLOATWIN | WB_TOOLTIPWIN ),
121 : m_aStatusText( this, 0 ),
122 : m_pLastParent( NULL ),
123 : m_bAnchoredAtRight( false ),
124 : m_bDelayedShow( false ),
125 : m_eDelayedReason( I18NStatus::contextmap ),
126 : m_nDelayedEvent( 0 ),
127 0 : m_bOn( bOn )
128 : {
129 0 : layout();
130 0 : }
131 :
132 0 : XIMStatusWindow::~XIMStatusWindow()
133 : {
134 0 : if( m_nDelayedEvent )
135 0 : Application::RemoveUserEvent( m_nDelayedEvent );
136 0 : }
137 :
138 0 : void XIMStatusWindow::toggle( bool bOn )
139 : {
140 0 : m_bOn = bOn;
141 0 : show( bOn, I18NStatus::contextmap );
142 0 : }
143 :
144 0 : void XIMStatusWindow::layout()
145 : {
146 0 : m_aWindowSize.Width() = m_aStatusText.GetTextWidth( m_aStatusText.GetText() )+8;
147 0 : Font aFont( m_aStatusText.GetFont() );
148 0 : m_aWindowSize.Height() = aFont.GetHeight()+10;
149 0 : m_aWindowSize = LogicToPixel( m_aWindowSize );
150 :
151 0 : Size aControlSize( m_aWindowSize );
152 0 : aControlSize.Width() -= 4;
153 0 : aControlSize.Height() -= 4;
154 :
155 0 : m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize );
156 0 : m_aStatusText.SetFont( aFont );
157 0 : m_aStatusText.Show( sal_True );
158 :
159 0 : if (m_bAnchoredAtRight && IsVisible())
160 : {
161 0 : SalFrame* pFrame = (SalFrame*)GetSystemData()->pSalFrame;
162 0 : long nDelta = pFrame->maGeometry.nWidth - m_aWindowSize.Width();
163 : pFrame->SetPosSize( pFrame->maGeometry.nX + nDelta,
164 : pFrame->maGeometry.nY,
165 0 : m_aWindowSize.Width(),
166 0 : m_aWindowSize.Height(),
167 0 : SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y | SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
168 : }
169 : else
170 0 : SetOutputSizePixel( m_aWindowSize );
171 0 : }
172 :
173 0 : bool XIMStatusWindow::checkLastParent() const
174 : {
175 0 : if( m_pLastParent )
176 : {
177 0 : const std::list< SalFrame* >& rFrames = GetGenericData()->GetSalDisplay()->getFrames();
178 0 : for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
179 : {
180 0 : if( *it == m_pLastParent )
181 0 : return true;
182 : }
183 : }
184 0 : return false;
185 : }
186 :
187 0 : void XIMStatusWindow::DataChanged( const DataChangedEvent& )
188 : {
189 0 : m_aStatusText.SetSettings( GetSettings() );
190 0 : layout();
191 0 : }
192 :
193 0 : Point XIMStatusWindow::updatePosition()
194 : {
195 0 : Point aRet;
196 0 : if( checkLastParent() )
197 : {
198 0 : const SystemEnvData* pParentEnvData = m_pLastParent->GetSystemData();
199 :
200 : SalExtTextInputPosEvent aPosEvent;
201 0 : m_pLastParent->CallCallback( SALEVENT_EXTTEXTINPUTPOS, (void*)&aPosEvent );
202 : int x, y;
203 : XLIB_Window aChild;
204 : XTranslateCoordinates( (Display*)pParentEnvData->pDisplay,
205 : (XLIB_Window)pParentEnvData->aShellWindow,
206 : GetGenericData()->GetSalDisplay()->GetRootWindow( GetGenericData()->GetSalDisplay()->GetDefaultXScreen() ),
207 : 0, 0,
208 : &x, &y,
209 0 : &aChild );
210 :
211 : // TODO: Currently, place the status window to the (physical) left of
212 : // the cursor iff in vertical mode (assuming that the columns in
213 : // vertical mode are always written from right to left, this causes the
214 : // status window to keep out of the text already written). This
215 : // heuristic would break if there is ever a vertical mode in which the
216 : // columns are written from left to right. Also, more elaborate
217 : // positioning for (both horizontal and vertical) left-to-right and
218 : // right-to-left text would be possible.
219 0 : bool bLeft = aPosEvent.mbVertical;
220 : // true if status window is to the left of the cursor
221 :
222 0 : int const nGap = 4; // between cursor and status window
223 0 : if (aPosEvent.mbVertical)
224 : {
225 0 : aRet.X() = x + aPosEvent.mnX + (bLeft
226 0 : ? -m_aWindowSize.Width() - nGap
227 0 : : aPosEvent.mnHeight + nGap);
228 0 : aRet.Y() = y + aPosEvent.mnY;
229 : }
230 : else
231 : {
232 0 : aRet.X() = x + aPosEvent.mnX + (bLeft ? -m_aWindowSize.Width() : 0);
233 0 : aRet.Y() = y + aPosEvent.mnY+aPosEvent.mnHeight + nGap;
234 : }
235 :
236 0 : m_bAnchoredAtRight = bLeft;
237 : }
238 0 : return aRet;
239 : }
240 :
241 0 : void XIMStatusWindow::setPosition( SalFrame* pParent )
242 : {
243 0 : if( pParent )
244 : {
245 0 : if( pParent != m_pLastParent )
246 : {
247 0 : setText( String() );
248 0 : m_pLastParent = pParent;
249 0 : Show( sal_False, SHOW_NOACTIVATE );
250 : }
251 0 : if( IsVisible() )
252 : {
253 0 : const SystemEnvData* pEnvData = GetSystemData();
254 0 : SalFrame* pStatusFrame = (SalFrame*)pEnvData->pSalFrame;
255 0 : Point aPoint = updatePosition();
256 0 : pStatusFrame->SetPosSize( aPoint.X(), aPoint.Y(), m_aWindowSize.Width(), m_aWindowSize.Height(), SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y | SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
257 : }
258 : }
259 0 : }
260 :
261 0 : IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl)
262 : {
263 0 : m_nDelayedEvent = 0;
264 0 : const SystemEnvData* pData = GetSystemData();
265 0 : SalFrame* pStatusFrame = (SalFrame*)pData->pSalFrame;
266 0 : if( m_bDelayedShow )
267 : {
268 0 : Size aControlSize( m_aWindowSize.Width()-4, m_aWindowSize.Height()-4 );
269 0 : m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize );
270 0 : Point aPoint = updatePosition();
271 0 : pStatusFrame->SetPosSize( aPoint.X(), aPoint.Y(), m_aWindowSize.Width(), m_aWindowSize.Height(), SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y | SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
272 : }
273 0 : Show( m_bDelayedShow && m_bOn, SHOW_NOACTIVATE );
274 0 : if( m_bDelayedShow )
275 : {
276 : XRaiseWindow( (Display*)pData->pDisplay,
277 0 : (XLIB_Window)pData->aShellWindow );
278 : }
279 0 : return 0;
280 : }
281 :
282 0 : void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason )
283 : {
284 0 : if( bShow && ! m_aStatusText.GetText().Len() )
285 0 : bShow = false;
286 :
287 0 : m_bDelayedShow = bShow;
288 0 : m_eDelayedReason = eReason;
289 0 : if( ! m_nDelayedEvent )
290 0 : m_nDelayedEvent = Application::PostUserEvent( LINK( this, XIMStatusWindow, DelayedShowHdl ) );
291 0 : }
292 :
293 0 : void XIMStatusWindow::setText( const String& rText )
294 : {
295 0 : m_aStatusText.SetText( rText );
296 0 : m_aWindowSize.Width() = m_aStatusText.GetTextWidth( rText )+8;
297 0 : }
298 :
299 0 : String XIMStatusWindow::getText() const
300 : {
301 0 : return m_aStatusText.GetText();
302 : }
303 :
304 : // --------------------------------------------------------------------------
305 :
306 : namespace vcl {
307 :
308 : class IIIMPStatusWindow : public StatusWindow
309 : {
310 : MenuButton m_aStatusBtn;
311 : PopupMenu m_aMenu;
312 : SalFrame* m_pResetFocus;
313 : bool m_bShow;
314 : bool m_bOn;
315 :
316 : DECL_LINK( SelectHdl, MenuButton* );
317 :
318 : void show();
319 :
320 : public:
321 : IIIMPStatusWindow( SalFrame* pParent, bool bOn ); // for initial position
322 : virtual ~IIIMPStatusWindow();
323 :
324 : virtual void setText( const String & );
325 : virtual String getText() const;
326 : virtual void show( bool bShow, I18NStatus::ShowReason eReason );
327 : virtual void toggle( bool bOn );
328 : void layout();
329 :
330 : // overload Window focus handler
331 : virtual void GetFocus();
332 : // overload WorkWindow::DataChanged
333 : virtual void DataChanged( const DataChangedEvent& rEvt );
334 : };
335 :
336 : }
337 :
338 0 : IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) :
339 : StatusWindow( WB_MOVEABLE ),
340 : m_aStatusBtn( this, WB_BORDER ),
341 : m_pResetFocus( pParent ),
342 : m_bShow( true ),
343 0 : m_bOn( bOn )
344 : {
345 0 : SetText( String( RTL_CONSTASCII_USTRINGPARAM( "IME Status" ) ) );
346 :
347 0 : layout();
348 :
349 0 : m_aStatusBtn.SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) );
350 0 : m_aStatusBtn.SetPopupMenu( &m_aMenu );
351 0 : m_aStatusBtn.Show( sal_True );
352 :
353 0 : const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() );
354 0 : int i = 1;
355 0 : for( ::std::vector< I18NStatus::ChoiceData >::const_iterator it = rChoices.begin(); it != rChoices.end(); ++it, i++ )
356 0 : m_aMenu.InsertItem( i, it->aString );
357 :
358 0 : if( pParent )
359 : {
360 0 : const SystemEnvData* pEnvData = GetSystemData();
361 :
362 0 : const SalFrameGeometry& rGeom( pParent->GetUnmirroredGeometry() );
363 0 : int nDistance = rGeom.nTopDecoration;
364 0 : if( nDistance < 20 )
365 0 : nDistance = 20;
366 : XMoveWindow( (Display*)pEnvData->pDisplay,
367 : (XLIB_Window)pEnvData->aShellWindow,
368 : rGeom.nX,
369 : rGeom.nY + rGeom.nHeight + nDistance
370 0 : );
371 : }
372 : #if OSL_DEBUG_LEVEL > 1
373 : else
374 : fprintf( stderr, "Warning: could not reposition status window since no frame\n" );
375 : #endif
376 0 : EnableAlwaysOnTop( sal_True );
377 0 : }
378 :
379 0 : IIIMPStatusWindow::~IIIMPStatusWindow()
380 : {
381 0 : }
382 :
383 0 : void IIIMPStatusWindow::layout()
384 : {
385 0 : Font aFont( m_aStatusBtn.GetFont() );
386 0 : Size aSize( 15*aFont.GetHeight(), aFont.GetHeight()+14 );
387 0 : aSize = m_aStatusBtn.LogicToPixel( aSize );
388 :
389 0 : m_aStatusBtn.SetPosSizePixel( Point( 0, 0 ), aSize );
390 0 : SetOutputSizePixel( aSize );
391 0 : if( IsVisible() )
392 0 : Invalidate();
393 0 : }
394 :
395 0 : void IIIMPStatusWindow::DataChanged( const DataChangedEvent& )
396 : {
397 0 : m_aStatusBtn.SetSettings( GetSettings() );
398 0 : layout();
399 0 : }
400 :
401 0 : void IIIMPStatusWindow::setText( const String& rText )
402 : {
403 0 : m_aStatusBtn.SetText( rText );
404 0 : }
405 :
406 0 : String IIIMPStatusWindow::getText() const
407 : {
408 0 : return m_aStatusBtn.GetText();
409 : }
410 :
411 0 : void IIIMPStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason )
412 : {
413 : // hide IIIMPStatusWindow only in presentations
414 0 : if( ! bShow
415 : && eReason != I18NStatus::presentation
416 : )
417 0 : return;
418 :
419 0 : m_bShow = bShow;
420 0 : show();
421 : }
422 :
423 0 : void IIIMPStatusWindow::toggle( bool bOn )
424 : {
425 0 : if (bOn != m_bOn)
426 : {
427 0 : m_bOn = bOn;
428 0 : show();
429 : }
430 0 : }
431 :
432 0 : void IIIMPStatusWindow::show()
433 : {
434 0 : if (m_bOn && m_bShow && !IsVisible())
435 0 : m_pResetFocus = I18NStatus::get().getParent();
436 0 : Show(m_bOn && m_bShow);
437 0 : }
438 :
439 0 : void IIIMPStatusWindow::GetFocus()
440 : {
441 : /*
442 : * this is here just to put the focus back to the application
443 : * window at startup on clickToFocus WMs
444 : */
445 0 : WorkWindow::GetFocus();
446 0 : if( m_pResetFocus )
447 : {
448 : /*
449 : * look if reset focus still exists
450 : * since reset focus really is an internal hack there should
451 : * not be a method to be called in SalFrame destructor
452 : */
453 0 : const std::list< SalFrame* >& rFrames = GetGenericData()->GetSalDisplay()->getFrames();
454 0 : std::list< SalFrame* >::const_iterator it;
455 0 : for( it = rFrames.begin(); it != rFrames.end() && *it != m_pResetFocus; ++it )
456 : ;
457 0 : if( it != rFrames.end() )
458 : {
459 0 : const SystemEnvData* pParentEnvData = m_pResetFocus->GetSystemData();
460 0 : GetGenericData()->ErrorTrapPush();
461 : XSetInputFocus( (Display*)pParentEnvData->pDisplay,
462 : (XLIB_Window)pParentEnvData->aShellWindow,
463 : RevertToNone,
464 : CurrentTime
465 0 : );
466 0 : XSync( (Display*)pParentEnvData->pDisplay, False );
467 0 : GetGenericData()->ErrorTrapPop();
468 : }
469 0 : m_pResetFocus = NULL;
470 : }
471 0 : }
472 :
473 : // --------------------------------------------------------------------------
474 :
475 0 : IMPL_LINK( IIIMPStatusWindow, SelectHdl, MenuButton*, pBtn )
476 : {
477 0 : if( pBtn == & m_aStatusBtn )
478 : {
479 0 : const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() );
480 0 : unsigned int nIndex = m_aStatusBtn.GetCurItemId()-1;
481 0 : if( nIndex < rChoices.size() )
482 : {
483 0 : XSetICValues( static_cast<X11SalFrame*>(I18NStatus::get().getParent())->getInputContext()->GetContext(),
484 : XNUnicodeCharacterSubset,
485 0 : rChoices[nIndex].pData,
486 0 : NULL);
487 : // FIXME: get rid of X11SalFrame
488 0 : X11SalFrame* pParent = static_cast<X11SalFrame*>(I18NStatus::get().getParent());
489 0 : if( pParent && pParent->isMapped() )
490 : {
491 0 : const SystemEnvData* pEnv = pParent->GetSystemData();
492 0 : GetGenericData()->ErrorTrapPush();
493 : XSetInputFocus( (Display*)pEnv->pDisplay,
494 : (XLIB_Window)pEnv->aShellWindow,
495 : RevertToNone,
496 : CurrentTime
497 0 : );
498 0 : XSync( (Display*)pEnv->pDisplay, False );
499 0 : GetGenericData()->ErrorTrapPop();
500 : }
501 : }
502 : }
503 0 : return 0;
504 : }
505 :
506 : /*
507 : * I18NStatus
508 : */
509 :
510 : I18NStatus* I18NStatus::pInstance = NULL;
511 :
512 0 : I18NStatus& I18NStatus::get()
513 : {
514 0 : if( ! pInstance )
515 0 : pInstance = new I18NStatus();
516 0 : return *pInstance;
517 : }
518 :
519 : // --------------------------------------------------------------------------
520 :
521 0 : bool I18NStatus::exists()
522 : {
523 0 : return pInstance != NULL;
524 : }
525 :
526 : // --------------------------------------------------------------------------
527 :
528 0 : void I18NStatus::free()
529 : {
530 0 : if( pInstance )
531 0 : delete pInstance, pInstance = NULL;
532 0 : }
533 :
534 : // --------------------------------------------------------------------------
535 :
536 0 : I18NStatus::I18NStatus() :
537 : m_pParent( NULL ),
538 0 : m_pStatusWindow( NULL )
539 : {
540 0 : }
541 :
542 : // --------------------------------------------------------------------------
543 :
544 0 : I18NStatus::~I18NStatus()
545 : {
546 0 : if( m_pStatusWindow )
547 0 : delete m_pStatusWindow, m_pStatusWindow = NULL;
548 0 : if( pInstance == this )
549 0 : pInstance = NULL;
550 0 : }
551 :
552 : // --------------------------------------------------------------------------
553 :
554 0 : void I18NStatus::setParent( SalFrame* pParent )
555 : {
556 0 : m_pParent = pParent;
557 0 : if( ! m_pStatusWindow )
558 : {
559 0 : bool bIIIMPmode = m_aChoices.begin() != m_aChoices.end();
560 0 : if( bIIIMPmode )
561 : m_pStatusWindow = new IIIMPStatusWindow( pParent,
562 0 : getStatusWindowMode() );
563 : else
564 0 : m_pStatusWindow = new XIMStatusWindow( getStatusWindowMode() );
565 0 : setStatusText( m_aCurrentIM );
566 : }
567 0 : m_pStatusWindow->setPosition( m_pParent );
568 0 : }
569 :
570 : // --------------------------------------------------------------------------
571 :
572 0 : void I18NStatus::show( bool bShow, ShowReason eReason )
573 : {
574 0 : if( m_pStatusWindow )
575 : {
576 0 : m_pStatusWindow->setPosition( m_pParent );
577 0 : m_pStatusWindow->show( bShow, eReason );
578 : }
579 0 : }
580 :
581 : // --------------------------------------------------------------------------
582 :
583 0 : void I18NStatus::setStatusText( const String& rText )
584 : {
585 0 : if( m_pStatusWindow )
586 : {
587 : /*
588 : * #93614# convert fullwidth ASCII forms to ascii
589 : */
590 0 : int nChars = rText.Len()+1;
591 0 : sal_Unicode* pBuffer = (sal_Unicode*)alloca( nChars*sizeof( sal_Unicode ) );
592 0 : const sal_Unicode* pCopy = rText.GetBuffer();
593 0 : for( int i = 0; i < nChars; i++ )
594 : {
595 0 : if( pCopy[i] >=0xff00 && pCopy[i] <= 0xff5f )
596 0 : pBuffer[i] = (pCopy[i] & 0xff) + 0x20;
597 : else
598 0 : pBuffer[i] = pCopy[i];
599 : }
600 0 : rtl::OUString aText( pBuffer );
601 0 : m_pStatusWindow->setText( aText );
602 0 : m_pStatusWindow->setPosition( m_pParent );
603 :
604 0 : bool bVisible = true;
605 0 : if( m_pParent )
606 : {
607 : long w, h;
608 0 : m_pParent->GetClientSize( w, h );
609 0 : if( w == 0 || h == 0 )
610 : {
611 0 : bVisible = false;
612 : }
613 : }
614 :
615 0 : m_pStatusWindow->show( bVisible, contextmap );
616 : }
617 0 : }
618 :
619 : // --------------------------------------------------------------------------
620 :
621 0 : void I18NStatus::changeIM( const String& rIM )
622 : {
623 0 : m_aCurrentIM = rIM;
624 0 : }
625 :
626 : // --------------------------------------------------------------------------
627 :
628 0 : SalFrame* I18NStatus::getStatusFrame() const
629 : {
630 0 : SalFrame* pRet = NULL;
631 0 : if( m_pStatusWindow )
632 : {
633 0 : const SystemEnvData* pData = m_pStatusWindow->GetSystemData();
634 0 : pRet = (SalFrame*)pData->pSalFrame;
635 : }
636 0 : return pRet;
637 : }
638 :
639 0 : bool I18NStatus::canToggleStatusWindow() const
640 : {
641 0 : return true;
642 : }
643 :
644 0 : void I18NStatus::toggleStatusWindow()
645 : {
646 0 : if (m_pStatusWindow != 0)
647 0 : m_pStatusWindow->toggle(getStatusWindowMode());
648 0 : }
649 :
650 0 : bool I18NStatus::getStatusWindowMode()
651 : {
652 0 : switch (ImplGetSVData()->maAppData.meShowImeStatusWindow)
653 : {
654 : default: // ImplSVAppData::ImeStatusWindowMode_UNKNOWN
655 0 : return Application::GetShowImeStatusWindowDefault();
656 : case ImplSVAppData::ImeStatusWindowMode_HIDE:
657 0 : return false;
658 : case ImplSVAppData::ImeStatusWindowMode_SHOW:
659 0 : return true;
660 : }
661 : }
662 :
663 : /*
664 : * X11ImeStatus
665 : */
666 0 : X11ImeStatus::~X11ImeStatus()
667 : {
668 0 : vcl::I18NStatus::free();
669 0 : }
670 :
671 0 : bool X11ImeStatus::canToggle()
672 : {
673 0 : return vcl::I18NStatus::get().canToggleStatusWindow();
674 : }
675 :
676 0 : void X11ImeStatus::toggle()
677 : {
678 0 : vcl::I18NStatus::get().toggleStatusWindow();
679 0 : }
680 :
681 0 : SalI18NImeStatus* X11SalInstance::CreateI18NImeStatus()
682 : {
683 0 : return new X11ImeStatus();
684 : }
685 :
686 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|