1b9e67834SAndre Fischer /************************************************************** 2b9e67834SAndre Fischer * 3b9e67834SAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one 4b9e67834SAndre Fischer * or more contributor license agreements. See the NOTICE file 5b9e67834SAndre Fischer * distributed with this work for additional information 6b9e67834SAndre Fischer * regarding copyright ownership. The ASF licenses this file 7b9e67834SAndre Fischer * to you under the Apache License, Version 2.0 (the 8b9e67834SAndre Fischer * "License"); you may not use this file except in compliance 9b9e67834SAndre Fischer * with the License. You may obtain a copy of the License at 10b9e67834SAndre Fischer * 11b9e67834SAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0 12b9e67834SAndre Fischer * 13b9e67834SAndre Fischer * Unless required by applicable law or agreed to in writing, 14b9e67834SAndre Fischer * software distributed under the License is distributed on an 15b9e67834SAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16b9e67834SAndre Fischer * KIND, either express or implied. See the License for the 17b9e67834SAndre Fischer * specific language governing permissions and limitations 18b9e67834SAndre Fischer * under the License. 19b9e67834SAndre Fischer * 20b9e67834SAndre Fischer *************************************************************/ 21b9e67834SAndre Fischer 22b9e67834SAndre Fischer #include "precompiled_sfx2.hxx" 23b9e67834SAndre Fischer 24b9e67834SAndre Fischer #include "sidebar/EnumContext.hxx" 25b9e67834SAndre Fischer 2695a18594SAndre Fischer #include <map> 2795a18594SAndre Fischer 28b9e67834SAndre Fischer namespace sfx2 { namespace sidebar { 29b9e67834SAndre Fischer 30b9e67834SAndre Fischer #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString))) 31b9e67834SAndre Fischer 32b9e67834SAndre Fischer namespace { 33b9e67834SAndre Fischer 34b9e67834SAndre Fischer typedef ::std::map<rtl::OUString,EnumContext::Application> ApplicationMap; 35b9e67834SAndre Fischer typedef ::std::vector<rtl::OUString> ApplicationVector; 36b9e67834SAndre Fischer static ApplicationMap maApplicationMap; 37b9e67834SAndre Fischer static ApplicationVector maApplicationVector; 38b9e67834SAndre Fischer 39b9e67834SAndre Fischer typedef ::std::map<rtl::OUString,EnumContext::Context> ContextMap; 40b9e67834SAndre Fischer typedef ::std::vector<rtl::OUString> ContextVector; 41b9e67834SAndre Fischer static ContextMap maContextMap; 42b9e67834SAndre Fischer static ContextVector maContextVector; 43b9e67834SAndre Fischer 44b9e67834SAndre Fischer } 45b9e67834SAndre Fischer 4695a18594SAndre Fischer const sal_Int32 EnumContext::NoMatch = 4; 4795a18594SAndre Fischer const sal_Int32 EnumContext::OptimalMatch = 0; // Neither application nor context name is "any". 48b9e67834SAndre Fischer 49b9e67834SAndre Fischer 50b9e67834SAndre Fischer EnumContext::EnumContext (void) 51f120fe41SAndre Fischer : meApplication(Application_None), 5295a18594SAndre Fischer meContext(Context_Unknown) 53b9e67834SAndre Fischer { 54b9e67834SAndre Fischer } 55b9e67834SAndre Fischer 56b9e67834SAndre Fischer 57b9e67834SAndre Fischer 58b9e67834SAndre Fischer 59b9e67834SAndre Fischer EnumContext::EnumContext ( 60b9e67834SAndre Fischer const Application eApplication, 61b9e67834SAndre Fischer const Context eContext) 62b9e67834SAndre Fischer : meApplication(eApplication), 63b9e67834SAndre Fischer meContext(eContext) 64b9e67834SAndre Fischer { 65b9e67834SAndre Fischer } 66b9e67834SAndre Fischer 67b9e67834SAndre Fischer 68b9e67834SAndre Fischer 69b9e67834SAndre Fischer 7095a18594SAndre Fischer EnumContext::EnumContext ( 7195a18594SAndre Fischer const ::rtl::OUString& rsApplicationName, 7295a18594SAndre Fischer const ::rtl::OUString& rsContextName) 7395a18594SAndre Fischer : meApplication(GetApplicationEnum(rsApplicationName)), 7495a18594SAndre Fischer meContext(GetContextEnum(rsContextName)) 7595a18594SAndre Fischer { 7695a18594SAndre Fischer } 7795a18594SAndre Fischer 7895a18594SAndre Fischer 7995a18594SAndre Fischer 8095a18594SAndre Fischer 81b9e67834SAndre Fischer sal_Int32 EnumContext::GetCombinedContext (void) const 82b9e67834SAndre Fischer { 83b9e67834SAndre Fischer return CombinedEnumContext(meApplication, meContext); 84b9e67834SAndre Fischer } 85b9e67834SAndre Fischer 86b9e67834SAndre Fischer 87b9e67834SAndre Fischer 88b9e67834SAndre Fischer 89f120fe41SAndre Fischer sal_Int32 EnumContext::GetCombinedContext_DI (void) const 90f120fe41SAndre Fischer { 91f120fe41SAndre Fischer switch (meApplication) 92f120fe41SAndre Fischer { 93f120fe41SAndre Fischer case Application_Draw: 94f120fe41SAndre Fischer case Application_Impress: 95f120fe41SAndre Fischer return CombinedEnumContext(Application_DrawImpress, meContext); 96f120fe41SAndre Fischer 97*dfbb0ba8SAndre Fischer case Application_Writer: 98*dfbb0ba8SAndre Fischer case Application_WriterWeb: 99*dfbb0ba8SAndre Fischer return CombinedEnumContext(Application_WriterAndWeb, meContext); 100*dfbb0ba8SAndre Fischer 101f120fe41SAndre Fischer default: 102f120fe41SAndre Fischer return CombinedEnumContext(meApplication, meContext); 103f120fe41SAndre Fischer } 104f120fe41SAndre Fischer } 105f120fe41SAndre Fischer 106f120fe41SAndre Fischer 107f120fe41SAndre Fischer 108f120fe41SAndre Fischer 10995a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (void) const 11095a18594SAndre Fischer { 11195a18594SAndre Fischer return EnumContext::GetApplicationName(meApplication); 11295a18594SAndre Fischer } 11395a18594SAndre Fischer 11495a18594SAndre Fischer 11595a18594SAndre Fischer 11695a18594SAndre Fischer 11795a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (void) const 11895a18594SAndre Fischer { 11995a18594SAndre Fischer return EnumContext::GetContextName(meContext); 12095a18594SAndre Fischer } 12195a18594SAndre Fischer 12295a18594SAndre Fischer 12395a18594SAndre Fischer 12495a18594SAndre Fischer 125b9e67834SAndre Fischer bool EnumContext::operator== (const EnumContext aOther) 126b9e67834SAndre Fischer { 127b9e67834SAndre Fischer return meApplication==aOther.meApplication 128b9e67834SAndre Fischer && meContext==aOther.meContext; 129b9e67834SAndre Fischer } 130b9e67834SAndre Fischer 131b9e67834SAndre Fischer 132b9e67834SAndre Fischer 133b9e67834SAndre Fischer 13495a18594SAndre Fischer bool EnumContext::operator!= (const EnumContext aOther) 13595a18594SAndre Fischer { 13695a18594SAndre Fischer return meApplication!=aOther.meApplication 13795a18594SAndre Fischer || meContext!=aOther.meContext; 13895a18594SAndre Fischer } 13995a18594SAndre Fischer 14095a18594SAndre Fischer 14195a18594SAndre Fischer 14295a18594SAndre Fischer 143b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Application eApplication) 144b9e67834SAndre Fischer { 145b9e67834SAndre Fischer maApplicationMap[rsName] = eApplication; 146b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastApplicationEnum); 14795a18594SAndre Fischer if (maApplicationVector.size() <= size_t(eApplication)) 148b9e67834SAndre Fischer maApplicationVector.resize(eApplication+1); 149b9e67834SAndre Fischer maApplicationVector[eApplication]=rsName; 150b9e67834SAndre Fischer } 151b9e67834SAndre Fischer 152b9e67834SAndre Fischer 153b9e67834SAndre Fischer 154b9e67834SAndre Fischer 155b9e67834SAndre Fischer void EnumContext::ProvideApplicationContainers (void) 156b9e67834SAndre Fischer { 157b9e67834SAndre Fischer if (maApplicationMap.empty()) 158b9e67834SAndre Fischer { 159b9e67834SAndre Fischer maApplicationVector.resize(static_cast<size_t>(EnumContext::__LastApplicationEnum)+1); 160b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.text.TextDocument"), EnumContext::Application_Writer); 161*dfbb0ba8SAndre Fischer AddEntry(A2S("com.sun.star.text.WebDocument"), EnumContext::Application_WriterWeb); 16295a18594SAndre Fischer AddEntry(A2S("com.sun.star.sheet.SpreadsheetDocument"), EnumContext::Application_Calc); 16395a18594SAndre Fischer AddEntry(A2S("com.sun.star.drawing.DrawingDocument"), EnumContext::Application_Draw); 164b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.presentation.PresentationDocument"), EnumContext::Application_Impress); 165f120fe41SAndre Fischer 16695a18594SAndre Fischer AddEntry(A2S("any"), EnumContext::Application_Any); 167f120fe41SAndre Fischer AddEntry(A2S("none"), EnumContext::Application_None); 168b9e67834SAndre Fischer } 169b9e67834SAndre Fischer } 170b9e67834SAndre Fischer 171b9e67834SAndre Fischer 172b9e67834SAndre Fischer 173b9e67834SAndre Fischer 174b9e67834SAndre Fischer EnumContext::Application EnumContext::GetApplicationEnum (const ::rtl::OUString& rsApplicationName) 175b9e67834SAndre Fischer { 176b9e67834SAndre Fischer ProvideApplicationContainers(); 177b9e67834SAndre Fischer 178b9e67834SAndre Fischer ApplicationMap::const_iterator iApplication( 179b9e67834SAndre Fischer maApplicationMap.find(rsApplicationName)); 180b9e67834SAndre Fischer if (iApplication != maApplicationMap.end()) 181b9e67834SAndre Fischer return iApplication->second; 182b9e67834SAndre Fischer else 183f120fe41SAndre Fischer return EnumContext::Application_None; 184b9e67834SAndre Fischer } 185b9e67834SAndre Fischer 186b9e67834SAndre Fischer 187b9e67834SAndre Fischer 188b9e67834SAndre Fischer 189b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (const Application eApplication) 190b9e67834SAndre Fischer { 191b9e67834SAndre Fischer ProvideApplicationContainers(); 192b9e67834SAndre Fischer 193b9e67834SAndre Fischer const sal_Int32 nIndex (eApplication); 194b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastApplicationEnum) 195f120fe41SAndre Fischer return maApplicationVector[Application_None]; 196b9e67834SAndre Fischer else 197b9e67834SAndre Fischer return maApplicationVector[nIndex]; 198b9e67834SAndre Fischer } 199b9e67834SAndre Fischer 200b9e67834SAndre Fischer 201b9e67834SAndre Fischer 202b9e67834SAndre Fischer 203b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Context eApplication) 204b9e67834SAndre Fischer { 205b9e67834SAndre Fischer maContextMap[rsName] = eApplication; 206b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastContextEnum); 20795a18594SAndre Fischer if (maContextVector.size() <= size_t(eApplication)) 208b9e67834SAndre Fischer maContextVector.resize(eApplication+1); 209b9e67834SAndre Fischer maContextVector[eApplication] = rsName; 210b9e67834SAndre Fischer } 211b9e67834SAndre Fischer 212b9e67834SAndre Fischer 213b9e67834SAndre Fischer 214b9e67834SAndre Fischer 215b9e67834SAndre Fischer void EnumContext::ProvideContextContainers (void) 216b9e67834SAndre Fischer { 217b9e67834SAndre Fischer if (maContextMap.empty()) 218b9e67834SAndre Fischer { 219b9e67834SAndre Fischer maContextVector.resize(static_cast<size_t>(__LastContextEnum)+1); 22095a18594SAndre Fischer AddEntry(A2S("any"), Context_Any); 221b9e67834SAndre Fischer AddEntry(A2S("default"), Context_Default); 22254eaaa32SAndre Fischer AddEntry(A2S("empty"), Context_Empty); 223f120fe41SAndre Fischer #define AddContext(context) AddEntry(A2S(#context), Context_##context); 224f120fe41SAndre Fischer AddContext(3DObject); 225f120fe41SAndre Fischer AddContext(Annotation); 226f120fe41SAndre Fischer AddContext(Auditing); 227f120fe41SAndre Fischer AddContext(Cell); 228f120fe41SAndre Fischer AddContext(Chart); 229f120fe41SAndre Fischer AddContext(Chart); 230f120fe41SAndre Fischer AddContext(Draw); 231f120fe41SAndre Fischer AddContext(DrawPage); 232f120fe41SAndre Fischer AddContext(DrawText); 233f120fe41SAndre Fischer AddContext(EditCell); 234f120fe41SAndre Fischer AddContext(Form); 235f120fe41SAndre Fischer AddContext(Frame); 236f120fe41SAndre Fischer AddContext(Graphic); 237f120fe41SAndre Fischer AddContext(HandoutPage); 238f120fe41SAndre Fischer AddContext(MasterPage); 239f120fe41SAndre Fischer AddContext(Media); 240f120fe41SAndre Fischer AddContext(MultiObject); 241f120fe41SAndre Fischer AddContext(NotesPage); 242f120fe41SAndre Fischer AddContext(OLE); 243f120fe41SAndre Fischer AddContext(OutlineText); 244f120fe41SAndre Fischer AddContext(Pivot); 245f120fe41SAndre Fischer AddContext(SlidesorterPage); 246f120fe41SAndre Fischer AddContext(Table); 247f120fe41SAndre Fischer AddContext(Text); 248f120fe41SAndre Fischer AddContext(TextObject); 249f120fe41SAndre Fischer #undef AddContext 250b9e67834SAndre Fischer } 251b9e67834SAndre Fischer } 252b9e67834SAndre Fischer 253b9e67834SAndre Fischer 254b9e67834SAndre Fischer 255b9e67834SAndre Fischer 256b9e67834SAndre Fischer EnumContext::Context EnumContext::GetContextEnum (const ::rtl::OUString& rsContextName) 257b9e67834SAndre Fischer { 258b9e67834SAndre Fischer ProvideContextContainers(); 259b9e67834SAndre Fischer 260b9e67834SAndre Fischer ContextMap::const_iterator iContext( 261b9e67834SAndre Fischer maContextMap.find(rsContextName)); 262b9e67834SAndre Fischer if (iContext != maContextMap.end()) 263b9e67834SAndre Fischer return iContext->second; 264b9e67834SAndre Fischer else 26595a18594SAndre Fischer return EnumContext::Context_Unknown; 266b9e67834SAndre Fischer } 267b9e67834SAndre Fischer 268b9e67834SAndre Fischer 269b9e67834SAndre Fischer 270b9e67834SAndre Fischer 271b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (const Context eContext) 272b9e67834SAndre Fischer { 273b9e67834SAndre Fischer ProvideContextContainers(); 274b9e67834SAndre Fischer 275b9e67834SAndre Fischer const sal_Int32 nIndex (eContext); 276b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastContextEnum) 27795a18594SAndre Fischer return maContextVector[Context_Unknown]; 278b9e67834SAndre Fischer else 279b9e67834SAndre Fischer return maContextVector[nIndex]; 280b9e67834SAndre Fischer } 281b9e67834SAndre Fischer 282b9e67834SAndre Fischer 283b9e67834SAndre Fischer 284b9e67834SAndre Fischer 28595a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch ( 28695a18594SAndre Fischer const EnumContext& rOther) const 28795a18594SAndre Fischer { 28895a18594SAndre Fischer const bool bApplicationNameIsAny (rOther.meApplication == Application_Any); 28995a18594SAndre Fischer if (rOther.meApplication==meApplication || bApplicationNameIsAny) 29095a18594SAndre Fischer { 29195a18594SAndre Fischer // Application name matches. 29295a18594SAndre Fischer const bool bContextNameIsAny (rOther.meContext == Context_Any); 29395a18594SAndre Fischer if (rOther.meContext==meContext || bContextNameIsAny) 29495a18594SAndre Fischer { 29595a18594SAndre Fischer // Context name matches. 29695a18594SAndre Fischer return (bApplicationNameIsAny ? 1 : 0) 29795a18594SAndre Fischer + (bContextNameIsAny ? 2 : 0); 29895a18594SAndre Fischer } 29995a18594SAndre Fischer } 30095a18594SAndre Fischer return NoMatch; 30195a18594SAndre Fischer } 30295a18594SAndre Fischer 30395a18594SAndre Fischer 30495a18594SAndre Fischer 30595a18594SAndre Fischer 30695a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch (const ::std::vector<EnumContext>& rOthers) const 30795a18594SAndre Fischer { 30895a18594SAndre Fischer sal_Int32 nBestMatch (NoMatch); 30995a18594SAndre Fischer 31095a18594SAndre Fischer for (::std::vector<EnumContext>::const_iterator 31195a18594SAndre Fischer iContext(rOthers.begin()), 31295a18594SAndre Fischer iEnd(rOthers.end()); 31395a18594SAndre Fischer iContext!=iEnd; 31495a18594SAndre Fischer ++iContext) 31595a18594SAndre Fischer { 31695a18594SAndre Fischer const sal_Int32 nMatch (EvaluateMatch(*iContext)); 31795a18594SAndre Fischer if (nMatch < nBestMatch) 31895a18594SAndre Fischer { 31995a18594SAndre Fischer if (nMatch == OptimalMatch) 32095a18594SAndre Fischer { 32195a18594SAndre Fischer // We will find no better match so stop searching. 32295a18594SAndre Fischer return OptimalMatch; 32395a18594SAndre Fischer } 32495a18594SAndre Fischer nBestMatch = nMatch; 32595a18594SAndre Fischer } 32695a18594SAndre Fischer } 32795a18594SAndre Fischer return nBestMatch; 32895a18594SAndre Fischer } 32995a18594SAndre Fischer 33095a18594SAndre Fischer 33195a18594SAndre Fischer 332b9e67834SAndre Fischer } } // end of namespace sfx2::sidebar 333