xref: /trunk/main/autodoc/source/display/inc/toolkit/out_node.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef ADC_DISPLAY_OUT_NODE_HXX
29 #define ADC_DISPLAY_OUT_NODE_HXX
30 
31 
32 
33 
34 namespace output
35 {
36 
37 
38 /** @resp
39     Represents a tree of names where each node can have only one parent,
40     but a list of children.
41 
42     @see    Position
43     @see    Tree
44 */
45 class Node
46 {
47   public:
48     typedef std::vector< Node* >    List;
49     typedef UINT32                  relative_id;
50 
51     // LIFECYCLE
52     enum E_NullObject { null_object };
53 
54                         Node();
55     explicit            Node(
56                             E_NullObject        );
57                         ~Node();
58 
59     // OPERATORS
60     bool                operator==(
61                             const Node &        i_node ) const
62                                                 { return pParent == i_node.pParent AND sName == i_node.sName; }
63     bool                operator!=(
64                             const Node &        i_node ) const
65                                                 { return NOT operator==(i_node); }
66 
67     // OPERATIONS
68     /// Seek, and if not existent, create.
69     Node &              Provide_Child(
70                             const String &      i_name );
71     /// Seek, and if not existent, create.
72     Node &              Provide_Child(
73                             const StringVector &
74                                                 i_path )
75                                                 { return provide_Child(i_path.begin(), i_path.end()); }
76     // INQUIRY
77     intt                Depth() const           { return nDepth; }
78 
79     const String &      Name() const            { return sName; }
80     /// @return Id of a namespace or class etc. this directory represents.
81     relative_id         RelatedNameRoom() const { return nNameRoomId; }
82     /// @return No delimiter at start, with delimiter at end.
83     void                Get_Path(
84                             StreamStr &         o_result,
85                             intt                i_maxDepth = -1 ) const;
86     void                Get_Chain(
87                             StringVector &      o_result,
88                             intt                i_maxDepth = -1 ) const;
89     // ACCESS
90     void                Set_RelatedNameRoom(
91                             relative_id         i_nNameRoomId )
92                                                 { nNameRoomId = i_nNameRoomId; }
93     Node *              Parent()                { return pParent; }
94     Node *              Child(
95                             const String &      i_name )
96                                                 { return find_Child(i_name); }
97     List &              Children()              { return aChildren; }
98 
99     /// @return a reference to a Node with Depth() == -1.
100     static Node &       Null_();
101 
102   private:
103     // Local
104                         Node(
105                             const String &      i_name,
106                             Node &              i_parent );
107 
108     Node *              find_Child(
109                             const String &      i_name );
110     Node &              add_Child(
111                             const String &      i_name );
112     Node &              provide_Child(
113                             StringVector::const_iterator
114                                                 i_next,
115                             StringVector::const_iterator
116                                                 i_end );
117     // Data
118     String              sName;
119     Node *              pParent;
120     List                aChildren;
121     intt                nDepth;
122     relative_id         nNameRoomId;
123 };
124 
125 
126 
127 
128 }   // namespace output
129 #endif
130