Merge branch 'devel/master' into tizen
[platform/core/uifw/dali-adaptor.git] / dali / internal / styling / common / style-monitor-impl.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/styling/common/style-monitor-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/devel-api/adaptor-framework/file-loader.h>
23 #include <dali/devel-api/common/singleton-service.h>
24 #include <dali/integration-api/debug.h>
25 #include <dali/public-api/object/type-registry.h>
26
27 // INTERNAL INCLUDES
28 #include <dali/internal/adaptor/common/adaptor-impl.h>
29
30 namespace Dali
31 {
32 namespace Internal
33 {
34 namespace Adaptor
35 {
36 namespace
37 {
38 #if defined(DEBUG_ENABLED)
39 Dali::Integration::Log::Filter* gLogFilter = Dali::Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_STYLE_MONITOR");
40 #endif
41
42 /**
43  * Use font client to get the system default font family
44  * @param[in] fontClient handle to font client
45  * @param[out] fontFamily string representing font family
46  */
47 void GetSystemDefaultFontFamily(TextAbstraction::FontClient& fontClient, std::string& fontFamily)
48 {
49   TextAbstraction::FontDescription defaultFontDescription;
50   if(fontClient)
51   {
52     fontClient.GetDefaultPlatformFontDescription(defaultFontDescription);
53     fontFamily = defaultFontDescription.family;
54   }
55 }
56
57 } // unnamed namespace
58
59 Dali::StyleMonitor StyleMonitor::Get()
60 {
61   Dali::StyleMonitor styleMonitor;
62
63   Dali::SingletonService service(SingletonService::Get());
64   if(service)
65   {
66     // Check whether the singleton is already created
67     Dali::BaseHandle handle = service.GetSingleton(typeid(Dali::StyleMonitor));
68     if(handle)
69     {
70       // If so, downcast the handle
71       styleMonitor = Dali::StyleMonitor(dynamic_cast<StyleMonitor*>(handle.GetObjectPtr()));
72     }
73     else
74     {
75       styleMonitor = Dali::StyleMonitor(new StyleMonitor());
76       service.Register(typeid(styleMonitor), styleMonitor);
77     }
78   }
79
80   return styleMonitor;
81 }
82
83 StyleMonitor::StyleMonitor()
84 : mDefaultFontSize(-1)
85 {
86   mFontClient = TextAbstraction::FontClient::Get();
87   GetSystemDefaultFontFamily(mFontClient, mDefaultFontFamily);
88   DALI_LOG_INFO(gLogFilter, Debug::Verbose, "StyleMonitor::StyleMonitor::DefaultFontFamily(%s)\n", mDefaultFontFamily.c_str());
89   mDefaultFontSize = mFontClient.GetDefaultFontSize();
90 }
91
92 StyleMonitor::~StyleMonitor()
93 {
94 }
95
96 void StyleMonitor::StyleChanged(StyleChange::Type styleChange)
97 {
98   switch(styleChange)
99   {
100     case StyleChange::DEFAULT_FONT_CHANGE:
101     {
102       if(mFontClient)
103       {
104         mFontClient.ResetSystemDefaults();
105         GetSystemDefaultFontFamily(mFontClient, mDefaultFontFamily);
106       }
107       DALI_LOG_INFO(gLogFilter, Debug::Verbose, "StyleMonitor::StyleChanged::DefaultFontFamily(%s)\n", mDefaultFontFamily.c_str());
108       break;
109     }
110
111     case StyleChange::DEFAULT_FONT_SIZE_CHANGE:
112     {
113       mDefaultFontSize = mFontClient.GetDefaultFontSize();
114       break;
115     }
116
117     case StyleChange::THEME_CHANGE:
118     {
119       break;
120     }
121   }
122
123   EmitStyleChangeSignal(styleChange);
124 }
125
126 std::string StyleMonitor::GetDefaultFontFamily() const
127 {
128   return mDefaultFontFamily;
129 }
130
131 std::string StyleMonitor::GetDefaultFontStyle() const
132 {
133   return mDefaultFontStyle;
134 }
135
136 int StyleMonitor::GetDefaultFontSize() const
137 {
138   return mDefaultFontSize;
139 }
140
141 const std::string& StyleMonitor::GetTheme() const
142 {
143   return mUserDefinedThemeFilePath;
144 }
145
146 void StyleMonitor::SetTheme(const std::string& path)
147 {
148   mUserDefinedThemeFilePath = path;
149   EmitStyleChangeSignal(StyleChange::THEME_CHANGE);
150 }
151
152 bool StyleMonitor::LoadThemeFile(const std::string& filename, std::string& output)
153 {
154   bool retval(false);
155
156   std::streampos     bufferSize = 0;
157   Dali::Vector<char> fileBuffer;
158   if(Dali::FileLoader::ReadFile(filename, bufferSize, fileBuffer, FileLoader::FileType::BINARY))
159   {
160     output.assign(&fileBuffer[0], bufferSize);
161     retval = true;
162   }
163
164   return retval;
165 }
166
167 Dali::StyleMonitor::StyleChangeSignalType& StyleMonitor::StyleChangeSignal()
168 {
169   return mStyleChangeSignal;
170 }
171
172 void StyleMonitor::EmitStyleChangeSignal(StyleChange::Type styleChange)
173 {
174   if(!mStyleChangeSignal.Empty())
175   {
176     DALI_LOG_INFO(gLogFilter, Debug::Verbose, "StyleMonitor::EmitStyleChangeSignal\n");
177     Dali::StyleMonitor handle(this);
178     mStyleChangeSignal.Emit(handle, styleChange);
179   }
180 }
181
182 } // namespace Adaptor
183
184 } // namespace Internal
185
186 } // namespace Dali