1 /* This file is part of the KDE project 2 * Copyright (C) 2001-2007 by OpenMFG, LLC <info@openmfg.com> 3 * Copyright (C) 2007-2008 by Adam Pigg <adam@piggz.co.uk> 4 * Copyright (C) 2011-2017 Jarosław Staniek <staniek@kde.org> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 #ifndef KREPORTDESIGNER_H 20 #define KREPORTDESIGNER_H 21 22 #include <QWidget> 23 24 #include "KReportDocument.h" 25 #include "KReportDataSource.h" 26 27 class KProperty; 28 class KPropertySet; 29 30 class KReportItemBase; 31 32 class QGraphicsScene; 33 class QActionGroup; 34 class QGraphicsSceneContextMenuEvent; 35 class QString; 36 37 class KReportDesignerSectionDetail; 38 class KReportDesignerSection; 39 class KReportUnit; 40 class KReportDesignerSectionScene; 41 class KReportDesignerSectionView; 42 class QAction; 43 44 #ifdef KREPORT_SCRIPTING 45 class KReportScriptSource; 46 #endif 47 48 49 /*! 50 * @brief The ReportDesigner is the main widget for designing a report 51 */ 52 class KREPORT_EXPORT KReportDesigner : public QWidget 53 { 54 Q_OBJECT 55 public: 56 /** 57 @brief Constructor that create a blank designer 58 @param parent QWidget parent 59 */ 60 explicit KReportDesigner(QWidget *parent = nullptr); 61 62 /** 63 @brief Constructor that create a designer, and loads the report described in the QDomElement 64 @param parent QWidget parent 65 @param desc Report structure XML element 66 */ 67 KReportDesigner(QWidget *parent, const QDomElement &desc); 68 69 /** 70 @brief Desctructor 71 */ 72 ~KReportDesigner() override; 73 74 /** 75 @brief Sets the report data 76 The report data interface contains functions to retrieve data 77 and information about the fields. 78 @param source Pointer to KReportDataSource instance, ownership is transferred 79 */ 80 void setDataSource(KReportDataSource* source); 81 82 #ifdef KREPORT_SCRIPTING 83 /** 84 @brief Sets the script source for the designer 85 The script source contains function to return scripts supplied by the parent application 86 @param source Pointer to KReportScriptSource instance, ownership is NOT transferred as it may be an application window 87 */ 88 void setScriptSource(KReportScriptSource *source); 89 #endif 90 91 /** 92 @brief Return a pointer to the reports data 93 @return Pointer to report data 94 */ 95 KReportDataSource *reportDataSource() const; 96 97 /** 98 @brief Return a pointer to the section specified 99 @param type KReportSectionData::Section enum value of the section to return 100 @return Pointer to report section object, or 0 if no section exists 101 */ 102 KReportDesignerSection* section(KReportSectionData::Type type) const; 103 104 /** 105 @brief Creates new section 106 @return Pointer to a new report section section object, ownership is transferred to 107 the caller 108 */ 109 KReportDesignerSection* createSection() Q_REQUIRED_RESULT; 110 111 /** 112 @brief Deletes the section specified 113 @param type KReportSectionData::Section enum value of the section to return 114 */ 115 void removeSection(KReportSectionData::Type type); 116 117 /** 118 @brief Create a new section and insert it into the report 119 @param type KReportSectionData::Section enum value of the section to return 120 */ 121 void insertSection(KReportSectionData::Type type); 122 123 /** 124 @brief Return a pointer to the detail section. 125 The detail section contains the actual detail section and related group sections 126 @return Pointer to detail section 127 */ 128 KReportDesignerSectionDetail* detailSection() const; 129 130 /** 131 @brief Sets the title of the reportData 132 @param title Report Title 133 */ 134 void setReportTitle(const QString &title); 135 136 /** 137 @brief Sets the parameters for the display of the background gridpoints 138 @param visible Grid visibility 139 @param divisions Number of minor divisions between major points 140 */ 141 void setGridOptions(bool visible, int divisions); 142 143 /** 144 @brief Return the title of the report 145 */ 146 QString reportTitle() const; 147 148 /** 149 @brief Return an XML description of the report 150 @return QDomElement describing the report definition 151 */ 152 QDomElement document() const; 153 154 /** 155 @brief Return true if the design has been modified 156 @return modified status 157 */ 158 bool isModified() const; 159 160 /** 161 @return a list of field names in the selected KReportData 162 */ 163 QStringList fieldNames() const; 164 165 /** 166 @return a list of field keys in the selected KReportData 167 The keys can be used to reference the names 168 */ 169 QStringList fieldKeys() const; 170 171 /** 172 @brief Calculate the width of the page in pixels given the paper size, orientation, dpi and margin 173 @return integer value of width in pixels 174 */ 175 int pageWidthPx() const; 176 177 /** 178 @return the scene (section) that is currently active 179 */ 180 QGraphicsScene* activeScene() const; 181 182 /** 183 @brief Sets the active Scene 184 @param scene The scene to make active 185 */ 186 void setActiveScene(QGraphicsScene* scene); 187 188 /** 189 @return the property set for the general report properties 190 */ 191 KPropertySet* propertySet() const; 192 193 /** 194 @brief Give a hint on the size of the widget 195 */ 196 QSize sizeHint() const override; 197 198 /** 199 @brief Return the current unit assigned to the report 200 */ 201 KReportUnit pageUnit() const; 202 203 /** 204 @brief Handle the context menu event for a report section 205 @param scene The associated scene (section) 206 */ 207 void sectionContextMenuEvent(KReportDesignerSectionScene *scene, QGraphicsSceneContextMenuEvent * event); 208 209 /** 210 @brief Handle the mouse release event for a report section 211 */ 212 void sectionMouseReleaseEvent(KReportDesignerSectionView *v, QMouseEvent * e); 213 214 void sectionMousePressEvent(KReportDesignerSectionView *v, QMouseEvent * e); 215 216 /** 217 @brief Sets the property set for the currently selected item 218 @param set Property set of item 219 */ 220 void changeSet(KPropertySet *set); 221 222 /** 223 @brief Return the property set for the curently selected item 224 */ 225 KPropertySet* selectedItemPropertySet() const; 226 227 /** 228 @brief Sets the modified status, defaulting to true for modified 229 @param modified Modified status 230 */ 231 void setModified(bool modified); 232 233 /** 234 @brief Return a unique name that can be used by the entity 235 @param name Name of entity 236 */ 237 QString suggestEntityName(const QString &name) const; 238 239 /** 240 @brief Checks if the supplied name is unique among all entities 241 */ 242 bool isEntityNameUnique(const QString &name, KReportItemBase *ignore = nullptr) const; 243 244 /** 245 @brief Returns a list of actions that represent the entities that can be inserted into the report. 246 Actions are created as children of @a group and belong to the group. 247 @return list of actions */ 248 static QList<QAction*> itemActions(QActionGroup* group = nullptr); 249 250 /** 251 @brief Populates the toolbar with actions that can be applied to the report 252 Actions are created as children of @a group and belong to the group. 253 @return list of actions */ 254 QList<QAction*> designerActions(); 255 256 /** 257 @return X position of mouse when mouse press occurs 258 */ 259 qreal getSelectionPressX() const; 260 261 /** 262 @return Y position of mouse when mouse press occurs 263 */ 264 qreal getSelectionPressY() const; 265 266 /** 267 @return difference between X position of mouse release and press 268 */ 269 qreal countSelectionWidth() const; 270 271 /** 272 @return difference between Y position of mouse release and press 273 */ 274 qreal countSelectionHeight() const; 275 276 /** 277 @return point that contains X,Y coordinates of mouse press 278 */ 279 QPointF getPressPoint() const; 280 281 /** 282 @return point that contains X,Y coordinates of mouse press 283 */ 284 QPointF getReleasePoint() const; 285 286 void plugItemActions(const QList<QAction*> &actList); 287 288 /** 289 * @brief Adds meta-properties to the property set @a set for consumption by property editor 290 * - "this:classString" - user-visible translated name of element type, e.g. tr("Label") 291 * - "this:iconName" - name of user-visible icon, e.g. "kreport-label-element" 292 * 293 * All the properties are set to invisible. 294 * @see propertySet() 295 */ 296 static void addMetaProperties(KPropertySet* set, const QString &classString, 297 const QString &iconName); 298 299 public Q_SLOTS: 300 301 void slotEditDelete(); 302 void slotEditCut(); 303 void slotEditCopy(); 304 void slotEditPaste(); 305 void slotEditPaste(QGraphicsScene *); 306 307 void slotItem(const QString&); 308 309 void slotSectionEditor(); 310 311 void slotRaiseSelected(); 312 void slotLowerSelected(); 313 314 private: 315 /** 316 @brief Sets the detail section to the given section 317 */ 318 void setDetail(KReportDesignerSectionDetail *rsd); 319 320 void resizeEvent(QResizeEvent * event) override; 321 322 //Properties 323 void createProperties(); 324 325 unsigned int selectionCount() const; 326 327 void setSectionCursor(const QCursor&); 328 void unsetSectionCursor(); 329 330 void createActions(); 331 332 QSize pageSizePt() const; 333 334 void recalculateMaxMargins(); 335 336 private Q_SLOTS: 337 void slotPropertyChanged(KPropertySet &s, KProperty &p); 338 339 /** 340 @brief When the 'page' button in the top left is pressed, change the property set to the reports properties. 341 */ 342 void slotPageButton_Pressed(); 343 344 void slotItemTriggered(bool checked); 345 346 Q_SIGNALS: 347 void pagePropertyChanged(KPropertySet &s); 348 void propertySetChanged(); 349 void dirty(); 350 void reportDataChanged(); 351 void itemInserted(const QString& entity); 352 353 private: 354 Q_DISABLE_COPY(KReportDesigner) 355 class Private; 356 Private * const d; 357 }; 358 359 #endif 360