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  #include "sidebar/PanelFactory.hxx"
23  
24  #include "text/TextPropertyPanel.hxx"
25  #include "area/AreaPropertyPanel.hxx"
26  #include "graphic/GraphicPropertyPanel.hxx"
27  #include "line/LinePropertyPanel.hxx"
28  #include "possize/PosSizePropertyPanel.hxx"
29  #include "gallery/GalleryControl.hxx"
30  #include "ColorPanel.hxx"
31  #include <sfx2/sidebar/SidebarPanelBase.hxx>
32  #include <sfx2/sfxbasecontroller.hxx>
33  #include <toolkit/helper/vclunohelper.hxx>
34  #include <vcl/window.hxx>
35  #include <rtl/ref.hxx>
36  #include <comphelper/namedvaluecollection.hxx>
37  
38  
39  #include <boost/bind.hpp>
40  
41  
42  using namespace css;
43  using namespace cssu;
44  using ::rtl::OUString;
45  
46  
47  namespace svx { namespace sidebar {
48  
49  #define A2S(s) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
50  #define IMPLEMENTATION_NAME "org.apache.openoffice.comp.svx.sidebar.PanelFactory"
51  #define SERVICE_NAME "com.sun.star.ui.UIElementFactory"
52  
53  
54  ::rtl::OUString SAL_CALL PanelFactory::getImplementationName (void)
55  {
56      return A2S(IMPLEMENTATION_NAME);
57  }
58  
59  
60  
61  
62  cssu::Reference<cssu::XInterface> SAL_CALL PanelFactory::createInstance (
63      const uno::Reference<lang::XMultiServiceFactory>& rxFactory)
64  {
65      (void)rxFactory;
66  
67      ::rtl::Reference<PanelFactory> pPanelFactory (new PanelFactory());
68      cssu::Reference<cssu::XInterface> xService (static_cast<XWeak*>(pPanelFactory.get()), cssu::UNO_QUERY);
69      return xService;
70  }
71  
72  
73  
74  
75  cssu::Sequence<OUString> SAL_CALL PanelFactory::getSupportedServiceNames (void)
76  {
77      cssu::Sequence<OUString> aServiceNames (1);
78      aServiceNames[0] = A2S(SERVICE_NAME);
79      return aServiceNames;
80  
81  }
82  
83  
84  
85  
86  PanelFactory::PanelFactory (void)
87      : PanelFactoryInterfaceBase(m_aMutex)
88  {
89  }
90  
91  
92  
93  
94  PanelFactory::~PanelFactory (void)
95  {
96  }
97  
98  
99  
100  
101  Reference<ui::XUIElement> SAL_CALL PanelFactory::createUIElement (
102      const ::rtl::OUString& rsResourceURL,
103      const ::cssu::Sequence<css::beans::PropertyValue>& rArguments)
104      throw(
105          container::NoSuchElementException,
106          lang::IllegalArgumentException,
107          RuntimeException)
108  {
109      Reference<ui::XUIElement> xElement;
110  
111      const ::comphelper::NamedValueCollection aArguments (rArguments);
112      Reference<frame::XFrame> xFrame (aArguments.getOrDefault("Frame", Reference<frame::XFrame>()));
113      Reference<awt::XWindow> xParentWindow (aArguments.getOrDefault("ParentWindow", Reference<awt::XWindow>()));
114      const sal_uInt64 nBindingsValue (aArguments.getOrDefault("SfxBindings", sal_uInt64(0)));
115      SfxBindings* pBindings = reinterpret_cast<SfxBindings*>(nBindingsValue);
116  
117      ::Window* pParentWindow = VCLUnoHelper::GetWindow(xParentWindow);
118      if ( ! xParentWindow.is() || pParentWindow==NULL)
119          throw RuntimeException(
120              A2S("PanelFactory::createUIElement called without ParentWindow"),
121              NULL);
122      if ( ! xFrame.is())
123          throw RuntimeException(
124              A2S("PanelFactory::createUIElement called without Frame"),
125              NULL);
126      if (pBindings == NULL)
127          throw RuntimeException(
128              A2S("PanelFactory::createUIElement called without SfxBindings"),
129              NULL);
130  
131  #define DoesResourceEndWith(s) rsResourceURL.endsWithAsciiL(s,strlen(s))
132      if (DoesResourceEndWith("/TextPropertyPanel"))
133      {
134          TextPropertyPanel* pPanel = TextPropertyPanel::Create(pParentWindow, xFrame, pBindings);
135          xElement = sfx2::sidebar::SidebarPanelBase::Create(
136              rsResourceURL,
137              xFrame,
138              pPanel,
139              ::boost::bind(&TextPropertyPanel::ShowMenu, pPanel),
140              ui::LayoutSize(-1,-1,-1));
141      }
142      else if (DoesResourceEndWith("/AreaPropertyPanel"))
143      {
144          AreaPropertyPanel* pPanel = AreaPropertyPanel::Create(pParentWindow, xFrame, pBindings);
145          xElement = sfx2::sidebar::SidebarPanelBase::Create(
146              rsResourceURL,
147              xFrame,
148              pPanel,
149              ::boost::bind(&AreaPropertyPanel::ShowMenu, pPanel),
150              ui::LayoutSize(-1,-1,-1));
151      }
152      else if (DoesResourceEndWith("/GraphicPropertyPanel"))
153      {
154          GraphicPropertyPanel* pPanel = GraphicPropertyPanel::Create(pParentWindow, xFrame, pBindings);
155          xElement = sfx2::sidebar::SidebarPanelBase::Create(
156              rsResourceURL,
157              xFrame,
158              pPanel,
159              ::boost::function<void(void)>(),
160              ui::LayoutSize(-1,-1,-1));
161      }
162      else if (DoesResourceEndWith("/LinePropertyPanel"))
163      {
164          LinePropertyPanel* pPanel = LinePropertyPanel::Create(pParentWindow, xFrame, pBindings);
165          xElement = sfx2::sidebar::SidebarPanelBase::Create(
166              rsResourceURL,
167              xFrame,
168              pPanel,
169              ::boost::bind(&LinePropertyPanel::ShowMenu, pPanel),
170              ui::LayoutSize(-1,-1,-1));
171      }
172      else if (DoesResourceEndWith("/PosSizePropertyPanel"))
173      {
174          PosSizePropertyPanel* pPanel = PosSizePropertyPanel::Create(pParentWindow, xFrame, pBindings);
175          xElement = sfx2::sidebar::SidebarPanelBase::Create(
176              rsResourceURL,
177              xFrame,
178              pPanel,
179              ::boost::bind(&PosSizePropertyPanel::ShowMenu, pPanel),
180              ui::LayoutSize(-1,-1,-1));
181      }
182      else if (DoesResourceEndWith("/GalleryPanel"))
183      {
184          GalleryControl* pGalleryControl = new GalleryControl(
185              pBindings,
186              pParentWindow);
187          xElement = sfx2::sidebar::SidebarPanelBase::Create(
188              rsResourceURL,
189              xFrame,
190              pGalleryControl,
191              ::boost::function<void(void)>(),
192              ui::LayoutSize(300,-1,400));
193      }
194      else if (DoesResourceEndWith("/Debug_ColorPanel"))
195      {
196          ColorPanel* pColorPanel = new ColorPanel(
197              pParentWindow);
198          xElement = sfx2::sidebar::SidebarPanelBase::Create(
199              rsResourceURL,
200              xFrame,
201              pColorPanel,
202              ::boost::function<void(void)>(),
203              ui::LayoutSize(300,-1,400));
204      }
205  #undef DoesResourceEndWith
206  
207      return xElement;
208  }
209  
210  } } // end of namespace svx::sidebar
211  
212  // eof
213