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 97dfbb0ba8SAndre Fischer case Application_Writer: 98*85f1aca2SAndre Fischer case Application_WriterGlobal: 99dfbb0ba8SAndre Fischer case Application_WriterWeb: 100*85f1aca2SAndre Fischer case Application_WriterXML: 101*85f1aca2SAndre Fischer return CombinedEnumContext(Application_WriterVariants, meContext); 102dfbb0ba8SAndre Fischer 103f120fe41SAndre Fischer default: 104f120fe41SAndre Fischer return CombinedEnumContext(meApplication, meContext); 105f120fe41SAndre Fischer } 106f120fe41SAndre Fischer } 107f120fe41SAndre Fischer 108f120fe41SAndre Fischer 109f120fe41SAndre Fischer 110f120fe41SAndre Fischer 11195a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (void) const 11295a18594SAndre Fischer { 11395a18594SAndre Fischer return EnumContext::GetApplicationName(meApplication); 11495a18594SAndre Fischer } 11595a18594SAndre Fischer 11695a18594SAndre Fischer 11795a18594SAndre Fischer 11895a18594SAndre Fischer 11995a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (void) const 12095a18594SAndre Fischer { 12195a18594SAndre Fischer return EnumContext::GetContextName(meContext); 12295a18594SAndre Fischer } 12395a18594SAndre Fischer 12495a18594SAndre Fischer 12595a18594SAndre Fischer 12695a18594SAndre Fischer 127b9e67834SAndre Fischer bool EnumContext::operator== (const EnumContext aOther) 128b9e67834SAndre Fischer { 129b9e67834SAndre Fischer return meApplication==aOther.meApplication 130b9e67834SAndre Fischer && meContext==aOther.meContext; 131b9e67834SAndre Fischer } 132b9e67834SAndre Fischer 133b9e67834SAndre Fischer 134b9e67834SAndre Fischer 135b9e67834SAndre Fischer 13695a18594SAndre Fischer bool EnumContext::operator!= (const EnumContext aOther) 13795a18594SAndre Fischer { 13895a18594SAndre Fischer return meApplication!=aOther.meApplication 13995a18594SAndre Fischer || meContext!=aOther.meContext; 14095a18594SAndre Fischer } 14195a18594SAndre Fischer 14295a18594SAndre Fischer 14395a18594SAndre Fischer 14495a18594SAndre Fischer 145b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Application eApplication) 146b9e67834SAndre Fischer { 147b9e67834SAndre Fischer maApplicationMap[rsName] = eApplication; 148b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastApplicationEnum); 14995a18594SAndre Fischer if (maApplicationVector.size() <= size_t(eApplication)) 150b9e67834SAndre Fischer maApplicationVector.resize(eApplication+1); 151b9e67834SAndre Fischer maApplicationVector[eApplication]=rsName; 152b9e67834SAndre Fischer } 153b9e67834SAndre Fischer 154b9e67834SAndre Fischer 155b9e67834SAndre Fischer 156b9e67834SAndre Fischer 157b9e67834SAndre Fischer void EnumContext::ProvideApplicationContainers (void) 158b9e67834SAndre Fischer { 159b9e67834SAndre Fischer if (maApplicationMap.empty()) 160b9e67834SAndre Fischer { 161b9e67834SAndre Fischer maApplicationVector.resize(static_cast<size_t>(EnumContext::__LastApplicationEnum)+1); 162b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.text.TextDocument"), EnumContext::Application_Writer); 163*85f1aca2SAndre Fischer AddEntry(A2S("com.sun.star.text.GlobalDocument"), EnumContext::Application_WriterGlobal); 164dfbb0ba8SAndre Fischer AddEntry(A2S("com.sun.star.text.WebDocument"), EnumContext::Application_WriterWeb); 165*85f1aca2SAndre Fischer AddEntry(A2S("com.sun.star.xforms.XMLFormDocument"), EnumContext::Application_WriterXML); 16695a18594SAndre Fischer AddEntry(A2S("com.sun.star.sheet.SpreadsheetDocument"), EnumContext::Application_Calc); 16795a18594SAndre Fischer AddEntry(A2S("com.sun.star.drawing.DrawingDocument"), EnumContext::Application_Draw); 168b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.presentation.PresentationDocument"), EnumContext::Application_Impress); 169f120fe41SAndre Fischer 17095a18594SAndre Fischer AddEntry(A2S("any"), EnumContext::Application_Any); 171f120fe41SAndre Fischer AddEntry(A2S("none"), EnumContext::Application_None); 172b9e67834SAndre Fischer } 173b9e67834SAndre Fischer } 174b9e67834SAndre Fischer 175b9e67834SAndre Fischer 176b9e67834SAndre Fischer 177b9e67834SAndre Fischer 178b9e67834SAndre Fischer EnumContext::Application EnumContext::GetApplicationEnum (const ::rtl::OUString& rsApplicationName) 179b9e67834SAndre Fischer { 180b9e67834SAndre Fischer ProvideApplicationContainers(); 181b9e67834SAndre Fischer 182b9e67834SAndre Fischer ApplicationMap::const_iterator iApplication( 183b9e67834SAndre Fischer maApplicationMap.find(rsApplicationName)); 184b9e67834SAndre Fischer if (iApplication != maApplicationMap.end()) 185b9e67834SAndre Fischer return iApplication->second; 186b9e67834SAndre Fischer else 187f120fe41SAndre Fischer return EnumContext::Application_None; 188b9e67834SAndre Fischer } 189b9e67834SAndre Fischer 190b9e67834SAndre Fischer 191b9e67834SAndre Fischer 192b9e67834SAndre Fischer 193b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (const Application eApplication) 194b9e67834SAndre Fischer { 195b9e67834SAndre Fischer ProvideApplicationContainers(); 196b9e67834SAndre Fischer 197b9e67834SAndre Fischer const sal_Int32 nIndex (eApplication); 198b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastApplicationEnum) 199f120fe41SAndre Fischer return maApplicationVector[Application_None]; 200b9e67834SAndre Fischer else 201b9e67834SAndre Fischer return maApplicationVector[nIndex]; 202b9e67834SAndre Fischer } 203b9e67834SAndre Fischer 204b9e67834SAndre Fischer 205b9e67834SAndre Fischer 206b9e67834SAndre Fischer 207b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Context eApplication) 208b9e67834SAndre Fischer { 209b9e67834SAndre Fischer maContextMap[rsName] = eApplication; 210b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastContextEnum); 21195a18594SAndre Fischer if (maContextVector.size() <= size_t(eApplication)) 212b9e67834SAndre Fischer maContextVector.resize(eApplication+1); 213b9e67834SAndre Fischer maContextVector[eApplication] = rsName; 214b9e67834SAndre Fischer } 215b9e67834SAndre Fischer 216b9e67834SAndre Fischer 217b9e67834SAndre Fischer 218b9e67834SAndre Fischer 219b9e67834SAndre Fischer void EnumContext::ProvideContextContainers (void) 220b9e67834SAndre Fischer { 221b9e67834SAndre Fischer if (maContextMap.empty()) 222b9e67834SAndre Fischer { 223b9e67834SAndre Fischer maContextVector.resize(static_cast<size_t>(__LastContextEnum)+1); 22495a18594SAndre Fischer AddEntry(A2S("any"), Context_Any); 225b9e67834SAndre Fischer AddEntry(A2S("default"), Context_Default); 22654eaaa32SAndre Fischer AddEntry(A2S("empty"), Context_Empty); 227f120fe41SAndre Fischer #define AddContext(context) AddEntry(A2S(#context), Context_##context); 228f120fe41SAndre Fischer AddContext(3DObject); 229f120fe41SAndre Fischer AddContext(Annotation); 230f120fe41SAndre Fischer AddContext(Auditing); 231f120fe41SAndre Fischer AddContext(Cell); 232f120fe41SAndre Fischer AddContext(Chart); 233f120fe41SAndre Fischer AddContext(Chart); 234f120fe41SAndre Fischer AddContext(Draw); 235f120fe41SAndre Fischer AddContext(DrawPage); 236f120fe41SAndre Fischer AddContext(DrawText); 237f120fe41SAndre Fischer AddContext(EditCell); 238f120fe41SAndre Fischer AddContext(Form); 239f120fe41SAndre Fischer AddContext(Frame); 240f120fe41SAndre Fischer AddContext(Graphic); 241f120fe41SAndre Fischer AddContext(HandoutPage); 242f120fe41SAndre Fischer AddContext(MasterPage); 243f120fe41SAndre Fischer AddContext(Media); 244f120fe41SAndre Fischer AddContext(MultiObject); 245f120fe41SAndre Fischer AddContext(NotesPage); 246f120fe41SAndre Fischer AddContext(OLE); 247f120fe41SAndre Fischer AddContext(OutlineText); 248f120fe41SAndre Fischer AddContext(Pivot); 249f120fe41SAndre Fischer AddContext(SlidesorterPage); 250f120fe41SAndre Fischer AddContext(Table); 251f120fe41SAndre Fischer AddContext(Text); 252f120fe41SAndre Fischer AddContext(TextObject); 253f120fe41SAndre Fischer #undef AddContext 254b9e67834SAndre Fischer } 255b9e67834SAndre Fischer } 256b9e67834SAndre Fischer 257b9e67834SAndre Fischer 258b9e67834SAndre Fischer 259b9e67834SAndre Fischer 260b9e67834SAndre Fischer EnumContext::Context EnumContext::GetContextEnum (const ::rtl::OUString& rsContextName) 261b9e67834SAndre Fischer { 262b9e67834SAndre Fischer ProvideContextContainers(); 263b9e67834SAndre Fischer 264b9e67834SAndre Fischer ContextMap::const_iterator iContext( 265b9e67834SAndre Fischer maContextMap.find(rsContextName)); 266b9e67834SAndre Fischer if (iContext != maContextMap.end()) 267b9e67834SAndre Fischer return iContext->second; 268b9e67834SAndre Fischer else 26995a18594SAndre Fischer return EnumContext::Context_Unknown; 270b9e67834SAndre Fischer } 271b9e67834SAndre Fischer 272b9e67834SAndre Fischer 273b9e67834SAndre Fischer 274b9e67834SAndre Fischer 275b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (const Context eContext) 276b9e67834SAndre Fischer { 277b9e67834SAndre Fischer ProvideContextContainers(); 278b9e67834SAndre Fischer 279b9e67834SAndre Fischer const sal_Int32 nIndex (eContext); 280b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastContextEnum) 28195a18594SAndre Fischer return maContextVector[Context_Unknown]; 282b9e67834SAndre Fischer else 283b9e67834SAndre Fischer return maContextVector[nIndex]; 284b9e67834SAndre Fischer } 285b9e67834SAndre Fischer 286b9e67834SAndre Fischer 287b9e67834SAndre Fischer 288b9e67834SAndre Fischer 28995a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch ( 29095a18594SAndre Fischer const EnumContext& rOther) const 29195a18594SAndre Fischer { 29295a18594SAndre Fischer const bool bApplicationNameIsAny (rOther.meApplication == Application_Any); 29395a18594SAndre Fischer if (rOther.meApplication==meApplication || bApplicationNameIsAny) 29495a18594SAndre Fischer { 29595a18594SAndre Fischer // Application name matches. 29695a18594SAndre Fischer const bool bContextNameIsAny (rOther.meContext == Context_Any); 29795a18594SAndre Fischer if (rOther.meContext==meContext || bContextNameIsAny) 29895a18594SAndre Fischer { 29995a18594SAndre Fischer // Context name matches. 30095a18594SAndre Fischer return (bApplicationNameIsAny ? 1 : 0) 30195a18594SAndre Fischer + (bContextNameIsAny ? 2 : 0); 30295a18594SAndre Fischer } 30395a18594SAndre Fischer } 30495a18594SAndre Fischer return NoMatch; 30595a18594SAndre Fischer } 30695a18594SAndre Fischer 30795a18594SAndre Fischer 30895a18594SAndre Fischer 30995a18594SAndre Fischer 31095a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch (const ::std::vector<EnumContext>& rOthers) const 31195a18594SAndre Fischer { 31295a18594SAndre Fischer sal_Int32 nBestMatch (NoMatch); 31395a18594SAndre Fischer 31495a18594SAndre Fischer for (::std::vector<EnumContext>::const_iterator 31595a18594SAndre Fischer iContext(rOthers.begin()), 31695a18594SAndre Fischer iEnd(rOthers.end()); 31795a18594SAndre Fischer iContext!=iEnd; 31895a18594SAndre Fischer ++iContext) 31995a18594SAndre Fischer { 32095a18594SAndre Fischer const sal_Int32 nMatch (EvaluateMatch(*iContext)); 32195a18594SAndre Fischer if (nMatch < nBestMatch) 32295a18594SAndre Fischer { 32395a18594SAndre Fischer if (nMatch == OptimalMatch) 32495a18594SAndre Fischer { 32595a18594SAndre Fischer // We will find no better match so stop searching. 32695a18594SAndre Fischer return OptimalMatch; 32795a18594SAndre Fischer } 32895a18594SAndre Fischer nBestMatch = nMatch; 32995a18594SAndre Fischer } 33095a18594SAndre Fischer } 33195a18594SAndre Fischer return nBestMatch; 33295a18594SAndre Fischer } 33395a18594SAndre Fischer 33495a18594SAndre Fischer 33595a18594SAndre Fischer 336b9e67834SAndre Fischer } } // end of namespace sfx2::sidebar 337