1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _CONTROLHELPER_HXX_
25 #define _CONTROLHELPER_HXX_
26 
27 #include <rtl/ustring.hxx>
28 #include <com/sun/star/uno/Any.hxx>
29 
30 #include <list>
31 #include <map>
32 
33 #include <premac.h>
34 #include <Cocoa/Cocoa.h>
35 #include <postmac.h>
36 #include "SalAquaConstants.h"
37 #include "FilterHelper.hxx"
38 #include "AquaFilePickerDelegate.hxx"
39 
40 using namespace com::sun::star;
41 using namespace rtl;
42 
43 class ControlHelper {
44 
45 public:
46 
47     //------------------------------------------------------------------------------------
48     // Constructor / Destructor
49     //------------------------------------------------------------------------------------
50     ControlHelper();
51     virtual ~ControlHelper();
52 
53     //------------------------------------------------
54     // XInitialization delegate
55     //------------------------------------------------
56     void       initialize( sal_Int16 templateId );
57 
58     //------------------------------------------------------------------------------------
59     // XFilePickerControlAccess function delegates
60     //------------------------------------------------------------------------------------
61     void       setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any& rValue );
62     uno::Any   getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) const;
63     void       enableControl( sal_Int16 nControlId, sal_Bool bEnable ) const;
64     OUString   getLabel( sal_Int16 nControlId );
65     void       setLabel( sal_Int16 nControlId, const NSString* aLabel );
66 
67     //------------------------------------------------------------------------------------
68     // other stuff
69     //------------------------------------------------------------------------------------
70     void       updateFilterUI();
71 
72     //------------------------------------------------------------------------------------
73     // Type definitions
74     //------------------------------------------------------------------------------------
75     enum ToggleType {
76         AUTOEXTENSION, //but autoextension is handled differently on MacOSX
77         PASSWORD,
78         FILTEROPTIONS,
79         READONLY,
80         LINK,
81         PREVIEW,
82         SELECTION,
83         TOGGLE_LAST
84     };
85 
86     enum ListType {
87         VERSION,
88         TEMPLATE,
89         IMAGE_TEMPLATE,
90         LIST_LAST
91     };
92 
93     //------------------------------------------------------------------------------------
94     // inline functions
95     //------------------------------------------------------------------------------------
96     inline NSView* getUserPane() {
97         if (m_bIsUserPaneLaidOut == false) {
98             createUserPane();
99         }
100         return m_pUserPane;
101     }
102 
103     inline bool    getVisibility(ToggleType tToggle) {
104         return m_bToggleVisibility[tToggle];
105     }
106 
107     inline void    setFilterControlNeeded(bool bNeeded) {
108         m_bIsFilterControlNeeded = bNeeded;
109         if (bNeeded == true) {
110             m_bUserPaneNeeded = true;
111         }
112     }
113 
114     inline void    setFilterHelper(FilterHelper* pFilterHelper) {
115         m_pFilterHelper = pFilterHelper;
116     }
117 
118     inline void    setFilePickerDelegate(AquaFilePickerDelegate* pDelegate) {
119         m_pDelegate = pDelegate;
120     }
121 
122     inline bool    isAutoExtensionEnabled() {
123         return ([((NSButton*) m_pToggles[AUTOEXTENSION]) state] == NSOnState);
124     }
125 
126 private:
127     //------------------------------------------------------------------------------------
128     // private member variables
129     //------------------------------------------------------------------------------------
130 
131     /** the native view object */
132     NSView*    m_pUserPane;
133 
134     /** the checkbox controls */
135     NSControl* m_pToggles[ TOGGLE_LAST ];
136 
137     /** the visibility flags for the checkboxes */
138     bool m_bToggleVisibility[TOGGLE_LAST];
139 
140     /** the special filter control */
141     NSPopUpButton *m_pFilterControl;
142 
143     /** the popup menu controls (except for the filter control) */
144     NSControl* m_pListControls[ LIST_LAST ];
145 
146     /** a map to store a control's label text */
147     ::std::map<NSControl *, NSString *> m_aMapListLabels;
148 
149     /** a map to store a popup menu's label text field */
150     ::std::map<NSPopUpButton *, NSTextField *> m_aMapListLabelFields;
151 
152     /** the visibility flags for the popup menus */
153     bool m_bListVisibility[ LIST_LAST ];
154 
155     /** indicates if a user pane is needed */
156     bool m_bUserPaneNeeded;
157 
158     /** indicates if the user pane was laid out already */
159     bool m_bIsUserPaneLaidOut;
160 
161     /** indicates if a filter control is needed */
162     bool m_bIsFilterControlNeeded;
163 
164     /** a list with all actively used controls */
165     ::std::list<NSControl*> m_aActiveControls;
166 
167     /** the filter helper */
168     FilterHelper *m_pFilterHelper;
169 
170     /** the save or open panel's delegate */
171     AquaFilePickerDelegate *m_pDelegate;
172 
173     //------------------------------------------------------------------------------------
174     // private methods
175     //------------------------------------------------------------------------------------
176     void HandleSetListValue(const NSControl* pControl, const sal_Int16 nControlAction, const uno::Any& rValue);
177     uno::Any HandleGetListValue(const NSControl* pControl, const sal_Int16 nControlAction) const;
178 
179     void         createControls();
180     void         createFilterControl();
181     void         createUserPane();
182     NSTextField* createLabelWithString(const NSString* label);
183 
184     int          getControlElementName(const Class clazz, const int nControlId) const;
185     NSControl*   getControl( const sal_Int16 nControlId ) const;
186     static int   getVerticalDistance(const NSControl* first, const NSControl* second);
187 
188     void         layoutControls();
189 };
190 
191 #endif //_CONTROLHELPER_HXX_
192