summaryrefslogtreecommitdiffstats
path: root/kexi/widget/tableview/kexitableedit.h
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/widget/tableview/kexitableedit.h')
-rw-r--r--kexi/widget/tableview/kexitableedit.h233
1 files changed, 233 insertions, 0 deletions
diff --git a/kexi/widget/tableview/kexitableedit.h b/kexi/widget/tableview/kexitableedit.h
new file mode 100644
index 00000000..ef38a11f
--- /dev/null
+++ b/kexi/widget/tableview/kexitableedit.h
@@ -0,0 +1,233 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Peter Simonsson <psn@linux.se>
+ Copyright (C) 2003-2006 Jaroslaw Staniek <js@iidea.pl>
+
+ This program 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 program 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 program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KEXITABLEEDIT_H_
+#define _KEXITABLEEDIT_H_
+
+#include <kexidataiteminterface.h>
+
+#include <qvariant.h>
+#include <qscrollview.h>
+
+#include "kexitableviewdata.h"
+
+namespace KexiDB {
+ class Field;
+ class QueryColumnInfo;
+}
+
+/*! @short Abstract class for a cell editor.
+ Handles cell painting and displaying the editor widget.
+*/
+class KEXIDATATABLE_EXPORT KexiTableEdit : public QWidget, public KexiDataItemInterface
+{
+ Q_OBJECT
+
+ public:
+ KexiTableEdit(KexiTableViewColumn &column, QWidget* parent = 0);
+
+ virtual ~KexiTableEdit();
+
+ //! Implemented for KexiDataItemInterface.
+ //! \return field information for this item
+ virtual KexiDB::Field *field() const { return m_column->field(); }
+
+ /*! A rich field information for db-aware data.
+ For not-db-aware data it is always 0 (use field() instead. */
+ virtual KexiDB::QueryColumnInfo *columnInfo() const { return m_column->columnInfo; }
+
+ //! Implemented for KexiDataItemInterface.
+ //! Does nothing because instead KexiTableViewColumn is used to get field's schema.
+ virtual void setColumnInfo(KexiDB::QueryColumnInfo *) { }
+
+ //! \return column information for this item
+ //! (extended information, comparing to field()).
+ inline KexiTableViewColumn *column() const { return m_column; }
+
+ /*! \return displayed field. This is equal to field() in typical case but can return a different field
+ definition if the column contains a lookup field. This distiction is especially used for
+ displaying data dependent on the type and specifics of the field definition
+ (e.g. text type versus integer type). Note that to compute the editor's value
+ we still use field(). */
+ KexiDB::Field *displayedField() const;
+
+ /*! Reimplemented: resizes a view(). */
+ virtual void resize(int w, int h);
+
+ /*! \return the view widget of this editor, e.g. line edit widget. */
+ virtual QWidget* widget() { return m_view; }
+
+ /*! Hides item's widget, if available. */
+ inline virtual void hideWidget() { hide(); }
+
+ /*! Shows item's widget, if available. */
+ inline virtual void showWidget() { show(); }
+
+ /*! Paints a border for the cell described by \a x, \a y, \a w, \a h on \a p painter.
+ The cell's value is \a val (may be useful if you want to reimplement this method).
+ */
+ virtual void paintFocusBorders( QPainter *p, QVariant &cal, int x, int y, int w, int h );
+
+ /*! For reimplementation.
+ Sets up and paints cell's contents using context of \a val value.
+ \a focused is true if the cell is focused. \a align is set using Qt::AlignmentFlags.
+ Some additional things may be painted using \a p,
+ but it is not needed to paint the text (this is done automatically outside of this method).
+
+ Before calling, \a x, \a y_offset, \a w, \a h parameters are initialized,
+ but you can tune these values depending on the context.
+ You should set \a txt to a text representation of \a val,
+ otherwise no text will be painted.
+
+ \a p can be 0 - in this case no painting should be performed, becasue caller only expects
+ that \a x, \a y_offset, \a w, \a h, \a txt parameters are tuned, if needed.
+ \a p painter's pen is set to foreground color (usually black) that should be used to paint
+ foreground information, if needed. For example boolean editor widget paints
+ a rectangle using this color. */
+ virtual void setupContents( QPainter *p, bool focused, const QVariant& val,
+ QString &txt, int &align, int &x, int &y_offset, int &w, int &h );
+
+ /*! \return true if "selected text" color should be used to paint contents of the editor.
+ True by default. It's false e.g. in boolean editor, where no selection is painted
+ using paintSelectionBackground().
+ This flag is set in editor's constructor and checked in KexiTableView::paintCell().
+ Depending on it, appropriate ("text" or "selected text" color is set for painter) before
+ setupContents() is called. */
+ bool usesSelectedTextColor() const { return m_usesSelectedTextColor; }
+
+ /*! For reimplementation.
+ Paints selection's background using \a p. Most parameters are similar to these from
+ setupContents(). */
+ virtual void paintSelectionBackground( QPainter *p, bool focused, const QString& txt,
+ int align, int x, int y_offset, int w, int h, const QColor& fillColor,
+ const QFontMetrics &fm, bool readOnly, bool fullRowSelection );
+
+ /*! Sometimes, editor can contain non-standard margin, for example combobox editor contains
+ dropdown button at the right side. \return left margin's size;
+ 0 by default. For reimplementation. */
+ int leftMargin() const { return m_leftMargin; }
+
+ /*! Sometimes, editor can contain non-standard margin, for example combobox editor contains
+ dropdown button at the right side. THe dropdown button's width is counted only if \a focused is true.
+ \return right margin's size; 0 by default. For reimplementation. */
+ int rightMargin(bool focused) const;
+
+ /*! Handles \a ke key event that came over the column that is bound to this editor.
+ For implementation: true should be returned if \a ke should be accepted.
+ If \a editorActive is true, this editor is currently active, i.e. the table view is in edit mode.
+ By default false is returned. */
+ virtual bool handleKeyPress( QKeyEvent* ke, bool editorActive ) {
+ Q_UNUSED(ke); Q_UNUSED(editorActive); return false; }
+
+ /*! Handles double click request coming from the table view.
+ \return true if it has been consumed.
+ Reimplemented in KexiBlobTableEdit (to execute "insert file" action. */
+ virtual bool handleDoubleClick() { return false; }
+
+ /*! Handles copy action for value. The \a value is copied to clipboard in format appropriate
+ for the editor's impementation, e.g. for image cell it can be a pixmap.
+ For a special case (combo box), \a visibleValue can be provided,
+ so it can be copied to the clipboard instead of unreadable \a value.
+ For reimplementation. */
+ virtual void handleCopyAction(const QVariant& value, const QVariant& visibleValue) = 0;
+
+ /*! \return width of \a value. For the default implementation \a val is converted to a string
+ and width of this string is returned. */
+ virtual int widthForValue( QVariant &val, const QFontMetrics &fm );
+
+ /*! \return total size of this editor, including any buttons, etc. (if present).
+ Reimpelment this if you want to return more appropriate size. This impelmentation just
+ returns QWidget::size(). */
+ virtual QSize totalSize() { return QWidget::size(); }
+
+ /*! Shows a special tooltip for \a value if needed, i.e. if the value could not fit inside \a rect
+ for a given font metrics \a fm.
+ \return true a normal tooltip should be displayed (using QToolTip,) and false if
+ no tooltip should be displayed or a custom tooltip was displayed internally (not yet supported).
+ Default implementation does nothing and returns false.
+ If the cell is currentl focused (selected), \a focused is true. */
+ virtual bool showToolTipIfNeeded(const QVariant& value, const QRect& rect, const QFontMetrics& fm,
+ bool focused);
+
+ /*! Created internal editor for this editor is needed. This method is only implemented
+ in KexiComboBoxTableEdit since it's visible value differs from internal value,
+ so a different KexiTableEdit object is used to displaying the data. */
+ virtual void createInternalEditor(KexiDB::QuerySchema& schema) { Q_UNUSED(schema); }
+
+ signals:
+ void editRequested();
+ void cancelRequested();
+ void acceptRequested();
+
+ protected:
+ virtual bool eventFilter(QObject* watched, QEvent* e);
+
+ /*! Sets \a v as view widget for this editor. The view will be assigned as focus proxy
+ for the editor, its events will be filtered, it will be resized when neede, and so on. */
+ void setViewWidget(QWidget *v);
+
+ /*! Moves child widget within the viewport if the parent is scrollview (otherwise does nothing).
+ Use this for child widgets that are outside of this editor widget, instead of calling QWidget::move(). */
+ void moveChild( QWidget * child, int x, int y );
+
+ /*! Allows to force redrawing the related cell by the editor itself. Usable when the editor is not
+ displayed by a QWidget but rather by table view cell itself, for example KexiBlobTableEdit. */
+ void repaintRelatedCell();
+
+ KexiTableViewColumn *m_column;
+ int m_leftMargin;
+ int m_rightMargin, m_rightMarginWhenFocused;
+ QScrollView* m_scrollView; //!< may be 0 if the parent is not a scrollview
+ bool m_usesSelectedTextColor : 1; //!< set in ctor, @see usesSelectedTextColor()
+
+ private:
+ QWidget* m_view;
+};
+
+//! Declaration of cell editor factory
+#define KEXI_DECLARE_CELLEDITOR_FACTORY_ITEM(factoryclassname) \
+ class factoryclassname : public KexiCellEditorFactoryItem \
+ { \
+ public: \
+ factoryclassname(); \
+ virtual ~factoryclassname(); \
+ \
+ protected: \
+ virtual KexiTableEdit* createEditor(KexiTableViewColumn &column, QWidget* parent = 0); \
+ };
+
+//! Implementation of cell editor factory
+#define KEXI_CELLEDITOR_FACTORY_ITEM_IMPL(factoryclassname, itemclassname) \
+factoryclassname::factoryclassname() \
+ : KexiCellEditorFactoryItem() \
+{ \
+ m_className = "" #itemclassname ""; \
+} \
+\
+factoryclassname::~factoryclassname() \
+{} \
+\
+KexiTableEdit* factoryclassname::createEditor( \
+ KexiTableViewColumn &column, QWidget* parent) \
+{ \
+ return new itemclassname(column, parent); \
+}
+
+#endif