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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_extensions.hxx"
26*b1cdbd2cSJim Jagielski #include "propertyeditor.hxx"
27*b1cdbd2cSJim Jagielski #include "browserpage.hxx"
28*b1cdbd2cSJim Jagielski #include "linedescriptor.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
31*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
32*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski //............................................................................
35*b1cdbd2cSJim Jagielski namespace pcr
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski //............................................................................
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski     #define LAYOUT_BORDER_LEFT      3
40*b1cdbd2cSJim Jagielski     #define LAYOUT_BORDER_TOP       3
41*b1cdbd2cSJim Jagielski     #define LAYOUT_BORDER_RIGHT     3
42*b1cdbd2cSJim Jagielski     #define LAYOUT_BORDER_BOTTOM    3
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski     /** === begin UNO using === **/
45*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Any;
46*b1cdbd2cSJim Jagielski     using ::com::sun::star::inspection::XPropertyControl;
47*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Reference;
48*b1cdbd2cSJim Jagielski     /** === end UNO using === **/
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski     //==================================================================
51*b1cdbd2cSJim Jagielski     // class OPropertyEditor
52*b1cdbd2cSJim Jagielski     //==================================================================
DBG_NAME(OPropertyEditor)53*b1cdbd2cSJim Jagielski     DBG_NAME(OPropertyEditor)
54*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
55*b1cdbd2cSJim Jagielski     OPropertyEditor::OPropertyEditor( Window* pParent, WinBits nWinStyle)
56*b1cdbd2cSJim Jagielski             :Control(pParent, nWinStyle)
57*b1cdbd2cSJim Jagielski             ,m_aTabControl( this )
58*b1cdbd2cSJim Jagielski             ,m_nNextId(1)
59*b1cdbd2cSJim Jagielski             ,m_bHasHelpSection( false )
60*b1cdbd2cSJim Jagielski             ,m_nMinHelpLines( 0 )
61*b1cdbd2cSJim Jagielski             ,m_nMaxHelpLines( 0 )
62*b1cdbd2cSJim Jagielski     {
63*b1cdbd2cSJim Jagielski         DBG_CTOR(OPropertyEditor,NULL);
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski         m_aTabControl.Show();
66*b1cdbd2cSJim Jagielski         m_aTabControl.SetDeactivatePageHdl(LINK(this, OPropertyEditor, OnPageDeactivate));
67*b1cdbd2cSJim Jagielski         m_aTabControl.SetActivatePageHdl(LINK(this, OPropertyEditor, OnPageActivate));
68*b1cdbd2cSJim Jagielski         m_aTabControl.SetBackground(GetBackground());
69*b1cdbd2cSJim Jagielski         m_aTabControl.SetPaintTransparent(sal_True);
70*b1cdbd2cSJim Jagielski     }
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
~OPropertyEditor()73*b1cdbd2cSJim Jagielski     OPropertyEditor::~OPropertyEditor()
74*b1cdbd2cSJim Jagielski     {
75*b1cdbd2cSJim Jagielski         Hide();
76*b1cdbd2cSJim Jagielski         ClearAll();
77*b1cdbd2cSJim Jagielski         DBG_DTOR(OPropertyEditor,NULL);
78*b1cdbd2cSJim Jagielski     }
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
ClearAll()81*b1cdbd2cSJim Jagielski     void OPropertyEditor::ClearAll()
82*b1cdbd2cSJim Jagielski     {
83*b1cdbd2cSJim Jagielski         m_nNextId=1;
84*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = m_aTabControl.GetPageCount();
85*b1cdbd2cSJim Jagielski         for(long i = nCount-1; i >= 0; --i)
86*b1cdbd2cSJim Jagielski         {
87*b1cdbd2cSJim Jagielski             sal_uInt16 nID = m_aTabControl.GetPageId((sal_uInt16)i);
88*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast<OBrowserPage*>(m_aTabControl.GetTabPage(nID));
89*b1cdbd2cSJim Jagielski             if (pPage)
90*b1cdbd2cSJim Jagielski             {
91*b1cdbd2cSJim Jagielski                 pPage->EnableInput(sal_False);
92*b1cdbd2cSJim Jagielski                 m_aTabControl.RemovePage(nID);
93*b1cdbd2cSJim Jagielski                 delete pPage;
94*b1cdbd2cSJim Jagielski             }
95*b1cdbd2cSJim Jagielski         }
96*b1cdbd2cSJim Jagielski         m_aTabControl.Clear();
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski         {
99*b1cdbd2cSJim Jagielski             MapStringToPageId aEmpty;
100*b1cdbd2cSJim Jagielski             m_aPropertyPageIds.swap( aEmpty );
101*b1cdbd2cSJim Jagielski         }
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski         while ( !m_aHiddenPages.empty() )
104*b1cdbd2cSJim Jagielski         {
105*b1cdbd2cSJim Jagielski             delete m_aHiddenPages.begin()->second.pPage;
106*b1cdbd2cSJim Jagielski             m_aHiddenPages.erase( m_aHiddenPages.begin() );
107*b1cdbd2cSJim Jagielski         }
108*b1cdbd2cSJim Jagielski     }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
getMinimumHeight()111*b1cdbd2cSJim Jagielski     sal_Int32 OPropertyEditor::getMinimumHeight()
112*b1cdbd2cSJim Jagielski     {
113*b1cdbd2cSJim Jagielski         sal_Int32 nMinHeight( LAYOUT_BORDER_TOP + LAYOUT_BORDER_BOTTOM );
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         if ( m_aTabControl.GetPageCount() > 0 )
116*b1cdbd2cSJim Jagielski         {
117*b1cdbd2cSJim Jagielski             sal_uInt16 nFirstID = m_aTabControl.GetPageId( 0 );
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski             // reserve space for the tabs themself
120*b1cdbd2cSJim Jagielski             Rectangle aTabArea( m_aTabControl.GetTabBounds( nFirstID ) );
121*b1cdbd2cSJim Jagielski             nMinHeight += aTabArea.GetHeight();
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski             // ask the page how much it requires
124*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( nFirstID ) );
125*b1cdbd2cSJim Jagielski             if ( pPage )
126*b1cdbd2cSJim Jagielski                 nMinHeight += pPage->getMinimumHeight();
127*b1cdbd2cSJim Jagielski         }
128*b1cdbd2cSJim Jagielski         else
129*b1cdbd2cSJim Jagielski             nMinHeight += 250;  // arbitrary ...
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski         return nMinHeight;
132*b1cdbd2cSJim Jagielski     }
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
getMinimumWidth()135*b1cdbd2cSJim Jagielski     sal_Int32 OPropertyEditor::getMinimumWidth()
136*b1cdbd2cSJim Jagielski     {
137*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = m_aTabControl.GetPageCount();
138*b1cdbd2cSJim Jagielski         sal_Int32 nPageMinWidth = 0;
139*b1cdbd2cSJim Jagielski         for(long i = nCount-1; i >= 0; --i)
140*b1cdbd2cSJim Jagielski         {
141*b1cdbd2cSJim Jagielski             sal_uInt16 nID = m_aTabControl.GetPageId((sal_uInt16)i);
142*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast<OBrowserPage*>(m_aTabControl.GetTabPage(nID));
143*b1cdbd2cSJim Jagielski             if (pPage)
144*b1cdbd2cSJim Jagielski             {
145*b1cdbd2cSJim Jagielski                 sal_Int32 nCurPageMinWidth = pPage->getMinimumWidth();
146*b1cdbd2cSJim Jagielski                 if( nCurPageMinWidth > nPageMinWidth )
147*b1cdbd2cSJim Jagielski                     nPageMinWidth = nCurPageMinWidth;
148*b1cdbd2cSJim Jagielski             }
149*b1cdbd2cSJim Jagielski         }
150*b1cdbd2cSJim Jagielski         return nPageMinWidth+6;
151*b1cdbd2cSJim Jagielski     }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
CommitModified()154*b1cdbd2cSJim Jagielski     void OPropertyEditor::CommitModified()
155*b1cdbd2cSJim Jagielski     {
156*b1cdbd2cSJim Jagielski         // commit all of my pages, if necessary
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = m_aTabControl.GetPageCount();
159*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i=0; i<nCount; ++i )
160*b1cdbd2cSJim Jagielski         {
161*b1cdbd2cSJim Jagielski             sal_uInt16 nID = m_aTabControl.GetPageId( i );
162*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( nID ) );
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski             if ( pPage && pPage->getListBox().IsModified() )
165*b1cdbd2cSJim Jagielski                 pPage->getListBox().CommitModified();
166*b1cdbd2cSJim Jagielski         }
167*b1cdbd2cSJim Jagielski     }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
GetFocus()170*b1cdbd2cSJim Jagielski     void OPropertyEditor::GetFocus()
171*b1cdbd2cSJim Jagielski     {
172*b1cdbd2cSJim Jagielski         m_aTabControl.GrabFocus();
173*b1cdbd2cSJim Jagielski     }
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
getPage(const::rtl::OUString & _rPropertyName)176*b1cdbd2cSJim Jagielski     OBrowserPage* OPropertyEditor::getPage( const ::rtl::OUString& _rPropertyName )
177*b1cdbd2cSJim Jagielski     {
178*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = NULL;
179*b1cdbd2cSJim Jagielski         MapStringToPageId::const_iterator aPropertyPageIdPos = m_aPropertyPageIds.find( _rPropertyName );
180*b1cdbd2cSJim Jagielski         if ( aPropertyPageIdPos != m_aPropertyPageIds.end() )
181*b1cdbd2cSJim Jagielski             pPage = static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( aPropertyPageIdPos->second ) );
182*b1cdbd2cSJim Jagielski         return pPage;
183*b1cdbd2cSJim Jagielski     }
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
getPage(const::rtl::OUString & _rPropertyName) const186*b1cdbd2cSJim Jagielski     const OBrowserPage* OPropertyEditor::getPage( const ::rtl::OUString& _rPropertyName ) const
187*b1cdbd2cSJim Jagielski     {
188*b1cdbd2cSJim Jagielski         return const_cast< OPropertyEditor* >( this )->getPage( _rPropertyName );
189*b1cdbd2cSJim Jagielski     }
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
getPage(sal_uInt16 & _rPageId)192*b1cdbd2cSJim Jagielski     OBrowserPage* OPropertyEditor::getPage( sal_uInt16& _rPageId )
193*b1cdbd2cSJim Jagielski     {
194*b1cdbd2cSJim Jagielski         return static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( _rPageId ) );
195*b1cdbd2cSJim Jagielski     }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
getPage(sal_uInt16 & _rPageId) const198*b1cdbd2cSJim Jagielski     const OBrowserPage* OPropertyEditor::getPage( sal_uInt16& _rPageId ) const
199*b1cdbd2cSJim Jagielski     {
200*b1cdbd2cSJim Jagielski         return const_cast< OPropertyEditor* >( this )->getPage( _rPageId );
201*b1cdbd2cSJim Jagielski     }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
Resize()204*b1cdbd2cSJim Jagielski     void OPropertyEditor::Resize()
205*b1cdbd2cSJim Jagielski     {
206*b1cdbd2cSJim Jagielski         Rectangle aPlayground(
207*b1cdbd2cSJim Jagielski             Point( LAYOUT_BORDER_LEFT, LAYOUT_BORDER_TOP ),
208*b1cdbd2cSJim Jagielski             Size(
209*b1cdbd2cSJim Jagielski                 GetOutputSizePixel().Width() - LAYOUT_BORDER_LEFT - LAYOUT_BORDER_RIGHT,
210*b1cdbd2cSJim Jagielski                 GetOutputSizePixel().Height() - LAYOUT_BORDER_TOP - LAYOUT_BORDER_BOTTOM
211*b1cdbd2cSJim Jagielski             )
212*b1cdbd2cSJim Jagielski         );
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski         Rectangle aTabArea( aPlayground );
215*b1cdbd2cSJim Jagielski         m_aTabControl.SetPosSizePixel( aTabArea.TopLeft(), aTabArea.GetSize() );
216*b1cdbd2cSJim Jagielski     }
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
AppendPage(const String & _rText,const rtl::OString & _rHelpId)219*b1cdbd2cSJim Jagielski     sal_uInt16 OPropertyEditor::AppendPage( const String & _rText, const rtl::OString& _rHelpId )
220*b1cdbd2cSJim Jagielski     {
221*b1cdbd2cSJim Jagielski         // obtain a new id
222*b1cdbd2cSJim Jagielski         sal_uInt16 nId = m_nNextId++;
223*b1cdbd2cSJim Jagielski         // insert the id
224*b1cdbd2cSJim Jagielski         m_aTabControl.InsertPage(nId, _rText);
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski         // create a new page
227*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = new OBrowserPage(&m_aTabControl);
228*b1cdbd2cSJim Jagielski         pPage->SetText( _rText );
229*b1cdbd2cSJim Jagielski         // some knittings
230*b1cdbd2cSJim Jagielski         pPage->SetSizePixel(m_aTabControl.GetTabPageSizePixel());
231*b1cdbd2cSJim Jagielski         pPage->getListBox().SetListener(m_pListener);
232*b1cdbd2cSJim Jagielski         pPage->getListBox().SetObserver(m_pObserver);
233*b1cdbd2cSJim Jagielski         pPage->getListBox().EnableHelpSection( m_bHasHelpSection );
234*b1cdbd2cSJim Jagielski         pPage->getListBox().SetHelpLineLimites( m_nMinHelpLines, m_nMaxHelpLines );
235*b1cdbd2cSJim Jagielski         pPage->SetHelpId( _rHelpId );
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski         // immediately activate the page
238*b1cdbd2cSJim Jagielski         m_aTabControl.SetTabPage(nId, pPage);
239*b1cdbd2cSJim Jagielski         m_aTabControl.SetCurPageId(nId);
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski         return nId;
242*b1cdbd2cSJim Jagielski     }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetHelpId(const rtl::OString & rHelpId)245*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetHelpId( const rtl::OString& rHelpId )
246*b1cdbd2cSJim Jagielski     {
247*b1cdbd2cSJim Jagielski         Control::SetHelpId("");
248*b1cdbd2cSJim Jagielski         m_aTabControl.SetHelpId(rHelpId);
249*b1cdbd2cSJim Jagielski     }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
RemovePage(sal_uInt16 nID)252*b1cdbd2cSJim Jagielski     void OPropertyEditor::RemovePage(sal_uInt16 nID)
253*b1cdbd2cSJim Jagielski     {
254*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = static_cast<OBrowserPage*>(m_aTabControl.GetTabPage(nID));
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski         if (pPage)
257*b1cdbd2cSJim Jagielski             pPage->EnableInput(sal_False);
258*b1cdbd2cSJim Jagielski         m_aTabControl.RemovePage(nID);
259*b1cdbd2cSJim Jagielski         if (pPage)
260*b1cdbd2cSJim Jagielski             delete pPage;
261*b1cdbd2cSJim Jagielski     }
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetPage(sal_uInt16 nId)264*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetPage(sal_uInt16 nId)
265*b1cdbd2cSJim Jagielski     {
266*b1cdbd2cSJim Jagielski         m_aTabControl.SetCurPageId(nId);
267*b1cdbd2cSJim Jagielski     }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
GetCurPage()270*b1cdbd2cSJim Jagielski     sal_uInt16 OPropertyEditor::GetCurPage()
271*b1cdbd2cSJim Jagielski     {
272*b1cdbd2cSJim Jagielski         if(m_aTabControl.GetPageCount()>0)
273*b1cdbd2cSJim Jagielski             return m_aTabControl.GetCurPageId();
274*b1cdbd2cSJim Jagielski         else
275*b1cdbd2cSJim Jagielski             return 0;
276*b1cdbd2cSJim Jagielski     }
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
Update(const::std::mem_fun_t<void,OBrowserListBox> & _aUpdateFunction)279*b1cdbd2cSJim Jagielski     void OPropertyEditor::Update(const ::std::mem_fun_t<void,OBrowserListBox>& _aUpdateFunction)
280*b1cdbd2cSJim Jagielski     {
281*b1cdbd2cSJim Jagielski         // forward this to all our pages
282*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = m_aTabControl.GetPageCount();
283*b1cdbd2cSJim Jagielski         for (sal_uInt16 i=0;i<nCount;++i)
284*b1cdbd2cSJim Jagielski         {
285*b1cdbd2cSJim Jagielski             sal_uInt16 nID = m_aTabControl.GetPageId(i);
286*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast<OBrowserPage*>(m_aTabControl.GetTabPage(nID));
287*b1cdbd2cSJim Jagielski             if (pPage)
288*b1cdbd2cSJim Jagielski                 _aUpdateFunction(&pPage->getListBox());
289*b1cdbd2cSJim Jagielski         }
290*b1cdbd2cSJim Jagielski     }
291*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
EnableUpdate()292*b1cdbd2cSJim Jagielski     void OPropertyEditor::EnableUpdate()
293*b1cdbd2cSJim Jagielski     {
294*b1cdbd2cSJim Jagielski         Update(::std::mem_fun(&OBrowserListBox::EnableUpdate));
295*b1cdbd2cSJim Jagielski     }
296*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
DisableUpdate()297*b1cdbd2cSJim Jagielski     void OPropertyEditor::DisableUpdate()
298*b1cdbd2cSJim Jagielski     {
299*b1cdbd2cSJim Jagielski         Update(::std::mem_fun(&OBrowserListBox::DisableUpdate));
300*b1cdbd2cSJim Jagielski     }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
forEachPage(PageOperation _pOperation,const void * _pArgument)303*b1cdbd2cSJim Jagielski     void OPropertyEditor::forEachPage( PageOperation _pOperation, const void* _pArgument )
304*b1cdbd2cSJim Jagielski     {
305*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = m_aTabControl.GetPageCount();
306*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i=0; i<nCount; ++i )
307*b1cdbd2cSJim Jagielski         {
308*b1cdbd2cSJim Jagielski             sal_uInt16 nID = m_aTabControl.GetPageId(i);
309*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( nID ) );
310*b1cdbd2cSJim Jagielski             if ( !pPage )
311*b1cdbd2cSJim Jagielski                 continue;
312*b1cdbd2cSJim Jagielski             (this->*_pOperation)( *pPage, _pArgument );
313*b1cdbd2cSJim Jagielski         }
314*b1cdbd2cSJim Jagielski     }
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
setPageLineListener(OBrowserPage & _rPage,const void *)317*b1cdbd2cSJim Jagielski     void OPropertyEditor::setPageLineListener( OBrowserPage& _rPage, const void* )
318*b1cdbd2cSJim Jagielski     {
319*b1cdbd2cSJim Jagielski         _rPage.getListBox().SetListener( m_pListener );
320*b1cdbd2cSJim Jagielski     }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetLineListener(IPropertyLineListener * _pListener)323*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetLineListener(IPropertyLineListener* _pListener)
324*b1cdbd2cSJim Jagielski     {
325*b1cdbd2cSJim Jagielski         m_pListener = _pListener;
326*b1cdbd2cSJim Jagielski         forEachPage( &OPropertyEditor::setPageLineListener );
327*b1cdbd2cSJim Jagielski     }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
setPageControlObserver(OBrowserPage & _rPage,const void *)330*b1cdbd2cSJim Jagielski     void OPropertyEditor::setPageControlObserver( OBrowserPage& _rPage, const void* )
331*b1cdbd2cSJim Jagielski     {
332*b1cdbd2cSJim Jagielski         _rPage.getListBox().SetObserver( m_pObserver );
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetControlObserver(IPropertyControlObserver * _pObserver)336*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetControlObserver( IPropertyControlObserver* _pObserver )
337*b1cdbd2cSJim Jagielski     {
338*b1cdbd2cSJim Jagielski         m_pObserver = _pObserver;
339*b1cdbd2cSJim Jagielski         forEachPage( &OPropertyEditor::setPageControlObserver );
340*b1cdbd2cSJim Jagielski     }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
EnableHelpSection(bool _bEnable)343*b1cdbd2cSJim Jagielski     void OPropertyEditor::EnableHelpSection( bool _bEnable )
344*b1cdbd2cSJim Jagielski     {
345*b1cdbd2cSJim Jagielski         m_bHasHelpSection = _bEnable;
346*b1cdbd2cSJim Jagielski         forEachPage( &OPropertyEditor::enableHelpSection );
347*b1cdbd2cSJim Jagielski     }
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
HasHelpSection() const350*b1cdbd2cSJim Jagielski     bool OPropertyEditor::HasHelpSection() const
351*b1cdbd2cSJim Jagielski     {
352*b1cdbd2cSJim Jagielski         return m_bHasHelpSection;
353*b1cdbd2cSJim Jagielski     }
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetHelpText(const::rtl::OUString & _rHelpText)356*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetHelpText( const ::rtl::OUString& _rHelpText )
357*b1cdbd2cSJim Jagielski     {
358*b1cdbd2cSJim Jagielski         forEachPage( &OPropertyEditor::setHelpSectionText, &_rHelpText );
359*b1cdbd2cSJim Jagielski     }
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetHelpLineLimites(sal_Int32 _nMinLines,sal_Int32 _nMaxLines)362*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetHelpLineLimites( sal_Int32 _nMinLines, sal_Int32 _nMaxLines )
363*b1cdbd2cSJim Jagielski     {
364*b1cdbd2cSJim Jagielski         m_nMinHelpLines = _nMinLines;
365*b1cdbd2cSJim Jagielski         m_nMaxHelpLines = _nMaxLines;
366*b1cdbd2cSJim Jagielski         forEachPage( &OPropertyEditor::setHelpLineLimits );
367*b1cdbd2cSJim Jagielski     }
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
enableHelpSection(OBrowserPage & _rPage,const void *)370*b1cdbd2cSJim Jagielski     void OPropertyEditor::enableHelpSection( OBrowserPage& _rPage, const void* )
371*b1cdbd2cSJim Jagielski     {
372*b1cdbd2cSJim Jagielski         _rPage.getListBox().EnableHelpSection( m_bHasHelpSection );
373*b1cdbd2cSJim Jagielski     }
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
setHelpSectionText(OBrowserPage & _rPage,const void * _pPointerToOUString)376*b1cdbd2cSJim Jagielski     void OPropertyEditor::setHelpSectionText( OBrowserPage& _rPage, const void* _pPointerToOUString )
377*b1cdbd2cSJim Jagielski     {
378*b1cdbd2cSJim Jagielski         OSL_ENSURE( _pPointerToOUString, "OPropertyEditor::setHelpSectionText: invalid argument!" );
379*b1cdbd2cSJim Jagielski         if ( !_pPointerToOUString )
380*b1cdbd2cSJim Jagielski             return;
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski         const ::rtl::OUString& rText( *(const ::rtl::OUString*)_pPointerToOUString );
383*b1cdbd2cSJim Jagielski         _rPage.getListBox().SetHelpText( rText );
384*b1cdbd2cSJim Jagielski     }
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
setHelpLineLimits(OBrowserPage & _rPage,const void *)387*b1cdbd2cSJim Jagielski     void OPropertyEditor::setHelpLineLimits( OBrowserPage& _rPage, const void* )
388*b1cdbd2cSJim Jagielski     {
389*b1cdbd2cSJim Jagielski         _rPage.getListBox().SetHelpLineLimites( m_nMinHelpLines, m_nMaxHelpLines );
390*b1cdbd2cSJim Jagielski     }
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
InsertEntry(const OLineDescriptor & rData,sal_uInt16 _nPageId,sal_uInt16 nPos)393*b1cdbd2cSJim Jagielski     sal_uInt16 OPropertyEditor::InsertEntry( const OLineDescriptor& rData, sal_uInt16 _nPageId, sal_uInt16 nPos )
394*b1cdbd2cSJim Jagielski     {
395*b1cdbd2cSJim Jagielski         // let the current page handle this
396*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = getPage( _nPageId );
397*b1cdbd2cSJim Jagielski         DBG_ASSERT( pPage, "OPropertyEditor::InsertEntry: don't have such a page!" );
398*b1cdbd2cSJim Jagielski         if ( !pPage )
399*b1cdbd2cSJim Jagielski             return LISTBOX_ENTRY_NOTFOUND;
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski         sal_uInt16 nEntry = pPage->getListBox().InsertEntry( rData, nPos );
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski         OSL_ENSURE( m_aPropertyPageIds.find( rData.sName ) == m_aPropertyPageIds.end(),
404*b1cdbd2cSJim Jagielski             "OPropertyEditor::InsertEntry: property already present in the map!" );
405*b1cdbd2cSJim Jagielski         m_aPropertyPageIds.insert( MapStringToPageId::value_type( rData.sName, _nPageId ) );
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski         return nEntry;
408*b1cdbd2cSJim Jagielski     }
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
RemoveEntry(const::rtl::OUString & _rName)411*b1cdbd2cSJim Jagielski     void OPropertyEditor::RemoveEntry( const ::rtl::OUString& _rName )
412*b1cdbd2cSJim Jagielski     {
413*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = getPage( _rName );
414*b1cdbd2cSJim Jagielski         if ( pPage )
415*b1cdbd2cSJim Jagielski         {
416*b1cdbd2cSJim Jagielski             OSL_VERIFY( pPage->getListBox().RemoveEntry( _rName ) );
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski             OSL_ENSURE( m_aPropertyPageIds.find( _rName ) != m_aPropertyPageIds.end(),
419*b1cdbd2cSJim Jagielski                 "OPropertyEditor::RemoveEntry: property not present in the map!" );
420*b1cdbd2cSJim Jagielski             m_aPropertyPageIds.erase( _rName );
421*b1cdbd2cSJim Jagielski         }
422*b1cdbd2cSJim Jagielski     }
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
ChangeEntry(const OLineDescriptor & rData)425*b1cdbd2cSJim Jagielski     void OPropertyEditor::ChangeEntry( const OLineDescriptor& rData )
426*b1cdbd2cSJim Jagielski     {
427*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = getPage( rData.sName );
428*b1cdbd2cSJim Jagielski         if ( pPage )
429*b1cdbd2cSJim Jagielski             pPage->getListBox().ChangeEntry( rData, EDITOR_LIST_REPLACE_EXISTING );
430*b1cdbd2cSJim Jagielski     }
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
SetPropertyValue(const::rtl::OUString & rEntryName,const Any & _rValue,bool _bUnknownValue)433*b1cdbd2cSJim Jagielski     void OPropertyEditor::SetPropertyValue( const ::rtl::OUString& rEntryName, const Any& _rValue, bool _bUnknownValue )
434*b1cdbd2cSJim Jagielski     {
435*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = getPage( rEntryName );
436*b1cdbd2cSJim Jagielski         if ( pPage )
437*b1cdbd2cSJim Jagielski             pPage->getListBox().SetPropertyValue( rEntryName, _rValue, _bUnknownValue );
438*b1cdbd2cSJim Jagielski     }
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
GetPropertyPos(const::rtl::OUString & rEntryName) const441*b1cdbd2cSJim Jagielski     sal_uInt16 OPropertyEditor::GetPropertyPos( const ::rtl::OUString& rEntryName ) const
442*b1cdbd2cSJim Jagielski     {
443*b1cdbd2cSJim Jagielski         sal_uInt16 nVal=LISTBOX_ENTRY_NOTFOUND;
444*b1cdbd2cSJim Jagielski         const OBrowserPage* pPage = getPage( rEntryName );
445*b1cdbd2cSJim Jagielski         if ( pPage )
446*b1cdbd2cSJim Jagielski             nVal = pPage->getListBox().GetPropertyPos( rEntryName );
447*b1cdbd2cSJim Jagielski         return nVal;
448*b1cdbd2cSJim Jagielski     }
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
ShowPropertyPage(sal_uInt16 _nPageId,bool _bShow)451*b1cdbd2cSJim Jagielski     void OPropertyEditor::ShowPropertyPage( sal_uInt16 _nPageId, bool _bShow )
452*b1cdbd2cSJim Jagielski     {
453*b1cdbd2cSJim Jagielski         if ( !_bShow )
454*b1cdbd2cSJim Jagielski         {
455*b1cdbd2cSJim Jagielski             sal_uInt16 nPagePos = m_aTabControl.GetPagePos( _nPageId );
456*b1cdbd2cSJim Jagielski             if ( TAB_PAGE_NOTFOUND == nPagePos )
457*b1cdbd2cSJim Jagielski                 return;
458*b1cdbd2cSJim Jagielski             DBG_ASSERT( m_aHiddenPages.find( _nPageId ) == m_aHiddenPages.end(), "OPropertyEditor::ShowPropertyPage: page already hidden!" );
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski             m_aHiddenPages[ _nPageId ] = HiddenPage( nPagePos, m_aTabControl.GetTabPage( _nPageId ) );
461*b1cdbd2cSJim Jagielski             m_aTabControl.RemovePage( _nPageId );
462*b1cdbd2cSJim Jagielski         }
463*b1cdbd2cSJim Jagielski         else
464*b1cdbd2cSJim Jagielski         {
465*b1cdbd2cSJim Jagielski             ::std::map< sal_uInt16, HiddenPage >::iterator aPagePos = m_aHiddenPages.find( _nPageId );
466*b1cdbd2cSJim Jagielski             if ( aPagePos == m_aHiddenPages.end() )
467*b1cdbd2cSJim Jagielski                 return;
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski             aPagePos->second.pPage->SetSizePixel( m_aTabControl.GetTabPageSizePixel() );
470*b1cdbd2cSJim Jagielski             m_aTabControl.InsertPage( aPagePos->first, aPagePos->second.pPage->GetText(), aPagePos->second.nPos );
471*b1cdbd2cSJim Jagielski             m_aTabControl.SetTabPage( aPagePos->first, aPagePos->second.pPage );
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski             m_aHiddenPages.erase( aPagePos );
474*b1cdbd2cSJim Jagielski         }
475*b1cdbd2cSJim Jagielski     }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
EnablePropertyControls(const::rtl::OUString & _rEntryName,sal_Int16 _nControls,bool _bEnable)478*b1cdbd2cSJim Jagielski     void OPropertyEditor::EnablePropertyControls( const ::rtl::OUString& _rEntryName, sal_Int16 _nControls, bool _bEnable )
479*b1cdbd2cSJim Jagielski     {
480*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = 0; i < m_aTabControl.GetPageCount(); ++i )
481*b1cdbd2cSJim Jagielski         {
482*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( m_aTabControl.GetPageId( i ) ) );
483*b1cdbd2cSJim Jagielski             if ( pPage )
484*b1cdbd2cSJim Jagielski                 pPage->getListBox().EnablePropertyControls( _rEntryName, _nControls, _bEnable );
485*b1cdbd2cSJim Jagielski         }
486*b1cdbd2cSJim Jagielski     }
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
EnablePropertyLine(const::rtl::OUString & _rEntryName,bool _bEnable)489*b1cdbd2cSJim Jagielski     void OPropertyEditor::EnablePropertyLine( const ::rtl::OUString& _rEntryName, bool _bEnable )
490*b1cdbd2cSJim Jagielski     {
491*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = 0; i < m_aTabControl.GetPageCount(); ++i )
492*b1cdbd2cSJim Jagielski         {
493*b1cdbd2cSJim Jagielski             OBrowserPage* pPage = static_cast< OBrowserPage* >( m_aTabControl.GetTabPage( m_aTabControl.GetPageId( i ) ) );
494*b1cdbd2cSJim Jagielski             if ( pPage )
495*b1cdbd2cSJim Jagielski                 pPage->getListBox().EnablePropertyLine( _rEntryName, _bEnable );
496*b1cdbd2cSJim Jagielski         }
497*b1cdbd2cSJim Jagielski     }
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
GetPropertyControl(const::rtl::OUString & rEntryName)500*b1cdbd2cSJim Jagielski     Reference< XPropertyControl > OPropertyEditor::GetPropertyControl(const ::rtl::OUString& rEntryName)
501*b1cdbd2cSJim Jagielski     {
502*b1cdbd2cSJim Jagielski         Reference< XPropertyControl > xControl;
503*b1cdbd2cSJim Jagielski         // let the current page handle this
504*b1cdbd2cSJim Jagielski         OBrowserPage* pPage = static_cast<OBrowserPage*>(m_aTabControl.GetTabPage(m_aTabControl.GetCurPageId()));
505*b1cdbd2cSJim Jagielski         if (pPage)
506*b1cdbd2cSJim Jagielski             xControl = pPage->getListBox().GetPropertyControl(rEntryName);
507*b1cdbd2cSJim Jagielski         return xControl;
508*b1cdbd2cSJim Jagielski     }
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
IMPL_LINK(OPropertyEditor,OnPageActivate,TabControl *,EMPTYARG)511*b1cdbd2cSJim Jagielski     IMPL_LINK(OPropertyEditor, OnPageActivate, TabControl*, EMPTYARG)
512*b1cdbd2cSJim Jagielski     {
513*b1cdbd2cSJim Jagielski         if (m_aPageActivationHandler.IsSet())
514*b1cdbd2cSJim Jagielski             m_aPageActivationHandler.Call(NULL);
515*b1cdbd2cSJim Jagielski         return 0L;
516*b1cdbd2cSJim Jagielski     }
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski     //------------------------------------------------------------------
IMPL_LINK(OPropertyEditor,OnPageDeactivate,TabControl *,EMPTYARG)519*b1cdbd2cSJim Jagielski     IMPL_LINK(OPropertyEditor, OnPageDeactivate, TabControl*, EMPTYARG)
520*b1cdbd2cSJim Jagielski     {
521*b1cdbd2cSJim Jagielski         // commit the data on the current (to-be-decativated) tab page
522*b1cdbd2cSJim Jagielski         // (79404)
523*b1cdbd2cSJim Jagielski         sal_Int32 nCurrentId = m_aTabControl.GetCurPageId();
524*b1cdbd2cSJim Jagielski         OBrowserPage* pCurrentPage = static_cast<OBrowserPage*>(m_aTabControl.GetTabPage((sal_uInt16)nCurrentId));
525*b1cdbd2cSJim Jagielski         if ( !pCurrentPage )
526*b1cdbd2cSJim Jagielski             return 1L;
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski         if ( pCurrentPage->getListBox().IsModified() )
529*b1cdbd2cSJim Jagielski             pCurrentPage->getListBox().CommitModified();
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski         return 1L;
532*b1cdbd2cSJim Jagielski     }
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski //............................................................................
535*b1cdbd2cSJim Jagielski } // namespace pcr
536*b1cdbd2cSJim Jagielski //............................................................................
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski 
539