summaryrefslogtreecommitdiffstats
path: root/kexi/plugins/tables/kexitabledesignerview.h
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/plugins/tables/kexitabledesignerview.h')
-rw-r--r--kexi/plugins/tables/kexitabledesignerview.h258
1 files changed, 258 insertions, 0 deletions
diff --git a/kexi/plugins/tables/kexitabledesignerview.h b/kexi/plugins/tables/kexitabledesignerview.h
new file mode 100644
index 00000000..773163b6
--- /dev/null
+++ b/kexi/plugins/tables/kexitabledesignerview.h
@@ -0,0 +1,258 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004-2007 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 KEXITABLEDESIGNERINTERVIEW_H
+#define KEXITABLEDESIGNERINTERVIEW_H
+
+#include <koproperty/property.h>
+#include <kexidb/alter.h>
+#include <core/kexitabledesignerinterface.h>
+
+#include <kexidatatable.h>
+#include "kexitablepart.h"
+
+class KexiTableItem;
+class KexiTableDesignerViewPrivate;
+class KCommand;
+class CommandGroup;
+
+namespace KoProperty {
+ class Set;
+}
+
+//! Design view of the Table Designer
+/*! Contains a spreadsheet-like space for entering field definitions.
+ Property editor is provided for altering field definitions.
+
+ The view also supports Undo and Redo operations.
+ These are connected to a factility creating a list of actions used
+ by AlterTableHandler to perform required operation of altering the table.
+
+ Altering itself is performed upon design saving (storeData()).
+ Saving unstored designs just creates a new table.
+ Saving changes made to empty (not filled with data) table is performed
+ by physically deleting the previous table schema and recreating it
+ TODO: this will be not quite when we have db relationships supported.
+
+ Saving changes made to table containing data requires use of the AlterTableHandler
+ functionality.
+*/
+class KexiTableDesignerView : public KexiDataTable, public KexiTableDesignerInterface
+{
+ Q_OBJECT
+
+ public:
+ /*! Creates a new alter table dialog. */
+ KexiTableDesignerView(KexiMainWindow *win, QWidget *parent);
+
+ virtual ~KexiTableDesignerView();
+
+ KexiTablePart::TempData* tempData() const;
+
+ /*! Clears field information entered for row.
+ This is performed by removing values from caption and data type columns.
+ Used by InsertFieldCommand to undo inserting a new field. */
+ virtual void clearRow(int row, bool addCommand = false);
+
+ /*! Inserts a new field with \a caption for \a row.
+ Property set is also created. */
+ virtual void insertField(int row, const QString& caption, bool addCommand = false);
+
+ /*! Inserts a new \a field for \a row.
+ Property set is also created. \a set will be deeply-copied into the new set.
+ Used by InsertFieldCommand to insert a new field. */
+ virtual void insertField(int row, KoProperty::Set& set, bool addCommand = false);
+
+ /*! Inserts a new empty row at position \a row.
+ Used by RemoveFieldCommand as a part of undo inserting a new field;
+ also used by InsertEmptyRowCommand. */
+ virtual void insertEmptyRow( int row, bool addCommand = false );
+
+ /*! Deletes \a row from the table view. Property set is also deleted.
+ All the subsequent fields are moved up. Used for undoing InsertEmptyRowCommand
+ and by RemoveFieldCommand to remove a field. */
+ virtual void deleteRow( int row, bool addCommand = false );
+
+ /*! Deletes a field for \a row. Property set is also deleted.
+ Used by RemoveFieldCommand to remove a field. */
+// virtual void deleteField( int row );
+
+ /*! Changes property \a propertyName to \a newValue for a field at row \a row.
+ If \a listData is not NULL and not empty, a deep copy of it is passed to Property::setListData().
+ If \a listData \a nlist if not NULL but empty, Property::setListData(0) is called. */
+ virtual void changeFieldPropertyForRow( int row,
+ const QCString& propertyName, const QVariant& newValue,
+ KoProperty::Property::ListData* const listData, bool addCommand );
+
+ /*! Changes property \a propertyName to \a newValue.
+ Works exactly like changeFieldPropertyForRow() except the field is pointed by \a fieldUID.
+ Used by ChangeFieldPropertyCommand to change field's property. */
+ void changeFieldProperty( int fieldUID, const QCString& propertyName,
+ const QVariant& newValue, KoProperty::Property::ListData* const listData = 0,
+ bool addCommand = false );
+
+ /*! Changes visibility of property \a propertyName to \a visible for a field pointed by \a fieldUID.
+ Used by ChangePropertyVisibilityCommand. */
+ void changePropertyVisibility( int fieldUID, const QCString& propertyName, bool visible );
+
+ /*! Builds table field's schema by looking at the \a set. */
+ KexiDB::Field * buildField( const KoProperty::Set &set ) const;
+
+ /*! Creates temporary table for the current design and returns debug string for it. */
+ virtual QString debugStringForCurrentTableSchema(tristate& result);
+
+ /*! Simulates execution of alter table, and puts debug into \a debugTarget.
+ A case when debugTarget is not 0 is true for the alter table test suite. */
+ virtual tristate simulateAlterTableExecution(QString *debugTarget);
+
+ public slots:
+ /*! Real execution of the Alter Table. For debugging of the real alter table.
+ \return true on success, false on failure and cancelled if user has cancelled
+ execution. */
+ virtual tristate executeRealAlterTable();
+
+ protected slots:
+ /*! Equivalent to updateActions(false). Called on row insert/delete
+ in a KexiDataAwarePropertySet. */
+ void updateActions();
+
+ virtual void slotUpdateRowActions(int row);
+
+ void slotAboutToShowContextMenu();
+
+ //! Called before cell change in tableview.
+ void slotBeforeCellChanged(KexiTableItem *item, int colnum,
+ QVariant& newValue, KexiDB::ResultInfo* result);
+
+ //! Called on row change in a tableview.
+ void slotRowUpdated(KexiTableItem *item);
+
+ //! Called before row inserting in tableview.
+ void slotRowInserted();
+// void slotAboutToInsertRow(KexiTableItem* item, KexiDB::ResultInfo* result, bool repaint);
+
+ //! Called before row deleting in tableview.
+ void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result, bool repaint);
+
+ /*! Called after any property has been changed in the current property set,
+ to perform some actions (like updating other dependent properties) */
+ void slotPropertyChanged(KoProperty::Set& set, KoProperty::Property& property);
+
+ /*! Toggles primary key for currently selected field.
+ Does nothing for empty row. */
+ void slotTogglePrimaryKey();
+
+ /*! Undoes the recently performed action. */
+ void slotUndo();
+
+ /*! Redoes the recently undoed action. */
+ void slotRedo();
+
+ /*! Reaction on command execution from the command history */
+ void slotCommandExecuted(KCommand *command);
+
+ /*! Simulates real execution of the Alter Table. For debugging. */
+ void slotSimulateAlterTableExecution();
+
+ protected:
+ virtual void updateActions(bool activated);
+
+ //! called whenever data should be reloaded (on switching to this view mode)
+ void initData();
+
+ /*! Creates a new property set for \a field.
+ The property set will be asigned to \a row, and owned by this dialog.
+ If \a newOne is true, the property set will be marked as newly created.
+ \return newly created property set. */
+ KoProperty::Set* createPropertySet( int row, const KexiDB::Field& field, bool newOne = false );
+
+ virtual tristate beforeSwitchTo(int mode, bool &dontStore);
+
+ virtual tristate afterSwitchFrom(int mode);
+
+ /*! \return property set associated with currently selected row (i.e. field)
+ or 0 if current row is empty. */
+ virtual KoProperty::Set *propertySet();
+
+// void removeCurrentPropertySet();
+
+ /*! Reimplemented from KexiViewBase, because tables creation is more complex.
+ No table schema altering is required, so just buildSchema() is used to create a new schema.
+ */
+ virtual KexiDB::SchemaData* storeNewData(const KexiDB::SchemaData& sdata, bool &cancel);
+
+ /*! Reimplemented from KexiViewBase, because table storage is more complex.
+ Table schema altering may be required, so just buildSchema() is used to create a new schema.
+ */
+ virtual tristate storeData(bool dontAsk = false);
+
+ /*! Builds table schema by looking at the current design. Used in storeNewData()
+ and storeData().
+ If \a beSilent is true, no message boxes are used to show questions or warnings.
+ This is used in the altertable test suite (kexi/tests/altertable).
+ \return true on successful schema creating, false on failure and cancelled when there
+ was a problem with user's design (and user has been informed about it). */
+ tristate buildSchema(KexiDB::TableSchema &schema, bool beSilent = false);
+
+ /*! Builds action list usable for KexiDB::AlterTableHandler by looking at undo buffer
+ of commands' history. Used in storeData() */
+ tristate buildAlterTableActions(KexiDB::AlterTableHandler::ActionList &actions);
+
+ /*! Helper, used for slotTogglePrimaryKey() and slotPropertyChanged().
+ Assigns primary key icon and value for property set \a propertySet,
+ and deselects it from previous pkey's row.
+ \a aWasPKey is internal.
+ If \a commandGroup is not 0, it is used as parent group for storing actions' history. */
+ void switchPrimaryKey(KoProperty::Set &propertySet, bool set, bool aWasPKey = false,
+ CommandGroup* commandGroup = 0);
+
+ //! Gets subtype strings and names for type \a fieldType.
+ void getSubTypeListData(KexiDB::Field::TypeGroup fieldTypeGroup,
+ QStringList& stringsList, QStringList& namesList);
+
+ /*! Adds history command \a command to the undo/redo buffer.
+ If \a execute is true, the command is executed afterwards. */
+ void addHistoryCommand( KCommand* command, bool execute );
+
+ //! Updates undo/redo shared actions availability by looking at command history's action
+ void updateUndoRedoActions();
+
+#ifdef KEXI_DEBUG_GUI
+ void debugCommand( KCommand* command, int nestingLevel );
+#endif
+
+ /*! Inserts a new \a field for \a row.
+ Property set is also created. If \a set is not 0 (the default),
+ it will be copied into the new set. Used by insertField(). */
+ void insertFieldInternal(int row, KoProperty::Set* set, const QString& caption, bool addCommand);
+
+ //! Reimplemented to pass the information also to the "Lookup" tab
+ virtual void propertySetSwitched();
+
+ /*! \return true if physical altering is needed for the current list of actions.
+ Used in KexiTableDesignerView::beforeSwitchTo() to avoid warning about removinf
+ table data if table recreating is not needed.
+ True is also returned if there is any trouble with getting the answer. */
+ bool isPhysicalAlteringNeeded();
+
+ private:
+ KexiTableDesignerViewPrivate *d;
+};
+
+#endif