xref: /AOO41X/main/svx/source/tbxctrls/layctrl.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers
30 #include <vcl/toolbox.hxx>
31 #ifndef _SV_BUTTON_HXX //autogen
32 #include <vcl/button.hxx>
33 #endif
34 #include <svl/intitem.hxx>
35 #include <sfx2/dispatch.hxx>
36 #include <sfx2/app.hxx>
37 
38 #include <svx/dialogs.hrc>
39 #include "svx/layctrl.hxx"
40 #include <svx/dialmgr.hxx>
41 #include <comphelper/processfactory.hxx>
42 #include <svtools/colorcfg.hxx>
43 
44 // namespaces
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::beans;
47 using namespace ::com::sun::star::util;
48 using namespace ::com::sun::star::frame;
49 
50 SFX_IMPL_TOOLBOX_CONTROL(SvxTableToolBoxControl,SfxUInt16Item);
51 SFX_IMPL_TOOLBOX_CONTROL(SvxColumnsToolBoxControl,SfxUInt16Item);
52 
53 // class TableWindow -----------------------------------------------------
54 
55 class TableWindow : public SfxPopupWindow
56 {
57 private:
58     ::Color             aLineColor;
59     ::Color             aHighlightLineColor;
60     ::Color             aFillColor;
61     ::Color             aHighlightFillColor;
62     long                nCol;
63     long                nLine;
64     long                nWidth;
65     long                nHeight;
66     long                nMX;
67     long                nMY;
68     long                nTextHeight;
69     sal_Bool                bInitialKeyInput;
70     sal_Bool                m_bMod1;
71     ToolBox&            rTbx;
72     Reference< XFrame > mxFrame;
73     rtl::OUString       maCommand;
74 
75     void UpdateSize_Impl( long nNewCol, long nNewLine);
76 
77 public:
78                             TableWindow( sal_uInt16                     nSlotId,
79                                          const rtl::OUString&       rCmd,
80                                          ToolBox&                   rParentTbx,
81                                          const Reference< XFrame >& rFrame );
82                             ~TableWindow();
83 
84     void                    KeyInput( const KeyEvent& rKEvt );
85     virtual void            MouseMove( const MouseEvent& rMEvt );
86     virtual void            MouseButtonDown( const MouseEvent& rMEvt );
87     virtual void            MouseButtonUp( const MouseEvent& rMEvt );
88     virtual void            Paint( const Rectangle& );
89     virtual void            PopupModeEnd();
90     virtual SfxPopupWindow* Clone() const;
91 
GetColCount() const92     sal_uInt16                  GetColCount() const { return (sal_uInt16)nCol; }
GetLineCount() const93     sal_uInt16                  GetLineCount() const { return (sal_uInt16)nLine; }
94 };
95 
96 // -----------------------------------------------------------------------
97 
TableWindow(sal_uInt16 nSlotId,const rtl::OUString & rCmd,ToolBox & rParentTbx,const Reference<XFrame> & rFrame)98 TableWindow::TableWindow( sal_uInt16 nSlotId, const rtl::OUString& rCmd, ToolBox& rParentTbx, const Reference< XFrame >& rFrame ) :
99     SfxPopupWindow( nSlotId, rFrame, WB_SYSTEMWINDOW ),
100     bInitialKeyInput(sal_True),
101     m_bMod1(sal_False),
102     rTbx(rParentTbx),
103     mxFrame( rFrame ),
104     maCommand( rCmd )
105 {
106     const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
107     svtools::ColorConfig aColorConfig;
108     aLineColor = ::Color( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
109     aHighlightLineColor = rStyles.GetHighlightTextColor();
110     aFillColor = rStyles.GetWindowColor();
111     aHighlightFillColor = rStyles.GetHighlightColor();
112 
113     nTextHeight = GetTextHeight()+1;
114     SetBackground();
115     Font aFont = GetFont();
116     aFont.SetColor( aLineColor );
117     aFont.SetFillColor( aFillColor );
118     aFont.SetTransparent( sal_False );
119     SetFont( aFont );
120 
121     nCol    = 0;
122     nLine   = 0;
123     nWidth  = 5;
124     nHeight = 5;
125 
126     Size aLogicSize = LogicToPixel( Size( 55, 35 ), MapMode( MAP_10TH_MM ) );
127     nMX = aLogicSize.Width();
128     nMY = aLogicSize.Height();
129     SetOutputSizePixel( Size( nMX*nWidth-1, nMY*nHeight-1+nTextHeight ) );
130 }
131 // -----------------------------------------------------------------------
~TableWindow()132 TableWindow::~TableWindow()
133 {
134 }
135 // -----------------------------------------------------------------------
136 
Clone() const137 SfxPopupWindow* TableWindow::Clone() const
138 {
139     return new TableWindow( GetId(), maCommand, rTbx, mxFrame );
140 }
141 
142 // -----------------------------------------------------------------------
143 
MouseMove(const MouseEvent & rMEvt)144 void TableWindow::MouseMove( const MouseEvent& rMEvt )
145 {
146     SfxPopupWindow::MouseMove( rMEvt );
147     Point aPos = rMEvt.GetPosPixel();
148     Point aMousePos( aPos );
149 
150     if ( rMEvt.IsEnterWindow() )
151         CaptureMouse();
152     else if ( aMousePos.X() < 0 || aMousePos.Y() < 0 )
153     {
154         nCol = 0;
155         nLine = 0;
156         ReleaseMouse();
157         Invalidate();
158         return;
159     }
160 
161     long    nNewCol = 0;
162     long    nNewLine = 0;
163 
164     if ( aPos.X() > 0 )
165         nNewCol = aPos.X() / nMX + 1;
166     if ( aPos.Y() > 0 )
167         nNewLine = aPos.Y() / nMY + 1;
168 
169     if ( nNewCol > 500 )
170         nNewCol = 500;
171     if ( nNewLine > 1000 )
172         nNewLine = 1000;
173 
174     UpdateSize_Impl( nNewCol, nNewLine);
175 
176 }
177 /* -----------------------------15.05.2002 17:14------------------------------
178 
179  ---------------------------------------------------------------------------*/
UpdateSize_Impl(long nNewCol,long nNewLine)180 void TableWindow::UpdateSize_Impl( long nNewCol, long nNewLine)
181 {
182     Size  aWinSize = GetOutputSizePixel();
183     Point aWinPos = GetPosPixel();
184     Point aMaxPos = OutputToScreenPixel( GetDesktopRectPixel().BottomRight() );
185     if ( (nWidth <= nNewCol) || (nHeight < nNewLine) )
186     {
187         long    nOff = 0;
188 
189         if ( nWidth <= nNewCol )
190         {
191             nWidth = nNewCol;
192             nWidth++;
193         }
194         if ( nHeight <= nNewLine )
195         {
196             nHeight = nNewLine;
197             nOff = 1;
198         }
199         while ( nWidth > 0 &&
200                 (short)(aWinPos.X()+(nMX*nWidth-1)) >= aMaxPos.X()-3 )
201             nWidth--;
202 
203         while ( nHeight > 0 &&
204                 (short)(aWinPos.Y()+(nMY*nHeight-1+nTextHeight)) >=
205                 aMaxPos.Y()-3 )
206             nHeight--;
207 
208         if ( nNewCol > nWidth )
209             nNewCol = nWidth;
210 
211         if ( nNewLine > nHeight )
212             nNewLine = nHeight;
213 
214         Size    _aWinSize = GetOutputSizePixel();
215         Invalidate( Rectangle( 0, _aWinSize.Height()-nTextHeight+2-nOff,
216                                _aWinSize.Width(), _aWinSize.Height() ) );
217         SetOutputSizePixel( Size( nMX*nWidth-1, nMY*nHeight-1+nTextHeight ) );
218     }
219     long    nMinCol = 0;
220     long    nMaxCol = 0;
221     long    nMinLine = 0;
222     long    nMaxLine = 0;
223     if ( nNewCol < nCol )
224     {
225         nMinCol = nNewCol;
226         nMaxCol = nCol;
227     }
228     else
229     {
230         nMinCol = nCol;
231         nMaxCol = nNewCol;
232     }
233     if ( nNewLine < nLine )
234     {
235         nMinLine = nNewLine;
236         nMaxLine = nLine;
237     }
238     else
239     {
240         nMinLine = nLine;
241         nMaxLine = nNewLine;
242     }
243 
244     if ( (nNewCol != nCol) || (nNewLine != nLine) )
245     {
246         Invalidate( Rectangle( 0, aWinSize.Height()-nTextHeight+2,
247                                aWinSize.Width(), aWinSize.Height() ) );
248 
249         if ( nNewCol != nCol )
250         {
251             Invalidate( Rectangle( nMinCol*nMX-1, 0, nMaxCol*nMX+1, nMaxLine*nMY ) );
252             nCol  = nNewCol;
253         }
254         if ( nNewLine != nLine )
255         {
256             Invalidate( Rectangle( 0, nMinLine*nMY-2, nMaxCol*nMX, nMaxLine*nMY+1 ) );
257             nLine = nNewLine;
258         }
259     }
260     Update();
261 }
262 /* -----------------------------15.05.2002 14:22------------------------------
263 
264  ---------------------------------------------------------------------------*/
KeyInput(const KeyEvent & rKEvt)265 void TableWindow::KeyInput( const KeyEvent& rKEvt )
266 {
267     sal_Bool bHandled = sal_False;
268     sal_uInt16 nModifier = rKEvt.GetKeyCode().GetModifier();
269     sal_uInt16 nKey = rKEvt.GetKeyCode().GetCode();
270     if(!nModifier)
271     {
272         if( KEY_UP == nKey || KEY_DOWN == nKey ||
273             KEY_LEFT == nKey || KEY_RIGHT == nKey ||
274             KEY_ESCAPE == nKey ||KEY_RETURN == nKey )
275         {
276             bHandled = sal_True;
277             long nNewCol = nCol;
278             long nNewLine = nLine;
279             switch(nKey)
280             {
281                 case KEY_UP :
282                     if(nNewLine > 1)
283                     {
284                         nNewLine--;
285                         break;
286                     }
287                 //no break;
288                 case KEY_ESCAPE:
289                     EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL);
290                 break;
291                 case KEY_DOWN :
292                     nNewLine++;
293                 break;
294                 case KEY_LEFT :
295 
296                     if(nNewCol)
297                         nNewCol--;
298                 break;
299                 case KEY_RIGHT :
300                     nNewCol++;
301                 break;
302                 case KEY_RETURN :
303                     if(IsMouseCaptured())
304                         ReleaseMouse();
305                     EndPopupMode(FLOATWIN_POPUPMODEEND_CLOSEALL );
306                 break;
307             }
308             //make sure that a table can initially be created
309             if(bInitialKeyInput)
310             {
311                 bInitialKeyInput = sal_False;
312                 if(!nNewLine)
313                     nNewLine = 1;
314                 if(!nNewCol)
315                     nNewCol = 1;
316             }
317             UpdateSize_Impl( nNewCol, nNewLine);
318         }
319     }
320     else if(KEY_MOD1 == nModifier && KEY_RETURN == nKey)
321     {
322         m_bMod1 = sal_True;
323         if(IsMouseCaptured())
324             ReleaseMouse();
325         EndPopupMode(FLOATWIN_POPUPMODEEND_CLOSEALL );
326     }
327 
328     if(!bHandled)
329         SfxPopupWindow::KeyInput(rKEvt);
330 
331 }
332 // -----------------------------------------------------------------------
333 
MouseButtonDown(const MouseEvent & rMEvt)334 void TableWindow::MouseButtonDown( const MouseEvent& rMEvt )
335 {
336     SfxPopupWindow::MouseButtonDown( rMEvt );
337     CaptureMouse();
338 }
339 
340 // -----------------------------------------------------------------------
341 
MouseButtonUp(const MouseEvent & rMEvt)342 void TableWindow::MouseButtonUp( const MouseEvent& rMEvt )
343 {
344     SfxPopupWindow::MouseButtonUp( rMEvt );
345     ReleaseMouse();
346 
347     if ( IsInPopupMode() )
348         EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
349 }
350 
351 // -----------------------------------------------------------------------
352 
Paint(const Rectangle &)353 void TableWindow::Paint( const Rectangle& )
354 {
355     long    i;
356     long    nStart;
357     Size    aSize = GetOutputSizePixel();
358 
359     SetLineColor();
360     SetFillColor( aHighlightFillColor );
361     DrawRect( Rectangle( 0, 0, nCol*nMX-1, nLine*nMY-1 ) );
362     SetFillColor( aFillColor );
363     DrawRect( Rectangle( nCol*nMX-1, 0,
364                          aSize.Width(), aSize.Height()-nTextHeight+1 ) );
365     DrawRect( Rectangle( 0, nLine*nMY-1,
366                          aSize.Width(), aSize.Height()-nTextHeight+1 ) );
367 
368     SetLineColor( aHighlightLineColor );
369     for ( i = 1; i < nCol; i++ )
370         DrawLine( Point( i*nMX-1, 0 ), Point( i*nMX-1, nLine*nMY-1 ) );
371     for ( i = 1; i < nLine; i++ )
372         DrawLine( Point( 0, i*nMY-1 ), Point( nCol*nMX-1, i*nMY-1 ) );
373     SetLineColor( aLineColor );
374     for ( i = 1; i <= nWidth; i++ )
375     {
376         if ( i < nCol )
377             nStart = nLine*nMY-1;
378         else
379             nStart = 0;
380         DrawLine( Point( i*nMX-1, nStart ), Point( i*nMX-1, nHeight*nMY-1 ) );
381     }
382     for ( i = 1; i <= nHeight; i++ )
383     {
384         if ( i < nLine )
385             nStart = nCol*nMX-1;
386         else
387             nStart = 0;
388         DrawLine( Point( nStart, i*nMY-1 ), Point( nWidth*nMX-1, i*nMY-1 ) );
389     }
390 
391     SetLineColor();
392     String aText;
393     if ( nCol && nLine )
394     {
395         aText += String::CreateFromInt32( nCol );
396         aText.AppendAscii( " x " );
397         aText += String::CreateFromInt32( nLine );
398         if(GetId() == FN_SHOW_MULTIPLE_PAGES)
399         {
400             aText += ' ';
401             aText += String(SVX_RESSTR(RID_SVXSTR_PAGES));
402         }
403 
404     }
405     else
406         aText = Button::GetStandardText( BUTTON_CANCEL );
407     Size aTextSize( GetTextWidth( aText ), GetTextHeight() );
408 
409     Rectangle aClearRect( 0, aSize.Height()-nTextHeight+2, (aSize.Width()), aSize.Height() );
410     DrawRect( aClearRect );
411 
412     // #i95350# force RTL output
413     if( IsRTLEnabled() &&   nCol && nLine )
414         aText.Insert(0x202D, 0);
415     DrawText( Point( (aSize.Width() - aTextSize.Width()) / 2, aSize.Height() - nTextHeight + 2 ), aText );
416 
417     SetLineColor( aLineColor );
418     SetFillColor();
419     DrawRect( Rectangle( Point(0,0), aSize ) );
420 }
421 
422 // -----------------------------------------------------------------------
423 
PopupModeEnd()424 void TableWindow::PopupModeEnd()
425 {
426     if ( !IsPopupModeCanceled() && nCol && nLine )
427     {
428         Window* pParent = rTbx.GetParent();
429         sal_uInt16 nId = GetId();
430         pParent->UserEvent(SVX_EVENT_COLUM_WINDOW_EXECUTE, reinterpret_cast<void*>(nId));
431 
432         Reference< XDispatchProvider > xDispatchProvider( mxFrame, UNO_QUERY );
433         if ( xDispatchProvider.is() )
434         {
435             com::sun::star::util::URL aTargetURL;
436             Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance(
437                                                     rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )),
438                                                   UNO_QUERY );
439             aTargetURL.Complete = maCommand;
440             xTrans->parseStrict( aTargetURL );
441             Reference< XDispatch > xDispatch = xDispatchProvider->queryDispatch( aTargetURL, rtl::OUString(), 0 );
442             if ( xDispatch.is() )
443             {
444                 Sequence< PropertyValue > aArgs( 2 );
445                 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Columns" ));
446                 aArgs[0].Value = makeAny( sal_Int16( nCol ));
447                 aArgs[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Rows" ));
448                 aArgs[1].Value = makeAny( sal_Int16( nLine ));
449 
450                 xDispatch->dispatch( aTargetURL, aArgs );
451             }
452         }
453     }
454     else if ( IsPopupModeCanceled() )
455         ReleaseMouse();
456     SfxPopupWindow::PopupModeEnd();
457 }
458 
459 // class ColumnsWindow ---------------------------------------------------
460 
461 class ColumnsWindow : public SfxPopupWindow
462 {
463 private:
464     ::Color             aLineColor;
465     ::Color             aHighlightLineColor;
466     ::Color             aFillColor;
467     ::Color             aHighlightFillColor;
468     long                nCol;
469     long                nWidth;
470     long                nMX;
471     long                nTextHeight;
472     sal_Bool                bInitialKeyInput;
473     sal_Bool                m_bMod1;
474     ToolBox&            rTbx;
475     Reference< XFrame > mxFrame;
476     ::rtl::OUString            maCommand;
477 
478     void UpdateSize_Impl( long nNewCol );
479 public:
480                             ColumnsWindow( sal_uInt16 nId, const ::rtl::OUString& rCmd, ToolBox& rParentTbx, const Reference< XFrame >& rFrame );
481 
482     void                    KeyInput( const KeyEvent& rKEvt );
483     virtual void            MouseMove( const MouseEvent& rMEvt );
484     virtual void            MouseButtonDown( const MouseEvent& rMEvt );
485     virtual void            MouseButtonUp( const MouseEvent& rMEvt );
486     virtual void            Paint( const Rectangle& );
487     virtual void            PopupModeEnd();
488     virtual SfxPopupWindow* Clone() const;
489 
GetColCount() const490     sal_uInt16                  GetColCount() const { return (sal_uInt16)nCol; }
491 };
492 
493 // -----------------------------------------------------------------------
494 
ColumnsWindow(sal_uInt16 nId,const::rtl::OUString & rCmd,ToolBox & rParentTbx,const Reference<XFrame> & rFrame)495 ColumnsWindow::ColumnsWindow( sal_uInt16 nId, const ::rtl::OUString& rCmd, ToolBox& rParentTbx, const Reference< XFrame >& rFrame ) :
496     SfxPopupWindow( nId, rFrame, WB_SYSTEMWINDOW ),
497     bInitialKeyInput(sal_True),
498     m_bMod1(sal_False),
499     rTbx(rParentTbx),
500     mxFrame(rFrame),
501     maCommand( rCmd )
502 {
503     const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
504     svtools::ColorConfig aColorConfig;
505     aLineColor = ::Color( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
506     aHighlightLineColor = rStyles.GetHighlightTextColor();
507     aFillColor = rStyles.GetWindowColor();
508     aHighlightFillColor = rStyles.GetHighlightColor();
509 
510     nTextHeight = GetTextHeight()+1;
511     SetBackground();
512     Font aFont( GetFont() );
513     aFont.SetColor( aLineColor );
514     aFont.SetFillColor( aFillColor );
515     aFont.SetTransparent( sal_False );
516     SetFont( aFont );
517 
518     nCol        = 0;
519     nWidth      = 4;
520 
521     Size aLogicSize = LogicToPixel( Size( 95, 155 ), MapMode( MAP_10TH_MM ) );
522     nMX = aLogicSize.Width();
523     SetOutputSizePixel( Size( nMX*nWidth-1, aLogicSize.Height()+nTextHeight ) );
524     StartCascading();
525 }
526 
527 // -----------------------------------------------------------------------
528 
Clone() const529 SfxPopupWindow* ColumnsWindow::Clone() const
530 {
531     return new ColumnsWindow( GetId(), maCommand, rTbx, mxFrame );
532 }
533 
534 // -----------------------------------------------------------------------
535 
MouseMove(const MouseEvent & rMEvt)536 void ColumnsWindow::MouseMove( const MouseEvent& rMEvt )
537 {
538     SfxPopupWindow::MouseMove( rMEvt );
539     Point aPos = rMEvt.GetPosPixel();
540     Point aMousePos = aPos;
541     Point aWinPos = GetPosPixel();
542 
543     if ( rMEvt.IsEnterWindow() )
544         CaptureMouse();
545     else if ( aMousePos.X() < 0 || aMousePos.Y() < 0 )
546     {
547         nCol = 0;
548         ReleaseMouse();
549         Invalidate();
550         return;
551     }
552 
553     long    nNewCol = 0;
554     if ( aPos.X() > 0 )
555         nNewCol = aPos.X() / nMX + 1;
556     if ( aPos.Y() < 0 )
557         nNewCol = 0;
558     if ( nNewCol > 20 )
559         nNewCol = 20;
560     UpdateSize_Impl( nNewCol );
561 }
562 /* -----------------------------21.05.2002 16:16------------------------------
563 
564  ---------------------------------------------------------------------------*/
UpdateSize_Impl(long nNewCol)565 void ColumnsWindow::UpdateSize_Impl( long nNewCol )
566 {
567     Size    aWinSize = GetOutputSizePixel();
568     long    nMinCol = 0;
569     long    nMaxCol = 0;
570     Point   aWinPos;// = GetPosPixel();
571 
572     if ( nWidth <= nNewCol )
573     {
574         Point aMaxPos = OutputToScreenPixel( GetDesktopRectPixel().BottomRight() );
575 
576         if ( nWidth <= nNewCol )
577         {
578             nWidth = nNewCol;
579             nWidth++;
580         }
581 
582         while ( nWidth > 0 &&
583                 (short)(aWinPos.X()+(nMX*nWidth-1)) >= aMaxPos.X()-3 )
584             nWidth--;
585 
586         if ( nNewCol > nWidth )
587             nNewCol = nWidth;
588 
589         Invalidate( Rectangle( 0, aWinSize.Height()-nTextHeight+2,
590                                aWinSize.Width(), aWinSize.Height() ) );
591         SetOutputSizePixel( Size( nMX*nWidth-1, aWinSize.Height() ) );
592     }
593 
594 
595     if ( nNewCol != nCol )
596     {
597         Invalidate( Rectangle( 0, aWinSize.Height()-nTextHeight+2,
598                                aWinSize.Width(), aWinSize.Height() ) );
599 
600         if ( nNewCol < nCol )
601         {
602             nMinCol = nNewCol;
603             nMaxCol = nCol;
604         }
605         else
606         {
607             nMinCol = nCol;
608             nMaxCol = nNewCol;
609         }
610 
611         Invalidate( Rectangle( nMinCol*nMX-1, 0,
612                                nMaxCol*nMX+1, aWinSize.Height()-nTextHeight+2 ) );
613         nCol  = nNewCol;
614     }
615     Update();
616 }
617 // -----------------------------------------------------------------------
618 
MouseButtonDown(const MouseEvent & rMEvt)619 void ColumnsWindow::MouseButtonDown( const MouseEvent& rMEvt )
620 {
621     SfxPopupWindow::MouseButtonDown( rMEvt );
622     CaptureMouse();
623 }
624 /* -----------------------------21.05.2002 16:11------------------------------
625 
626  ---------------------------------------------------------------------------*/
KeyInput(const KeyEvent & rKEvt)627 void ColumnsWindow::KeyInput( const KeyEvent& rKEvt )
628 {
629     sal_Bool bHandled = sal_False;
630     sal_uInt16 nModifier = rKEvt.GetKeyCode().GetModifier();
631     sal_uInt16 nKey = rKEvt.GetKeyCode().GetCode();
632     if(!nModifier)
633     {
634         if( KEY_LEFT == nKey || KEY_RIGHT == nKey ||
635             KEY_RETURN == nKey ||KEY_ESCAPE == nKey ||
636             KEY_UP == nKey)
637         {
638             bHandled = sal_True;
639             long nNewCol = nCol;
640             switch(nKey)
641             {
642                 case KEY_LEFT :
643                     if(nNewCol)
644                         nNewCol--;
645                 break;
646                 case KEY_RIGHT :
647                     nNewCol++;
648                 break;
649                 case KEY_RETURN :
650                     if(IsMouseCaptured())
651                         ReleaseMouse();
652                     EndPopupMode(FLOATWIN_POPUPMODEEND_CLOSEALL );
653                 break;
654                 case KEY_ESCAPE :
655                 case KEY_UP :
656                     EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL);
657                 break;
658             }
659             //make sure that a table can initially be created
660             if(bInitialKeyInput)
661             {
662                 bInitialKeyInput = sal_False;
663                 if(!nNewCol)
664                     nNewCol = 1;
665             }
666             UpdateSize_Impl( nNewCol );
667         }
668     }
669     else if(KEY_MOD1 == nModifier && KEY_RETURN == nKey)
670     {
671         m_bMod1 = sal_True;
672         if(IsMouseCaptured())
673             ReleaseMouse();
674         EndPopupMode(FLOATWIN_POPUPMODEEND_CLOSEALL );
675     }
676     if(!bHandled)
677         SfxPopupWindow::KeyInput(rKEvt);
678 }
679 
680 // -----------------------------------------------------------------------
681 
MouseButtonUp(const MouseEvent & rMEvt)682 void ColumnsWindow::MouseButtonUp( const MouseEvent& rMEvt )
683 {
684     SfxPopupWindow::MouseButtonUp( rMEvt );
685     ReleaseMouse();
686 
687     if ( IsInPopupMode() )
688         EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
689 }
690 
691 // -----------------------------------------------------------------------
692 
Paint(const Rectangle &)693 void ColumnsWindow::Paint( const Rectangle& )
694 {
695     long    i;
696     long    j;
697     long    nLineWidth;
698     Size    aSize = GetOutputSizePixel();
699 
700     for ( i = 0; i < nWidth; i++ )
701     {
702         if ( i < nCol )
703         {
704             SetLineColor( aHighlightLineColor );
705             SetFillColor( aHighlightFillColor );
706         }
707         else
708         {
709             SetLineColor( aLineColor );
710             SetFillColor( aFillColor );
711         }
712 
713         DrawRect( Rectangle( i*nMX-1, -1,
714                              i*nMX+nMX, aSize.Height()-nTextHeight+1 ) );
715 
716         j = 4;
717         while ( j < aSize.Height()-nTextHeight-4 )
718         {
719             if ( !(j % 16) )
720                 nLineWidth = 10;
721             else
722                 nLineWidth = 4;
723             DrawLine( Point( i*nMX+4, j ), Point( i*nMX+nMX-nLineWidth-4, j ) );
724             j += 4;
725         }
726     }
727 
728     SetLineColor();
729     SetFillColor( aFillColor );
730     String aText;
731     if ( nCol )
732         aText = String( String::CreateFromInt32(nCol) );
733     else
734         aText = Button::GetStandardText( BUTTON_CANCEL );
735     Size aTextSize(GetTextWidth( aText ), GetTextHeight());
736     DrawText( Point( ( aSize.Width() - aTextSize.Width() ) / 2, aSize.Height() - nTextHeight + 2 ), aText );
737 
738     DrawRect( Rectangle( 0, aSize.Height()-nTextHeight+2, (aSize.Width()-aTextSize.Width())/2-1, aSize.Height() ) );
739     DrawRect( Rectangle( (aSize.Width()-aTextSize.Width())/2+aTextSize.Width(), aSize.Height()-nTextHeight+2, aSize.Width(), aSize.Height() ) );
740 
741     SetLineColor( aLineColor );
742     SetFillColor();
743     DrawRect( Rectangle( Point(0,0), aSize ) );
744 }
745 
746 // -----------------------------------------------------------------------
747 
PopupModeEnd()748 void ColumnsWindow::PopupModeEnd()
749 {
750     if ( !IsPopupModeCanceled() && nCol )
751     {
752         sal_uInt16 nId = GetId();
753         Window* pParent = rTbx.GetParent();
754         pParent->UserEvent(SVX_EVENT_COLUM_WINDOW_EXECUTE, reinterpret_cast<void*>(nId));
755 
756         Sequence< PropertyValue > aArgs( 2 );
757         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Columns" ));
758         aArgs[0].Value = makeAny( sal_Int16( nCol ));
759         aArgs[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Modifier" ));
760         aArgs[1].Value = makeAny( sal_Int16( m_bMod1 ? KEY_MOD1 : 0 ));
761 
762         SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
763                                         maCommand,
764                                         aArgs );
765     }
766     else if ( IsPopupModeCanceled() )
767         ReleaseMouse();
768     SfxPopupWindow::PopupModeEnd();
769 }
770 
771 // class SvxTableToolBoxControl ------------------------------------------
772 
SvxTableToolBoxControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)773 SvxTableToolBoxControl::SvxTableToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
774     SfxToolBoxControl( nSlotId, nId, rTbx ),
775     bEnabled( sal_True )
776 {
777     rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
778     rTbx.Invalidate();
779 }
780 
781 // -----------------------------------------------------------------------
782 
~SvxTableToolBoxControl()783 SvxTableToolBoxControl::~SvxTableToolBoxControl()
784 {
785 }
786 
787 // -----------------------------------------------------------------------
788 
GetPopupWindowType() const789 SfxPopupWindowType SvxTableToolBoxControl::GetPopupWindowType() const
790 {
791     return SFX_POPUPWINDOW_ONTIMEOUTANDMOVE;
792 }
793 
794 // -----------------------------------------------------------------------
795 
CreatePopupWindow()796 SfxPopupWindow* SvxTableToolBoxControl::CreatePopupWindow()
797 {
798     if ( bEnabled )
799     {
800         ToolBox& rTbx = GetToolBox();
801         TableWindow* pWin = new TableWindow( GetSlotId(), m_aCommandURL, rTbx, m_xFrame );
802         pWin->StartPopupMode( &rTbx, FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_NOKEYCLOSE );
803         SetPopupWindow( pWin );
804         return pWin;
805     }
806     return 0;
807 }
808 
809 // -----------------------------------------------------------------------
810 
CreatePopupWindowCascading()811 SfxPopupWindow* SvxTableToolBoxControl::CreatePopupWindowCascading()
812 {
813     if ( bEnabled )
814         return new TableWindow( GetSlotId(), m_aCommandURL, GetToolBox(), m_xFrame );
815     return 0;
816 }
817 
818 // -----------------------------------------------------------------------
819 
StateChanged(sal_uInt16,SfxItemState eState,const SfxPoolItem * pState)820 void SvxTableToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
821 {
822     if ( pState && pState->ISA(SfxUInt16Item) )
823     {
824         sal_Int16 nValue = static_cast< const SfxUInt16Item* >( pState )->GetValue();
825         bEnabled = ( nValue != 0 );
826     }
827     else
828         bEnabled = SFX_ITEM_DISABLED != eState;
829 
830     sal_uInt16 nId = GetId();
831     ToolBox& rTbx = GetToolBox();
832 
833     rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
834     rTbx.SetItemState( nId,
835         ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
836 }
837 
838 // class SvxColumnsToolBoxControl ------------------------------------------
839 
SvxColumnsToolBoxControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)840 SvxColumnsToolBoxControl::SvxColumnsToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
841     SfxToolBoxControl( nSlotId, nId, rTbx )
842 {
843     rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
844     rTbx.Invalidate();
845 }
846 
847 // -----------------------------------------------------------------------
848 
~SvxColumnsToolBoxControl()849 SvxColumnsToolBoxControl::~SvxColumnsToolBoxControl()
850 {
851 }
852 
853 // -----------------------------------------------------------------------
854 
GetPopupWindowType() const855 SfxPopupWindowType SvxColumnsToolBoxControl::GetPopupWindowType() const
856 {
857     return SFX_POPUPWINDOW_ONTIMEOUTANDMOVE;
858 }
859 
860 // -----------------------------------------------------------------------
861 
CreatePopupWindow()862 SfxPopupWindow* SvxColumnsToolBoxControl::CreatePopupWindow()
863 {
864     ColumnsWindow* pWin = 0;
865     if(bEnabled)
866     {
867             pWin = new ColumnsWindow( GetSlotId(), m_aCommandURL, GetToolBox(), m_xFrame );
868             pWin->StartPopupMode( &GetToolBox(),
869                                   FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_NOKEYCLOSE );
870             SetPopupWindow( pWin );
871     }
872     return pWin;
873 }
874 
875 // -----------------------------------------------------------------------
876 
CreatePopupWindowCascading()877 SfxPopupWindow* SvxColumnsToolBoxControl::CreatePopupWindowCascading()
878 {
879     ColumnsWindow* pWin = 0;
880     if(bEnabled)
881     {
882         pWin = new ColumnsWindow( GetSlotId(), m_aCommandURL, GetToolBox(), m_xFrame );
883     }
884     return pWin;
885 }
886 /* -----------------18.11.99 16:38-------------------
887 
888  --------------------------------------------------*/
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)889 void SvxColumnsToolBoxControl::StateChanged( sal_uInt16 nSID,
890                                               SfxItemState eState,
891                                               const SfxPoolItem* pState )
892 {
893     bEnabled = SFX_ITEM_DISABLED != eState;
894     SfxToolBoxControl::StateChanged(nSID,   eState, pState );
895 }
896