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
|
/* This file is part of the KDE project
* Copyright (c) 2006 Boudewijn Rempt (boud@valdyas.org)
* Copyright (C) 2006-2007 Thomas Zander <zander@kde.org>
* Copyright (C) 2008 Thorsten Zachmann <zachmann@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef KOSHAPEFACTORYBASE_H
#define KOSHAPEFACTORYBASE_H
#include <QObject>
#include <QStringList>
#include <QString>
#include <QWidget>
#include <QList>
#include "flake_export.h"
#include <KoXmlReader.h>
class KoShape;
class KoProperties;
class KoShapeConfigFactoryBase;
class KoShapeConfigWidgetBase;
class KoShapeLoadingContext;
class KoDataCenterBase;
class KoDocumentResourceManager;
#define SHAPETEMPLATE_MIMETYPE "application/x-flake-shapetemplate"
#define SHAPEID_MIMETYPE "application/x-flake-shapeId"
/**
* Contains a KoProperties object that describes the settings of a
* particular variant of a shape object, together with a name, a description
* and an icon for use in the user interface.
*/
struct FLAKE_EXPORT KoShapeTemplate {
KoShapeTemplate() {
properties = 0;
}
QString id; ///< The id of the shape
QString templateId; ///< The id of this particular template - only has to be unique with the shape
QString name; ///< The name to be shown for this template
QString family; ///< The family of the shape (possible values are: "funny","arrow")
QString toolTip; ///< The tooltip text for the template
QString icon; ///< Icon name
/**
* The properties which, when passed to the KoShapeFactoryBase::createShape() method
* result in the shape this template represents.
*/
KoProperties *properties;
};
/**
* A factory for KoShape objects.
* The baseclass for all shape plugins. Each plugin that ships a KoShape should also
* ship a factory. That factory will extend this class and set variable data like
* a toolTip and icon in the constructor of that extending class.
*
* An example usage would be:
@code
class MyShapeFactory : public KoShapeFactoryBase {
public:
MyShapeFactory()
: KoShapeFactoryBase("MyShape", i18n("My Shape")) {
setToolTip(i18n("A nice shape"));
}
~MyShapeFactory() {}
// more methods here
};
@endcode
* After you created the factory you should create a plugin that can announce the factory to the
* KoShapeRegistry. See the KoPluginLoader as well.
*/
class FLAKE_EXPORT KoShapeFactoryBase : public QObject
{
Q_OBJECT
public:
/**
* Create the new factory
* @param id a string that will be used internally for referencing the shape, for
* example for use by the KoToolBase::activateTemporary.
* @param name the user visible name of the shape this factory creates.
*/
KoShapeFactoryBase(const QString &id, const QString &name, const QString &deferredPluginName = QString::null);
virtual ~KoShapeFactoryBase();
/**
* Create a list of option panels to show on creating a new shape.
* The shape type this factory creates may have general or specific setting panels
* that will be shown after inserting a new shape.
* The first item in the list will be shown as the first tab in the list of panels,
* behind all app specific panels.
* This is a separate list as set by setOptionPanels() and fetched by panelFactories()
*/
virtual QList<KoShapeConfigWidgetBase*> createShapeOptionPanels() {
return QList<KoShapeConfigWidgetBase*>();
}
/**
* Set app specific panel factories to show config options after creating a new shape.
* The application that lets the user create shapes is able to set option
* widgets that will be shown after the user inserted a new shape of the
* type that this factory presents.
* Example:
* @code
* // Init shape Factories with our frame based configuration panels.
* QList<KoShapeConfigFactoryBase *> panels;
* panels.append(new AppConfigFactory()); // insert some factory
* foreach(QString id, KoShapeRegistry::instance()->keys())
* KoShapeRegistry::instance()->value(id)->setOptionPanels(panels);
* @endcode
* @see panelFactories()
*/
void setOptionPanels(const QList<KoShapeConfigFactoryBase*> &panelFactories);
/**
* Return the app-specific panels.
* @see setOptionPanels()
*/
QList<KoShapeConfigFactoryBase*> panelFactories();
/**
* return the id for the shape this factory creates.
* @return the id for the shape this factory creates.
*/
QString id() const;
/**
* Return all the templates this factory knows about.
* Each template shows a different way to create a shape this factory is specialized in.
*/
QList<KoShapeTemplate> templates() const;
/**
* return a translated tooltip Text for a selector of shapes
* @return a translated tooltip Text
*/
QString toolTip() const;
/**
* return the basename of the icon for a selector of shapes
* @return the basename of the icon for a selector of shapes
*/
QString icon() const;
/**
* return the user visible (and translated) name to be seen by the user.
* @return the user visible (and translated) name to be seen by the user.
*/
QString name() const;
/**
* return the non-visible name of the family the default shape belongs to.
* @return the family name.
*/
QString family() const;
/// lower prio means the shape is more generic and will be checked later
int loadingPriority() const;
/**
* The list of namespaces to the supported elements the factory supports.
*/
QList<QPair<QString, QStringList> > odfElements() const;
/// returns true if this shapeFactory is able to load the ODF type
/// started at argument element. ('draw:line' / 'draw:frame' / etc)
virtual bool supports(const KoXmlElement &element, KoShapeLoadingContext &context) const = 0;
/**
* The hidden boolean requests if the shape should be hidden in the
* shape selector or shown with all its templates.
* The default is false
* @see setHidden()
*/
bool hidden() const;
/**
* This method is called whenever there is a new document resource
* manager that is created. The factory may reimplement this in
* order to get existing resources or put factory specific resources in.
* In case the factory creates new resources it is adviced to parent
* them to the manager (which is a QObject) for memory management
* purposes.
*
* FIXME: this method is only used by Tables. We should refactor so
* it is no longer necessary.
*
* NOTE: this actually is also used somehow to create the imagecollection
* for the picture shape?
*
* NOTE: we store the documentmanagers in a list, and remove them
* from the list on delete.
*
* @param manager the new manager
*/
virtual void newDocumentResourceManager(KoDocumentResourceManager *manager) const;
QList<KoDocumentResourceManager *> documentResourceManagers() const;
/**
* This method should be implemented by factories to create a shape that the user
* gets when doing a base insert. For example from a script. The created shape
* should have its values set to good defaults that the user can then adjust further if
* needed. Including the KoShape:setShapeId(), with the Id from this factory
* The default shape position is not relevant, it will be moved by the caller.
* @param documentResources the resources manager that has all the document wide
* resources which can be used to create the object.
* @return a new shape
* @see createShape() newDocumentResourceManager()
*/
virtual KoShape *createDefaultShape(KoDocumentResourceManager *documentResources = 0) const;
/**
* This method should be implemented by factories to create a shape based on a set of
* properties that are specifically made for this shape-type.
* This method should also set this factories shapeId on the shape using KoShape::setShapeId()
* The default implementation just ignores 'params' and calls createDefaultShape()
* @return a new shape
* @param params the properties object is the same as added in the addTemplate() call
* @param documentResources the resources manager that has all the document wide
* resources which can be used to create the object.
* @see createDefaultShape() newDocumentResourceManager()
* @see KoShapeTemplate::properties
*/
virtual KoShape *createShape(const KoProperties *params, KoDocumentResourceManager *documentResources = 0) const;
/**
* This method provides the default implementation for creating a shape
* from a specified xml element of an odf document.
* Most derived factories do not need to reimplement this method, however if a factory
* has some special requirements or does something special it is still possible.
* One example is creating different shapes depending on the content of the passed
* xml element.
*/
virtual KoShape *createShapeFromOdf(const KoXmlElement &element, KoShapeLoadingContext &context);
protected:
/**
* Add a template with the properties of a speficic type of shape this factory can generate
* using the createShape() method.
* @param params the new template this factory knows to produce
*/
void addTemplate(const KoShapeTemplate ¶ms);
/**
* Set the tooltip to be used for a selector of shapes
* @param tooltip the tooltip
*/
void setToolTip(const QString &tooltip);
/**
* Set an icon to be used in a selector of shapes
* @param iconName the basename (without extension) of the icon
* @see KIconLoader
*/
void setIcon(const QString &iconName);
/**
* Set the family name of the default shape
* @param family the family name of the default shape this factory creates.
* for example "funny", "arrows", "geometrics". Use "" for default
*/
void setFamily(const QString &family);
/**
* Set the loading priority for this icon; higher priority means
* the shape is more specific which means it will be earlier in
* the queue to try loading a particular odf element.
*/
void setLoadingPriority(int priority);
/**
* Set the namespace and element tags used for quick checking whether this shapefactory
* is able to create a shape from xml identified by this element
* name.
*
* @param nameSpace the ODF name space (like
* urn:oasis:names:tc:opendocument:xmlns:text:1.0,
* take it from KoXmlNS.h)
* @param elementNames the name of the element itself, like "path"
*
*/
void setXmlElementNames(const QString &nameSpace, const QStringList &elementNames);
/**
* Set the namespaces and according element tags used for quick checking whether this shapefactory
* is able to create a shape from xml identified by this element
* name.
*
* @param elementNamesList containing a list of namespace (like
* urn:oasis:names:tc:opendocument:xmlns:text:1.0,
* take it from KoXmlNS.h) to a list of elementName of the element itself, like "path"
*/
void setXmlElements(const QList<QPair<QString, QStringList> > &elementNamesList);
/**
* The hidden boolean requests if the shape should be hidden in the
* shape selector or shown with all its templates.
* The default is false
* @see hidden()
*/
void setHidden(bool hidden);
private:
void getDeferredPlugin();
private slots:
/// called whenever a document KoDocumentResourceManager is deleted
void pruneDocumentResourceManager(QObject *);
private:
class Private;
Private * const d;
};
#endif
|