Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "itemholder2.hxx"
22 :
23 : #include <comphelper/processfactory.hxx>
24 : #include <com/sun/star/lang/XComponent.hpp>
25 : #include <com/sun/star/configuration/theDefaultProvider.hpp>
26 :
27 : #include <svl/cjkoptions.hxx>
28 : #include <svl/ctloptions.hxx>
29 : #include <svl/languageoptions.hxx>
30 : #include <unotools/options.hxx>
31 :
32 274 : ItemHolder2::ItemHolder2()
33 274 : : ItemHolderMutexBase()
34 : {
35 : try
36 : {
37 274 : css::uno::Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
38 548 : css::uno::Reference< css::lang::XComponent > xCfg( css::configuration::theDefaultProvider::get(xContext), css::uno::UNO_QUERY_THROW );
39 548 : xCfg->addEventListener(static_cast< css::lang::XEventListener* >(this));
40 : }
41 0 : catch(const css::uno::RuntimeException&)
42 : {
43 0 : throw;
44 : }
45 : #ifdef DBG_UTIL
46 : catch(const css::uno::Exception& rEx)
47 : {
48 : static bool bMessage = true;
49 : if(bMessage)
50 : {
51 : bMessage = false;
52 : OString sMsg("CreateInstance with arguments exception: ");
53 : sMsg += OString(rEx.Message.getStr(),
54 : rEx.Message.getLength(),
55 : RTL_TEXTENCODING_ASCII_US);
56 : OSL_FAIL(sMsg.getStr());
57 : }
58 : }
59 : #else
60 0 : catch(css::uno::Exception&){}
61 : #endif
62 274 : }
63 :
64 816 : ItemHolder2::~ItemHolder2()
65 : {
66 272 : impl_releaseAllItems();
67 544 : }
68 :
69 460 : void ItemHolder2::holdConfigItem(EItem eItem)
70 : {
71 460 : static ItemHolder2* pHolder = new ItemHolder2();
72 460 : pHolder->impl_addItem(eItem);
73 460 : }
74 :
75 272 : void SAL_CALL ItemHolder2::disposing(const css::lang::EventObject&)
76 : throw(css::uno::RuntimeException, std::exception)
77 : {
78 272 : impl_releaseAllItems();
79 272 : }
80 :
81 460 : void ItemHolder2::impl_addItem(EItem eItem)
82 : {
83 460 : ::osl::ResettableMutexGuard aLock(m_aLock);
84 :
85 460 : TItems::const_iterator pIt;
86 1938 : for ( pIt = m_lItems.begin();
87 1292 : pIt != m_lItems.end() ;
88 : ++pIt )
89 : {
90 186 : const TItemInfo& rInfo = *pIt;
91 186 : if (rInfo.eItem == eItem)
92 460 : return;
93 : }
94 :
95 460 : TItemInfo aNewItem;
96 460 : aNewItem.eItem = eItem;
97 460 : impl_newItem(aNewItem);
98 460 : if (aNewItem.pItem)
99 460 : m_lItems.push_back(aNewItem);
100 : }
101 :
102 544 : void ItemHolder2::impl_releaseAllItems()
103 : {
104 544 : ::osl::ResettableMutexGuard aLock(m_aLock);
105 :
106 544 : TItems::iterator pIt;
107 3006 : for ( pIt = m_lItems.begin();
108 2004 : pIt != m_lItems.end() ;
109 : ++pIt )
110 : {
111 458 : TItemInfo& rInfo = *pIt;
112 458 : impl_deleteItem(rInfo);
113 : }
114 544 : m_lItems.clear();
115 544 : }
116 :
117 460 : void ItemHolder2::impl_newItem(TItemInfo& rItem)
118 : {
119 460 : switch(rItem.eItem)
120 : {
121 : case E_CJKOPTIONS :
122 186 : rItem.pItem = new SvtCJKOptions();
123 186 : break;
124 :
125 : case E_CTLOPTIONS :
126 274 : rItem.pItem = new SvtCTLOptions();
127 274 : break;
128 :
129 : case E_LANGUAGEOPTIONS :
130 : // capsulate CTL and CJL options ! rItem.pItem = new SvtLanguageOptions();
131 0 : break;
132 :
133 : default:
134 : OSL_ASSERT(false);
135 0 : break;
136 : }
137 460 : }
138 :
139 458 : void ItemHolder2::impl_deleteItem(TItemInfo& rItem)
140 : {
141 458 : if (rItem.pItem)
142 : {
143 458 : delete rItem.pItem;
144 458 : rItem.pItem = 0;
145 : }
146 458 : }
147 :
148 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|