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 #ifndef _SVX_BRWBOX_HXX 24 #define _SVX_BRWBOX_HXX 25 26 #include "svtools/svtdllapi.h" 27 #include <vcl/scrbar.hxx> 28 #include <vcl/ctrl.hxx> 29 #include <tools/multisel.hxx> 30 #include <svtools/headbar.hxx> 31 #include <svtools/transfer.hxx> 32 #include <svtools/AccessibleBrowseBoxObjType.hxx> 33 #include <svtools/accessibletableprovider.hxx> 34 35 #ifndef INCLUDED_LIMITS_H 36 #include <limits.h> 37 #define INCLUDED_LIMITS_H 38 #endif 39 40 #ifndef INCLUDED_MEMORY 41 #include <memory> 42 #define INCLUDED_MEMORY 43 #endif 44 45 class BrowserColumn; 46 class BrowserColumns; 47 class BrowserDataWin; 48 class MultiSelection; 49 class BrowserHeader; 50 51 namespace svt { 52 class BrowseBoxImpl; 53 class IAccessibleFactory; 54 } 55 namespace utl { 56 class AccessibleStateSetHelper; 57 } 58 59 // ------------------- 60 // - BrowseBox-Types - 61 // ------------------- 62 63 #define BROWSER_INVALIDID USHRT_MAX 64 #define BROWSER_ENDOFSELECTION (long)(SFX_ENDOFSELECTION) 65 66 typedef sal_uLong BrowserMode; 67 68 #define BROWSER_COLUMNSELECTION 0x0001 69 #define BROWSER_MULTISELECTION 0x0002 70 #define BROWSER_THUMBDRAGGING 0x0004 71 #define BROWSER_KEEPHIGHLIGHT 0x0008 72 #define BROWSER_KEEPSELECTION BROWSER_KEEPHIGHLIGHT // old, dont use! 73 #define BROWSER_HLINES 0x0010 74 #define BROWSER_VLINES 0x0020 75 #define BROWSER_HLINESFULL BROWSER_HLINES // old, dont use! 76 #define BROWSER_VLINESFULL BROWSER_VLINES // old, dont use! 77 #define BROWSER_HLINESDOTS 0x0000 // old => dont use! 78 #define BROWSER_VLINESDOTS 0x0000 // old => dont use! 79 80 #define BROWSER_HIDESELECT 0x0100 // old => dont use! 81 #define BROWSER_HIDECURSOR 0x0200 82 83 #define BROWSER_NO_HSCROLL 0x0400 84 #define BROWSER_NO_SCROLLBACK 0x0800 85 86 #define BROWSER_AUTO_VSCROLL 0x1000 87 #define BROWSER_AUTO_HSCROLL 0x2000 88 89 #define BROWSER_TRACKING_TIPS 0x4000 90 91 #define BROWSER_NO_VSCROLL 0x8000 92 93 #define BROWSER_HIGHLIGHT_NONE 0x0100 // == BROWSER_HIDESELECT 94 #define BROWSER_HIGHLIGHT_TOGGLE 0x00000000 // old default => NULL, dont use! 95 96 #define BROWSER_HEADERBAR_NEW 0x00040000 97 #define BROWSER_AUTOSIZE_LASTCOL 0x00080000 98 #define BROWSER_OWN_DATACHANGED 0x00100000 99 100 #define BROWSER_CURSOR_WO_FOCUS 0x00200000 101 // Allows a cursor which is shown even if the control does not have the focus. This does not affect other 102 // situations which require to temporarily hide the cursor (such as scrolling). 103 104 #define BROWSER_SMART_HIDECURSOR 0x00400000 105 // is an enhanced version of BROWSER_HIDECURSOR. 106 // When set, BROWSER_HIDECURSOR is overruled, and the cursor is hidden as long as no selection exists, 107 // but shown otherwise. This does not affect other situations which require to temporarily hide the 108 // cursor (such as scrolling). 109 110 typedef int BrowserColumnMode; 111 #define BROWSER_COLUMN_TITLEABBREVATION 1 112 #define BROWSER_COLUMN_STANDARD BROWSER_COLUMN_TITLEABBREVATION 113 114 #define BROWSER_NONE 0 115 #define BROWSER_SELECT 720 116 #define BROWSER_EXPANDSELECTION 721 117 #define BROWSER_ENHANCESELECTION 722 118 #define BROWSER_SELECTALL 723 119 #define BROWSER_SELECTDOWN 724 120 #define BROWSER_SELECTUP 725 121 #define BROWSER_CURSORDOWN 731 122 #define BROWSER_CURSORUP 732 123 #define BROWSER_CURSORLEFT 733 124 #define BROWSER_CURSORRIGHT 734 125 #define BROWSER_CURSORPAGEDOWN 735 126 #define BROWSER_CURSORPAGEUP 736 127 #define BROWSER_CURSORPAGERIGHT 735 128 #define BROWSER_CURSORPAGELEFT 736 129 #define BROWSER_CURSORENDOFFILE 741 130 #define BROWSER_CURSORTOPOFFILE 742 131 #define BROWSER_CURSORENDOFSCREEN 743 132 #define BROWSER_CURSORTOPOFSCREEN 744 133 #define BROWSER_CURSORHOME 745 134 #define BROWSER_CURSOREND 746 135 #define BROWSER_SCROLLDOWN 751 136 #define BROWSER_SCROLLUP 752 137 #define BROWSER_SELECTHOME 753 138 #define BROWSER_SELECTEND 754 139 #define BROWSER_SELECTCOLUMN 755 140 #define BROWSER_MOVECOLUMNLEFT 756 141 #define BROWSER_MOVECOLUMNRIGHT 757 142 143 // --------------- 144 // - BrowseEvent - 145 // --------------- 146 147 class BrowseEvent 148 { 149 Window* pWin; 150 long nRow; 151 Rectangle aRect; 152 sal_uInt16 nCol; 153 sal_uInt16 nColId; 154 155 public: 156 BrowseEvent(); 157 BrowseEvent( Window* pWindow, 158 long nAbsRow, 159 sal_uInt16 nColumn, sal_uInt16 nColumnId, 160 const Rectangle& rRect ); 161 162 Window* GetWindow() const { return pWin; } 163 long GetRow() const { return nRow; } 164 sal_uInt16 GetColumn() const { return nCol; } 165 sal_uInt16 GetColumnId() const { return nColId; } 166 const Rectangle& GetRect() const { return aRect; } 167 }; 168 169 // --------------------- 170 // - BrowserMouseEvent - 171 // --------------------- 172 173 class BrowserMouseEvent: public MouseEvent, public BrowseEvent 174 { 175 public: 176 BrowserMouseEvent(); 177 BrowserMouseEvent( BrowserDataWin* pWin, const MouseEvent& rEvt ); 178 BrowserMouseEvent( Window* pWin, const MouseEvent& rEvt, 179 long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId, 180 const Rectangle& rRect ); 181 }; 182 183 // -------------------------- 184 // - BrowserAcceptDropEvent - 185 // -------------------------- 186 187 class BrowserAcceptDropEvent : public AcceptDropEvent, public BrowseEvent 188 { 189 public: 190 BrowserAcceptDropEvent(); 191 BrowserAcceptDropEvent( BrowserDataWin* pWin, const AcceptDropEvent& rEvt ); 192 }; 193 194 // --------------------------- 195 // - BrowserExecuteDropEvent - 196 // --------------------------- 197 198 class BrowserExecuteDropEvent : public ExecuteDropEvent, public BrowseEvent 199 { 200 public: 201 BrowserExecuteDropEvent(); 202 BrowserExecuteDropEvent( BrowserDataWin* pWin, const ExecuteDropEvent& rEvt ); 203 }; 204 205 // ------------- 206 // - BrowseBox - 207 // ------------- 208 209 // TODO 210 // The whole selection thingie in this class is somewhat .... suspicious to me. 211 // some oddities: 212 // * method parameters named like members (and used in both semantics within the method!) 213 // * the multi selection flag is sometimes used as if it is for row selection, sometimes as if 214 // it's for column selection, too (and sometimes in an even stranger way :) 215 // * it is not really defined like all these hundreds selection related flags/methods work together 216 // and influence each other. I do not understand it very well, but this may be my fault :) 217 // * There is a GetColumnSelection, but it can't be used to determine the selected columns (at least 218 // not without a const_cast) 219 // 220 // We should clearly define this somewhere in the future. Or, even better, we should re-implement this 221 // whole class, which is planned for a long time :) 222 // 223 // sorry for the ranting. could not resist 224 // 98483 - 11.04.2002 - fs@openoffice.org 225 226 class SVT_DLLPUBLIC BrowseBox 227 :public Control 228 ,public DragSourceHelper 229 ,public DropTargetHelper 230 ,public svt::IAccessibleTableProvider 231 { 232 #define NO_CURSOR_HIDE 0 233 #define HARD_CURSOR_HIDE 1 234 #define SMART_CURSOR_HIDE 2 235 236 friend class BrowserDataWin; 237 friend class ::svt::BrowseBoxImpl; 238 239 #ifdef DBG_MI 240 friend void DoLog_Impl( const BrowseBox *pThis, const char *pWhat, const char *pWho ); 241 #endif 242 243 #ifdef DBG_UTIL 244 friend const char* BrowseBoxCheckInvariants( const void * pVoid ); 245 #endif 246 247 Window* pDataWin; // window to display data rows 248 ScrollBar* pVScroll; // vertical scrollbar 249 ScrollBar aHScroll; // horizontal scrollbar 250 251 long nDataRowHeight; // height of a single data-row 252 sal_uInt16 nTitleLines; // number of lines in title row 253 sal_uLong nControlAreaWidth; // width of fixed area beneeth hscroll 254 sal_Bool bThumbDragging; // handle thumb dragging 255 sal_Bool bColumnCursor; // single columns and fields selectable 256 sal_Bool bMultiSelection;// allow multiple selected rows 257 sal_Bool bKeepHighlight; // don't hide selection on LoseFocus 258 259 sal_Bool bHLines; // draw lines between rows 260 sal_Bool bVLines; // draw lines between columns 261 sal_Bool bHDots; // draw lines between rows dotted 262 sal_Bool bVDots; // draw lines between columns dotted 263 Color aGridLineColor; // color for lines, default dark grey 264 sal_Bool bBootstrapped; // child windows resized etc. 265 long nTopRow; // no. of first visible row (0...) 266 long nCurRow; // no. of row with cursor 267 long nRowCount; // total number of rows in model 268 sal_uInt16 nFirstCol; // no. of first visible scrollable column 269 sal_uInt16 nCurColId; // column id of cursor 270 271 sal_Bool bSelecting; 272 sal_Bool bRowDividerDrag; 273 sal_Bool bHit; 274 sal_Bool mbInteractiveRowHeight; 275 Point a1stPoint; 276 Point a2ndPoint; 277 278 long nResizeX; // mouse position at start of resizing 279 long nMinResizeX; // never drag more left 280 long nDragX; // last dragged column (MouseMove) 281 sal_uInt16 nResizeCol; // resize this column in MouseMove 282 sal_Bool bResizing; // mouse captured for column resizing 283 284 sal_Bool bSelect; // select or deselect 285 sal_Bool bSelectionIsVisible; // depending on focus 286 sal_Bool bScrolling; // hidden cursor while scrolling 287 sal_Bool bNotToggleSel; // set while in ToggleSelection() etc. 288 sal_Bool bHasFocus; // set/unset in Get/LoseFocus 289 sal_Bool bHideSelect; // hide selection (highlight) 290 sal_Bool bHideCursor; // hide cursor (frame) 291 Range aSelRange; // for selection expansion 292 293 BrowserColumns* pCols; // array of column-descriptions 294 union 295 { 296 MultiSelection* pSel; // selected rows for multi-selection 297 long nSel; // selected row for single-selection 298 } uRow; 299 MultiSelection* pColSel; // selected column-ids 300 301 ::std::auto_ptr< ::svt::BrowseBoxImpl > m_pImpl; // impl structure of the BrowseBox object 302 303 sal_Bool m_bFocusOnlyCursor; // hide cursor if we don't have the focus 304 Color m_aCursorColor; // special color for cursor, COL_TRANSPARENT for usual (VCL-painted) "inverted" cursor 305 BrowserMode m_nCurrentMode; // last argument of SetMode (redundant, as our other members represent the current settings, too) 306 307 private: 308 //#if 0 // _SOLAR__PRIVATE 309 SVT_DLLPRIVATE void ConstructImpl(BrowserMode nMode); 310 SVT_DLLPRIVATE void ExpandRowSelection( const BrowserMouseEvent& rEvt ); 311 SVT_DLLPRIVATE void ToggleSelection( sal_Bool bForce = sal_False ); 312 313 SVT_DLLPRIVATE void UpdateScrollbars(); 314 SVT_DLLPRIVATE void AutoSizeLastColumn(); 315 316 SVT_DLLPRIVATE long ImpGetDataRowHeight() const; 317 SVT_DLLPRIVATE Rectangle ImplFieldRectPixel( long nRow, sal_uInt16 nColId ) const; 318 SVT_DLLPRIVATE sal_uInt16 FrozenColCount() const; 319 320 SVT_DLLPRIVATE void ColumnInserted( sal_uInt16 nPos ); 321 322 DECL_DLLPRIVATE_LINK( ScrollHdl, ScrollBar * ); 323 DECL_DLLPRIVATE_LINK( EndScrollHdl, ScrollBar * ); 324 DECL_DLLPRIVATE_LINK( StartDragHdl, HeaderBar * ); 325 326 SVT_DLLPRIVATE long GetFrozenWidth() const; 327 //#endif 328 329 sal_Bool GoToRow(long nRow, sal_Bool bRowColMove, sal_Bool bDoNotModifySelection = sal_False ); 330 331 sal_Bool GoToColumnId( sal_uInt16 nColId, sal_Bool bMakeVisible, sal_Bool bRowColMove = sal_False); 332 void SelectColumnPos( sal_uInt16 nCol, sal_Bool _bSelect, sal_Bool bMakeVisible); 333 void SelectColumnId( sal_uInt16 nColId, sal_Bool _bSelect, sal_Bool bMakeVisible) 334 { SelectColumnPos( GetColumnPos(nColId), _bSelect, bMakeVisible); } 335 336 void ImplPaintData(OutputDevice& _rOut, const Rectangle& _rRect, sal_Bool _bForeignDevice, sal_Bool _bDrawSelections); 337 338 sal_Bool PaintCursorIfHiddenOnce() const { return !m_bFocusOnlyCursor && !HasFocus(); } 339 340 sal_uInt16 ToggleSelectedColumn(); 341 void SetToggledSelectedColumn(sal_uInt16 _nSelectedColumnId); 342 343 protected: 344 /// retrieves the XAccessible implementation associated with the BrowseBox instance 345 ::svt::IAccessibleFactory& getAccessibleFactory(); 346 347 protected: 348 sal_uInt16 ColCount() const; 349 350 // software plug for database access 351 // Der RowCount wird jetzt intern automatisch gezaehlt 352 // (ueber RowInserted und RowRemoved), daher ist das Ueberladen 353 // dieser Methode ueberfluessig! 354 public: 355 virtual long GetRowCount() const; 356 357 protected: 358 // fuer Anzeige im VScrollBar z.B. auf "?" oder setzen 359 void SetRealRowCount( const String &rRealRowCount ); 360 361 // Return Value muss immer sal_True sein - SeekRow *muss* klappen! 362 // (sonst ASSERT) MI: wer hat das eingebaut? Das darf nicht so sein! 363 364 /** seeks for the given row position 365 @param nRow 366 nRow starts at 0 367 */ 368 virtual sal_Bool SeekRow( long nRow ) = 0; 369 virtual void DrawCursor(); 370 virtual void PaintRow( OutputDevice &rDev, const Rectangle &rRect ); 371 virtual void PaintData( Window& rWin, const Rectangle& rRect ); 372 virtual void PaintField( OutputDevice& rDev, const Rectangle& rRect, 373 sal_uInt16 nColumnId ) const = 0; 374 // Benachrichtigung an die abgeleitete Klasse, dass sich der sichtbare 375 // Bereich von Rows geaendert hat. Aus dieser Methode heraus darf 376 // die abgeleitete Klasse Aenderungen des Model mit Hilfe der Methoden 377 // RowInserted und RowRemoved bekanntgeben. Mit sich daraus ergebenden 378 // neuen Zustand wird anschliessend ein Paint veranlasst (und entsprechend 379 // SeekRow etc. gerufen). 380 // 381 // Parameter: nNewTopRow: Nr. der neuen TopRow (kann von VisibleRowsChanged 382 // durch Aufruf von RowInserted und RowDeleted noch veraendert werden). 383 // nNumRows: Anzahl der sichtbaren Rows (auch eine teilweise sichtbare Row 384 // wird mitgezaehlt). 385 // 386 // Moegliche Ursachen fuer die Aenderung des sichtbaren Bereiches: 387 // - Vor dem sichtbaren Bereich sind Rows eingefuegt oder geloescht worden, 388 // dadurch aendert sich nur die Numerierung der sichtbaren Rows 389 // - Scrollen (und daraus resultierend eine andere erste sichtbare Row) 390 // - Resize des Fensters 391 virtual void VisibleRowsChanged( long nNewTopRow, sal_uInt16 nNumRows); 392 393 // Anzahl sichtbarer Rows in dem Fenster (inkl. "angeschnittener" Rows) 394 sal_uInt16 GetVisibleRows() 395 { return (sal_uInt16)((pDataWin->GetOutputSizePixel().Height() - 1 )/ GetDataRowHeight() + 1); } 396 long GetTopRow() { return nTopRow; } 397 sal_uInt16 GetFirstVisibleColNumber() const { return nFirstCol; } 398 399 // Focus-Rect ein-/ausschalten 400 void DoShowCursor( const char *pWhoLog ); 401 void DoHideCursor( const char *pWhoLog ); 402 short GetCursorHideCount() const; 403 404 virtual BrowserHeader* CreateHeaderBar( BrowseBox* pParent ); 405 406 // HACK(virtuelles Create wird im Ctor nicht gerufen) 407 void SetHeaderBar( BrowserHeader* ); 408 409 long CalcReverseZoom(long nVal); 410 411 HeaderBar* GetHeaderBar() const; 412 // header bar access for derived classes 413 414 inline const DataFlavorExVector& 415 GetDataFlavors() const; 416 417 sal_Bool IsDropFormatSupported( SotFormatStringId nFormat ); // need this because the base class' IsDropFormatSupported is not const ... 418 sal_Bool IsDropFormatSupported( SotFormatStringId nFormat ) const; 419 420 sal_Bool IsDropFormatSupported( const ::com::sun::star::datatransfer::DataFlavor& _rFlavor ); // need this because the base class' IsDropFormatSupported is not const ... 421 sal_Bool IsDropFormatSupported( const ::com::sun::star::datatransfer::DataFlavor& _rFlavor ) const; 422 423 private: 424 void* implGetDataFlavors() const; 425 // with this we can make GetDataFlavors() inline, which is strongly needed as SVTOOLS does not export 426 // any sysbols containing an "_STL", so a non-inlined method would not be exported .... 427 428 protected: 429 // callbacks for the data window 430 virtual void ImplStartTracking(); 431 virtual void ImplTracking(); 432 virtual void ImplEndTracking(); 433 434 public: 435 BrowseBox( Window* pParent, WinBits nBits = 0, 436 BrowserMode nMode = 0 ); 437 BrowseBox( Window* pParent, const ResId& rId, 438 BrowserMode nMode = 0 ); 439 ~BrowseBox(); 440 441 // ererbte ueberladene Handler 442 virtual void StateChanged( StateChangedType nStateChange ); 443 virtual void MouseButtonDown( const MouseEvent& rEvt ); 444 virtual void MouseMove( const MouseEvent& rEvt ); 445 virtual void MouseButtonUp( const MouseEvent& rEvt ); 446 virtual void KeyInput( const KeyEvent& rEvt ); 447 virtual void LoseFocus(); 448 virtual void GetFocus(); 449 virtual void Resize(); 450 virtual void Paint( const Rectangle& rRect ); 451 virtual void Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ); 452 virtual void Command( const CommandEvent& rEvt ); 453 virtual void StartDrag( sal_Int8 _nAction, const Point& _rPosPixel ); 454 455 virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ); // will forward everything got to the second AcceptDrop method 456 virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ); // will forward everything got to the second ExecuteDrop method 457 458 virtual sal_Int8 AcceptDrop( const BrowserAcceptDropEvent& rEvt ); 459 virtual sal_Int8 ExecuteDrop( const BrowserExecuteDropEvent& rEvt ); 460 461 // neue Handler 462 virtual void MouseButtonDown( const BrowserMouseEvent& rEvt ); 463 virtual void MouseMove( const BrowserMouseEvent& rEvt ); 464 virtual void MouseButtonUp( const BrowserMouseEvent& rEvt ); 465 virtual void StartScroll(); 466 virtual void EndScroll(); 467 virtual void Select(); 468 virtual void DoubleClick( const BrowserMouseEvent& rEvt ); 469 virtual sal_Bool IsCursorMoveAllowed( long nNewRow, sal_uInt16 nNewColId ) const; 470 virtual void CursorMoved(); 471 virtual void ColumnMoved( sal_uInt16 nColId ); 472 virtual void ColumnResized( sal_uInt16 nColId ); 473 virtual long QueryColumnResize( sal_uInt16 nColId, long nWidth ); 474 /// called when the row height has been changed interactively 475 virtual void RowHeightChanged(); 476 virtual long QueryMinimumRowHeight(); 477 478 // Window-Control (pass to DataWindow) 479 void SetUpdateMode( sal_Bool bUpdate ); 480 sal_Bool GetUpdateMode() const; 481 482 // map-mode and font control 483 void SetFont( const Font& rNewFont ); 484 const Font& GetFont() const { return pDataWin->GetFont(); } 485 void SetTitleFont( const Font& rNewFont ) 486 { Control::SetFont( rNewFont ); } 487 const Font& GetTitleFont() const { return Control::GetFont(); } 488 489 // color for line painting 490 void SetGridLineColor(const Color& rColor) {aGridLineColor = rColor;} 491 const Color& GetGridLineColor() const {return aGridLineColor;} 492 493 // inserting, changing, removing and freezing of columns 494 void InsertHandleColumn( sal_uLong nWidth ); 495 void InsertDataColumn( sal_uInt16 nItemId, const Image& rImage, 496 long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE, 497 sal_uInt16 nPos = HEADERBAR_APPEND ); 498 void InsertDataColumn( sal_uInt16 nItemId, const XubString& rText, 499 long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE, 500 sal_uInt16 nPos = HEADERBAR_APPEND ); 501 void InsertDataColumn( sal_uInt16 nItemId, 502 const Image& rImage, const XubString& rText, 503 long nSize, HeaderBarItemBits nBits = HIB_STDSTYLE, 504 sal_uInt16 nPos = HEADERBAR_APPEND, 505 // Hilfstext bei leerem rText 506 const String* pHelpText = 0 ); 507 void SetColumnTitle( sal_uInt16 nColumnId, const String &rTitle ); 508 void SetColumnMode( sal_uInt16 nColumnId, BrowserColumnMode nFlags ); 509 void SetColumnWidth( sal_uInt16 nColumnId, sal_uLong nWidth ); 510 void SetColumnPos( sal_uInt16 nColumnId, sal_uInt16 nPos ); 511 void FreezeColumn( sal_uInt16 nColumnId, sal_Bool bFreeze = sal_True ); 512 void UnfreezeColumns(); 513 void RemoveColumn( sal_uInt16 nColumnId ); 514 void RemoveColumns(); 515 516 // control of title and data row height 517 void SetDataRowHeight( long nPixel ); 518 long GetDataRowHeight() const; 519 void SetTitleLines( sal_uInt16 nLines ); 520 sal_uInt16 GetTitleLines() const { return nTitleLines; } 521 virtual long GetTitleHeight() const; 522 523 // access to dynamic values of cursor row 524 String GetColumnTitle( sal_uInt16 nColumnId ) const; 525 BrowserColumnMode GetColumnMode( sal_uInt16 nColumnId ) const; 526 Rectangle GetFieldRect( sal_uInt16 nColumnId ) const; 527 sal_uLong GetColumnWidth( sal_uInt16 nColumnId ) const; 528 sal_uInt16 GetColumnId( sal_uInt16 nPos ) const; 529 sal_uInt16 GetColumnPos( sal_uInt16 nColumnId ) const; 530 sal_Bool IsFrozen( sal_uInt16 nColumnId ) const; 531 532 // movement of visible area 533 void ResetScroll(); 534 long ScrollColumns( long nColumns ); 535 long ScrollRows( long nRows ); 536 long ScrollPages( long nPagesY ); 537 sal_Bool MakeFieldVisible( long nRow, sal_uInt16 nColId, sal_Bool bComplete = sal_False ); 538 539 // access and movement of cursor 540 long GetCurRow() const { return nCurRow; } 541 sal_uInt16 GetCurColumnId() const { return nCurColId; } 542 sal_Bool GoToRow( long nRow ); 543 sal_Bool GoToRowAndDoNotModifySelection( long nRow ); 544 sal_Bool GoToColumnId( sal_uInt16 nColId ); 545 sal_Bool GoToRowColumnId( long nRow, sal_uInt16 nColId ); 546 547 // selections 548 virtual void SetNoSelection(); 549 virtual void SelectAll(); 550 virtual void SelectRow( long nRow, sal_Bool _bSelect = sal_True, sal_Bool bExpand = sal_True ); 551 void SelectColumnPos( sal_uInt16 nCol, sal_Bool _bSelect = sal_True ) 552 { SelectColumnPos( nCol, _bSelect, sal_True); } 553 void SelectColumnId( sal_uInt16 nColId, sal_Bool _bSelect = sal_True ) 554 { SelectColumnPos( GetColumnPos(nColId), _bSelect, sal_True); } 555 long GetSelectRowCount() const; 556 sal_uInt16 GetSelectColumnCount() const; 557 virtual bool IsRowSelected( long nRow ) const; 558 bool IsColumnSelected( sal_uInt16 nColumnId ) const; 559 sal_Bool IsAllSelected() const; 560 long FirstSelectedRow( sal_Bool bInverse = sal_False ); 561 long LastSelectedRow(); 562 long PrevSelectedRow(); 563 long NextSelectedRow(); 564 const MultiSelection* GetColumnSelection() const { return pColSel; } 565 const MultiSelection* GetSelection() const 566 { return bMultiSelection ? uRow.pSel : 0; } 567 void SetSelection( const MultiSelection &rSelection ); 568 569 long FirstSelectedColumn( ) const; 570 long NextSelectedColumn( ) const; 571 572 sal_Bool IsResizing() const { return bResizing; } 573 574 // access to positions of fields, column and rows 575 Window& GetEventWindow() const; 576 Window& GetDataWindow() const { return *pDataWin; } 577 Rectangle GetRowRectPixel( long nRow, 578 sal_Bool bRelToBrowser = sal_True ) const; 579 Rectangle GetFieldRectPixel( long nRow, sal_uInt16 nColId, 580 sal_Bool bRelToBrowser = sal_True) const; 581 sal_Bool IsFieldVisible( long nRow, sal_uInt16 nColId, 582 sal_Bool bComplete = sal_False ) const; 583 long GetRowAtYPosPixel( long nY, 584 sal_Bool bRelToBrowser = sal_True ) const; 585 sal_uInt16 GetColumnAtXPosPixel( long nX, 586 sal_Bool bRelToBrowser = sal_True ) const; 587 588 // invalidations 589 void Clear(); 590 void RowRemoved( long nRow, long nNumRows = 1, sal_Bool bDoPaint = sal_True ); 591 void RowModified( long nRow, sal_uInt16 nColId = USHRT_MAX ); 592 void RowInserted( long nRow, long nNumRows = 1, sal_Bool bDoPaint = sal_True, sal_Bool bKeepSelection = sal_False ); 593 594 // miscellanous 595 void ReserveControlArea( sal_uInt16 nWidth = USHRT_MAX ); 596 Rectangle GetControlArea() const; 597 sal_Bool ProcessKey( const KeyEvent& rEvt ); 598 void Dispatch( sal_uInt16 nId ); 599 void SetMode( BrowserMode nMode = 0 ); 600 BrowserMode GetMode( ) const { return m_nCurrentMode; } 601 bool IsInCommandEvent() const; 602 603 void SetCursorColor(const Color& _rCol); 604 Color GetCursorColor() const { return m_aCursorColor; } 605 void ResetSelecting() { bSelecting = sal_False; } 606 607 /** specifies that the user is allowed to interactively change the height of a row, 608 by simply dragging an arbitrary row separator. 609 610 Note that this works only if there's a handle column, since only in this case, 611 there *is* something for the user to click onto 612 */ 613 void EnableInteractiveRowHeight( sal_Bool _bEnable = sal_True ) { mbInteractiveRowHeight = _bEnable; } 614 sal_Bool IsInteractiveRowHeightEnabled( ) const { return mbInteractiveRowHeight; } 615 616 /// access to selected methods, to be granted to the BrowserColumn 617 struct BrowserColumnAccess { friend class BrowserColumn; private: BrowserColumnAccess() { } }; 618 /** public version of PaintField, with selected access rights for the BrowserColumn 619 */ 620 void DoPaintField( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId, BrowserColumnAccess ) const 621 { PaintField( rDev, rRect, nColumnId ); } 622 623 /** suggests a default width for a column containing a given text 624 625 The width is calculated so that the text fits completely, plus som margin. 626 */ 627 sal_uLong GetDefaultColumnWidth( const String& _rText ) const; 628 629 /** GetCellText returns the text at the given position 630 @param _nRow 631 the number of the row 632 @param _nColId 633 the ID of the column 634 @return 635 the text out of the cell 636 */ 637 virtual String GetCellText(long _nRow, sal_uInt16 _nColId) const; 638 639 /** @return 640 the current column count 641 */ 642 sal_uInt16 GetColumnCount() const { return ColCount(); } 643 644 /** commitBrowseBoxEvent commit the event at all listeners of the browsebox 645 @param nEventId 646 the event id 647 @param rNewValue 648 the new value 649 @param rOldValue 650 the old value 651 */ 652 void commitBrowseBoxEvent(sal_Int16 nEventId, 653 const ::com::sun::star::uno::Any& rNewValue, 654 const ::com::sun::star::uno::Any& rOldValue); 655 656 /** commitTableEvent commit the event at all listeners of the table 657 @param nEventId 658 the event id 659 @param rNewValue 660 the new value 661 @param rOldValue 662 the old value 663 */ 664 void commitTableEvent(sal_Int16 nEventId, 665 const ::com::sun::star::uno::Any& rNewValue, 666 const ::com::sun::star::uno::Any& rOldValue); 667 668 /** fires an AccessibleEvent relative to a header bar AccessibleContext 669 670 @param nEventId 671 the event id 672 @param rNewValue 673 the new value 674 @param rOldValue 675 the old value 676 */ 677 void commitHeaderBarEvent(sal_Int16 nEventId, 678 const ::com::sun::star::uno::Any& rNewValue, 679 const ::com::sun::star::uno::Any& rOldValue, 680 sal_Bool _bColumnHeaderBar 681 ); 682 683 /** returns the Rectangle for either the column header bar ot the row header bar 684 @param _bIsColumnBar 685 <TRUE/> when column header bar is used 686 @param _bOnScreen 687 <TRUE/> when the rectangle should be calculated OnScreen 688 @return 689 the Rectangle 690 */ 691 virtual Rectangle calcHeaderRect(sal_Bool _bIsColumnBar,sal_Bool _bOnScreen = sal_True); 692 693 /** calculates the Rectangle of the table 694 @param _bOnScreen 695 <TRUE/> when the rectangle should be calculated OnScreen 696 @return 697 the Rectangle 698 */ 699 virtual Rectangle calcTableRect(sal_Bool _bOnScreen = sal_True); 700 701 /** 702 @param _nRowId 703 the current row 704 @param _nColId 705 teh column id 706 @param _bOnScreen 707 <TRUE/> when the rectangle should be calculated OnScreen 708 @return 709 the Rectangle 710 */ 711 virtual Rectangle GetFieldRectPixelAbs(sal_Int32 _nRowId,sal_uInt16 _nColId, sal_Bool _bIsHeader, sal_Bool _bOnScreen = sal_True); 712 713 /// return <TRUE/> if and only if the accessible object for this instance has been created and is alive 714 sal_Bool isAccessibleAlive( ) const; 715 716 // ACCESSIBILITY ========================================================== 717 public: 718 /** Creates and returns the accessible object of the whole BrowseBox. */ 719 virtual ::com::sun::star::uno::Reference< 720 ::com::sun::star::accessibility::XAccessible > CreateAccessible(); 721 722 // Children --------------------------------------------------------------- 723 724 /** Creates the accessible object of a data table cell. 725 @param nRow The row index of the cell. 726 @param nColumnId The column pos of the cell. 727 @return The XAccessible interface of the specified cell. */ 728 virtual ::com::sun::star::uno::Reference< 729 ::com::sun::star::accessibility::XAccessible > 730 CreateAccessibleCell( sal_Int32 nRow, sal_uInt16 nColumnPos ); 731 732 /** Creates the accessible object of a row header. 733 @param nRow The row index of the header. 734 @return The XAccessible interface of the specified row header. */ 735 virtual ::com::sun::star::uno::Reference< 736 ::com::sun::star::accessibility::XAccessible > 737 CreateAccessibleRowHeader( sal_Int32 nRow ); 738 739 /** Creates the accessible object of a column header. 740 @param nColumnId The column ID of the header. 741 @return The XAccessible interface of the specified column header. */ 742 virtual ::com::sun::star::uno::Reference< 743 ::com::sun::star::accessibility::XAccessible > 744 CreateAccessibleColumnHeader( sal_uInt16 nColumnPos ); 745 746 /** @return The count of additional controls of the control area. */ 747 virtual sal_Int32 GetAccessibleControlCount() const; 748 749 /** Creates the accessible object of an additional control. 750 @param nIndex The 0-based index of the control. 751 @return The XAccessible interface of the specified control. */ 752 virtual ::com::sun::star::uno::Reference< 753 ::com::sun::star::accessibility::XAccessible > 754 CreateAccessibleControl( sal_Int32 nIndex ); 755 756 // Conversions ------------------------------------------------------------ 757 758 /** Converts a point relative to the data window origin to a cell address. 759 @param rnRow Out-paramater that takes the row index. 760 @param rnColumnId Out-paramater that takes the column ID. 761 @param rPoint The position in pixels relative to the data window. 762 @return <TRUE/>, if the point could be converted to a valid address. */ 763 virtual sal_Bool ConvertPointToCellAddress( 764 sal_Int32& rnRow, sal_uInt16& rnColumnId, const Point& rPoint ); 765 766 /** Converts a point relative to the row header bar origin to a row header 767 index. 768 @param rnRow Out-paramater that takes the row index. 769 @param rPoint The position in pixels relative to the header bar. 770 @return <TRUE/>, if the point could be converted to a valid index. */ 771 virtual sal_Bool ConvertPointToRowHeader( sal_Int32& rnRow, const Point& rPoint ); 772 773 /** Converts a point relative to the column header bar origin to a column 774 header index. 775 @param rnColumnId Out-paramater that takes the column ID. 776 @param rPoint The position in pixels relative to the header bar. 777 @return <TRUE/>, if the point could be converted to a valid index. */ 778 virtual sal_Bool ConvertPointToColumnHeader( sal_uInt16& rnColumnPos, const Point& rPoint ); 779 780 /** Converts a point relative to the BrowseBox origin to the index of an 781 existing control. 782 @param rnRow Out-paramater that takes the 0-based control index. 783 @param rPoint The position in pixels relative to the BrowseBox. 784 @return <TRUE/>, if the point could be converted to a valid index. */ 785 virtual sal_Bool ConvertPointToControlIndex( sal_Int32& rnIndex, const Point& rPoint ); 786 787 // Object data and state -------------------------------------------------- 788 789 /** return the name of the specified object. 790 @param eObjType 791 The type to ask for 792 @param _nPosition 793 The position of a tablecell (index position), header bar colum/row cell 794 @return 795 The name of the specified object. 796 */ 797 virtual ::rtl::OUString GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const; 798 799 /** return the description of the specified object. 800 @param eObjType 801 The type to ask for 802 @param _nPosition 803 The position of a tablecell (index position), header bar colum/row cell 804 @return 805 The description of the specified object. 806 */ 807 virtual ::rtl::OUString GetAccessibleObjectDescription( ::svt::AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const; 808 809 /** @return The header text of the specified row. */ 810 virtual ::rtl::OUString GetRowDescription( sal_Int32 nRow ) const; 811 812 /** @return The header text of the specified column. */ 813 virtual ::rtl::OUString GetColumnDescription( sal_uInt16 _nColumn ) const; 814 815 /** Fills the StateSet with all states (except DEFUNC and SHOWING, done by 816 the accessible object), depending on the specified object type. */ 817 virtual void FillAccessibleStateSet( 818 ::utl::AccessibleStateSetHelper& rStateSet, 819 ::svt::AccessibleBrowseBoxObjType eObjType ) const; 820 821 /** Fills the StateSet with all states for one cell (except DEFUNC and SHOWING, done by 822 the accessible object). */ 823 virtual void FillAccessibleStateSetForCell( 824 ::utl::AccessibleStateSetHelper& _rStateSet, 825 sal_Int32 _nRow, sal_uInt16 _nColumn ) const; 826 827 /** Sets focus to current cell of the data table. */ 828 virtual void GrabTableFocus(); 829 830 // IAccessibleTableProvider 831 virtual sal_Int32 GetCurrRow() const; 832 virtual sal_uInt16 GetCurrColumn() const; 833 virtual sal_Bool HasRowHeader() const; 834 virtual sal_Bool IsCellFocusable() const; 835 virtual sal_Bool GoToCell( sal_Int32 _nRow, sal_uInt16 _nColumn ); 836 virtual void SelectColumn( sal_uInt16 _nColumn, sal_Bool _bSelect = sal_True ); 837 virtual sal_Bool IsColumnSelected( long _nColumn ) const; 838 virtual sal_Int32 GetSelectedRowCount() const; 839 virtual sal_Int32 GetSelectedColumnCount() const; 840 virtual void GetAllSelectedRows( ::com::sun::star::uno::Sequence< sal_Int32 >& _rRows ) const; 841 virtual void GetAllSelectedColumns( ::com::sun::star::uno::Sequence< sal_Int32 >& _rColumns ) const; 842 virtual sal_Bool IsCellVisible( sal_Int32 _nRow, sal_uInt16 _nColumn ) const; 843 virtual String GetAccessibleCellText(long _nRow, sal_uInt16 _nColPos) const; 844 virtual sal_Bool GetGlyphBoundRects( const Point& rOrigin, const String& rStr, int nIndex, int nLen, int nBase, MetricVector& rVector ); 845 virtual Rectangle GetWindowExtentsRelative( Window *pRelativeWindow ) const; 846 virtual void GrabFocus(); 847 virtual XACC GetAccessible( sal_Bool bCreate = sal_True ); 848 virtual Window* GetAccessibleParentWindow() const; 849 virtual Window* GetWindowInstance(); 850 851 private: 852 // the following declares some Window/OutputDevice methods private. This happened in the course 853 // of CWS warnings01, which pointed out nameclashs in those methods. If the build breaks in some 854 // upper module, you should investigate whether you really wanted to call base class methods, 855 // or the versions at this class. In the latter case, use the renamed versions above. 856 857 // Set/GetLineColor - superseded by Set/GetGridLineColor 858 using OutputDevice::SetLineColor; 859 using OutputDevice::GetLineColor; 860 861 // ToTop/ToBottom were never property implemented. If you currently call it, this is most probably wrong 862 // and not doing as intended 863 using Window::ToTop; 864 }; 865 866 //------------------------------------------------------------------- 867 inline const DataFlavorExVector& BrowseBox::GetDataFlavors() const 868 { 869 return *reinterpret_cast<DataFlavorExVector*>(implGetDataFlavors()); 870 } 871 872 #endif 873 874