1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef SD_TOOLPANEL_CONTROL_CONTAINER_HXX 25*b1cdbd2cSJim Jagielski #define SD_TOOLPANEL_CONTROL_CONTAINER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski #include <vector> 30*b1cdbd2cSJim Jagielski #include <memory> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski class Window; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski namespace sd { namespace toolpanel { 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski class TreeNode; 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski /** This container manages the children of a TreeNode. It handles the 39*b1cdbd2cSJim Jagielski expansion and visibility state of its child controls. The container 40*b1cdbd2cSJim Jagielski does not do the layouting or painting of the controls. Instead it asks 41*b1cdbd2cSJim Jagielski its owner to do that. 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski The difference between expansion state and visibility is that when a 44*b1cdbd2cSJim Jagielski control is collapsed at least a title bar is shown for it. When it is 45*b1cdbd2cSJim Jagielski not visible then even this title bar is not shown. In that case the 46*b1cdbd2cSJim Jagielski user can not expand the control. A control has to be visible in order 47*b1cdbd2cSJim Jagielski to be expanded or collapsed. 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski Whenever you expand or collapse, show or hide a child control then use 50*b1cdbd2cSJim Jagielski this container class. Do not call the respective methods of the child 51*b1cdbd2cSJim Jagielski directly. 52*b1cdbd2cSJim Jagielski */ 53*b1cdbd2cSJim Jagielski class ControlContainer 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski public: 56*b1cdbd2cSJim Jagielski enum VisibilityState { VS_SHOW, VS_HIDE, VS_TOGGLE }; 57*b1cdbd2cSJim Jagielski enum ExpansionState { ES_EXPAND, ES_COLLAPSE, ES_TOGGLE }; 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski /** Create a new control container. 60*b1cdbd2cSJim Jagielski @param pParent 61*b1cdbd2cSJim Jagielski This node is asked to re-calculate the size of its children when 62*b1cdbd2cSJim Jagielski a child of this container is expanded or collapsed. 63*b1cdbd2cSJim Jagielski */ 64*b1cdbd2cSJim Jagielski ControlContainer (TreeNode* pNode); 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski virtual ~ControlContainer (void); 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski /** This is function makes sure that all children are deleted. Call 69*b1cdbd2cSJim Jagielski this function from the destructor of a sub class to have all child 70*b1cdbd2cSJim Jagielski windows deleted before the destructor of another base class of that 71*b1cdbd2cSJim Jagielski sub class is called. When that other base class is some kind of a 72*b1cdbd2cSJim Jagielski window it would otherwise complain that there are living children. 73*b1cdbd2cSJim Jagielski */ 74*b1cdbd2cSJim Jagielski void DeleteChildren (void); 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski /** Add the given control to the set of controls managed by the 77*b1cdbd2cSJim Jagielski container. This control is then expanded. 78*b1cdbd2cSJim Jagielski @return 79*b1cdbd2cSJim Jagielski Return the index under which the control has been inserted in 80*b1cdbd2cSJim Jagielski the container. It is the same index that is returned by 81*b1cdbd2cSJim Jagielski GetControlIndex(). 82*b1cdbd2cSJim Jagielski */ 83*b1cdbd2cSJim Jagielski sal_uInt32 AddControl (::std::auto_ptr<TreeNode> pControl); 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielski /** Expand (default) or collapse the specified control. When 86*b1cdbd2cSJim Jagielski expanding a control in a single expansion environment then all 87*b1cdbd2cSJim Jagielski other controls are collapsed. The specified control is being 88*b1cdbd2cSJim Jagielski made the active control as returned by GetActiveControl(). 89*b1cdbd2cSJim Jagielski */ 90*b1cdbd2cSJim Jagielski virtual void SetExpansionState ( 91*b1cdbd2cSJim Jagielski sal_uInt32 nIndex, 92*b1cdbd2cSJim Jagielski ExpansionState aState); 93*b1cdbd2cSJim Jagielski virtual void SetExpansionState ( 94*b1cdbd2cSJim Jagielski TreeNode* pControl, 95*b1cdbd2cSJim Jagielski ExpansionState aState); 96*b1cdbd2cSJim Jagielski virtual void SetVisibilityState ( 97*b1cdbd2cSJim Jagielski sal_uInt32 nIndex, 98*b1cdbd2cSJim Jagielski VisibilityState aState); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski /** Return the index of the given control. 101*b1cdbd2cSJim Jagielski */ 102*b1cdbd2cSJim Jagielski sal_uInt32 GetControlIndex (TreeNode* pControl) const; 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski /** Return the number of controls in the container. 105*b1cdbd2cSJim Jagielski */ 106*b1cdbd2cSJim Jagielski sal_uInt32 GetControlCount (void) const; 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski /** Return the number of visible controls in the container. 109*b1cdbd2cSJim Jagielski */ 110*b1cdbd2cSJim Jagielski sal_uInt32 GetVisibleControlCount (void) const; 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski /** Return the control with the specified index regardless of whether 113*b1cdbd2cSJim Jagielski that control is hidden or visible. 114*b1cdbd2cSJim Jagielski */ 115*b1cdbd2cSJim Jagielski TreeNode* GetControl (sal_uInt32 nIndex) const; 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski /** Return the index of the control previous to that that is specified 118*b1cdbd2cSJim Jagielski by the given index. 119*b1cdbd2cSJim Jagielski @param nIndex 120*b1cdbd2cSJim Jagielski Index of the control for which to return the index of the 121*b1cdbd2cSJim Jagielski previous control. This index is guaranteed not to be returned. 122*b1cdbd2cSJim Jagielski @param bIncludeHidden 123*b1cdbd2cSJim Jagielski This flag tells the method whether to include the controls that 124*b1cdbd2cSJim Jagielski are not visible in the search for the previous control. When it 125*b1cdbd2cSJim Jagielski is <FALSE/> the hidden controls are skipped. 126*b1cdbd2cSJim Jagielski @param bCycle 127*b1cdbd2cSJim Jagielski When this flag is <TRUE/> then the search for the previous 128*b1cdbd2cSJim Jagielski control wraps arround when reaching the first control. 129*b1cdbd2cSJim Jagielski @return 130*b1cdbd2cSJim Jagielski Returns the index to the previous control or (sal_uInt32)-1 when 131*b1cdbd2cSJim Jagielski there is no previous control. This would be the case when there 132*b1cdbd2cSJim Jagielski is only one (visible) child. 133*b1cdbd2cSJim Jagielski */ 134*b1cdbd2cSJim Jagielski sal_uInt32 GetPreviousIndex ( 135*b1cdbd2cSJim Jagielski sal_uInt32 nIndex, 136*b1cdbd2cSJim Jagielski bool bIncludeHidden=false, 137*b1cdbd2cSJim Jagielski bool bCycle=false) const; 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski /** Return the index of the control next to that that is specified by 140*b1cdbd2cSJim Jagielski the given index. 141*b1cdbd2cSJim Jagielski @param nIndex 142*b1cdbd2cSJim Jagielski Index of the control for which to return the index of the next 143*b1cdbd2cSJim Jagielski control. This index is guaranteed not to be returned. 144*b1cdbd2cSJim Jagielski @param bIncludeHidden 145*b1cdbd2cSJim Jagielski This flag tells the method whether to include the controls that 146*b1cdbd2cSJim Jagielski are not visible in the search for the next control. When it is 147*b1cdbd2cSJim Jagielski <FALSE/> the hidden controls are skipped. 148*b1cdbd2cSJim Jagielski @param bCycle 149*b1cdbd2cSJim Jagielski When this flag is <TRUE/> then the search for the next control 150*b1cdbd2cSJim Jagielski wraps arround when reaching the last control. 151*b1cdbd2cSJim Jagielski @return 152*b1cdbd2cSJim Jagielski Returns the index to the next control or (sal_uInt32)-1 when 153*b1cdbd2cSJim Jagielski there is no next control. This would be the case when there is 154*b1cdbd2cSJim Jagielski only one (visible) child. 155*b1cdbd2cSJim Jagielski */ 156*b1cdbd2cSJim Jagielski sal_uInt32 GetNextIndex ( 157*b1cdbd2cSJim Jagielski sal_uInt32 nIndex, 158*b1cdbd2cSJim Jagielski bool bIncludeHidden=false, 159*b1cdbd2cSJim Jagielski bool bCycle=false) const; 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski void SetMultiSelection (bool bFlag); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski /** This is method is called when the list of controls has changed, 164*b1cdbd2cSJim Jagielski i.e. a new control has been added. The default implementation is 165*b1cdbd2cSJim Jagielski empty. Overwrite this method in derived classes in order to react to 166*b1cdbd2cSJim Jagielski such changes. 167*b1cdbd2cSJim Jagielski */ 168*b1cdbd2cSJim Jagielski virtual void ListHasChanged (void); 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski private: 171*b1cdbd2cSJim Jagielski osl::Mutex maMutex; 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski /// List of controls managed by a container. 174*b1cdbd2cSJim Jagielski typedef ::std::vector<TreeNode*> ControlList; 175*b1cdbd2cSJim Jagielski ControlList maControlList; 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski /** This parent is used for resize requests when children are expanded 178*b1cdbd2cSJim Jagielski or collapsed. 179*b1cdbd2cSJim Jagielski */ 180*b1cdbd2cSJim Jagielski TreeNode* mpNode; 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski /** The index of the currently expanded control. A value of 183*b1cdbd2cSJim Jagielski (sal_uInt32)-1 indicates that no control is active. This may be the 184*b1cdbd2cSJim Jagielski case after adding controls to the container. 185*b1cdbd2cSJim Jagielski */ 186*b1cdbd2cSJim Jagielski sal_uInt32 mnActiveControlIndex; 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski bool mbMultiSelection; 189*b1cdbd2cSJim Jagielski }; 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski } } // end of namespace ::sd::toolpanel 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski #endif 194