1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx" 26*b1cdbd2cSJim Jagielski #include "DGColorNameLookUp.hxx" 27*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp> 30*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx> 31*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx> 32*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx> 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski using ::rtl::OUString; 36*b1cdbd2cSJim Jagielski using namespace ::com::sun::star; 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski namespace accessibility { 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski // Initialize the class instance with NULL. A true instance is created only 41*b1cdbd2cSJim Jagielski // when the static <member>Instance</member> is called for the first time. 42*b1cdbd2cSJim Jagielski DGColorNameLookUp* DGColorNameLookUp::mpInstance = NULL; 43*b1cdbd2cSJim Jagielski Instance(void)44*b1cdbd2cSJim JagielskiDGColorNameLookUp& DGColorNameLookUp::Instance (void) 45*b1cdbd2cSJim Jagielski { 46*b1cdbd2cSJim Jagielski // Using double check pattern to make sure that exactly one instance of 47*b1cdbd2cSJim Jagielski // the shape type handler is instantiated. 48*b1cdbd2cSJim Jagielski if (mpInstance == NULL) 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski ::vos::OGuard aGuard (::Application::GetSolarMutex()); 51*b1cdbd2cSJim Jagielski if (mpInstance == NULL) 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski // Create the single instance of the color name look up. 54*b1cdbd2cSJim Jagielski mpInstance = new DGColorNameLookUp(); 55*b1cdbd2cSJim Jagielski } 56*b1cdbd2cSJim Jagielski } 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski return *mpInstance; 59*b1cdbd2cSJim Jagielski } 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski LookUpColor(long int nColor) const64*b1cdbd2cSJim JagielskiOUString DGColorNameLookUp::LookUpColor (long int nColor) const 65*b1cdbd2cSJim Jagielski { 66*b1cdbd2cSJim Jagielski OUString sColorName; 67*b1cdbd2cSJim Jagielski tColorValueToNameMap::const_iterator I; 68*b1cdbd2cSJim Jagielski I = maColorValueToNameMap.find (nColor); 69*b1cdbd2cSJim Jagielski if (I != maColorValueToNameMap.end()) 70*b1cdbd2cSJim Jagielski // Found the color value. Return the associated name. 71*b1cdbd2cSJim Jagielski sColorName = I->second; 72*b1cdbd2cSJim Jagielski else 73*b1cdbd2cSJim Jagielski { 74*b1cdbd2cSJim Jagielski // Did not find the given color. Append its rgb tuple to the 75*b1cdbd2cSJim Jagielski // description. 76*b1cdbd2cSJim Jagielski ::rtl::OUStringBuffer sNameBuffer; 77*b1cdbd2cSJim Jagielski sNameBuffer.append (sal_Unicode('#')); 78*b1cdbd2cSJim Jagielski sNameBuffer.append (nColor, 16); 79*b1cdbd2cSJim Jagielski sColorName = sNameBuffer.makeStringAndClear(); 80*b1cdbd2cSJim Jagielski } 81*b1cdbd2cSJim Jagielski return sColorName; 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski DGColorNameLookUp(void)87*b1cdbd2cSJim JagielskiDGColorNameLookUp::DGColorNameLookUp (void) 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski uno::Sequence<OUString> aNames; 90*b1cdbd2cSJim Jagielski uno::Reference<container::XNameAccess> xNA; 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski try 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski // Create color table in which to look up the given color. 95*b1cdbd2cSJim Jagielski uno::Reference<container::XNameContainer> xColorTable ( 96*b1cdbd2cSJim Jagielski ::comphelper::getProcessServiceFactory()->createInstance( 97*b1cdbd2cSJim Jagielski OUString::createFromAscii("com.sun.star.drawing.ColorTable")), 98*b1cdbd2cSJim Jagielski uno::UNO_QUERY); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski // Get list of color names in order to iterate over the color table. 101*b1cdbd2cSJim Jagielski xNA = uno::Reference<container::XNameAccess>(xColorTable, uno::UNO_QUERY); 102*b1cdbd2cSJim Jagielski if (xNA.is()) 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski // Look the solar mutex here as workarround for missing lock in 105*b1cdbd2cSJim Jagielski // called function. 106*b1cdbd2cSJim Jagielski ::vos::OGuard aGuard (::Application::GetSolarMutex()); 107*b1cdbd2cSJim Jagielski aNames = xNA->getElementNames(); 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski } 110*b1cdbd2cSJim Jagielski catch (uno::RuntimeException e) 111*b1cdbd2cSJim Jagielski { 112*b1cdbd2cSJim Jagielski // When an excpetion occured then whe have an empty name sequence 113*b1cdbd2cSJim Jagielski // and the loop below is not entered. 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski // Fill the map to convert from numerical color values to names. 117*b1cdbd2cSJim Jagielski if (xNA.is()) 118*b1cdbd2cSJim Jagielski for (long int i=0; i<aNames.getLength(); i++) 119*b1cdbd2cSJim Jagielski { 120*b1cdbd2cSJim Jagielski // Get the numerical value for the i-th color name. 121*b1cdbd2cSJim Jagielski try 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski uno::Any aColor (xNA->getByName (aNames[i])); 124*b1cdbd2cSJim Jagielski long nColor = 0; 125*b1cdbd2cSJim Jagielski aColor >>= nColor; 126*b1cdbd2cSJim Jagielski maColorValueToNameMap[nColor] = aNames[i]; 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski catch (uno::RuntimeException e) 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski // Ignore the exception: the color who lead to the excpetion 131*b1cdbd2cSJim Jagielski // is not included into the map. 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski } 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski ~DGColorNameLookUp(void)139*b1cdbd2cSJim JagielskiDGColorNameLookUp::~DGColorNameLookUp (void) 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski maColorValueToNameMap.clear(); 142*b1cdbd2cSJim Jagielski } 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski } // end of namespace accessibility 145