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 : #include <string>
21 : #include <vcl/toolbox.hxx>
22 : #include <vcl/button.hxx>
23 : #include <vcl/settings.hxx>
24 : #include <svl/intitem.hxx>
25 : #include <sfx2/dispatch.hxx>
26 : #include <sfx2/app.hxx>
27 :
28 : #include <svx/dialogs.hrc>
29 : #include "svx/layctrl.hxx"
30 : #include <svx/dialmgr.hxx>
31 : #include <comphelper/processfactory.hxx>
32 : #include <comphelper/string.hxx>
33 : #include <svtools/colorcfg.hxx>
34 : #include <com/sun/star/util/URLTransformer.hpp>
35 :
36 : // namespaces
37 : using namespace ::com::sun::star::uno;
38 : using namespace ::com::sun::star::beans;
39 : using namespace ::com::sun::star::util;
40 : using namespace ::com::sun::star::frame;
41 :
42 1102 : SFX_IMPL_TOOLBOX_CONTROL(SvxTableToolBoxControl,SfxUInt16Item);
43 264 : SFX_IMPL_TOOLBOX_CONTROL(SvxColumnsToolBoxControl,SfxUInt16Item);
44 :
45 : class TableWindow : public SfxPopupWindow
46 : {
47 : private:
48 : PushButton aTableButton;
49 : ::Color aLineColor;
50 : ::Color aFillColor;
51 : ::Color aHighlightFillColor;
52 : ::Color aBackgroundColor;
53 : long nCol;
54 : long nLine;
55 : bool bInitialKeyInput;
56 : bool m_bMod1;
57 : ToolBox& rTbx;
58 : Reference< XFrame > mxFrame;
59 : OUString maCommand;
60 :
61 : static const long TABLE_CELLS_HORIZ;
62 : static const long TABLE_CELLS_VERT;
63 :
64 : long mnTableCellWidth;
65 : long mnTableCellHeight;
66 :
67 : long mnTablePosX;
68 : long mnTablePosY;
69 :
70 : long mnTableWidth;
71 : long mnTableHeight;
72 :
73 : DECL_LINK( SelectHdl, void * );
74 :
75 : public:
76 : TableWindow( sal_uInt16 nSlotId,
77 : const OUString& rCmd,
78 : const OUString& rText,
79 : ToolBox& rParentTbx,
80 : const Reference< XFrame >& rFrame );
81 : virtual ~TableWindow();
82 :
83 : void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
84 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
85 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
86 : virtual void Paint( const Rectangle& ) SAL_OVERRIDE;
87 : virtual void PopupModeEnd() SAL_OVERRIDE;
88 : virtual SfxPopupWindow* Clone() const SAL_OVERRIDE;
89 :
90 : private:
91 : void Update( long nNewCol, long nNewLine );
92 : void TableDialog( const Sequence< PropertyValue >& rArgs );
93 : void CloseAndShowTableDialog();
94 : };
95 :
96 : const long TableWindow::TABLE_CELLS_HORIZ = 10;
97 : const long TableWindow::TABLE_CELLS_VERT = 15;
98 :
99 :
100 :
101 0 : IMPL_LINK_NOARG(TableWindow, SelectHdl)
102 : {
103 0 : CloseAndShowTableDialog();
104 0 : return 0;
105 : }
106 :
107 :
108 :
109 0 : TableWindow::TableWindow( sal_uInt16 nSlotId, const OUString& rCmd, const OUString& rText,
110 : ToolBox& rParentTbx, const Reference< XFrame >& rFrame )
111 : : SfxPopupWindow( nSlotId, rFrame, WinBits( WB_STDPOPUP ) )
112 : , aTableButton( this )
113 : , nCol( 0 )
114 : , nLine( 0 )
115 : , bInitialKeyInput(false)
116 : , m_bMod1(false)
117 : , rTbx(rParentTbx)
118 : , mxFrame( rFrame )
119 : , maCommand( rCmd )
120 : , mnTablePosX(2)
121 0 : , mnTablePosY(2)
122 : {
123 0 : mnTableCellWidth = 15 * GetDPIScaleFactor();
124 0 : mnTableCellHeight = 15 * GetDPIScaleFactor();
125 :
126 0 : mnTableWidth = mnTablePosX + TABLE_CELLS_HORIZ*mnTableCellWidth;
127 0 : mnTableHeight = mnTablePosY + TABLE_CELLS_VERT*mnTableCellHeight;
128 :
129 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
130 0 : svtools::ColorConfig aColorConfig;
131 :
132 0 : aLineColor = rStyles.GetShadowColor();
133 0 : aFillColor = rStyles.GetWindowColor();
134 0 : aHighlightFillColor = rStyles.GetHighlightColor();
135 0 : aBackgroundColor = GetSettings().GetStyleSettings().GetFaceColor();
136 :
137 0 : SetBackground( aBackgroundColor );
138 0 : vcl::Font aFont = GetFont();
139 0 : aFont.SetColor( ::Color( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor ) );
140 0 : aFont.SetFillColor( aBackgroundColor );
141 0 : aFont.SetTransparent( false );
142 0 : SetFont( aFont );
143 :
144 0 : SetText( rText );
145 :
146 : aTableButton.SetPosSizePixel( Point( mnTablePosX + mnTableCellWidth, mnTableHeight + 5 ),
147 0 : Size( mnTableWidth - mnTablePosX - 2*mnTableCellWidth, 24 ) );
148 0 : aTableButton.SetText( SVX_RESSTR( RID_SVXSTR_MORE ) );
149 0 : aTableButton.SetClickHdl( LINK( this, TableWindow, SelectHdl ) );
150 0 : aTableButton.Show();
151 :
152 0 : SetOutputSizePixel( Size( mnTableWidth + 3, mnTableHeight + 33 ) );
153 0 : }
154 :
155 :
156 :
157 0 : TableWindow::~TableWindow()
158 : {
159 0 : }
160 :
161 :
162 :
163 0 : SfxPopupWindow* TableWindow::Clone() const
164 : {
165 0 : return new TableWindow( GetId(), maCommand, GetText(), rTbx, mxFrame );
166 : }
167 :
168 :
169 :
170 0 : void TableWindow::MouseMove( const MouseEvent& rMEvt )
171 : {
172 0 : SfxPopupWindow::MouseMove( rMEvt );
173 0 : Point aPos = rMEvt.GetPosPixel();
174 0 : Point aMousePos( aPos );
175 :
176 0 : long nNewCol = ( aMousePos.X() - mnTablePosX + mnTableCellWidth ) / mnTableCellWidth;
177 0 : long nNewLine = ( aMousePos.Y() - mnTablePosY + mnTableCellHeight ) / mnTableCellHeight;
178 :
179 0 : Update( nNewCol, nNewLine );
180 0 : }
181 :
182 :
183 :
184 0 : void TableWindow::KeyInput( const KeyEvent& rKEvt )
185 : {
186 0 : bool bHandled = false;
187 0 : sal_uInt16 nModifier = rKEvt.GetKeyCode().GetModifier();
188 0 : sal_uInt16 nKey = rKEvt.GetKeyCode().GetCode();
189 0 : if ( !nModifier )
190 : {
191 0 : bHandled = true;
192 0 : long nNewCol = nCol;
193 0 : long nNewLine = nLine;
194 0 : switch(nKey)
195 : {
196 : case KEY_UP:
197 0 : if ( nNewLine > 1 )
198 0 : nNewLine--;
199 : else
200 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL );
201 0 : break;
202 : case KEY_DOWN:
203 0 : if ( nNewLine < TABLE_CELLS_VERT )
204 0 : nNewLine++;
205 : else
206 0 : CloseAndShowTableDialog();
207 0 : break;
208 : case KEY_LEFT:
209 0 : if ( nNewCol > 1 )
210 0 : nNewCol--;
211 : else
212 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL );
213 0 : break;
214 : case KEY_RIGHT:
215 0 : if ( nNewCol < TABLE_CELLS_HORIZ )
216 0 : nNewCol++;
217 : else
218 0 : CloseAndShowTableDialog();
219 0 : break;
220 : case KEY_ESCAPE:
221 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL );
222 0 : break;
223 : case KEY_RETURN:
224 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
225 0 : break;
226 : case KEY_TAB:
227 0 : CloseAndShowTableDialog();
228 0 : break;
229 : default:
230 0 : bHandled = false;
231 : }
232 0 : if ( bHandled )
233 : {
234 : //make sure that a table can initially be created
235 0 : if(bInitialKeyInput)
236 : {
237 0 : bInitialKeyInput = false;
238 0 : if(!nNewLine)
239 0 : nNewLine = 1;
240 0 : if(!nNewCol)
241 0 : nNewCol = 1;
242 : }
243 0 : Update( nNewCol, nNewLine );
244 : }
245 : }
246 0 : else if(KEY_MOD1 == nModifier && KEY_RETURN == nKey)
247 : {
248 0 : m_bMod1 = true;
249 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
250 : }
251 :
252 0 : if(!bHandled)
253 0 : SfxPopupWindow::KeyInput(rKEvt);
254 0 : }
255 :
256 :
257 :
258 0 : void TableWindow::MouseButtonUp( const MouseEvent& rMEvt )
259 : {
260 0 : SfxPopupWindow::MouseButtonUp( rMEvt );
261 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
262 0 : }
263 :
264 :
265 :
266 0 : void TableWindow::Paint( const Rectangle& )
267 : {
268 0 : const long nSelectionWidth = mnTablePosX + nCol*mnTableCellWidth;
269 0 : const long nSelectionHeight = mnTablePosY + nLine*mnTableCellHeight;
270 :
271 : // the non-selected parts of the table
272 0 : SetLineColor( aLineColor );
273 0 : SetFillColor( aFillColor );
274 0 : DrawRect( Rectangle( nSelectionWidth, mnTablePosY, mnTableWidth, nSelectionHeight ) );
275 0 : DrawRect( Rectangle( mnTablePosX, nSelectionHeight, nSelectionWidth, mnTableHeight ) );
276 0 : DrawRect( Rectangle( nSelectionWidth, nSelectionHeight, mnTableWidth, mnTableHeight ) );
277 :
278 : // the selection
279 0 : if ( nCol > 0 && nLine > 0 )
280 : {
281 0 : SetFillColor( aHighlightFillColor );
282 : DrawRect( Rectangle( mnTablePosX, mnTablePosY,
283 0 : nSelectionWidth, nSelectionHeight ) );
284 : }
285 :
286 : // lines inside of the table
287 0 : SetLineColor( aLineColor );
288 0 : for ( long i = 1; i < TABLE_CELLS_VERT; ++i )
289 0 : DrawLine( Point( mnTablePosX, mnTablePosY + i*mnTableCellHeight ),
290 0 : Point( mnTableWidth, mnTablePosY + i*mnTableCellHeight ) );
291 :
292 0 : for ( long i = 1; i < TABLE_CELLS_HORIZ; ++i )
293 0 : DrawLine( Point( mnTablePosX + i*mnTableCellWidth, mnTablePosY ),
294 0 : Point( mnTablePosX + i*mnTableCellWidth, mnTableHeight ) );
295 :
296 : // the text near the mouse cursor telling the table dimensions
297 0 : if ( nCol && nLine )
298 : {
299 0 : OUString aText;
300 0 : aText += OUString::number( nCol );
301 0 : aText += " x ";
302 0 : aText += OUString::number( nLine );
303 0 : if(GetId() == FN_SHOW_MULTIPLE_PAGES)
304 : {
305 0 : aText += " ";
306 0 : aText += SVX_RESSTR(RID_SVXSTR_PAGES);
307 : }
308 :
309 0 : Size aTextSize( GetTextWidth( aText ), GetTextHeight() );
310 :
311 0 : long nTextX = nSelectionWidth + mnTableCellWidth;
312 0 : long nTextY = nSelectionHeight + mnTableCellHeight;
313 0 : const long nTipBorder = 2;
314 :
315 0 : if ( aTextSize.Width() + mnTablePosX + mnTableCellWidth + 2*nTipBorder < nSelectionWidth )
316 0 : nTextX = nSelectionWidth - mnTableCellWidth - aTextSize.Width();
317 :
318 0 : if ( aTextSize.Height() + mnTablePosY + mnTableCellHeight + 2*nTipBorder < nSelectionHeight )
319 0 : nTextY = nSelectionHeight - mnTableCellHeight - aTextSize.Height();
320 :
321 0 : SetLineColor( aLineColor );
322 0 : SetFillColor( aBackgroundColor );
323 : DrawRect( Rectangle ( nTextX - 2*nTipBorder, nTextY - 2*nTipBorder,
324 0 : nTextX + aTextSize.Width() + nTipBorder, nTextY + aTextSize.Height() + nTipBorder ) );
325 :
326 : // #i95350# force RTL output
327 0 : if ( IsRTLEnabled() )
328 0 : aText = OUString(0x202D) + aText;
329 :
330 0 : DrawText( Point( nTextX, nTextY ), aText );
331 : }
332 0 : }
333 :
334 :
335 :
336 0 : void TableWindow::PopupModeEnd()
337 : {
338 0 : if ( !IsPopupModeCanceled() && nCol && nLine )
339 : {
340 0 : Sequence< PropertyValue > aArgs( 2 );
341 0 : aArgs[0].Name = "Columns";
342 0 : aArgs[0].Value = makeAny( sal_Int16( nCol ));
343 0 : aArgs[1].Name = "Rows";
344 0 : aArgs[1].Value = makeAny( sal_Int16( nLine ));
345 :
346 0 : TableDialog( aArgs );
347 : }
348 :
349 0 : SfxPopupWindow::PopupModeEnd();
350 0 : }
351 :
352 :
353 :
354 0 : void TableWindow::Update( long nNewCol, long nNewLine )
355 : {
356 0 : if ( nNewCol < 0 || nNewCol > TABLE_CELLS_HORIZ )
357 0 : nNewCol = 0;
358 :
359 0 : if ( nNewLine < 0 || nNewLine > TABLE_CELLS_VERT )
360 0 : nNewLine = 0;
361 :
362 0 : if ( nNewCol != nCol || nNewLine != nLine )
363 : {
364 0 : nCol = nNewCol;
365 0 : nLine = nNewLine;
366 0 : Invalidate( Rectangle( mnTablePosX, mnTablePosY, mnTableWidth, mnTableHeight ) );
367 : }
368 0 : }
369 :
370 :
371 :
372 0 : void TableWindow::TableDialog( const Sequence< PropertyValue >& rArgs )
373 : {
374 0 : Reference< XDispatchProvider > xDispatchProvider( mxFrame, UNO_QUERY );
375 0 : if ( xDispatchProvider.is() )
376 : {
377 0 : com::sun::star::util::URL aTargetURL;
378 0 : Reference < XURLTransformer > xTrans( URLTransformer::create(::comphelper::getProcessComponentContext()) );
379 0 : aTargetURL.Complete = maCommand;
380 0 : xTrans->parseStrict( aTargetURL );
381 :
382 0 : Reference< XDispatch > xDispatch = xDispatchProvider->queryDispatch( aTargetURL, OUString(), 0 );
383 0 : if ( xDispatch.is() )
384 0 : xDispatch->dispatch( aTargetURL, rArgs );
385 0 : }
386 0 : }
387 :
388 :
389 :
390 0 : void TableWindow::CloseAndShowTableDialog()
391 : {
392 : // close the toolbar tool
393 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL );
394 :
395 : // and open the table dialog instead
396 0 : TableDialog( Sequence< PropertyValue >() );
397 0 : }
398 :
399 0 : class ColumnsWindow : public SfxPopupWindow
400 : {
401 : private:
402 : ::Color aLineColor;
403 : ::Color aHighlightLineColor;
404 : ::Color aFillColor;
405 : ::Color aHighlightFillColor;
406 : ::Color aFaceColor;
407 : long nCol;
408 : long nWidth;
409 : long nMX;
410 : long nTextHeight;
411 : bool bInitialKeyInput;
412 : bool m_bMod1;
413 : ToolBox& rTbx;
414 : Reference< XFrame > mxFrame;
415 : OUString maCommand;
416 :
417 : void UpdateSize_Impl( long nNewCol );
418 : public:
419 : ColumnsWindow( sal_uInt16 nId, const OUString& rCmd, const OUString &rText, ToolBox& rParentTbx, const Reference< XFrame >& rFrame );
420 :
421 : void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
422 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
423 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
424 : virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
425 : virtual void Paint( const Rectangle& ) SAL_OVERRIDE;
426 : virtual void PopupModeEnd() SAL_OVERRIDE;
427 : virtual SfxPopupWindow* Clone() const SAL_OVERRIDE;
428 : };
429 :
430 :
431 :
432 0 : ColumnsWindow::ColumnsWindow( sal_uInt16 nId, const OUString& rCmd, const OUString& rText, ToolBox& rParentTbx, const Reference< XFrame >& rFrame ) :
433 : SfxPopupWindow( nId, rFrame, WB_STDPOPUP ),
434 : bInitialKeyInput(true),
435 : m_bMod1(false),
436 : rTbx(rParentTbx),
437 : mxFrame(rFrame),
438 0 : maCommand( rCmd )
439 : {
440 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
441 0 : svtools::ColorConfig aColorConfig;
442 0 : aLineColor = ::Color( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
443 0 : aHighlightLineColor = rStyles.GetHighlightTextColor();
444 0 : aFillColor = rStyles.GetWindowColor();
445 0 : aHighlightFillColor = rStyles.GetHighlightColor();
446 0 : aFaceColor = rStyles.GetFaceColor();
447 :
448 0 : nTextHeight = GetTextHeight()+1;
449 0 : SetBackground();
450 0 : vcl::Font aFont( GetFont() );
451 0 : aFont.SetColor( aLineColor );
452 0 : aFont.SetFillColor( aFaceColor );
453 0 : aFont.SetTransparent( false );
454 0 : SetFont( aFont );
455 :
456 0 : nCol = 0;
457 0 : nWidth = 4;
458 :
459 0 : SetText( rText );
460 :
461 0 : Size aLogicSize = LogicToPixel( Size( 95, 155 ), MapMode( MAP_10TH_MM ) );
462 0 : nMX = aLogicSize.Width();
463 0 : SetOutputSizePixel( Size( nMX*nWidth-1, aLogicSize.Height()+nTextHeight ) );
464 0 : StartCascading();
465 0 : }
466 :
467 :
468 :
469 0 : SfxPopupWindow* ColumnsWindow::Clone() const
470 : {
471 0 : return new ColumnsWindow( GetId(), maCommand, GetText(), rTbx, mxFrame );
472 : }
473 :
474 :
475 :
476 0 : void ColumnsWindow::MouseMove( const MouseEvent& rMEvt )
477 : {
478 0 : SfxPopupWindow::MouseMove( rMEvt );
479 0 : Point aPos = rMEvt.GetPosPixel();
480 0 : Point aMousePos = aPos;
481 :
482 0 : if ( rMEvt.IsEnterWindow() )
483 0 : CaptureMouse();
484 0 : else if ( aMousePos.X() < 0 || aMousePos.Y() < 0 )
485 : {
486 0 : nCol = 0;
487 0 : ReleaseMouse();
488 0 : Invalidate();
489 0 : return;
490 : }
491 :
492 0 : long nNewCol = 0;
493 0 : if ( aPos.X() > 0 )
494 0 : nNewCol = aPos.X() / nMX + 1;
495 0 : if ( aPos.Y() < 0 )
496 0 : nNewCol = 0;
497 0 : if ( nNewCol > 20 )
498 0 : nNewCol = 20;
499 0 : UpdateSize_Impl( nNewCol );
500 : }
501 :
502 0 : void ColumnsWindow::UpdateSize_Impl( long nNewCol )
503 : {
504 0 : Size aWinSize = GetOutputSizePixel();
505 0 : Point aWinPos;// = GetPosPixel();
506 :
507 0 : if ( nWidth <= nNewCol )
508 : {
509 0 : Point aMaxPos = OutputToScreenPixel( GetDesktopRectPixel().BottomRight() );
510 :
511 0 : if ( nWidth <= nNewCol )
512 : {
513 0 : nWidth = nNewCol;
514 0 : nWidth++;
515 : }
516 :
517 0 : while ( nWidth > 0 &&
518 0 : (short)(aWinPos.X()+(nMX*nWidth-1)) >= aMaxPos.X()-3 )
519 0 : nWidth--;
520 :
521 0 : if ( nNewCol > nWidth )
522 0 : nNewCol = nWidth;
523 :
524 0 : Invalidate( Rectangle( 0, aWinSize.Height()-nTextHeight+2,
525 0 : aWinSize.Width(), aWinSize.Height() ) );
526 0 : SetOutputSizePixel( Size( nMX*nWidth-1, aWinSize.Height() ) );
527 : }
528 :
529 :
530 0 : if ( nNewCol != nCol )
531 : {
532 0 : Invalidate( Rectangle( 0, aWinSize.Height()-nTextHeight+2,
533 0 : aWinSize.Width(), aWinSize.Height() ) );
534 :
535 0 : long nMinCol = 0, nMaxCol = 0;
536 :
537 0 : if ( nNewCol < nCol )
538 : {
539 0 : nMinCol = nNewCol;
540 0 : nMaxCol = nCol;
541 : }
542 : else
543 : {
544 0 : nMinCol = nCol;
545 0 : nMaxCol = nNewCol;
546 : }
547 :
548 0 : Invalidate( Rectangle( nMinCol*nMX-1, 0,
549 0 : nMaxCol*nMX+1, aWinSize.Height()-nTextHeight+2 ) );
550 0 : nCol = nNewCol;
551 : }
552 0 : Update();
553 0 : }
554 :
555 :
556 0 : void ColumnsWindow::MouseButtonDown( const MouseEvent& rMEvt )
557 : {
558 0 : SfxPopupWindow::MouseButtonDown( rMEvt );
559 0 : CaptureMouse();
560 0 : }
561 :
562 0 : void ColumnsWindow::KeyInput( const KeyEvent& rKEvt )
563 : {
564 0 : bool bHandled = false;
565 0 : sal_uInt16 nModifier = rKEvt.GetKeyCode().GetModifier();
566 0 : sal_uInt16 nKey = rKEvt.GetKeyCode().GetCode();
567 0 : if(!nModifier)
568 : {
569 0 : if( KEY_LEFT == nKey || KEY_RIGHT == nKey ||
570 0 : KEY_RETURN == nKey ||KEY_ESCAPE == nKey ||
571 : KEY_UP == nKey)
572 : {
573 0 : bHandled = true;
574 0 : long nNewCol = nCol;
575 0 : switch(nKey)
576 : {
577 : case KEY_LEFT :
578 0 : if(nNewCol)
579 0 : nNewCol--;
580 0 : break;
581 : case KEY_RIGHT :
582 0 : nNewCol++;
583 0 : break;
584 : case KEY_RETURN :
585 0 : if(IsMouseCaptured())
586 0 : ReleaseMouse();
587 0 : EndPopupMode(FLOATWIN_POPUPMODEEND_CLOSEALL );
588 0 : break;
589 : case KEY_ESCAPE :
590 : case KEY_UP :
591 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL);
592 0 : break;
593 : }
594 : //make sure that a table can initially be created
595 0 : if(bInitialKeyInput)
596 : {
597 0 : bInitialKeyInput = false;
598 0 : if(!nNewCol)
599 0 : nNewCol = 1;
600 : }
601 0 : UpdateSize_Impl( nNewCol );
602 : }
603 : }
604 0 : else if(KEY_MOD1 == nModifier && KEY_RETURN == nKey)
605 : {
606 0 : m_bMod1 = true;
607 0 : if(IsMouseCaptured())
608 0 : ReleaseMouse();
609 0 : EndPopupMode(FLOATWIN_POPUPMODEEND_CLOSEALL );
610 : }
611 0 : if(!bHandled)
612 0 : SfxPopupWindow::KeyInput(rKEvt);
613 0 : }
614 :
615 :
616 :
617 0 : void ColumnsWindow::MouseButtonUp( const MouseEvent& rMEvt )
618 : {
619 0 : SfxPopupWindow::MouseButtonUp( rMEvt );
620 0 : ReleaseMouse();
621 :
622 0 : if ( IsInPopupMode() )
623 0 : EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
624 0 : }
625 :
626 :
627 :
628 0 : void ColumnsWindow::Paint( const Rectangle& )
629 : {
630 : long i;
631 : long j;
632 : long nLineWidth;
633 0 : Size aSize = GetOutputSizePixel();
634 :
635 0 : for ( i = 0; i < nWidth; i++ )
636 : {
637 0 : if ( i < nCol )
638 : {
639 0 : SetLineColor( aHighlightLineColor );
640 0 : SetFillColor( aHighlightFillColor );
641 : }
642 : else
643 : {
644 0 : SetLineColor( aLineColor );
645 0 : SetFillColor( aFillColor );
646 : }
647 :
648 0 : DrawRect( Rectangle( i*nMX-1, -1,
649 0 : i*nMX+nMX, aSize.Height()-nTextHeight+1 ) );
650 :
651 0 : j = 4;
652 0 : while ( j < aSize.Height()-nTextHeight-4 )
653 : {
654 0 : if ( !(j % 16) )
655 0 : nLineWidth = 10;
656 : else
657 0 : nLineWidth = 4;
658 0 : DrawLine( Point( i*nMX+4, j ), Point( i*nMX+nMX-nLineWidth-4, j ) );
659 0 : j += 4;
660 : }
661 : }
662 :
663 0 : SetLineColor();
664 0 : SetFillColor( aFaceColor );
665 0 : OUString aText;
666 0 : if ( nCol )
667 0 : aText = OUString::number(nCol);
668 : else
669 0 : aText = comphelper::string::remove(Button::GetStandardText(BUTTON_CANCEL), '~');
670 :
671 0 : Size aTextSize(GetTextWidth( aText ), GetTextHeight());
672 0 : DrawText( Point( ( aSize.Width() - aTextSize.Width() ) / 2, aSize.Height() - nTextHeight + 2 ), aText );
673 :
674 0 : DrawRect( Rectangle( 0, aSize.Height()-nTextHeight+2, (aSize.Width()-aTextSize.Width())/2-1, aSize.Height() ) );
675 0 : DrawRect( Rectangle( (aSize.Width()-aTextSize.Width())/2+aTextSize.Width(), aSize.Height()-nTextHeight+2, aSize.Width(), aSize.Height() ) );
676 :
677 0 : SetLineColor( aLineColor );
678 0 : SetFillColor();
679 0 : DrawRect( Rectangle( 0, 0, aSize.Width() - 1, aSize.Height() - nTextHeight + 1 ) );
680 0 : }
681 :
682 :
683 :
684 0 : void ColumnsWindow::PopupModeEnd()
685 : {
686 0 : if ( !IsPopupModeCanceled() && nCol )
687 : {
688 0 : Sequence< PropertyValue > aArgs( 2 );
689 0 : aArgs[0].Name = "Columns";
690 0 : aArgs[0].Value = makeAny( sal_Int16( nCol ));
691 0 : aArgs[1].Name = "Modifier";
692 0 : aArgs[1].Value = makeAny( sal_Int16( m_bMod1 ? KEY_MOD1 : 0 ));
693 :
694 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
695 : maCommand,
696 0 : aArgs );
697 : }
698 0 : else if ( IsPopupModeCanceled() )
699 0 : ReleaseMouse();
700 0 : SfxPopupWindow::PopupModeEnd();
701 0 : }
702 :
703 890 : SvxTableToolBoxControl::SvxTableToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
704 : SfxToolBoxControl( nSlotId, nId, rTbx ),
705 890 : bEnabled( true )
706 : {
707 890 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
708 890 : rTbx.Invalidate();
709 890 : }
710 :
711 :
712 :
713 1780 : SvxTableToolBoxControl::~SvxTableToolBoxControl()
714 : {
715 1780 : }
716 :
717 :
718 :
719 0 : SfxPopupWindowType SvxTableToolBoxControl::GetPopupWindowType() const
720 : {
721 0 : return SFX_POPUPWINDOW_ONTIMEOUTANDMOVE;
722 : }
723 :
724 :
725 :
726 0 : SfxPopupWindow* SvxTableToolBoxControl::CreatePopupWindow()
727 : {
728 0 : if ( bEnabled )
729 : {
730 0 : ToolBox& rTbx = GetToolBox();
731 0 : TableWindow* pWin = new TableWindow( GetSlotId(), m_aCommandURL, GetToolBox().GetItemText( GetId() ), rTbx, m_xFrame );
732 0 : pWin->StartPopupMode( &rTbx, FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_NOKEYCLOSE );
733 0 : SetPopupWindow( pWin );
734 0 : return pWin;
735 : }
736 0 : return 0;
737 : }
738 :
739 :
740 :
741 0 : SfxPopupWindow* SvxTableToolBoxControl::CreatePopupWindowCascading()
742 : {
743 0 : if ( bEnabled )
744 0 : return new TableWindow( GetSlotId(), m_aCommandURL, GetToolBox().GetItemText( GetId() ), GetToolBox(), m_xFrame );
745 0 : return 0;
746 : }
747 :
748 :
749 :
750 919 : void SvxTableToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
751 : {
752 919 : if ( pState && pState->ISA(SfxUInt16Item) )
753 : {
754 0 : sal_Int16 nValue = static_cast< const SfxUInt16Item* >( pState )->GetValue();
755 0 : bEnabled = ( nValue != 0 );
756 : }
757 : else
758 919 : bEnabled = SfxItemState::DISABLED != eState;
759 :
760 919 : sal_uInt16 nId = GetId();
761 919 : ToolBox& rTbx = GetToolBox();
762 :
763 919 : rTbx.EnableItem( nId, SfxItemState::DISABLED != eState );
764 : rTbx.SetItemState( nId,
765 919 : ( SfxItemState::DONTCARE == eState ) ? TRISTATE_INDET : TRISTATE_FALSE );
766 919 : }
767 :
768 0 : SvxColumnsToolBoxControl::SvxColumnsToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx )
769 : : SfxToolBoxControl(nSlotId, nId, rTbx)
770 0 : , bEnabled(false)
771 : {
772 0 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) );
773 0 : rTbx.Invalidate();
774 0 : }
775 :
776 :
777 :
778 0 : SvxColumnsToolBoxControl::~SvxColumnsToolBoxControl()
779 : {
780 0 : }
781 :
782 :
783 :
784 0 : SfxPopupWindowType SvxColumnsToolBoxControl::GetPopupWindowType() const
785 : {
786 0 : return SFX_POPUPWINDOW_ONTIMEOUTANDMOVE;
787 : }
788 :
789 :
790 :
791 0 : SfxPopupWindow* SvxColumnsToolBoxControl::CreatePopupWindow()
792 : {
793 0 : ColumnsWindow* pWin = 0;
794 0 : if(bEnabled)
795 : {
796 0 : pWin = new ColumnsWindow( GetSlotId(), m_aCommandURL, GetToolBox().GetItemText( GetId() ), GetToolBox(), m_xFrame );
797 0 : pWin->StartPopupMode( &GetToolBox(),
798 0 : FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_NOKEYCLOSE );
799 0 : SetPopupWindow( pWin );
800 : }
801 0 : return pWin;
802 : }
803 :
804 :
805 :
806 0 : SfxPopupWindow* SvxColumnsToolBoxControl::CreatePopupWindowCascading()
807 : {
808 0 : ColumnsWindow* pWin = 0;
809 0 : if(bEnabled)
810 : {
811 0 : pWin = new ColumnsWindow( GetSlotId(), m_aCommandURL, GetToolBox().GetItemText( GetId() ), GetToolBox(), m_xFrame );
812 : }
813 0 : return pWin;
814 : }
815 :
816 0 : void SvxColumnsToolBoxControl::StateChanged( sal_uInt16 nSID,
817 : SfxItemState eState,
818 : const SfxPoolItem* pState )
819 : {
820 0 : bEnabled = SfxItemState::DISABLED != eState;
821 0 : SfxToolBoxControl::StateChanged(nSID, eState, pState );
822 594 : }
823 :
824 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|