summaryrefslogtreecommitdiffstats
path: root/src/widgets/categorylistview.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/categorylistview.h')
-rw-r--r--src/widgets/categorylistview.h288
1 files changed, 288 insertions, 0 deletions
diff --git a/src/widgets/categorylistview.h b/src/widgets/categorylistview.h
new file mode 100644
index 0000000..1dcabba
--- /dev/null
+++ b/src/widgets/categorylistview.h
@@ -0,0 +1,288 @@
+/***************************************************************************
+* Copyright (C) 2004 by *
+* Jason Kivlighn ([email protected]) *
+* Unai Garro ([email protected]) *
+* *
+* 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; either version 2 of the License, or *
+* (at your option) any later version. *
+***************************************************************************/
+
+#ifndef CATEGORYLISTVIEW_H
+#define CATEGORYLISTVIEW_H
+
+#include <tqmap.h>
+#include <tqpixmap.h>
+
+#include "dblistviewbase.h"
+
+#include "datablocks/elementlist.h"
+
+class TDEPopupMenu;
+
+class RecipeDB;
+class CategoryTree;
+class CategoryCheckListView;
+
+#define CATEGORYCHECKLISTITEM_RTTI 1005
+#define CATEGORYLISTITEM_RTTI 1001
+#define PSEUDOLISTITEM_RTTI 1008
+
+/** Category listitems inherit this class to provide a common interface for accessing this information.
+ */
+class CategoryItemInfo
+{
+public:
+ CategoryItemInfo( const Element &category ) : ctyStored( category ), populated(false){}
+ bool isPopulated() const { return populated; }
+ void setPopulated( bool b ){ populated = b; }
+
+ Element element() const
+ {
+ return ctyStored;
+ }
+
+ int categoryId() const
+ {
+ return ctyStored.id;
+ }
+ TQString categoryName() const
+ {
+ return ctyStored.name;
+ }
+
+protected:
+ Element ctyStored;
+
+private:
+ bool populated;
+};
+
+class CategoryCheckListItem : public TQCheckListItem, public CategoryItemInfo
+{
+public:
+ CategoryCheckListItem( CategoryCheckListView* klv, const Element &category, bool exclusive = true );
+ CategoryCheckListItem( TQListViewItem* it, const Element &category, bool exclusive = true );
+ CategoryCheckListItem( CategoryCheckListView* klv, TQListViewItem* it, const Element &category, bool exclusive = true );
+
+ virtual TQString text( int column ) const;
+ virtual void setText( int column, const TQString &text );
+
+ int rtti() const
+ {
+ return CATEGORYCHECKLISTITEM_RTTI;
+ }
+
+protected:
+ virtual void stateChange( bool );
+ void setChildrenState( bool );
+ void setParentsState( bool );
+
+ bool locked;
+ bool exclusive;
+
+private:
+ CategoryCheckListView *m_listview;
+};
+
+
+class CategoryListItem : public TQListViewItem, public CategoryItemInfo
+{
+public:
+ CategoryListItem( TQListView* klv, const Element &category );
+ CategoryListItem( TQListViewItem* it, const Element &category );
+ CategoryListItem( TQListView* klv, TQListViewItem* it, const Element &category );
+
+ virtual TQString text( int column ) const;
+ virtual void setText( int column, const TQString &text );
+
+ int rtti() const
+ {
+ return CATEGORYLISTITEM_RTTI;
+ }
+};
+
+
+
+class CategoryListView : public DBListViewBase
+{
+ TQ_OBJECT
+
+public:
+ CategoryListView( TQWidget *parent, RecipeDB * );
+
+ void populateAll( TQListViewItem *parent = 0 );
+
+public slots:
+ void open( TQListViewItem *item );
+
+protected:
+ virtual void init();
+
+ virtual void load( int limit, int offset );
+
+ /** so that it allows dropping into
+ * subchildren that aren't expandable. The code is taken from TDE's TDEListView with
+ * one line commented out.
+ */
+ void findDrop( const TQPoint &pos, TQListViewItem *&parent, TQListViewItem *&after )
+ {
+ TQPoint p ( contentsToViewport( pos ) );
+
+ // Get the position to put it in
+ TQListViewItem *atpos = itemAt( p );
+
+ TQListViewItem *above;
+ if ( !atpos ) // put it at the end
+ above = lastItem();
+ else {
+ // Get the closest item before us ('atpos' or the one above, if any)
+ if ( p.y() - itemRect( atpos ).topLeft().y() < ( atpos->height() / 2 ) )
+ above = atpos->itemAbove();
+ else
+ above = atpos;
+ }
+
+ if ( above ) {
+ // if above has children, I might need to drop it as the first item there
+
+ if ( above->firstChild() && above->isOpen() ) {
+ parent = above;
+ after = 0;
+ return ;
+ }
+
+ // Now, we know we want to go after "above". But as a child or as a sibling ?
+ // We have to ask the "above" item if it accepts children.
+ // ### NOTE: Here is the one line commented out so that "above" always accepts children
+ //if (above->isExpandable())
+ {
+ // The mouse is sufficiently on the right ? - doesn't matter if 'above' has visible children
+ if ( p.x() >= depthToPixels( above->depth() + 1 ) ||
+ ( above->isOpen() && above->childCount() > 0 ) )
+ {
+ parent = above;
+ after = 0L;
+ return ;
+ }
+ }
+
+ // Ok, there's one more level of complexity. We may want to become a new
+ // sibling, but of an upper-level group, rather than the "above" item
+ TQListViewItem * betterAbove = above->parent();
+ TQListViewItem * last = above;
+ while ( betterAbove ) {
+ // We are allowed to become a sibling of "betterAbove" only if we are
+ // after its last child
+ if ( last->nextSibling() == 0 ) {
+ if ( p.x() < depthToPixels ( betterAbove->depth() + 1 ) )
+ above = betterAbove; // store this one, but don't stop yet, there may be a better one
+ else
+ break; // not enough on the left, so stop
+ last = betterAbove;
+ betterAbove = betterAbove->parent(); // up one level
+ }
+ else
+ break; // we're among the child of betterAbove, not after the last one
+ }
+ }
+ // set as sibling
+ after = above;
+ parent = after ? after->parent() : 0L ;
+ }
+
+protected slots:
+ virtual void removeCategory( int id ) = 0;
+ virtual void createCategory( const Element &category, int parent_id ) = 0;
+ virtual void modifyCategory( const Element &category );
+ virtual void modifyCategory( int id, int parent_id );
+ virtual void mergeCategories( int id1, int id2 );
+
+ virtual void checkCreateCategory( const Element &, int parent_id );
+ virtual void populate( TQListViewItem *item );
+
+ TQMap<int, TQListViewItem*> items_map;
+
+private:
+ TQListViewItem *m_item_to_delete;
+};
+
+
+class StdCategoryListView : public CategoryListView
+{
+ TQ_OBJECT
+
+public:
+ StdCategoryListView( TQWidget *parent, RecipeDB *, bool editable = false );
+ ~StdCategoryListView();
+
+protected:
+ virtual void removeCategory( int id );
+ virtual void createCategory( const Element &category, int parent_id );
+
+ void setPixmap( const TQPixmap &pixmap );
+
+private slots:
+ void preparePopup();
+ void showPopup( TDEListView *, TQListViewItem *, const TQPoint & );
+
+ void createNew();
+ void remove
+ ();
+ void rename();
+ void cut();
+ void paste();
+ void pasteAsSub();
+
+ void changeCategoryParent( TQListViewItem *item, TQListViewItem * /*afterFirst*/, TQListViewItem * /*afterNow*/ );
+
+ void modCategory( TQListViewItem* i );
+ void saveCategory( TQListViewItem* i );
+
+private:
+ bool checkBounds( const TQString &name );
+
+ TDEPopupMenu *kpop;
+ TQListViewItem *clipboard_item;
+ TQListViewItem *clipboard_parent;
+
+ TQPixmap m_folder_icon;
+};
+
+
+class CategoryCheckListView : public CategoryListView
+{
+ TQ_OBJECT
+
+public:
+ CategoryCheckListView( TQWidget *parent, RecipeDB *, bool exclusive=true, const ElementList &init_items_checked = ElementList() );
+
+ virtual void stateChange( CategoryCheckListItem*, bool );
+
+ ElementList selections() const{ return m_selections; }
+
+protected:
+ virtual void removeCategory( int id );
+ virtual void createCategory( const Element &category, int parent_id );
+
+ virtual void load( int limit, int offset );
+
+ bool exclusive;
+
+private:
+ ElementList m_selections;
+};
+
+
+class PseudoListItem : public TQListViewItem
+{
+public:
+ PseudoListItem( TQListView* lv ) : TQListViewItem(lv){}
+ PseudoListItem( TQListViewItem* it ) : TQListViewItem(it){}
+
+protected:
+ int rtti() const { return PSEUDOLISTITEM_RTTI; }
+};
+
+#endif //CATEGORYLISTVIEW_H