LCOV - code coverage report
Current view: top level - sc/source/ui/condformat - condformatdlg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 440 0.2 %
Date: 2015-06-13 12:38:46 Functions: 2 49 4.1 %
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             : 
      10             : #include "condformatdlg.hxx"
      11             : #include "condformatdlg.hrc"
      12             : 
      13             : #include <vcl/vclevent.hxx>
      14             : #include <svl/style.hxx>
      15             : #include <sfx2/dispatch.hxx>
      16             : #include <svl/stritem.hxx>
      17             : #include <svl/intitem.hxx>
      18             : #include <svx/xtable.hxx>
      19             : #include <svx/drawitem.hxx>
      20             : #include <vcl/msgbox.hxx>
      21             : #include <vcl/settings.hxx>
      22             : #include <vcl/builderfactory.hxx>
      23             : #include <libxml/tree.h>
      24             : 
      25             : #include "anyrefdg.hxx"
      26             : #include "document.hxx"
      27             : #include "conditio.hxx"
      28             : #include "stlpool.hxx"
      29             : #include "tabvwsh.hxx"
      30             : #include "colorscale.hxx"
      31             : #include "colorformat.hxx"
      32             : #include "reffact.hxx"
      33             : #include "docsh.hxx"
      34             : #include "docfunc.hxx"
      35             : #include "condformatdlgentry.hxx"
      36             : 
      37             : #include "globstr.hrc"
      38             : 
      39           0 : ScCondFormatList::ScCondFormatList(vcl::Window* pParent, WinBits nStyle)
      40             :     : Control(pParent, nStyle | WB_DIALOGCONTROL)
      41             :     , mbHasScrollBar(false)
      42             :     , mpScrollBar(VclPtr<ScrollBar>::Create(this, WB_VERT ))
      43             :     , mpDoc(NULL)
      44           0 :     , mpDialogParent(NULL)
      45             : {
      46           0 :     mpScrollBar->SetScrollHdl( LINK( this, ScCondFormatList, ScrollHdl ) );
      47           0 :     mpScrollBar->EnableDrag();
      48           0 :     SetControlBackground( GetSettings().GetStyleSettings().GetWindowColor() );
      49           0 :     SetBackground(GetControlBackground());
      50           0 : }
      51             : 
      52           0 : ScCondFormatList::~ScCondFormatList()
      53             : {
      54           0 :     disposeOnce();
      55           0 : }
      56             : 
      57           0 : void ScCondFormatList::dispose()
      58             : {
      59           0 :     mpDialogParent.clear();
      60           0 :     mpScrollBar.disposeAndClear();
      61           0 :     for (auto it = maEntries.begin(); it != maEntries.end(); ++it)
      62           0 :         it->disposeAndClear();
      63           0 :     maEntries.clear();
      64           0 :     Control::dispose();
      65           0 : }
      66             : 
      67           0 : void ScCondFormatList::init(ScDocument* pDoc, ScCondFormatDlg* pDialogParent,
      68             :         const ScConditionalFormat* pFormat, const ScRangeList& rRanges,
      69             :         const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType)
      70             : {
      71           0 :     mpDialogParent = pDialogParent;
      72           0 :     mpDoc = pDoc;
      73           0 :     maPos = rPos;
      74           0 :     maRanges = rRanges;
      75             : 
      76           0 :     if(pFormat)
      77             :     {
      78           0 :         size_t nCount = pFormat->size();
      79           0 :         for (size_t nIndex = 0; nIndex < nCount; ++nIndex)
      80             :         {
      81           0 :             const ScFormatEntry* pEntry = pFormat->GetEntry(nIndex);
      82           0 :             switch(pEntry->GetType())
      83             :             {
      84             :                 case condformat::CONDITION:
      85             :                     {
      86           0 :                         const ScCondFormatEntry* pConditionEntry = static_cast<const ScCondFormatEntry*>( pEntry );
      87           0 :                         if(pConditionEntry->GetOperation() != SC_COND_DIRECT)
      88           0 :                             maEntries.push_back(VclPtr<ScConditionFrmtEntry>::Create( this, mpDoc, pDialogParent, maPos, pConditionEntry ) );
      89             :                         else
      90           0 :                             maEntries.push_back(VclPtr<ScFormulaFrmtEntry>::Create( this, mpDoc, pDialogParent, maPos, pConditionEntry ) );
      91             : 
      92             :                     }
      93           0 :                     break;
      94             :                 case condformat::COLORSCALE:
      95             :                     {
      96           0 :                         const ScColorScaleFormat* pColorScale = static_cast<const ScColorScaleFormat*>( pEntry );
      97           0 :                         if( pColorScale->size() == 2 )
      98           0 :                             maEntries.push_back(VclPtr<ScColorScale2FrmtEntry>::Create( this, mpDoc, maPos, pColorScale ) );
      99             :                         else
     100           0 :                             maEntries.push_back(VclPtr<ScColorScale3FrmtEntry>::Create( this, mpDoc, maPos, pColorScale ) );
     101             :                     }
     102           0 :                     break;
     103             :                 case condformat::DATABAR:
     104           0 :                     maEntries.push_back(VclPtr<ScDataBarFrmtEntry>::Create( this, mpDoc, maPos, static_cast<const ScDataBarFormat*>( pEntry ) ) );
     105           0 :                     break;
     106             :                 case condformat::ICONSET:
     107           0 :                     maEntries.push_back(VclPtr<ScIconSetFrmtEntry>::Create( this, mpDoc, maPos, static_cast<const ScIconSetFormat*>( pEntry ) ) );
     108           0 :                     break;
     109             :                 case condformat::DATE:
     110           0 :                     maEntries.push_back(VclPtr<ScDateFrmtEntry>::Create( this, mpDoc, static_cast<const ScCondDateFormatEntry*>( pEntry ) ) );
     111           0 :                     break;
     112             :             }
     113             :         }
     114           0 :         if(nCount)
     115           0 :             EntrySelectHdl(maEntries[0].get());
     116             :     }
     117             :     else
     118             :     {
     119           0 :         switch(eType)
     120             :         {
     121             :             case condformat::dialog::CONDITION:
     122           0 :                 maEntries.push_back(VclPtr<ScConditionFrmtEntry>::Create( this, mpDoc, pDialogParent, maPos ));
     123           0 :                 break;
     124             :             case condformat::dialog::COLORSCALE:
     125           0 :                 maEntries.push_back(VclPtr<ScColorScale3FrmtEntry>::Create( this, mpDoc, maPos ));
     126           0 :                 break;
     127             :             case condformat::dialog::DATABAR:
     128           0 :                 maEntries.push_back(VclPtr<ScDataBarFrmtEntry>::Create( this, mpDoc, maPos ));
     129           0 :                 break;
     130             :             case condformat::dialog::ICONSET:
     131           0 :                 maEntries.push_back(VclPtr<ScIconSetFrmtEntry>::Create( this, mpDoc, maPos ));
     132           0 :                 break;
     133             :             case condformat::dialog::DATE:
     134           0 :                 maEntries.push_back(VclPtr<ScDateFrmtEntry>::Create( this, mpDoc ));
     135           0 :                 break;
     136             :             case condformat::dialog::NONE:
     137           0 :                 break;
     138             :         }
     139             :     }
     140           0 :     RecalcAll();
     141           0 :     if (!maEntries.empty())
     142           0 :         (*maEntries.begin())->SetActive();
     143             : 
     144           0 :     RecalcAll();
     145           0 : }
     146             : 
     147           0 : VCL_BUILDER_DECL_FACTORY(ScCondFormatList)
     148             : {
     149           0 :     WinBits nWinBits = 0;
     150             : 
     151           0 :     OString sBorder = VclBuilder::extractCustomProperty(rMap);
     152           0 :     if (!sBorder.isEmpty())
     153           0 :        nWinBits |= WB_BORDER;
     154             : 
     155           0 :     rRet = VclPtr<ScCondFormatList>::Create(pParent, nWinBits);
     156           0 : }
     157             : 
     158           0 : Size ScCondFormatList::GetOptimalSize() const
     159             : {
     160           0 :     return LogicToPixel(Size(290, 185), MAP_APPFONT);
     161             : }
     162             : 
     163           0 : void ScCondFormatList::Resize()
     164             : {
     165           0 :     Control::Resize();
     166           0 :     RecalcAll();
     167           0 : }
     168             : 
     169           0 : ScConditionalFormat* ScCondFormatList::GetConditionalFormat() const
     170             : {
     171           0 :     if(maEntries.empty())
     172           0 :         return NULL;
     173             : 
     174           0 :     ScConditionalFormat* pFormat = new ScConditionalFormat(0, mpDoc);
     175           0 :     for(EntryContainer::const_iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
     176             :     {
     177           0 :         ScFormatEntry* pEntry = (*itr)->GetEntry();
     178           0 :         if(pEntry)
     179           0 :             pFormat->AddEntry(pEntry);
     180             :     }
     181             : 
     182           0 :     pFormat->SetRange(maRanges);
     183             : 
     184           0 :     return pFormat;
     185             : }
     186             : 
     187           0 : void ScCondFormatList::RecalcAll()
     188             : {
     189           0 :     sal_Int32 nTotalHeight = 0;
     190           0 :     sal_Int32 nIndex = 1;
     191           0 :     for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
     192             :     {
     193           0 :         nTotalHeight += (*itr)->GetSizePixel().Height();
     194           0 :         (*itr)->SetIndex( nIndex );
     195           0 :         ++nIndex;
     196             :     }
     197             : 
     198           0 :     Size aCtrlSize = GetOutputSize();
     199           0 :     long nSrcBarSize = GetSettings().GetStyleSettings().GetScrollBarSize();
     200           0 :     if(nTotalHeight > GetSizePixel().Height())
     201             :     {
     202           0 :         mbHasScrollBar = true;
     203           0 :         mpScrollBar->SetPosSizePixel(Point(aCtrlSize.Width() -nSrcBarSize, 0),
     204           0 :                 Size(nSrcBarSize, aCtrlSize.Height()) );
     205           0 :         mpScrollBar->SetRangeMax(nTotalHeight);
     206           0 :         mpScrollBar->SetVisibleSize(aCtrlSize.Height());
     207           0 :         mpScrollBar->Show();
     208             :     }
     209             :     else
     210             :     {
     211           0 :         mbHasScrollBar = false;
     212           0 :         mpScrollBar->Hide();
     213             :     }
     214             : 
     215           0 :     Point aPoint(0,-1*mpScrollBar->GetThumbPos());
     216           0 :     for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
     217             :     {
     218           0 :         (*itr)->SetPosPixel(aPoint);
     219           0 :         Size aSize = (*itr)->GetSizePixel();
     220           0 :         if(mbHasScrollBar)
     221           0 :             aSize.Width() = aCtrlSize.Width() - nSrcBarSize;
     222             :         else
     223           0 :             aSize.Width() = aCtrlSize.Width();
     224           0 :         (*itr)->SetSizePixel(aSize);
     225             : 
     226           0 :         aPoint.Y() += (*itr)->GetSizePixel().Height();
     227             :     }
     228           0 : }
     229             : 
     230           0 : void ScCondFormatList::DoScroll(long nDelta)
     231             : {
     232           0 :     Point aNewPoint = mpScrollBar->GetPosPixel();
     233           0 :     Rectangle aRect(Point(), GetOutputSize());
     234           0 :     aRect.Right() -= mpScrollBar->GetSizePixel().Width();
     235           0 :     Scroll( 0, -nDelta, aRect );
     236           0 :     mpScrollBar->SetPosPixel(aNewPoint);
     237           0 : }
     238             : 
     239           0 : IMPL_LINK(ScCondFormatList, ColFormatTypeHdl, ListBox*, pBox)
     240             : {
     241           0 :     EntryContainer::iterator itr = maEntries.begin();
     242           0 :     for(; itr != maEntries.end(); ++itr)
     243             :     {
     244           0 :         if((*itr)->IsSelected())
     245           0 :             break;
     246             :     }
     247           0 :     if(itr == maEntries.end())
     248           0 :         return 0;
     249             : 
     250           0 :     sal_Int32 nPos = pBox->GetSelectEntryPos();
     251           0 :     switch(nPos)
     252             :     {
     253             :         case 0:
     254           0 :             if((*itr)->GetType() == condformat::entry::COLORSCALE2)
     255           0 :                 return 0;
     256             : 
     257           0 :             itr->disposeAndClear();
     258           0 :             *itr = VclPtr<ScColorScale2FrmtEntry>::Create( this, mpDoc, maPos );
     259           0 :             break;
     260             :         case 1:
     261           0 :             if((*itr)->GetType() == condformat::entry::COLORSCALE3)
     262           0 :                 return 0;
     263             : 
     264           0 :             itr->disposeAndClear();
     265           0 :             *itr = VclPtr<ScColorScale3FrmtEntry>::Create( this, mpDoc, maPos );
     266           0 :             break;
     267             :         case 2:
     268           0 :             if((*itr)->GetType() == condformat::entry::DATABAR)
     269           0 :                 return 0;
     270             : 
     271           0 :             itr->disposeAndClear();
     272           0 :             *itr = VclPtr<ScDataBarFrmtEntry>::Create( this, mpDoc, maPos );
     273           0 :             break;
     274             :         case 3:
     275           0 :             if((*itr)->GetType() == condformat::entry::ICONSET)
     276           0 :                 return 0;
     277             : 
     278           0 :             itr->disposeAndClear();
     279           0 :             *itr = VclPtr<ScIconSetFrmtEntry>::Create( this, mpDoc, maPos );
     280           0 :             break;
     281             :         default:
     282           0 :             break;
     283             :     }
     284           0 :     mpDialogParent->InvalidateRefData();
     285           0 :     (*itr)->SetActive();
     286           0 :     RecalcAll();
     287           0 :     return 0;
     288             : }
     289             : 
     290           0 : IMPL_LINK(ScCondFormatList, TypeListHdl, ListBox*, pBox)
     291             : {
     292             :     //Resolves: fdo#79021 At this point we are still inside the ListBox Select.
     293             :     //If we call maEntries.replace here then the pBox will be deleted before it
     294             :     //has finished Select and will crash on accessing its deleted this. So Post
     295             :     //to do the real work after the Select has completed
     296           0 :     Application::PostUserEvent(LINK(this, ScCondFormatList, AfterTypeListHdl), pBox, true);
     297           0 :     return 0;
     298             : }
     299             : 
     300           0 : IMPL_LINK(ScCondFormatList, AfterTypeListHdl, ListBox*, pBox)
     301             : {
     302           0 :     EntryContainer::iterator itr = maEntries.begin();
     303           0 :     for(; itr != maEntries.end(); ++itr)
     304             :     {
     305           0 :         if((*itr)->IsSelected())
     306           0 :             break;
     307             :     }
     308           0 :     if(itr == maEntries.end())
     309           0 :         return 0;;
     310             : 
     311           0 :     sal_Int32 nPos = pBox->GetSelectEntryPos();
     312           0 :     switch(nPos)
     313             :     {
     314             :         case 0:
     315           0 :             switch((*itr)->GetType())
     316             :             {
     317             :                 case condformat::entry::FORMULA:
     318             :                 case condformat::entry::CONDITION:
     319             :                 case condformat::entry::DATE:
     320           0 :                     break;
     321             :                 case condformat::entry::COLORSCALE2:
     322             :                 case condformat::entry::COLORSCALE3:
     323             :                 case condformat::entry::DATABAR:
     324             :                 case condformat::entry::ICONSET:
     325           0 :                     return 0;
     326             :             }
     327           0 :             itr->disposeAndClear();
     328           0 :             *itr = VclPtr<ScColorScale3FrmtEntry>::Create(this, mpDoc, maPos);
     329           0 :             mpDialogParent->InvalidateRefData();
     330           0 :             (*itr)->SetActive();
     331           0 :             break;
     332             :         case 1:
     333           0 :             if((*itr)->GetType() == condformat::entry::CONDITION)
     334           0 :                 return 0;
     335             : 
     336           0 :             itr->disposeAndClear();
     337           0 :             *itr = VclPtr<ScConditionFrmtEntry>::Create(this, mpDoc, mpDialogParent, maPos);
     338           0 :             mpDialogParent->InvalidateRefData();
     339           0 :             (*itr)->SetActive();
     340           0 :             break;
     341             :         case 2:
     342           0 :             if((*itr)->GetType() == condformat::entry::FORMULA)
     343           0 :                 return 0;
     344             : 
     345           0 :             itr->disposeAndClear();
     346           0 :             *itr = VclPtr<ScFormulaFrmtEntry>::Create(this, mpDoc, mpDialogParent, maPos);
     347           0 :             mpDialogParent->InvalidateRefData();
     348           0 :             (*itr)->SetActive();
     349           0 :             break;
     350             :         case 3:
     351           0 :             if((*itr)->GetType() == condformat::entry::DATE)
     352           0 :                 return 0;
     353             : 
     354           0 :             itr->disposeAndClear();
     355           0 :             *itr = VclPtr<ScDateFrmtEntry>::Create( this, mpDoc );
     356           0 :             mpDialogParent->InvalidateRefData();
     357           0 :             (*itr)->SetActive();
     358           0 :             break;
     359             : 
     360             :     }
     361           0 :     RecalcAll();
     362           0 :     return 0;
     363             : }
     364             : 
     365           0 : IMPL_LINK_NOARG( ScCondFormatList, AddBtnHdl )
     366             : {
     367           0 :     VclPtr<ScCondFrmtEntry> pNewEntry = VclPtr<ScConditionFrmtEntry>::Create(this, mpDoc, mpDialogParent, maPos);
     368           0 :     maEntries.push_back( pNewEntry );
     369           0 :     for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
     370             :     {
     371           0 :         (*itr)->SetInactive();
     372             :     }
     373           0 :     mpDialogParent->InvalidateRefData();
     374           0 :     pNewEntry->SetActive();
     375           0 :     RecalcAll();
     376           0 :     return 0;
     377             : }
     378             : 
     379           0 : IMPL_LINK_NOARG( ScCondFormatList, RemoveBtnHdl )
     380             : {
     381           0 :     for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
     382             :     {
     383           0 :         if((*itr)->IsSelected())
     384             :         {
     385           0 :             itr->disposeAndClear();
     386           0 :             maEntries.erase(itr);
     387           0 :             break;
     388             :         }
     389             :     }
     390           0 :     mpDialogParent->InvalidateRefData();
     391           0 :     RecalcAll();
     392           0 :     return 0;
     393             : }
     394             : 
     395           0 : IMPL_LINK( ScCondFormatList, EntrySelectHdl, ScCondFrmtEntry*, pEntry )
     396             : {
     397           0 :     if(pEntry->IsSelected())
     398           0 :         return 0;
     399             : 
     400             :     //A child has focus, but we will hide that, so regrab to whatever new thing gets
     401             :     //shown instead of leaving it stuck in the inaccessible hidden element
     402           0 :     bool bReGrabFocus = HasChildPathFocus();
     403           0 :     for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
     404             :     {
     405           0 :         (*itr)->SetInactive();
     406             :     }
     407           0 :     mpDialogParent->InvalidateRefData();
     408           0 :     pEntry->SetActive();
     409           0 :     RecalcAll();
     410           0 :     if (bReGrabFocus)
     411           0 :         GrabFocus();
     412           0 :     return 0;
     413             : }
     414             : 
     415           0 : IMPL_LINK_NOARG( ScCondFormatList, ScrollHdl )
     416             : {
     417           0 :     DoScroll(mpScrollBar->GetDelta());
     418           0 :     return 0;
     419             : }
     420             : 
     421             : // -------------------------------------------------------------------
     422             : // Conditional Format Dialog
     423             : //
     424           0 : ScCondFormatDlg::ScCondFormatDlg(SfxBindings* pB, SfxChildWindow* pCW,
     425             :     vcl::Window* pParent, ScViewData* pViewData,
     426             :     const ScConditionalFormat* pFormat, const ScRangeList& rRange,
     427             :     const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType,
     428             :     bool bManaged)
     429             :         : ScAnyRefDlg(pB, pCW, pParent, "ConditionalFormatDialog",
     430             :                         "modules/scalc/ui/conditionalformatdialog.ui")
     431             :     , mbManaged(bManaged)
     432             :     , maPos(rPos)
     433             :     , mpViewData(pViewData)
     434           0 :     , mpLastEdit(NULL)
     435             : {
     436           0 :     get(mpBtnOk, "ok");
     437           0 :     get(mpBtnAdd, "add");
     438           0 :     get(mpBtnRemove, "delete");
     439           0 :     get(mpBtnCancel, "cancel");
     440             : 
     441           0 :     get(mpFtRange, "ftassign");
     442           0 :     get(mpEdRange, "edassign");
     443           0 :     mpEdRange->SetReferences(this, mpFtRange);
     444             : 
     445           0 :     get(mpRbRange, "rbassign");
     446           0 :     mpRbRange->SetReferences(this, mpEdRange);
     447             : 
     448           0 :     maKey = pFormat ? pFormat->GetKey() : 0;
     449             : 
     450           0 :     get(mpCondFormList, "list");
     451           0 :     mpCondFormList->init(mpViewData->GetDocument(), this, pFormat, rRange, rPos, eType);
     452             : 
     453           0 :     OUStringBuffer aTitle( GetText() );
     454           0 :     aTitle.append(" ");
     455           0 :     OUString aRangeString;
     456             :     rRange.Format(aRangeString, SCA_VALID, pViewData->GetDocument(),
     457           0 :                     pViewData->GetDocument()->GetAddressConvention());
     458           0 :     aTitle.append(aRangeString);
     459           0 :     SetText(aTitle.makeStringAndClear());
     460           0 :     mpBtnOk->SetClickHdl(LINK(this, ScCondFormatDlg, BtnPressedHdl ) );
     461           0 :     mpBtnAdd->SetClickHdl( LINK( mpCondFormList, ScCondFormatList, AddBtnHdl ) );
     462           0 :     mpBtnRemove->SetClickHdl( LINK( mpCondFormList, ScCondFormatList, RemoveBtnHdl ) );
     463           0 :     mpBtnCancel->SetClickHdl( LINK(this, ScCondFormatDlg, BtnPressedHdl ) );
     464           0 :     mpEdRange->SetModifyHdl( LINK( this, ScCondFormatDlg, EdRangeModifyHdl ) );
     465           0 :     mpEdRange->SetGetFocusHdl( LINK( this, ScCondFormatDlg, RangeGetFocusHdl ) );
     466             : 
     467           0 :     mpEdRange->SetText(aRangeString);
     468           0 : }
     469             : 
     470           0 : ScCondFormatDlg::~ScCondFormatDlg()
     471             : {
     472           0 :     disposeOnce();
     473           0 : }
     474             : 
     475           0 : void ScCondFormatDlg::dispose()
     476             : {
     477           0 :     mpBtnOk.clear();
     478           0 :     mpBtnAdd.clear();
     479           0 :     mpBtnRemove.clear();
     480           0 :     mpBtnCancel.clear();
     481           0 :     mpFtRange.clear();
     482           0 :     mpEdRange.clear();
     483           0 :     mpRbRange.clear();
     484           0 :     mpCondFormList.clear();
     485           0 :     mpLastEdit.clear();
     486             : 
     487           0 :     ScAnyRefDlg::dispose();
     488           0 : }
     489             : 
     490           0 : void ScCondFormatDlg::SetActive()
     491             : {
     492           0 :     if(mpLastEdit)
     493           0 :         mpLastEdit->GrabFocus();
     494             :     else
     495           0 :         mpEdRange->GrabFocus();
     496             : 
     497           0 :     RefInputDone();
     498           0 : }
     499             : 
     500           0 : void ScCondFormatDlg::RefInputDone( bool bForced )
     501             : {
     502           0 :     ScAnyRefDlg::RefInputDone(bForced);
     503           0 : }
     504             : 
     505           0 : bool ScCondFormatDlg::IsTableLocked() const
     506             : {
     507           0 :     if (mpLastEdit && mpLastEdit != mpEdRange)
     508           0 :         return false;
     509             : 
     510           0 :     return true;
     511             : }
     512             : 
     513           0 : bool ScCondFormatDlg::IsRefInputMode() const
     514             : {
     515           0 :     return mpEdRange->IsEnabled();
     516             : }
     517             : 
     518             : #define ABS_SREF          SCA_VALID \
     519             :     | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
     520             : #define ABS_DREF          ABS_SREF \
     521             :     | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
     522             : #define ABS_DREF3D      ABS_DREF | SCA_TAB_3D
     523             : 
     524           0 : void ScCondFormatDlg::SetReference(const ScRange& rRef, ScDocument*)
     525             : {
     526           0 :     formula::RefEdit* pEdit = mpLastEdit;
     527           0 :     if (!mpLastEdit)
     528           0 :         pEdit = mpEdRange;
     529             : 
     530           0 :     if( pEdit->IsEnabled() )
     531             :     {
     532           0 :         if(rRef.aStart != rRef.aEnd)
     533           0 :             RefInputStart(pEdit);
     534             : 
     535           0 :         sal_uInt16 n = 0;
     536           0 :         if (mpLastEdit && mpLastEdit != mpEdRange)
     537           0 :             n = ABS_DREF3D;
     538             :         else
     539           0 :             n = ABS_DREF;
     540             : 
     541           0 :         OUString aRefStr(rRef.Format(n, mpViewData->GetDocument(),
     542           0 :             ScAddress::Details(mpViewData->GetDocument()->GetAddressConvention(), 0, 0)));
     543           0 :         pEdit->SetRefString( aRefStr );
     544             :     }
     545           0 : }
     546             : 
     547           0 : ScConditionalFormat* ScCondFormatDlg::GetConditionalFormat() const
     548             : {
     549           0 :     OUString aRangeStr = mpEdRange->GetText();
     550           0 :     if(aRangeStr.isEmpty())
     551           0 :         return NULL;
     552             : 
     553           0 :     ScRangeList aRange;
     554             :     sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpViewData->GetDocument(),
     555           0 :         SCA_VALID, mpViewData->GetDocument()->GetAddressConvention(), maPos.Tab());
     556           0 :     ScConditionalFormat* pFormat = mpCondFormList->GetConditionalFormat();
     557             : 
     558           0 :     if(nFlags & SCA_VALID && !aRange.empty() && pFormat)
     559           0 :         pFormat->SetRange(aRange);
     560             :     else
     561             :     {
     562           0 :         delete pFormat;
     563           0 :         pFormat = NULL;
     564             :     }
     565             : 
     566           0 :     return pFormat;
     567             : }
     568             : 
     569           0 : void ScCondFormatDlg::InvalidateRefData()
     570             : {
     571           0 :     mpLastEdit = NULL;
     572           0 : }
     573             : 
     574             : // -------------------------------------------------------------
     575             : // Close the Conditional Format Dialog
     576             : //
     577           0 : bool ScCondFormatDlg::Close()
     578             : {
     579           0 :     return DoClose( ScCondFormatDlgWrapper::GetChildWindowId() );
     580             : }
     581             : 
     582             : // ------------------------------------------------------------------------
     583             : // Occurs when the Conditional Format Dialog the OK button is pressed.
     584             : //
     585           0 : void ScCondFormatDlg::OkPressed()
     586             : {
     587           0 :     ScConditionalFormat* pFormat = GetConditionalFormat();
     588             : 
     589           0 :     if(pFormat)
     590           0 :         mpViewData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(maKey,
     591           0 :             pFormat, maPos.Tab(), pFormat->GetRange());
     592             :     else
     593           0 :         mpViewData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(maKey,
     594           0 :             NULL, maPos.Tab(), ScRangeList());
     595             : 
     596           0 :     if ( mbManaged )
     597             :     {
     598           0 :         SetDispatcherLock( false );
     599             :         // Queue message to open Conditional Format Manager Dialog
     600           0 :         GetBindings().GetDispatcher()->Execute( SID_OPENDLG_CONDFRMT_MANAGER,
     601           0 :                                             SfxCallMode::ASYNCHRON );
     602             :     }
     603           0 :     Close();
     604           0 : }
     605             : 
     606             : // ------------------------------------------------------------------------
     607             : // Occurs when the Conditional Format Dialog is cancelled.
     608             : //
     609           0 : void ScCondFormatDlg::CancelPressed()
     610             : {
     611           0 :     if ( mbManaged )
     612             :     {
     613           0 :         SetDispatcherLock( false );
     614             :         // Queue message to open Conditional Format Manager Dialog
     615           0 :         GetBindings().GetDispatcher()->Execute( SID_OPENDLG_CONDFRMT_MANAGER,
     616           0 :                                             SfxCallMode::ASYNCHRON );
     617             :     }
     618           0 :     Close();
     619           0 : }
     620             : 
     621             : // ------------------------------------------------------------------------------
     622             : // Parse xml string parameters used to initialize the Conditional Format Dialog
     623             : // when it is created.
     624             : //
     625           0 : bool ScCondFormatDlg::ParseXmlString(const OUString&    sXMLString,
     626             :                                      sal_uInt32&        nIndex,
     627             :                                      sal_uInt8&         nType,
     628             :                                      bool&              bManaged)
     629             : {
     630           0 :     bool bRetVal = false;
     631           0 :     OString sTagName;
     632           0 :     OUString sTagValue;
     633             : 
     634           0 :     xmlNodePtr      pXmlRoot  = NULL;
     635           0 :     xmlNodePtr      pXmlNode  = NULL;
     636             : 
     637           0 :     OString sOString = OUStringToOString( sXMLString, RTL_TEXTENCODING_UTF8 );
     638           0 :     xmlDocPtr pXmlDoc = xmlParseMemory(sOString.getStr(), sOString.getLength());
     639             : 
     640           0 :     if( pXmlDoc )
     641             :     {
     642           0 :         bRetVal = true;
     643           0 :         pXmlRoot = xmlDocGetRootElement( pXmlDoc );
     644           0 :         pXmlNode = pXmlRoot->children;
     645             : 
     646           0 :         while (pXmlNode != NULL && bRetVal)
     647             :         {
     648           0 :             sTagName  = OUStringToOString(OUString("Index"), RTL_TEXTENCODING_UTF8);
     649           0 :             if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0)
     650             :             {
     651           0 :                 if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE)
     652             :                 {
     653           0 :                     sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content),
     654           0 :                                      strlen(reinterpret_cast<char*>(pXmlNode->children->content)),
     655           0 :                                      RTL_TEXTENCODING_UTF8);
     656           0 :                     nIndex   = sTagValue.toUInt32();
     657           0 :                     pXmlNode = pXmlNode->next;
     658           0 :                     continue;
     659             :                 }
     660             :             }
     661             : 
     662           0 :             sTagName  = OUStringToOString(OUString("Type"), RTL_TEXTENCODING_UTF8);
     663           0 :             if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0)
     664             :             {
     665           0 :                 if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE)
     666             :                 {
     667           0 :                     sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content),
     668           0 :                                      strlen(reinterpret_cast<char*>(pXmlNode->children->content)),
     669           0 :                                      RTL_TEXTENCODING_UTF8);
     670           0 :                     nType    = sTagValue.toUInt32();
     671           0 :                     pXmlNode = pXmlNode->next;
     672           0 :                     continue;
     673             :                 }
     674             :             }
     675             : 
     676           0 :             sTagName  = OUStringToOString(OUString("Managed"), RTL_TEXTENCODING_UTF8);
     677           0 :             if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0)
     678             :             {
     679           0 :                 if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE)
     680             :                 {
     681           0 :                     sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content),
     682           0 :                                      strlen(reinterpret_cast<char*>(pXmlNode->children->content)),
     683           0 :                                      RTL_TEXTENCODING_UTF8);
     684           0 :                     bManaged = sTagValue.toBoolean();
     685           0 :                     pXmlNode = pXmlNode->next;
     686           0 :                     continue;
     687             :                 }
     688             :             }
     689           0 :             bRetVal = false;
     690             :         }
     691             :     }
     692             : 
     693           0 :     xmlFreeDoc(pXmlDoc);
     694           0 :     return bRetVal;
     695             : }
     696             : 
     697             : // ---------------------------------------------------------------------------------------
     698             : // Generate xml string parameters used to initialize the Conditional Format Dialog
     699             : // when it is created.
     700             : //
     701           0 : OUString ScCondFormatDlg::GenerateXmlString(sal_uInt32 nIndex, sal_uInt8 nType, bool bManaged)
     702             : {
     703           0 :     OUString sReturn;
     704             : 
     705           0 :     OString sTagName;
     706           0 :     OString sTagValue;
     707             : 
     708           0 :     xmlNodePtr      pXmlRoot  = NULL;
     709           0 :     xmlNodePtr      pXmlNode  = NULL;
     710             : 
     711           0 :     xmlChar*        pBuffer   = NULL;
     712           0 :     const xmlChar*  pTagName  = NULL;
     713           0 :     const xmlChar*  pTagValue = NULL;
     714             : 
     715           0 :     xmlDocPtr pXmlDoc = xmlNewDoc(reinterpret_cast<const xmlChar*>("1.0"));
     716             : 
     717           0 :     sTagName = OUStringToOString(OUString("ScCondFormatDlg"), RTL_TEXTENCODING_UTF8);
     718           0 :     pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr());
     719           0 :     pXmlRoot = xmlNewDocNode(pXmlDoc, NULL, pTagName, NULL);
     720             : 
     721           0 :     xmlDocSetRootElement(pXmlDoc, pXmlRoot);
     722             : 
     723           0 :     sTagName  = OUStringToOString(OUString("Index"), RTL_TEXTENCODING_UTF8);
     724           0 :     sTagValue = OUStringToOString(OUString::number(nIndex), RTL_TEXTENCODING_UTF8);
     725           0 :     pTagName  = reinterpret_cast<const xmlChar*>(sTagName.getStr());
     726           0 :     pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr());
     727           0 :     pXmlNode  = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue);
     728             : 
     729           0 :     xmlAddChild(pXmlRoot, pXmlNode);
     730             : 
     731           0 :     sTagName  = OUStringToOString(OUString("Type"), RTL_TEXTENCODING_UTF8);
     732           0 :     sTagValue = OUStringToOString(OUString::number(nType), RTL_TEXTENCODING_UTF8);
     733           0 :     pTagName  = reinterpret_cast<const xmlChar*>(sTagName.getStr());
     734           0 :     pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr());
     735           0 :     pXmlNode  = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue);
     736             : 
     737           0 :     xmlAddChild(pXmlRoot, pXmlNode);
     738             : 
     739           0 :     sTagName  = OUStringToOString(OUString("Managed"), RTL_TEXTENCODING_UTF8);
     740           0 :     sTagValue = OUStringToOString(OUString::boolean(bManaged), RTL_TEXTENCODING_UTF8);
     741           0 :     pTagName  = reinterpret_cast<const xmlChar*>(sTagName.getStr());
     742           0 :     pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr());
     743           0 :     pXmlNode  = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue);
     744             : 
     745           0 :     xmlAddChild(pXmlRoot, pXmlNode);
     746             : 
     747           0 :     int nSize = 0;
     748           0 :     xmlDocDumpMemory(pXmlDoc, &pBuffer, &nSize);
     749             : 
     750           0 :     sReturn = OUString(reinterpret_cast<char const *>(pBuffer), nSize, RTL_TEXTENCODING_UTF8);
     751             : 
     752           0 :     xmlFree(pBuffer);
     753           0 :     xmlFreeDoc(pXmlDoc);
     754             : 
     755           0 :     return sReturn;
     756             : }
     757             : 
     758             : 
     759           0 : IMPL_LINK( ScCondFormatDlg, EdRangeModifyHdl, Edit*, pEdit )
     760             : {
     761           0 :     OUString aRangeStr = pEdit->GetText();
     762           0 :     ScRangeList aRange;
     763             :     sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpViewData->GetDocument(),
     764           0 :         SCA_VALID, mpViewData->GetDocument()->GetAddressConvention());
     765           0 :     if(nFlags & SCA_VALID)
     766           0 :         pEdit->SetControlBackground(GetSettings().GetStyleSettings().GetWindowColor());
     767             :     else
     768           0 :         pEdit->SetControlBackground(COL_LIGHTRED);
     769           0 :     return 0;
     770             : }
     771             : 
     772           0 : IMPL_LINK( ScCondFormatDlg, RangeGetFocusHdl, formula::RefEdit*, pEdit )
     773             : {
     774           0 :     mpLastEdit = pEdit;
     775           0 :     return 0;
     776             : }
     777             : 
     778             : // ------------------------------------------------------
     779             : // Conditional Format Dialog button click event handler.
     780             : //
     781           0 : IMPL_LINK( ScCondFormatDlg, BtnPressedHdl, Button*, pBtn)
     782             : {
     783           0 :     if (pBtn == mpBtnOk)
     784           0 :         OkPressed();
     785           0 :     else if (pBtn == mpBtnCancel)
     786           0 :         CancelPressed();
     787           0 :     return 0;
     788         156 : }
     789             : 
     790             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11