00001 #ifndef GENERICTREE_H_
00002 #define GENERICTREE_H_
00003
00004 #include <qstring.h>
00005 #include <qvaluevector.h>
00006 #include <qvaluelist.h>
00007 #include <qptrlist.h>
00008
00009 #include "mythexp.h"
00010
00011 using namespace std;
00012
00013 class SortableGenericTreeList;
00014
00015 class MPUBLIC GenericTree
00016 {
00017 typedef QValueVector<int> IntVector;
00018
00019 public:
00020 GenericTree(const QString &a_string = "", int an_int = 0,
00021 bool selectable_flag = false);
00022 virtual ~GenericTree();
00023
00024 GenericTree *addNode(const QString &a_string, int an_int = 0,
00025 bool selectable_flag = false);
00026 GenericTree *addNode(GenericTree *child);
00027
00028 void removeNode(GenericTree *child);
00029
00030 GenericTree *findLeaf(int ordering_index = -1);
00031
00032 GenericTree* findNode(QValueList<int> route_of_branches);
00033 GenericTree* recursiveNodeFinder(QValueList<int> route_of_branches);
00034 bool checkNode(QValueList<int> route_of_branches);
00035
00036 GenericTree *nextSibling(int number_down, int ordering_index = -1);
00037 GenericTree *prevSibling(int number_up, int ordering_index = -1);
00038
00039 QPtrListIterator<GenericTree> getFirstChildIterator(int ordering = -1);
00040
00041 GenericTree *getSelectedChild(int ordering_index);
00042 GenericTree *getChildAt(uint reference, int ordering_index = -1);
00043 GenericTree *getChildByName(const QString &a_name);
00044 GenericTree *getChildByInt(int an_int);
00045
00046 QPtrList<GenericTree> *getAllChildren(int ordering_index = -1);
00047
00048 int getChildPosition(GenericTree *child, int ordering_index = -1);
00049 int getPosition(void);
00050 int getPosition(int ordering_index);
00051
00052 void setInt(int an_int) { m_int = an_int; }
00053 int getInt() { return m_int; }
00054
00055 void setParent(GenericTree* a_parent) { m_parent = a_parent; }
00056 GenericTree *getParent(void);
00057
00058 const QString getString(void) { return m_string; }
00059 void setString(const QString &str) { m_string = str; }
00060
00061 int calculateDepth(int start);
00062
00063 int childCount(void);
00064 int siblingCount(void);
00065
00066 void setSelectable(bool flag) { m_selectable = flag; }
00067 bool isSelectable() { return m_selectable; }
00068
00069 void setAttribute(uint attribute_position, int value_of_attribute);
00070 int getAttribute(uint which_one);
00071 IntVector *getAttributes(void) { return m_attributes; }
00072
00073 void reorderSubnodes(int ordering_index);
00074 void setOrderingIndex(int ordering_index)
00075 { m_current_ordering_index = ordering_index; }
00076 int getOrderingIndex(void) { return m_current_ordering_index; }
00077
00078 void becomeSelectedChild(void);
00079 void setSelectedChild(GenericTree* a_node) { m_selected_subnode = a_node; }
00080
00081 void addYourselfIfSelectable(QPtrList<GenericTree> *flat_list);
00082 void buildFlatListOfSubnodes(int ordering_index, bool scrambled_parents);
00083
00084 GenericTree *nextPrevFromFlatList(bool forward_or_back, bool wrap_around,
00085 GenericTree *active);
00086
00087 void sortByString();
00088 void sortByAttributeThenByString(int which_attribute);
00089 void sortBySelectable();
00090 void deleteAllChildren();
00091 void pruneAllChildren();
00092 void reOrderAsSorted();
00093
00094
00095 void MoveItemUpDown(GenericTree *item, bool flag);
00096
00097 private:
00098 QString m_string;
00099 int m_int;
00100
00101 SortableGenericTreeList *m_subnodes;
00102 SortableGenericTreeList *m_ordered_subnodes;
00103 SortableGenericTreeList *m_flatened_subnodes;
00104
00105 GenericTree *m_selected_subnode;
00106 IntVector *m_attributes;
00107 GenericTree *m_parent;
00108
00109 bool m_selectable;
00110 int m_current_ordering_index;
00111 };
00112
00113 #endif