LCOV - code coverage report
Current view: top level - svx/source/tbxctrls - PaletteManager.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 46 137 33.6 %
Date: 2015-06-13 12:38:46 Functions: 5 16 31.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svx/PaletteManager.hxx>
      21             : #include <osl/file.hxx>
      22             : #include <unotools/pathoptions.hxx>
      23             : #include <sfx2/objsh.hxx>
      24             : #include <svx/drawitem.hxx>
      25             : #include <svx/dialogs.hrc>
      26             : #include <svx/dialmgr.hxx>
      27             : #include <svtools/colrdlg.hxx>
      28             : #include <vcl/svapp.hxx>
      29             : #include <vcl/settings.hxx>
      30             : #include <stack>
      31             : #include <set>
      32             : 
      33        3448 : PaletteManager::PaletteManager() :
      34        3448 :     mnMaxRecentColors(Application::GetSettings().GetStyleSettings().GetColorValueSetColumnCount()),
      35             :     mnNumOfPalettes(2),
      36             :     mnCurrentPalette(0),
      37             :     mnColorCount(0),
      38             :     mpBtnUpdater(NULL),
      39        3448 :     mLastColor(COL_AUTO)
      40             : {
      41        3448 :     LoadPalettes();
      42        3448 :     mnNumOfPalettes += maPalettes.size();
      43        3448 : }
      44             : 
      45        3448 : PaletteManager::~PaletteManager()
      46             : {
      47        3448 : }
      48             : 
      49        3448 : void PaletteManager::LoadPalettes()
      50             : {
      51        3448 :     maPalettes.clear();
      52        3448 :     OUString aPalPaths = SvtPathOptions().GetPalettePath();
      53             : 
      54        6896 :     std::stack<OUString> aDirs;
      55        3448 :     sal_Int32 nIndex = 0;
      56        6896 :     do
      57             :     {
      58        6896 :         aDirs.push(aPalPaths.getToken(0, ';', nIndex));
      59             :     }
      60        6896 :     while (nIndex >= 0);
      61             : 
      62        6896 :     std::set<OUString> aNames;
      63             :     //try all entries palette path list user first, then
      64             :     //system, ignoring duplicate file names
      65       13792 :     while (!aDirs.empty())
      66             :     {
      67        6896 :         OUString aPalPath = aDirs.top();
      68        6896 :         aDirs.pop();
      69             : 
      70       13792 :         osl::Directory aDir(aPalPath);
      71       13792 :         osl::DirectoryItem aDirItem;
      72             :         osl::FileStatus aFileStat( osl_FileStatus_Mask_FileName |
      73             :                                    osl_FileStatus_Mask_FileURL  |
      74       13792 :                                    osl_FileStatus_Mask_Type     );
      75        6896 :         if( aDir.open() == osl::FileBase::E_None )
      76             :         {
      77       86200 :             while( aDir.getNextItem(aDirItem) == osl::FileBase::E_None )
      78             :             {
      79       72408 :                 aDirItem.getFileStatus(aFileStat);
      80       72408 :                 if(aFileStat.isRegular() || aFileStat.isLink())
      81             :                 {
      82       68960 :                     OUString aFName = aFileStat.getFileName();
      83       68960 :                     if (aNames.find(aFName) == aNames.end())
      84             :                     {
      85       68960 :                         Palette* pPalette = 0;
      86       68960 :                         if( aFName.endsWithIgnoreAsciiCase(".gpl") )
      87           0 :                             pPalette = new PaletteGPL( aFileStat.getFileURL(), aFName );
      88       68960 :                         else if( aFName.endsWithIgnoreAsciiCase(".soc") )
      89       31032 :                             pPalette = new PaletteSOC( aFileStat.getFileURL(), aFName );
      90       37928 :                         else if ( aFName.endsWithIgnoreAsciiCase(".ase") )
      91           0 :                             pPalette = new PaletteASE( aFileStat.getFileURL(), aFName );
      92             : 
      93       68960 :                         if( pPalette && pPalette->IsValid() )
      94       31032 :                             maPalettes.push_back( pPalette );
      95       68960 :                         aNames.insert(aFName);
      96       68960 :                     }
      97             :                 }
      98             :             }
      99             :         }
     100       10344 :     }
     101        3448 : }
     102             : 
     103           0 : void PaletteManager::ReloadColorSet(SvxColorValueSet &rColorSet)
     104             : {
     105           0 :     SfxObjectShell* pDocSh = SfxObjectShell::Current();
     106             : 
     107           0 :     if( mnCurrentPalette == 0 )
     108             :     {
     109           0 :         XColorListRef pColorList;
     110             : 
     111           0 :         if ( pDocSh )
     112             :         {
     113           0 :             const SfxPoolItem* pItem = NULL;
     114           0 :             if ( 0 != ( pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) )
     115           0 :                 pColorList = static_cast<const SvxColorListItem*>(pItem)->GetColorList();
     116             :         }
     117             : 
     118           0 :         if ( !pColorList.is() )
     119           0 :             pColorList = XColorList::CreateStdColorList();
     120             : 
     121             : 
     122           0 :         if ( pColorList.is() )
     123             :         {
     124           0 :             mnColorCount = pColorList->Count();
     125           0 :             rColorSet.Clear();
     126           0 :             rColorSet.addEntriesForXColorList(*pColorList);
     127           0 :         }
     128             :     }
     129           0 :     else if( mnCurrentPalette == mnNumOfPalettes - 1 )
     130             :     {
     131             :         // Add doc colors to palette
     132           0 :         std::set<Color> aColors = pDocSh->GetDocColors();
     133           0 :         mnColorCount = aColors.size();
     134           0 :         rColorSet.Clear();
     135           0 :         rColorSet.addEntriesForColorSet(aColors, SVX_RESSTR( RID_SVXSTR_DOC_COLOR_PREFIX ) + " " );
     136             :     }
     137             :     else
     138             :     {
     139           0 :         maPalettes[mnCurrentPalette-1].LoadColorSet( rColorSet );
     140           0 :         mnColorCount = rColorSet.GetItemCount();
     141             :     }
     142           0 : }
     143             : 
     144           0 : void PaletteManager::ReloadRecentColorSet(SvxColorValueSet& rColorSet)
     145             : {
     146           0 :     rColorSet.Clear();
     147           0 :     int nIx = 1;
     148           0 :     for(std::deque<Color>::const_iterator it = maRecentColors.begin();
     149           0 :         it != maRecentColors.end(); ++it)
     150             :     {
     151           0 :         rColorSet.InsertItem(nIx, *it, "");
     152           0 :         ++nIx;
     153             :     }
     154           0 : }
     155             : 
     156           0 : std::vector<OUString> PaletteManager::GetPaletteList()
     157             : {
     158           0 :     std::vector<OUString> aPaletteNames;
     159             : 
     160           0 :     aPaletteNames.push_back( SVX_RESSTR( RID_SVXSTR_DEFAULT_PAL ) );
     161             : 
     162           0 :     for( boost::ptr_vector<Palette>::iterator it = maPalettes.begin();
     163           0 :          it != maPalettes.end();
     164             :          ++it)
     165             :     {
     166           0 :         aPaletteNames.push_back( (*it).GetName() );
     167             :     }
     168             : 
     169           0 :     aPaletteNames.push_back( SVX_RESSTR ( RID_SVXSTR_DOC_COLORS ) );
     170             : 
     171           0 :     return aPaletteNames;
     172             : }
     173             : 
     174           0 : void PaletteManager::SetPalette( sal_Int32 nPos )
     175             : {
     176           0 :     mnCurrentPalette = nPos;
     177           0 : }
     178             : 
     179           0 : sal_Int32 PaletteManager::GetPalette()
     180             : {
     181           0 :     return mnCurrentPalette;
     182             : }
     183             : 
     184           0 : long PaletteManager::GetColorCount()
     185             : {
     186           0 :     return mnColorCount;
     187             : }
     188             : 
     189           0 : long PaletteManager::GetRecentColorCount()
     190             : {
     191           0 :     return maRecentColors.size();
     192             : }
     193             : 
     194           0 : const Color& PaletteManager::GetLastColor()
     195             : {
     196           0 :     return mLastColor;
     197             : }
     198             : 
     199        3448 : void PaletteManager::SetLastColor(const Color& rLastColor)
     200             : {
     201        3448 :     mLastColor = rLastColor;
     202        3448 : }
     203             : 
     204           0 : void PaletteManager::AddRecentColor(const Color& rRecentColor)
     205             : {
     206             :     std::deque<Color>::iterator itColor =
     207           0 :         std::find(maRecentColors.begin(), maRecentColors.end(), rRecentColor);
     208             :     // if recent color to be added is already in list, remove it
     209           0 :     if( itColor != maRecentColors.end() )
     210           0 :         maRecentColors.erase( itColor );
     211             : 
     212           0 :     maRecentColors.push_front( rRecentColor );
     213           0 :     if( maRecentColors.size() > mnMaxRecentColors )
     214           0 :         maRecentColors.pop_back();
     215           0 : }
     216             : 
     217        3448 : void PaletteManager::SetBtnUpdater(svx::ToolboxButtonColorUpdater* pBtnUpdater)
     218             : {
     219        3448 :     mpBtnUpdater = pBtnUpdater;
     220        3448 : }
     221             : 
     222           0 : void PaletteManager::PopupColorPicker(const OUString& aCommand)
     223             : {
     224             :     // The calling object goes away during aColorDlg.Execute(), so we must copy this
     225           0 :     OUString aCommandCopy = aCommand;
     226           0 :     SvColorDialog aColorDlg( 0 );
     227           0 :     aColorDlg.SetColor ( mLastColor );
     228           0 :     aColorDlg.SetMode( svtools::ColorPickerMode_MODIFY );
     229           0 :     if( aColorDlg.Execute() == RET_OK )
     230             :     {
     231           0 :         if (mpBtnUpdater)
     232           0 :             mpBtnUpdater->Update( aColorDlg.GetColor() );
     233           0 :         mLastColor = aColorDlg.GetColor();
     234           0 :         AddRecentColor( mLastColor );
     235           0 :         DispatchColorCommand(aCommandCopy, mLastColor);
     236           0 :     }
     237           0 : }
     238             : 
     239           0 : void PaletteManager::DispatchColorCommand(const OUString& aCommand, const Color& rColor)
     240             : {
     241             :     using namespace css::uno;
     242             :     using namespace css::frame;
     243             :     using namespace css::beans;
     244             :     using namespace css::util;
     245             : 
     246           0 :     Reference<XComponentContext> xContext(comphelper::getProcessComponentContext());
     247           0 :     Reference<XDesktop2> xDesktop = Desktop::create(xContext);
     248           0 :     Reference<XDispatchProvider> xDispatchProvider(xDesktop->getCurrentFrame(), UNO_QUERY );
     249           0 :     if (xDispatchProvider.is())
     250             :     {
     251           0 :         INetURLObject aObj( aCommand );
     252             : 
     253           0 :         Sequence<PropertyValue> aArgs(1);
     254           0 :         aArgs[0].Name = aObj.GetURLPath();
     255           0 :         aArgs[0].Value = makeAny(sal_Int32(rColor.GetColor()));
     256             : 
     257           0 :         URL aTargetURL;
     258           0 :         aTargetURL.Complete = aCommand;
     259           0 :         Reference<XURLTransformer> xURLTransformer(URLTransformer::create(comphelper::getProcessComponentContext()));
     260           0 :         xURLTransformer->parseStrict(aTargetURL);
     261             : 
     262           0 :         Reference<XDispatch> xDispatch = xDispatchProvider->queryDispatch(aTargetURL, OUString(), 0);
     263           0 :         if (xDispatch.is())
     264           0 :             xDispatch->dispatch(aTargetURL, aArgs);
     265           0 :     }
     266           0 : }
     267             : 
     268             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11