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