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 { 91*ae13266dSAndre Fischer return CombinedEnumContext(GetApplication_DI(), meContext); 92*ae13266dSAndre Fischer } 93*ae13266dSAndre Fischer 94*ae13266dSAndre Fischer 95*ae13266dSAndre Fischer 96*ae13266dSAndre Fischer 97*ae13266dSAndre Fischer EnumContext::Application EnumContext::GetApplication_DI (void) const 98*ae13266dSAndre Fischer { 99f120fe41SAndre Fischer switch (meApplication) 100f120fe41SAndre Fischer { 101f120fe41SAndre Fischer case Application_Draw: 102f120fe41SAndre Fischer case Application_Impress: 103*ae13266dSAndre Fischer return Application_DrawImpress; 104f120fe41SAndre Fischer 105dfbb0ba8SAndre Fischer case Application_Writer: 10685f1aca2SAndre Fischer case Application_WriterGlobal: 107dfbb0ba8SAndre Fischer case Application_WriterWeb: 10885f1aca2SAndre Fischer case Application_WriterXML: 109a7f63c05SOliver-Rainer Wittmann case Application_WriterForm: 110a7f63c05SOliver-Rainer Wittmann case Application_WriterReport: 111*ae13266dSAndre Fischer return Application_WriterVariants; 112dfbb0ba8SAndre Fischer 113f120fe41SAndre Fischer default: 114*ae13266dSAndre Fischer return meApplication; 115f120fe41SAndre Fischer } 116f120fe41SAndre Fischer } 117f120fe41SAndre Fischer 118f120fe41SAndre Fischer 119f120fe41SAndre Fischer 120f120fe41SAndre Fischer 121*ae13266dSAndre Fischer EnumContext::Application EnumContext::GetApplication (void) const 122*ae13266dSAndre Fischer { 123*ae13266dSAndre Fischer return meApplication; 124*ae13266dSAndre Fischer } 125*ae13266dSAndre Fischer 126*ae13266dSAndre Fischer 127*ae13266dSAndre Fischer 128*ae13266dSAndre Fischer 12995a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (void) const 13095a18594SAndre Fischer { 13195a18594SAndre Fischer return EnumContext::GetApplicationName(meApplication); 13295a18594SAndre Fischer } 13395a18594SAndre Fischer 13495a18594SAndre Fischer 13595a18594SAndre Fischer 13695a18594SAndre Fischer 13795a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (void) const 13895a18594SAndre Fischer { 13995a18594SAndre Fischer return EnumContext::GetContextName(meContext); 14095a18594SAndre Fischer } 14195a18594SAndre Fischer 14295a18594SAndre Fischer 14395a18594SAndre Fischer 14495a18594SAndre Fischer 145b9e67834SAndre Fischer bool EnumContext::operator== (const EnumContext aOther) 146b9e67834SAndre Fischer { 147b9e67834SAndre Fischer return meApplication==aOther.meApplication 148b9e67834SAndre Fischer && meContext==aOther.meContext; 149b9e67834SAndre Fischer } 150b9e67834SAndre Fischer 151b9e67834SAndre Fischer 152b9e67834SAndre Fischer 153b9e67834SAndre Fischer 15495a18594SAndre Fischer bool EnumContext::operator!= (const EnumContext aOther) 15595a18594SAndre Fischer { 15695a18594SAndre Fischer return meApplication!=aOther.meApplication 15795a18594SAndre Fischer || meContext!=aOther.meContext; 15895a18594SAndre Fischer } 15995a18594SAndre Fischer 16095a18594SAndre Fischer 16195a18594SAndre Fischer 16295a18594SAndre Fischer 163b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Application eApplication) 164b9e67834SAndre Fischer { 165b9e67834SAndre Fischer maApplicationMap[rsName] = eApplication; 166b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastApplicationEnum); 16795a18594SAndre Fischer if (maApplicationVector.size() <= size_t(eApplication)) 168b9e67834SAndre Fischer maApplicationVector.resize(eApplication+1); 169b9e67834SAndre Fischer maApplicationVector[eApplication]=rsName; 170b9e67834SAndre Fischer } 171b9e67834SAndre Fischer 172b9e67834SAndre Fischer 173b9e67834SAndre Fischer 174b9e67834SAndre Fischer 175b9e67834SAndre Fischer void EnumContext::ProvideApplicationContainers (void) 176b9e67834SAndre Fischer { 177b9e67834SAndre Fischer if (maApplicationMap.empty()) 178b9e67834SAndre Fischer { 179b9e67834SAndre Fischer maApplicationVector.resize(static_cast<size_t>(EnumContext::__LastApplicationEnum)+1); 180b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.text.TextDocument"), EnumContext::Application_Writer); 18185f1aca2SAndre Fischer AddEntry(A2S("com.sun.star.text.GlobalDocument"), EnumContext::Application_WriterGlobal); 182dfbb0ba8SAndre Fischer AddEntry(A2S("com.sun.star.text.WebDocument"), EnumContext::Application_WriterWeb); 18385f1aca2SAndre Fischer AddEntry(A2S("com.sun.star.xforms.XMLFormDocument"), EnumContext::Application_WriterXML); 18465d25098SAndre Fischer AddEntry(A2S("com.sun.star.sdb.FormDesign"), EnumContext::Application_WriterForm); 185a7f63c05SOliver-Rainer Wittmann AddEntry(A2S("com.sun.star.sdb.TextReportDesign"), EnumContext::Application_WriterReport); 18695a18594SAndre Fischer AddEntry(A2S("com.sun.star.sheet.SpreadsheetDocument"), EnumContext::Application_Calc); 18795a18594SAndre Fischer AddEntry(A2S("com.sun.star.drawing.DrawingDocument"), EnumContext::Application_Draw); 188b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.presentation.PresentationDocument"), EnumContext::Application_Impress); 189f120fe41SAndre Fischer 19095a18594SAndre Fischer AddEntry(A2S("any"), EnumContext::Application_Any); 191f120fe41SAndre Fischer AddEntry(A2S("none"), EnumContext::Application_None); 192b9e67834SAndre Fischer } 193b9e67834SAndre Fischer } 194b9e67834SAndre Fischer 195b9e67834SAndre Fischer 196b9e67834SAndre Fischer 197b9e67834SAndre Fischer 198b9e67834SAndre Fischer EnumContext::Application EnumContext::GetApplicationEnum (const ::rtl::OUString& rsApplicationName) 199b9e67834SAndre Fischer { 200b9e67834SAndre Fischer ProvideApplicationContainers(); 201b9e67834SAndre Fischer 202b9e67834SAndre Fischer ApplicationMap::const_iterator iApplication( 203b9e67834SAndre Fischer maApplicationMap.find(rsApplicationName)); 204b9e67834SAndre Fischer if (iApplication != maApplicationMap.end()) 205b9e67834SAndre Fischer return iApplication->second; 206b9e67834SAndre Fischer else 207f120fe41SAndre Fischer return EnumContext::Application_None; 208b9e67834SAndre Fischer } 209b9e67834SAndre Fischer 210b9e67834SAndre Fischer 211b9e67834SAndre Fischer 212b9e67834SAndre Fischer 213b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (const Application eApplication) 214b9e67834SAndre Fischer { 215b9e67834SAndre Fischer ProvideApplicationContainers(); 216b9e67834SAndre Fischer 217b9e67834SAndre Fischer const sal_Int32 nIndex (eApplication); 218b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastApplicationEnum) 219f120fe41SAndre Fischer return maApplicationVector[Application_None]; 220b9e67834SAndre Fischer else 221b9e67834SAndre Fischer return maApplicationVector[nIndex]; 222b9e67834SAndre Fischer } 223b9e67834SAndre Fischer 224b9e67834SAndre Fischer 225b9e67834SAndre Fischer 226b9e67834SAndre Fischer 227b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Context eApplication) 228b9e67834SAndre Fischer { 229b9e67834SAndre Fischer maContextMap[rsName] = eApplication; 230b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastContextEnum); 23195a18594SAndre Fischer if (maContextVector.size() <= size_t(eApplication)) 232b9e67834SAndre Fischer maContextVector.resize(eApplication+1); 233b9e67834SAndre Fischer maContextVector[eApplication] = rsName; 234b9e67834SAndre Fischer } 235b9e67834SAndre Fischer 236b9e67834SAndre Fischer 237b9e67834SAndre Fischer 238b9e67834SAndre Fischer 239b9e67834SAndre Fischer void EnumContext::ProvideContextContainers (void) 240b9e67834SAndre Fischer { 241b9e67834SAndre Fischer if (maContextMap.empty()) 242b9e67834SAndre Fischer { 243b9e67834SAndre Fischer maContextVector.resize(static_cast<size_t>(__LastContextEnum)+1); 24495a18594SAndre Fischer AddEntry(A2S("any"), Context_Any); 245b9e67834SAndre Fischer AddEntry(A2S("default"), Context_Default); 24654eaaa32SAndre Fischer AddEntry(A2S("empty"), Context_Empty); 247f120fe41SAndre Fischer #define AddContext(context) AddEntry(A2S(#context), Context_##context); 248f120fe41SAndre Fischer AddContext(3DObject); 249f120fe41SAndre Fischer AddContext(Annotation); 250f120fe41SAndre Fischer AddContext(Auditing); 251f120fe41SAndre Fischer AddContext(Cell); 252f120fe41SAndre Fischer AddContext(Chart); 253f120fe41SAndre Fischer AddContext(Chart); 254f120fe41SAndre Fischer AddContext(Draw); 255f120fe41SAndre Fischer AddContext(DrawPage); 256f120fe41SAndre Fischer AddContext(DrawText); 257f120fe41SAndre Fischer AddContext(EditCell); 258f120fe41SAndre Fischer AddContext(Form); 259f120fe41SAndre Fischer AddContext(Frame); 260f120fe41SAndre Fischer AddContext(Graphic); 261f120fe41SAndre Fischer AddContext(HandoutPage); 262f120fe41SAndre Fischer AddContext(MasterPage); 263f120fe41SAndre Fischer AddContext(Media); 264f120fe41SAndre Fischer AddContext(MultiObject); 265f120fe41SAndre Fischer AddContext(NotesPage); 266f120fe41SAndre Fischer AddContext(OLE); 267f120fe41SAndre Fischer AddContext(OutlineText); 268f120fe41SAndre Fischer AddContext(Pivot); 269f120fe41SAndre Fischer AddContext(SlidesorterPage); 270f120fe41SAndre Fischer AddContext(Table); 271f120fe41SAndre Fischer AddContext(Text); 272f120fe41SAndre Fischer AddContext(TextObject); 273f120fe41SAndre Fischer #undef AddContext 274b9e67834SAndre Fischer } 275b9e67834SAndre Fischer } 276b9e67834SAndre Fischer 277b9e67834SAndre Fischer 278b9e67834SAndre Fischer 279b9e67834SAndre Fischer 280b9e67834SAndre Fischer EnumContext::Context EnumContext::GetContextEnum (const ::rtl::OUString& rsContextName) 281b9e67834SAndre Fischer { 282b9e67834SAndre Fischer ProvideContextContainers(); 283b9e67834SAndre Fischer 284b9e67834SAndre Fischer ContextMap::const_iterator iContext( 285b9e67834SAndre Fischer maContextMap.find(rsContextName)); 286b9e67834SAndre Fischer if (iContext != maContextMap.end()) 287b9e67834SAndre Fischer return iContext->second; 288b9e67834SAndre Fischer else 28995a18594SAndre Fischer return EnumContext::Context_Unknown; 290b9e67834SAndre Fischer } 291b9e67834SAndre Fischer 292b9e67834SAndre Fischer 293b9e67834SAndre Fischer 294b9e67834SAndre Fischer 295b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (const Context eContext) 296b9e67834SAndre Fischer { 297b9e67834SAndre Fischer ProvideContextContainers(); 298b9e67834SAndre Fischer 299b9e67834SAndre Fischer const sal_Int32 nIndex (eContext); 300b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastContextEnum) 30195a18594SAndre Fischer return maContextVector[Context_Unknown]; 302b9e67834SAndre Fischer else 303b9e67834SAndre Fischer return maContextVector[nIndex]; 304b9e67834SAndre Fischer } 305b9e67834SAndre Fischer 306b9e67834SAndre Fischer 307b9e67834SAndre Fischer 308b9e67834SAndre Fischer 30995a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch ( 31095a18594SAndre Fischer const EnumContext& rOther) const 31195a18594SAndre Fischer { 31295a18594SAndre Fischer const bool bApplicationNameIsAny (rOther.meApplication == Application_Any); 31395a18594SAndre Fischer if (rOther.meApplication==meApplication || bApplicationNameIsAny) 31495a18594SAndre Fischer { 31595a18594SAndre Fischer // Application name matches. 31695a18594SAndre Fischer const bool bContextNameIsAny (rOther.meContext == Context_Any); 31795a18594SAndre Fischer if (rOther.meContext==meContext || bContextNameIsAny) 31895a18594SAndre Fischer { 31995a18594SAndre Fischer // Context name matches. 32095a18594SAndre Fischer return (bApplicationNameIsAny ? 1 : 0) 32195a18594SAndre Fischer + (bContextNameIsAny ? 2 : 0); 32295a18594SAndre Fischer } 32395a18594SAndre Fischer } 32495a18594SAndre Fischer return NoMatch; 32595a18594SAndre Fischer } 32695a18594SAndre Fischer 32795a18594SAndre Fischer 32895a18594SAndre Fischer 32995a18594SAndre Fischer 33095a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch (const ::std::vector<EnumContext>& rOthers) const 33195a18594SAndre Fischer { 33295a18594SAndre Fischer sal_Int32 nBestMatch (NoMatch); 33395a18594SAndre Fischer 33495a18594SAndre Fischer for (::std::vector<EnumContext>::const_iterator 33595a18594SAndre Fischer iContext(rOthers.begin()), 33695a18594SAndre Fischer iEnd(rOthers.end()); 33795a18594SAndre Fischer iContext!=iEnd; 33895a18594SAndre Fischer ++iContext) 33995a18594SAndre Fischer { 34095a18594SAndre Fischer const sal_Int32 nMatch (EvaluateMatch(*iContext)); 34195a18594SAndre Fischer if (nMatch < nBestMatch) 34295a18594SAndre Fischer { 34395a18594SAndre Fischer if (nMatch == OptimalMatch) 34495a18594SAndre Fischer { 34595a18594SAndre Fischer // We will find no better match so stop searching. 34695a18594SAndre Fischer return OptimalMatch; 34795a18594SAndre Fischer } 34895a18594SAndre Fischer nBestMatch = nMatch; 34995a18594SAndre Fischer } 35095a18594SAndre Fischer } 35195a18594SAndre Fischer return nBestMatch; 35295a18594SAndre Fischer } 35395a18594SAndre Fischer 35495a18594SAndre Fischer 35595a18594SAndre Fischer 356b9e67834SAndre Fischer } } // end of namespace sfx2::sidebar 357