1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// ============================================================================
#ifndef _SC_CSVGRID_HXX
#define _SC_CSVGRID_HXX
#include <vcl/virdev.hxx>
#include <vcl/menu.hxx>
#include <unotools/options.hxx>
#include <vector>
#include <memory>
#include "scdllapi.h"
#include "csvcontrol.hxx"
#include "csvsplits.hxx"
// ----------------------------------------------------------------------------
namespace svtools { class ColorConfig; }
class EditEngine;
class ScEditEngineDefaulter;
class ScAsciiOptions;
class ScAccessibleCsvControl;
// ============================================================================
const sal_uInt8 CSV_COLFLAG_NONE = 0x00; /// Nothing set.
const sal_uInt8 CSV_COLFLAG_SELECT = 0x01; /// Column is selected.
const sal_uInt32 CSV_COLUMN_INVALID = CSV_VEC_NOTFOUND;
// ----------------------------------------------------------------------------
/** This struct contains the state of one table column. */
struct ScCsvColState
{
sal_Int32 mnType; /// Data type.
sal_uInt8 mnFlags; /// Flags (i.e. selection state).
inline explicit ScCsvColState(
sal_Int32 nType = CSV_TYPE_DEFAULT,
sal_uInt8 nFlags = CSV_COLFLAG_NONE ) :
mnType( nType ), mnFlags( nFlags ) {}
inline bool IsSelected() const;
inline void Select( bool bSel );
};
inline bool ScCsvColState::IsSelected() const
{
return (mnFlags & CSV_COLFLAG_SELECT) != 0;
}
inline void ScCsvColState::Select( bool bSel )
{
if( bSel ) mnFlags |= CSV_COLFLAG_SELECT; else mnFlags &= ~CSV_COLFLAG_SELECT;
}
// ----------------------------------------------------------------------------
typedef ::std::vector< ScCsvColState > ScCsvColStateVec;
// ============================================================================
/** A data grid control for the CSV import dialog. The design of this control
simulates a Calc spreadsheet with row and column headers. */
class SC_DLLPUBLIC ScCsvGrid : public ScCsvControl, public utl::ConfigurationListener
{
private:
typedef ::std::auto_ptr< ScEditEngineDefaulter > ScEditEnginePtr;
VirtualDevice maBackgrDev; /// Grid background, headers, cell texts.
VirtualDevice maGridDev; /// Data grid with selection and cursor.
PopupMenu maPopup; /// Popup menu for column types.
::svtools::ColorConfig* mpColorConfig; /// Application color configuration.
Color maBackColor; /// Cell background color.
Color maGridColor; /// Table grid color.
Color maGridPBColor; /// Grid color for "first imported line" delimiter.
Color maAppBackColor; /// Background color for unused area.
Color maTextColor; /// Text color for data area.
Color maHeaderBackColor; /// Background color for headers.
Color maHeaderGridColor; /// Grid color for headers.
Color maHeaderTextColor; /// Text color for headers.
Color maSelectColor; /// Header color of selected columns.
ScEditEnginePtr mpEditEngine; /// For drawing cell texts.
Font maHeaderFont; /// Font for column and row headers.
Font maMonoFont; /// Monospace font for data cells.
Size maWinSize; /// Size of the control.
Size maEdEngSize; /// Paper size for edit engine.
ScCsvSplits maSplits; /// Vector with split positions.
ScCsvColStateVec maColStates; /// State of each column.
StringVec maTypeNames; /// UI names of data types.
StringVecVec maTexts; /// 2D-vector for cell texts.
sal_Int32 mnFirstImpLine; /// First imported line (0-based).
sal_uInt32 mnRecentSelCol; /// Index of most recently selected column.
sal_uInt32 mnMTCurrCol; /// Current column of mouse tracking.
bool mbMTSelecting; /// Mouse tracking: true = select, false = deselect.
// ------------------------------------------------------------------------
public:
explicit ScCsvGrid( ScCsvControl& rParent );
virtual ~ScCsvGrid();
/** Finishes initialization. Must be called after constructing a new object. */
void Init();
// common grid handling ---------------------------------------------------
public:
/** Updates layout data dependent from the control's state. */
void UpdateLayoutData();
/** Updates X coordinate of first visible position dependent from line numbers. */
void UpdateOffsetX();
/** Apply current layout data to the grid control. */
void ApplyLayout( const ScCsvLayoutData& rOldData );
/** Sets the number of the first imported line (for visual feedback). nLine is 0-based! */
void SetFirstImportedLine( sal_Int32 nLine );
/** Finds a column position nearest to nPos which does not cause scrolling the visible area. */
sal_Int32 GetNoScrollCol( sal_Int32 nPos ) const;
private:
/** Reads colors from system settings. */
SC_DLLPRIVATE void InitColors();
/** Initializes all font settings. */
SC_DLLPRIVATE void InitFonts();
/** Initializes all data dependent from the control's size. */
SC_DLLPRIVATE void InitSizeData();
// split handling ---------------------------------------------------------
public:
/** Inserts a split. */
void InsertSplit( sal_Int32 nPos );
/** Removes a split. */
void RemoveSplit( sal_Int32 nPos );
/** Inserts a new or removes an existing split. */
void MoveSplit( sal_Int32 nPos, sal_Int32 nNewPos );
/** Removes all splits. */
void RemoveAllSplits();
/** Removes all splits and inserts the splits from rSplits. */
void SetSplits( const ScCsvSplits& rSplits );
private:
/** Inserts a split and adjusts column data. */
SC_DLLPRIVATE bool ImplInsertSplit( sal_Int32 nPos );
/** Removes a split and adjusts column data. */
SC_DLLPRIVATE bool ImplRemoveSplit( sal_Int32 nPos );
/** Clears the split array and re-inserts boundary splits. */
SC_DLLPRIVATE void ImplClearSplits();
// columns/column types ---------------------------------------------------
public:
/** Returns the number of columns. */
inline sal_uInt32 GetColumnCount() const { return maColStates.size(); }
/** Returns the index of the first visible column. */
sal_uInt32 GetFirstVisColumn() const;
/** Returns the index of the last visible column. */
sal_uInt32 GetLastVisColumn() const;
/** Returns true, if nColIndex points to an existing column. */
bool IsValidColumn( sal_uInt32 nColIndex ) const;
/** Returns true, if column with index nColIndex is (at least partly) visible. */
bool IsVisibleColumn( sal_uInt32 nColIndex ) const;
/** Returns X coordinate of the specified column. */
sal_Int32 GetColumnX( sal_uInt32 nColIndex ) const;
/** Returns column index from output coordinate. */
sal_uInt32 GetColumnFromX( sal_Int32 nX ) const;
/** Returns start position of the column with the specified index. */
inline sal_Int32 GetColumnPos( sal_uInt32 nColIndex ) const { return maSplits[ nColIndex ]; }
/** Returns column index from position. A split counts to its following column. */
sal_uInt32 GetColumnFromPos( sal_Int32 nPos ) const;
/** Returns the character width of the column with the specified index. */
sal_Int32 GetColumnWidth( sal_uInt32 nColIndex ) const;
/** Returns the vector with the states of all columns. */
inline const ScCsvColStateVec& GetColumnStates() const { return maColStates; }
/** Sets all column states to the values in the passed vector. */
void SetColumnStates( const ScCsvColStateVec& rColStates );
/** Returns the data type of the selected columns. */
sal_Int32 GetSelColumnType() const;
/** Changes the data type of all selected columns. */
void SetSelColumnType( sal_Int32 nType );
/** Sets new UI data type names. */
void SetTypeNames( const StringVec& rTypeNames );
/** Returns the UI type name of the specified column. */
const String& GetColumnTypeName( sal_uInt32 nColIndex ) const;
/** Fills the options object with column data for separators mode. */
void FillColumnDataSep( ScAsciiOptions& rOptions ) const;
/** Fills the options object with column data for fixed width mode. */
void FillColumnDataFix( ScAsciiOptions& rOptions ) const;
private:
/** Returns the data type of the specified column. */
SC_DLLPRIVATE sal_Int32 GetColumnType( sal_uInt32 nColIndex ) const;
/** Returns the data type of the specified column. */
SC_DLLPRIVATE void SetColumnType( sal_uInt32 nColIndex, sal_Int32 nColType );
/** Scrolls data grid vertically. */
SC_DLLPRIVATE void ScrollVertRel( ScMoveMode eDir );
/** Executes the data type popup menu. */
SC_DLLPRIVATE void ExecutePopup( const Point& rPos );
// selection handling -----------------------------------------------------
public:
/** Returns true, if the specified column is selected. */
bool IsSelected( sal_uInt32 nColIndex ) const;
/** Returns index of the first selected column. */
sal_uInt32 GetFirstSelected() const;
/** Returns index of the first selected column really after nFromIndex. */
sal_uInt32 GetNextSelected( sal_uInt32 nFromIndex ) const;
/** Returns true, if at least one column is selected. */
inline bool HasSelection() const { return GetFirstSelected() != CSV_COLUMN_INVALID; }
/** Selects or deselects the specified column. */
void Select( sal_uInt32 nColIndex, bool bSelect = true );
/** Toggles selection of the specified column. */
void ToggleSelect( sal_uInt32 nColIndex );
/** Selects or deselects the specified column range. */
void SelectRange( sal_uInt32 nColIndex1, sal_uInt32 nColIndex2, bool bSelect = true );
/** Selects or deselects all columns. */
void SelectAll( bool bSelect = true );
/** Returns index of the focused column. */
inline sal_uInt32 GetFocusColumn() const { return GetColumnFromPos( GetGridCursorPos() ); }
private:
/** Moves column cursor to a new position. */
SC_DLLPRIVATE void MoveCursor( sal_uInt32 nColIndex );
/** Moves column cursor to the given direction. */
SC_DLLPRIVATE void MoveCursorRel( ScMoveMode eDir );
/** Clears the entire selection without notify. */
SC_DLLPRIVATE void ImplClearSelection();
/** Executes selection action for a specific column. */
SC_DLLPRIVATE void DoSelectAction( sal_uInt32 nColIndex, sal_uInt16 nModifier );
// cell contents ----------------------------------------------------------
public:
/** Fills all cells of a line with the passed text (separators mode). */
void ImplSetTextLineSep(
sal_Int32 nLine, const String& rTextLine,
const String& rSepChars, sal_Unicode cTextSep, bool bMergeSep );
/** Fills all cells of a line with the passed text (fixed width mode). */
void ImplSetTextLineFix( sal_Int32 nLine, const String& rTextLine );
/** Returns the text of the specified cell. */
const String& GetCellText( sal_uInt32 nColIndex, sal_Int32 nLine ) const;
// event handling ---------------------------------------------------------
protected:
virtual void Resize();
virtual void GetFocus();
virtual void LoseFocus();
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void Tracking( const TrackingEvent& rTEvt );
virtual void KeyInput( const KeyEvent& rKEvt );
virtual void Command( const CommandEvent& rCEvt );
virtual void DataChanged( const DataChangedEvent& rDCEvt );
virtual void ConfigurationChanged( ::utl::ConfigurationBroadcaster*, sal_uInt32 );
// painting ---------------------------------------------------------------
protected:
virtual void Paint( const Rectangle& );
public:
/** Redraws the entire data grid. */
void ImplRedraw();
/** Returns a pointer to the used edit engine. */
EditEngine* GetEditEngine();
private:
/** Returns the width of the control. */
inline sal_Int32 GetWidth() const { return maWinSize.Width(); }
/** Returns the height of the control. */
inline sal_Int32 GetHeight() const { return maWinSize.Height(); }
/** Sets a clip region in the specified output device for the specified column. */
SC_DLLPRIVATE void ImplSetColumnClipRegion( OutputDevice& rOutDev, sal_uInt32 nColIndex );
/** Draws the header of the specified column to the specified output device. */
SC_DLLPRIVATE void ImplDrawColumnHeader( OutputDevice& rOutDev, sal_uInt32 nColIndex, Color aFillColor );
/** Draws the text at the specified position to maBackgrDev. */
SC_DLLPRIVATE void ImplDrawCellText( const Point& rPos, const String& rText );
/** Draws the "first imported line" separator to maBackgrDev (or erases, if bSet is false). */
SC_DLLPRIVATE void ImplDrawFirstLineSep( bool bSet );
/** Draws the column with index nColIndex to maBackgrDev. */
SC_DLLPRIVATE void ImplDrawColumnBackgr( sal_uInt32 nColIndex );
/** Draws the row headers column to maBackgrDev. */
SC_DLLPRIVATE void ImplDrawRowHeaders();
/** Draws all columns and the row headers column to maBackgrDev. */
SC_DLLPRIVATE void ImplDrawBackgrDev();
/** Draws the column with index nColIndex with its selection state to maGridDev. */
SC_DLLPRIVATE void ImplDrawColumnSelection( sal_uInt32 nColIndex );
/** Draws all columns with selection and cursor to maGridDev. */
SC_DLLPRIVATE void ImplDrawGridDev();
/** Redraws the entire column (background and selection). */
SC_DLLPRIVATE void ImplDrawColumn( sal_uInt32 nColIndex );
/** Optimized drawing: Scrolls horizontally and redraws only missing parts. */
SC_DLLPRIVATE void ImplDrawHorzScrolled( sal_Int32 nOldPos );
/** Inverts the cursor bar at the specified position in maGridDev. */
SC_DLLPRIVATE void ImplInvertCursor( sal_Int32 nPos );
/** Draws directly tracking rectangle to the column with the specified index. */
SC_DLLPRIVATE void ImplDrawTrackingRect( sal_uInt32 nColIndex );
// accessibility ----------------------------------------------------------
protected:
/** Creates a new accessible object. */
virtual ScAccessibleCsvControl* ImplCreateAccessible();
};
// ============================================================================
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|