//***************************************************************************
/*
* TOra - An Oracle Toolkit for DBA's and developers
* Copyright (C) 2003 Quest Software, Inc
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; only version 2 of
* the License is valid for this program.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* As a special exception, you have permission to link this program
* with the Oracle Client libraries and distribute executables, as long
* as you follow the requirements of the GNU GPL in regard to all of the
* software in the executable aside from Oracle client libraries.
*
* Specifically you are not permitted to link this program with the
* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
* And you are not permitted to distribute binaries compiled against
* these libraries without written consent from Quest Software, Inc.
* Observe that this does not disallow linking to the Qt Free Edition.
*
* All trademarks belong to their respective owners.
*
****************************************************************************/
#ifndef TORESULTVIEW_H
#define TORESULTVIEW_H
#include "toeditwidget.h"
#include "toresult.h"
#include "toresultlistformatui.h"
#include <qlistview.h>
#include <map>
class QListViewItem;
class QPopupMenu;
class TOPrinter;
class toListTip;
class toQuery;
class toResultCols;
class toResultView;
class toSQL;
class toSearchReplace;
/** Baseclass for filters to apply to the @ref toResultView to filter out
* rows that you don't want to add as items to the list.
*/
class toResultFilter {
public:
toResultFilter()
{ }
virtual ~toResultFilter()
{ }
/** This function can inspect the item to be added and decide if it is
* valid for adding or not.
* @param item Item to inspect.
* @return If false is returned the item isn't added.
*/
virtual bool check(const QListViewItem *item) = 0;
/** Create a copy of this filter.
* @return A newly created copy of this filter.
*/
virtual toResultFilter *clone(void) = 0;
/** Export data to a map.
* @param data A map that can be used to recreate the data of a chart.
* @param prefix Prefix to add to the map.
*/
virtual void exportData(std::map<QCString,QString> &data,const QCString &prefix);
/** Import data
* @param data Data to read from a map.
* @param prefix Prefix to read data from.
*/
virtual void importData(std::map<QCString,QString> &data,const QCString &prefix);
};
/** An item to display in a toListView or toResultView. They differ from normal
* QListViewItems in that they can have a tooltip and actually contain more text
* than is displayed in the cell of the listview.
*/
class toResultViewItem : public QListViewItem {
struct keyData {
QString Data;
QString KeyAsc;
QString KeyDesc;
int Width;
enum { String,Number } Type;
};
int ColumnCount;
keyData *ColumnData;
QString firstText(int col) const;
protected:
virtual int realWidth(const QFontMetrics &fm, const QListView *top, int column,const QString &txt) const;
public:
/** Create a new item.
* @param parent Parent list view.
* @param after Insert after this item.
* @param buffer String to set as first column
*/
toResultViewItem(QListView *parent,QListViewItem *after,const QString &buf=QString::null)
: QListViewItem(parent,after,QString::null)
{ ColumnData=NULL; ColumnCount=0; if (buf) setText(0,buf); }
/** Create a new item.
* @param parent Parent to this item.
* @param after Insert after this item.
* @param buffer String to set as first column
*/
toResultViewItem(QListViewItem *parent,QListViewItem *after,const QString &buf=QString::null)
: QListViewItem(parent,after,QString::null)
{ ColumnData=NULL; ColumnCount=0; if (buf) setText(0,buf); }
/** Reimplemented for internal reasons.
*/
virtual ~toResultViewItem()
{ delete[] ColumnData; }
/** Reimplemented for internal reasons.
*/
virtual void setText (int col,const QString &txt);
/** Set from database.
*/
virtual void setText (int col,const toQValue &val);
/** Reimplemented for internal reasons.
*/
virtual void paintCell(QPainter * p,const QColorGroup & cg,int column,int width,int align);
/** Reimplemented for internal reasons.
*/
virtual QString text(int col) const;
/** String to sort the data on. This is reimplemented so that numbers are sorted as numbers
* and not as strings.
* @param col Column
* @param asc Wether to sort ascending or not.
*/
virtual QString key(int col,bool asc) const
{ if (col>=ColumnCount) return QString::null; return asc?ColumnData[col].KeyAsc:ColumnData[col].KeyDesc; }
/** Reimplemented for internal reasons.
*/
virtual int width(const QFontMetrics &, const QListView *, int col) const
{ if (col>=ColumnCount) return 0; return ColumnData[col].Width; }
/** Get all text for this item. This is used for copying, drag & drop and memo editing etc.
* @param col Column.
* @return All of the text.
*/
virtual QString allText(int col) const
{ if (col>=ColumnCount) return QString::null; return ColumnData[col].Data; }
/** Get the text to be displayed as tooltip for this item.
* @param col Column.
* @return The text to display as tooltip.
*/
virtual QString tooltip(int col) const
{ return allText(col); }
};
/** This item expands the height to commodate all lines in the input buffer.
*/
class toResultViewMLine : public toResultViewItem {
private:
/** Number of lines in the largest row.
*/
int Lines;
protected:
virtual int realWidth(const QFontMetrics &fm, const QListView *top, int column,const QString &txt) const;
public:
/** Create a new item.
* @param parent Parent list view.
* @param after Insert after this item.
* @param buffer String to set as first column
*/
toResultViewMLine(QListView *parent,QListViewItem *after,const QString &buf=QString::null)
: toResultViewItem(parent,after,QString::null)
{ Lines=1; if (buf) setText(0,buf); }
/** Create a new item.
* @param parent Parent to this item.
* @param after Insert after this item.
* @param buffer String to set as first column
*/
toResultViewMLine(QListViewItem *parent,QListViewItem *after,const QString &buf=QString::null)
: toResultViewItem(parent,after,QString::null)
{ Lines=1; if (buf) setText(0,buf); }
/** Reimplemented for internal reasons.
*/
virtual void setText (int,const QString &);
/** Set from database.
*/
virtual void setText (int col,const toQValue &val);
/** Reimplemented for internal reasons.
*/
virtual void setup(void);
/** Reimplemented for internal reasons.
*/
virtual QString text(int col) const
{ return toResultViewItem::allText(col); }
/** Reimplemented for internal reasons.
*/
virtual void paintCell (QPainter *pnt,const QColorGroup & cg,int column,int width,int alignment);
};
/** An item to display in a toListView or toResultView. They differ from normal
* QListViewItems in that they can have a tooltip and actually contain more text
* than is displayed in the cell of the listview.
*/
class toResultViewCheck : public QCheckListItem {
struct keyData {
QString Data;
QString KeyAsc;
QString KeyDesc;
int Width;
enum { String,Number } Type;
};
int ColumnCount;
keyData *ColumnData;
protected:
virtual int realWidth(const QFontMetrics &fm, const QListView *top, int column,const QString &txt) const;
QString firstText(int col) const;
public:
/** Create a new item.
* @param parent Parent list view.
* @param text Text of first column.
* @param type Type of check on this item.
*/
toResultViewCheck(QListView *parent,const QString &text,QCheckListItem::Type type=Controller)
: QCheckListItem(parent,QString::null,type)
{ ColumnData=NULL; ColumnCount=0; if (!text.isNull()) setText(0,text); }
/** Create a new item.
* @param parent Parent item.
* @param text Text of first column.
* @param type Type of check on this item.
*/
toResultViewCheck(QListViewItem *parent,const QString &text,QCheckListItem::Type type=Controller)
: QCheckListItem(parent,QString::null,type)
{ ColumnData=NULL; ColumnCount=0; if (!text.isNull()) setText(0,text); }
/** Create a new item.
* @param parent Parent list view.
* @param after After last item.
* @param text Text of first column.
* @param type Type of check on this item.
*/
toResultViewCheck(QListView *parent,QListViewItem *after,const QString &text,QCheckListItem::Type type=Controller);
/** Create a new item.
* @param parent Parent item.
* @param after After last item.
* @param text Text of first column.
* @param type Type of check on this item.
*/
toResultViewCheck(QListViewItem *parent,QListViewItem *after,const QString &text,QCheckListItem::Type type=Controller);
/** Reimplemented for internal reasons.
*/
virtual ~toResultViewCheck()
{ delete[] ColumnData; }
/** Reimplemented for internal reasons.
*/
virtual void setText (int col,const QString &txt);
/** Set from database.
*/
virtual void setText (int col,const toQValue &val);
/** Reimplemented for internal reasons.
*/
virtual void paintCell(QPainter * p,const QColorGroup & cg,int column,int width,int align);
/** Reimplemented for internal reasons.
*/
virtual QString text(int col) const;
/** String to sort the data on. This is reimplemented so that numbers are sorted as numbers
* and not as strings.
* @param col Column
* @param asc Wether to sort ascending or not.
*/
/** String to sort the data on. This is reimplemented so that numbers are sorted as numbers
* and not as strings.
* @param col Column
* @param asc Wether to sort ascending or not.
*/
virtual QString key(int col,bool asc) const
{ if (col>=ColumnCount) return QString::null; return asc?ColumnData[col].KeyAsc:ColumnData[col].KeyDesc; }
/** Reimplemented for internal reasons.
*/
virtual int width(const QFontMetrics &, const QListView *, int col) const
{ if (col>=ColumnCount) return 0; return ColumnData[col].Width; }
/** Get all text for this item. This is used for copying, drag & drop and memo editing etc.
* @param col Column.
* @return All of the text.
*/
virtual QString allText(int col) const
{ if (col>=ColumnCount) return QString::null; return ColumnData[col].Data; }
/** Get the text to be displayed as tooltip for this item.
* @param col Column.
* @return The text to display as tooltip.
*/
virtual QString tooltip(int col) const
{ return allText(col); }
};
/** This item expands the height to commodate all lines in the input buffer.
*/
class toResultViewMLCheck : public toResultViewCheck {
private:
/** Number of lines in the largest row.
*/
int Lines;
protected:
virtual int realWidth(const QFontMetrics &fm, const QListView *top, int column,const QString &txt) const;
public:
/** Create a new item.
* @param parent Parent list view.
* @param text Text of first column.
* @param type Type of check on this item.
*/
toResultViewMLCheck(QListView *parent,const QString &text,QCheckListItem::Type type=Controller)
: toResultViewCheck(parent,QString::null,type)
{ Lines=1; if (!text.isNull()) setText(0,text); }
/** Create a new item.
* @param parent Parent item.
* @param text Text of first column.
* @param type Type of check on this item.
*/
toResultViewMLCheck(QListViewItem *parent,const QString &text,QCheckListItem::Type type=Controller)
: toResultViewCheck(parent,QString::null,type)
{ Lines=1; if (!text.isNull()) setText(0,text); }
/** Reimplemented for internal reasons.
*/
virtual void setup(void);
/** Reimplemented for internal reasons.
*/
virtual void setText (int,const QString &);
/** Set from database.
*/
virtual void setText (int col,const toQValue &val);
/** Reimplemented for internal reasons.
*/
virtual QString text(int col) const
{ return toResultViewCheck::allText(col); }
/** Reimplemented for internal reasons.
*/
virtual void paintCell (QPainter *pnt,const QColorGroup & cg,int column,int width,int alignment);
};
/**
* The TOra implementation of a listview which offers a few extra goodies to the baseclass.
* First of all tooltip which can display contents that doesn't fit in the list, printing,
* integration into toMain with Edit menu etc, drag & drop, export as file, display item
* as memo and context menu.
*/
class toListView : public QListView,public toEditWidget {
Q_OBJECT
bool FirstSearch;
/** Name of this list, used primarily when printing. Also used to be able to edit
* SQL displayed in @ref toResultView.
*/
QString Name;
/** Used to display tip on fields.
*/
toListTip *AllTip;
/** Item selected when popup menu displayed.
*/
QListViewItem *MenuItem;
/** Column of item selected when popup menu displayed.
*/
int MenuColumn;
/** Popup menu if available.
*/
QPopupMenu *Menu;
/** Last move, used to determine if drag has started.
*/
QPoint LastMove;
/** Reimplemented for internal reasons.
*/
virtual void contentsMouseDoubleClickEvent (QMouseEvent *e);
/** Reimplemented for internal reasons.
*/
virtual void contentsMousePressEvent(QMouseEvent *e);
/** Reimplemented for internal reasons.
*/
virtual void contentsMouseReleaseEvent(QMouseEvent *e);
/** Reimplemented for internal reasons.
*/
virtual void contentsMouseMoveEvent (QMouseEvent *e);
/** Used to print one page of the list.
* @param printer Printer to print to.
* @param painter Painter to print page to.
* @param top Item at top of page.
* @param column Column to start printing at. Will be changed to where you are when done.
* @param level The indentation level of the top item.
* @param pageNo Page number.
* @param paint If just testing to determine how many pages are needed set this to false.
* @return The next item to print to (Pass as top to this function).
*/
virtual QListViewItem *printPage(TOPrinter *printer,QPainter *painter,QListViewItem *top,
int &column,int &level,int pageNo,bool paint=true);
int exportType(QString &separator,QString &delimiter);
public:
/** Create new list view.
* @param parent Parent of list.
* @param name Name of list.
*/
toListView(QWidget *parent,const char *name=NULL);
/** Get SQL name of list.
*/
virtual QString sqlName(void)
{ return Name; }
/** Set SQL name of list.
*/
virtual void setSQLName(const QString &name)
{ Name=name; }
/** Get the whole text for the item and column selected when menu was poped up.
*/
QString menuText(void);
/** Print this list
*/
virtual void editPrint(void);
/** Reimplemented for internal reasons.
*/
virtual void focusInEvent (QFocusEvent *e);
/** The string to be displayed in the middle of the footer when printing.
* @return String to be placed in middle.
*/
virtual QString middleString()
{ return QString::null; }
/** Adds option to add menues to the popup menu before it is displayed.
* @param menu Menu to add entries to.
*/
virtual void addMenues(QPopupMenu *menu);
/** Export list as a string.
* @param includeHeader Include header.
* @param onlySelection Only include selection.
* @param type Format of exported list.
* @param separator Separator for CSV format.
* @param delimiter Delimiter for CSV format.
*/
virtual QString exportAsText(bool includeHeader,bool onlySelection,int type=-1,const QString &separator=";",const QString &delimiter="\"");
/** Export list as file.
*/
virtual bool editSave(bool ask);
/** Move to top of data
*/
virtual void searchTop(void)
{ if (firstChild()) setCurrentItem(firstChild()); FirstSearch=true; }
/** Search for next entry
* @return True if found, should select the found text.
*/
virtual bool searchNext(toSearchReplace *search);
/** Check if data can be modified by search
* @param all If true can replace all, otherwise can replace right now.
*/
virtual bool searchCanReplace(bool all);
/** Export data to a map.
* @param data A map that can be used to recreate the data of a chart.
* @param prefix Prefix to add to the map.
*/
virtual void exportData(std::map<QCString,QString> &data,const QCString &prefix);
/** Import data
* @param data Data to read from a map.
* @param prefix Prefix to read data from.
*/
virtual void importData(std::map<QCString,QString> &data,const QCString &prefix);
/** Create transposed copy of list
* @return Pointer to newly allocated transposed listview.
*/
virtual toListView *copyTransposed(void);
public slots:
/** set the popup menu --> see displayMenu()
* @param item Item to display.
*/
virtual void setDisplayMenu(QPopupMenu *item);
/** Display the menu at the given point and column.
* @param item Item to display.
* @param pnt Point to display menu at.
* @param col Column to display menu for.
*/
virtual void displayMenu(QListViewItem *item,const QPoint &pnt,int col);
/** Display memo of selected menu column
*/
virtual void displayMemo(void);
protected slots:
/** Callback when menu is selected. If you override this make sure you
* call the parents function when you have parsed your entries.
* @param id ID of the menu item selected.
*/
virtual void menuCallback(int id);
};
/**
* This class defines a list which displays the result of a query.
*
* One special thing to know about this class is that columns at the end in which the
* description start with a '-' characters are not displayed.
*/
class toResultView : public toListView, public toResult {
Q_OBJECT
int SortColumn;
bool SortAscending;
bool SortConnected;
/** Reimplemented for internal reasons.
*/
virtual void keyPressEvent (QKeyEvent * e);
protected:
/** Connection to execute statement on.
*/
toQuery *Query;
/** Last added item.
*/
QListViewItem *LastItem;
/** Number of rows in list.
*/
int RowNumber;
/** If column names are to be made more readable.
*/
bool ReadableColumns;
/** Wether to display first number column or not.
*/
bool NumberColumn;
/** If all the available data should be read at once.
*/
bool ReadAll;
/** Input filter if any.
*/
toResultFilter *Filter;
/** Setup the list.
* @param readable Wether to display first number column or not.
* @param dispCol Wether to display first number column or not.
*/
void setup(bool readable,bool dispCol);
/** Check if end of query is detected yet or not.
*/
virtual bool eof(void);
public:
/** Create list.
* @param readable Indicate if columns are to be made more readable. This means that the
* descriptions are capitalised and '_' are converted to ' '.
* @param numCol If number column is to be displayed.
* @param parent Parent of list.
* @param name Name of widget.
*/
toResultView(bool readable,bool numCol,QWidget *parent,const char *name=NULL);
/** Create list. The columns are not readable and the number column is displayed.
* @param parent Parent of list.
* @param name Name of widget.
*/
toResultView(QWidget *parent,const char *name=NULL);
~toResultView();
/** Set the read all flag.
* @param all New value of flag.
*/
void setReadAll(bool all)
{ ReadAll=all;}
/** Get read all flag
* @return Value of read all flag.
*/
virtual void editReadAll(void);
/** Get the number of columns in query.
* @return Columns in query.
*/
int queryColumns() const;
/** Get the query used to execute this.
*/
toQuery *query()
{ return Query; }
/** Set a filter to this list.
* @param filter The new filter or NULL if no filter is to be used.
*/
void setFilter(toResultFilter *filter)
{ Filter=filter; }
/** Get the current filter.
* @return Current filter or NULL if no filter.
*/
toResultFilter *filter(void)
{ return Filter; }
/** Get number column flag.
* @return Wether or not the numbercolumn is displayed.
*/
bool numberColumn() const
{ return NumberColumn; }
/** Set number column flag. Don't change this while a query is running. Observe
* that not all descendants of this class support changing this on the fly. The base
* class and @ref toResultLong does though.
* @param val New value of number column.
*/
void setNumberColumn(bool val)
{ NumberColumn=val; }
/** Get readable column flag.
* @return Wether or not the readable column names.
*/
bool readableColumn() const
{ return ReadableColumns; }
/** Set readable column flag.
*/
void setReadableColumns(bool val)
{ ReadableColumns=val; }
/** Create a new item in this list. Can be used if a special kind of item is wanted
* in the list. The rest of the columns will be filled with setText.
* @param last Where to insert the item.
* @param str String to set first column to.
* @return Allocated item.
*/
virtual QListViewItem *createItem(QListViewItem *last,const QString &str);
/** Reimplemented for internal reasons.
*/
virtual void query(const QString &sql,const toQList ¶m);
/** Get SQL name of list.
*/
virtual QString sqlName(void)
{ return toListView::sqlName(); }
/** Set SQL name of list.
*/
virtual void setSQLName(const QString &name)
{ toListView::setSQLName(name); }
// Why are these needed?
#if 1
/** Set the SQL statement of this list
* @param sql String containing statement.
*/
void setSQL(const QString &sql)
{ toResult::setSQL(sql); }
/** Set the SQL statement of this list. This will also affect @ref Name.
* @param sql SQL containing statement.
*/
void setSQL(const toSQL &sql)
{ toResult::setSQL(sql); }
/** Set new SQL and run query.
* @param sql New sql.
* @see setSQL
*/
void query(const QString &sql)
{ toResult::query(sql); }
/** Set new SQL and run query.
* @param sql New sql.
* @see setSQL
*/
void query(const toSQL &sql)
{ toResult::query(sql); }
/** Set new SQL and run query.
* @param sql New sql.
* @see setSQL
*/
void query(const toSQL &sql,toQList &par)
{ toResult::query(sql,par); }
#endif
/** Reimplemented for internal reasons.
*/
virtual void editPrint(void)
{ editReadAll(); toListView::editPrint(); }
/** Reimplemented for internal reasons.
*/
virtual QString middleString();
/** Reimplemented for internal reasons.
*/
virtual void addMenues(QPopupMenu *);
/** Reimplemented for internal reasons.
*/
virtual void setSorting(int col,bool asc=true);
/** Reimplemented for internal reasons.
*/
virtual int sortColumn() const
{ return SortColumn; }
public slots:
/** Reimplemented for internal reasons.
*/
virtual void refresh(void);
/** Reimplemented for internal reasons.
*/
virtual void changeParams(const QString &Param1)
{ toResult::changeParams(Param1); }
/** Reimplemented For internal reasons.
*/
virtual void changeParams(const QString &Param1,const QString &Param2)
{ toResult::changeParams(Param1,Param2); }
/** Reimplemented for internal reasons.
*/
virtual void changeParams(const QString &Param1,const QString &Param2,const QString &Param3)
{ toResult::changeParams(Param1,Param2,Param3); }
/** Try to add an item to the list if available.
*/
virtual void addItem(void);
/** Handle any connection by default
*/
virtual bool canHandle(toConnection &)
{ return true; }
private slots:
void headingClicked(int col);
void checkHeading(void);
protected slots:
/** Reimplemented for internal reasons.
*/
virtual void menuCallback(int);
};
/***
* Used internally by toListView.
* @internal
*/
class toResultListFormat : public toResultListFormatUI {
Q_OBJECT
public:
toResultListFormat(QWidget *parent,const char *name);
void saveDefault(void);
public slots:
virtual void formatChanged(int pos);
};
#endif