LCOV - code coverage report
Current view: top level - sc/source/ui/miscdlgs - datafdlg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 221 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 24 0.0 %
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             : #undef SC_DLLIMPLEMENTATION
      11             : 
      12             : #include "datafdlg.hxx"
      13             : #include "scresid.hxx"
      14             : #include "viewdata.hxx"
      15             : #include "docsh.hxx"
      16             : #include "refundo.hxx"
      17             : #include "undodat.hxx"
      18             : 
      19             : #include <rtl/ustrbuf.hxx>
      20             : 
      21             : #define HDL(hdl)            LINK( this, ScDataFormDlg, hdl )
      22             : 
      23           0 : ScDataFormDlg::ScDataFormDlg(vcl::Window* pParent, ScTabViewShell* pTabViewShellOri)
      24             :     : ModalDialog(pParent, "DataFormDialog", "modules/scalc/ui/dataform.ui")
      25             :     , pTabViewShell(pTabViewShellOri)
      26             :     , aColLength(0)
      27             :     , nCurrentRow(0)
      28             :     , nStartCol(0)
      29             :     , nEndCol(0)
      30             :     , nStartRow(0)
      31             :     , nEndRow(0)
      32             :     , nTab(0)
      33           0 :     , bNoSelection(false)
      34             : {
      35           0 :     get(m_pBtnNew, "new");
      36           0 :     get(m_pBtnDelete, "delete");
      37           0 :     get(m_pBtnRestore, "restore");
      38           0 :     get(m_pBtnPrev, "prev");
      39           0 :     get(m_pBtnNext, "next");
      40           0 :     get(m_pBtnClose, "close");
      41           0 :     get(m_pFixedText, "label");
      42           0 :     sNewRecord = m_pFixedText->GetText();
      43           0 :     get(m_pSlider, "scrollbar");
      44           0 :     get(m_pGrid, "grid");
      45             : 
      46             :     //read header form current document, and add new controls
      47             :     OSL_ENSURE( pTabViewShell, "pTabViewShell is NULL! :-/" );
      48           0 :     ScViewData& rViewData = pTabViewShell->GetViewData();
      49             : 
      50           0 :     pDoc = rViewData.GetDocument();
      51           0 :     if (pDoc)
      52             :     {
      53           0 :         ScRange aRange;
      54           0 :         rViewData.GetSimpleArea( aRange );
      55           0 :         ScAddress aStart = aRange.aStart;
      56           0 :         ScAddress aEnd = aRange.aEnd;
      57             : 
      58           0 :         nStartCol = aStart.Col();
      59           0 :         nEndCol = aEnd.Col();
      60           0 :         nStartRow   = aStart.Row();
      61           0 :         nEndRow = aEnd.Row();
      62             : 
      63           0 :         nTab = rViewData.GetTabNo();
      64             :         //if there is no selection
      65           0 :         if ((nStartCol == nEndCol) && (nStartRow == nEndRow))
      66           0 :             bNoSelection = true;
      67             : 
      68           0 :         if (bNoSelection)
      69             :         {
      70             :             //find last not blank cell in row
      71           0 :             for (int i=1;i<=MAX_DATAFORM_COLS;i++)
      72             :             {
      73           0 :                 nEndCol++;
      74           0 :                 OUString aColName = pDoc->GetString(nEndCol, nStartRow, nTab);
      75           0 :                 int nColWidth = pDoc->GetColWidth( nEndCol, nTab );
      76           0 :                 if (aColName.isEmpty() && nColWidth)
      77             :                 {
      78           0 :                     nEndCol--;
      79           0 :                     break;
      80             :                 }
      81           0 :             }
      82             : 
      83             :             //find first not blank cell in row
      84           0 :             for (int i=1;i<=MAX_DATAFORM_COLS;i++)
      85             :             {
      86           0 :                 if (nStartCol <= 0)
      87           0 :                     break;
      88           0 :                 nStartCol--;
      89             : 
      90           0 :                 OUString aColName = pDoc->GetString(nStartCol, nStartRow, nTab);
      91           0 :                 int nColWidth = pDoc->GetColWidth( nEndCol, nTab );
      92           0 :                 if (aColName.isEmpty() && nColWidth)
      93             :                 {
      94           0 :                     nStartCol++;
      95           0 :                     break;
      96             :                 }
      97           0 :             }
      98             : 
      99             :             //skip leading hide column
     100           0 :             for (int i=1;i<=MAX_DATAFORM_COLS;i++)
     101             :             {
     102           0 :                 int nColWidth = pDoc->GetColWidth( nStartCol, nTab );
     103           0 :                 if (nColWidth)
     104           0 :                     break;
     105           0 :                 nStartCol++;
     106             :             }
     107             : 
     108           0 :             if (nEndCol < nStartCol)
     109           0 :                 nEndCol = nStartCol;
     110             : 
     111             :             //find last not blank cell in row
     112           0 :             for (int i=1;i<=MAX_DATAFORM_ROWS;i++)
     113             :             {
     114           0 :                 nEndRow++;
     115           0 :                 OUString aColName = pDoc->GetString(nStartCol, nEndRow, nTab);
     116           0 :                 if (aColName.isEmpty())
     117             :                 {
     118           0 :                     nEndRow--;
     119           0 :                     break;
     120             :                 }
     121           0 :             }
     122             : 
     123             :             //find first not blank cell in row
     124           0 :             for (int i=1;i<=MAX_DATAFORM_ROWS;i++)
     125             :             {
     126           0 :                 if (nStartRow <= 0)
     127           0 :                     break;
     128           0 :                 nStartRow--;
     129             : 
     130           0 :                 OUString aColName = pDoc->GetString(nStartCol, nStartRow, nTab);
     131           0 :                 if (aColName.isEmpty())
     132             :                 {
     133           0 :                     nStartRow++;
     134           0 :                     break;
     135             :                 }
     136           0 :             }
     137             : 
     138           0 :             if (nEndRow < nStartRow)
     139           0 :                 nEndRow = nStartRow;
     140             :         }
     141             : 
     142           0 :         nCurrentRow = nStartRow + 1;
     143             : 
     144           0 :         aColLength = nEndCol - nStartCol + 1;
     145             : 
     146             :         //new the controls
     147           0 :         maFixedTexts.reserve(aColLength);
     148           0 :         maEdits.reserve(aColLength);
     149             : 
     150           0 :         sal_Int32 nGridRow = 0;
     151           0 :         for(sal_uInt16 nIndex = 0; nIndex < aColLength; ++nIndex)
     152             :         {
     153           0 :             OUString aFieldName = pDoc->GetString(nIndex + nStartCol, nStartRow, nTab);
     154           0 :             int nColWidth = pDoc->GetColWidth( nIndex + nStartCol, nTab );
     155           0 :             if (nColWidth)
     156             :             {
     157           0 :                 maFixedTexts.push_back( VclPtr<FixedText>::Create(m_pGrid) );
     158           0 :                 maEdits.push_back( VclPtr<Edit>::Create(m_pGrid, WB_BORDER) );
     159             : 
     160           0 :                 maFixedTexts[nIndex]->set_grid_left_attach(0);
     161           0 :                 maEdits[nIndex]->set_grid_left_attach(1);
     162           0 :                 maFixedTexts[nIndex]->set_grid_top_attach(nGridRow);
     163           0 :                 maEdits[nIndex]->set_grid_top_attach(nGridRow);
     164             : 
     165           0 :                 maEdits[nIndex]->SetWidthInChars(32);
     166           0 :                 maEdits[nIndex]->set_hexpand(true);
     167             : 
     168           0 :                 ++nGridRow;
     169             : 
     170           0 :                 maFixedTexts[nIndex]->SetText(aFieldName);
     171           0 :                 maFixedTexts[nIndex]->Show();
     172           0 :                 maEdits[nIndex]->Show();
     173             :             }
     174             :             else
     175             :             {
     176           0 :                 maFixedTexts.push_back( NULL );
     177           0 :                 maEdits.push_back( NULL );
     178             :             }
     179           0 :             if (maEdits[nIndex] != nullptr)
     180           0 :                 maEdits[nIndex]->SetModifyHdl( HDL(Impl_DataModifyHdl) );
     181           0 :         }
     182             :     }
     183             : 
     184           0 :     FillCtrls(nCurrentRow);
     185             : 
     186           0 :     m_pSlider->SetPageSize( 10 );
     187           0 :     m_pSlider->SetVisibleSize( 1 );
     188           0 :     m_pSlider->SetLineSize( 1 );
     189           0 :     m_pSlider->SetRange( Range( 0, nEndRow - nStartRow + 1) );
     190           0 :     m_pSlider->Show();
     191             : 
     192           0 :     m_pBtnNew->SetClickHdl(HDL(Impl_NewHdl));
     193           0 :     m_pBtnPrev->SetClickHdl(HDL(Impl_PrevHdl));
     194           0 :     m_pBtnNext->SetClickHdl(HDL(Impl_NextHdl));
     195             : 
     196           0 :     m_pBtnRestore->SetClickHdl(HDL(Impl_RestoreHdl));
     197           0 :     m_pBtnDelete->SetClickHdl(HDL(Impl_DeleteHdl));
     198           0 :     m_pBtnClose->SetClickHdl(HDL(Impl_CloseHdl));
     199             : 
     200           0 :     m_pSlider->SetEndScrollHdl(HDL(Impl_ScrollHdl));
     201             : 
     202           0 :     SetButtonState();
     203           0 : }
     204             : 
     205           0 : ScDataFormDlg::~ScDataFormDlg()
     206             : {
     207           0 :     disposeOnce();
     208           0 : }
     209             : 
     210           0 : void ScDataFormDlg::dispose()
     211             : {
     212           0 :     m_pBtnNew.clear();
     213           0 :     m_pBtnDelete.clear();
     214           0 :     m_pBtnRestore.clear();
     215           0 :     m_pBtnPrev.clear();
     216           0 :     m_pBtnNext.clear();
     217           0 :     m_pBtnClose.clear();
     218           0 :     m_pSlider.clear();
     219           0 :     m_pGrid.clear();
     220           0 :     m_pFixedText.clear();
     221           0 :     ModalDialog::dispose();
     222           0 : }
     223             : 
     224           0 : void ScDataFormDlg::FillCtrls(SCROW /*nCurrentRow*/)
     225             : {
     226           0 :     for (sal_uInt16 i = 0; i < aColLength; ++i)
     227             :     {
     228           0 :         if (maEdits[i] != nullptr)
     229             :         {
     230           0 :             if (nCurrentRow<=nEndRow && pDoc)
     231             :             {
     232           0 :                 OUString  aFieldName(pDoc->GetString(i + nStartCol, nCurrentRow, nTab));
     233           0 :                 maEdits[i]->SetText(aFieldName);
     234             :             }
     235             :             else
     236           0 :                 maEdits[i]->SetText(OUString());
     237             :         }
     238             :     }
     239             : 
     240           0 :     if (nCurrentRow <= nEndRow)
     241             :     {
     242           0 :         OUStringBuffer aBuf;
     243           0 :         aBuf.append(static_cast<sal_Int32>(nCurrentRow - nStartRow));
     244           0 :         aBuf.appendAscii(" / ");
     245           0 :         aBuf.append(static_cast<sal_Int32>(nEndRow - nStartRow));
     246           0 :         m_pFixedText->SetText(aBuf.makeStringAndClear());
     247             :     }
     248             :     else
     249           0 :         m_pFixedText->SetText(sNewRecord);
     250             : 
     251           0 :     m_pSlider->SetThumbPos(nCurrentRow-nStartRow-1);
     252           0 : }
     253             : 
     254           0 : IMPL_LINK( ScDataFormDlg, Impl_DataModifyHdl, Edit*, pEdit)
     255             : {
     256           0 :     if ( pEdit->IsModified() )
     257           0 :         m_pBtnRestore->Enable( true );
     258           0 :     return 0;
     259             : }
     260             : 
     261           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_NewHdl)
     262             : {
     263           0 :     ScViewData& rViewData = pTabViewShell->GetViewData();
     264           0 :     ScDocShell* pDocSh = rViewData.GetDocShell();
     265           0 :     if ( pDoc )
     266             :     {
     267           0 :         bool bHasData = false;
     268           0 :         auto itr = maEdits.begin(), itrEnd = maEdits.end();
     269           0 :         for(; itr != itrEnd; ++itr)
     270           0 :             if ((*itr) != nullptr)
     271           0 :                 if ( !(*itr)->GetText().isEmpty() )
     272             :                 {
     273           0 :                     bHasData = true;
     274           0 :                     break;
     275             :                 }
     276             : 
     277           0 :         if ( bHasData )
     278             :         {
     279           0 :             pTabViewShell->DataFormPutData( nCurrentRow , nStartRow , nStartCol , nEndRow , nEndCol , maEdits , aColLength );
     280           0 :             nCurrentRow++;
     281           0 :             if (nCurrentRow >= nEndRow + 2)
     282             :             {
     283           0 :                     nEndRow ++ ;
     284           0 :                     m_pSlider->SetRange( Range( 0, nEndRow - nStartRow + 1) );
     285             :             }
     286           0 :             SetButtonState();
     287           0 :             FillCtrls(nCurrentRow);
     288           0 :             pDocSh->SetDocumentModified();
     289           0 :             pDocSh->PostPaintGridAll();
     290             :             }
     291             :     }
     292           0 :     return 0;
     293             : }
     294             : 
     295           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_PrevHdl)
     296             : {
     297           0 :     if (pDoc)
     298             :     {
     299           0 :         if ( nCurrentRow > nStartRow +1 )
     300           0 :             nCurrentRow--;
     301             : 
     302           0 :         SetButtonState();
     303           0 :         FillCtrls(nCurrentRow);
     304             :     }
     305           0 :     return 0;
     306             : }
     307             : 
     308           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_NextHdl)
     309             : {
     310           0 :     if (pDoc)
     311             :     {
     312           0 :         if ( nCurrentRow <= nEndRow)
     313           0 :             nCurrentRow++;
     314             : 
     315           0 :         SetButtonState();
     316           0 :         FillCtrls(nCurrentRow);
     317             :     }
     318           0 :     return 0;
     319             : }
     320             : 
     321           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_RestoreHdl)
     322             : {
     323           0 :     if (pDoc)
     324             :     {
     325           0 :         FillCtrls(nCurrentRow);
     326             :     }
     327           0 :     return 0;
     328             : }
     329             : 
     330           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_DeleteHdl)
     331             : {
     332           0 :     ScViewData& rViewData = pTabViewShell->GetViewData();
     333           0 :     ScDocShell* pDocSh = rViewData.GetDocShell();
     334           0 :     if (pDoc)
     335             :     {
     336           0 :         ScRange aRange(nStartCol, nCurrentRow, nTab, nEndCol, nCurrentRow, nTab);
     337           0 :         pDoc->DeleteRow(aRange);
     338           0 :         nEndRow--;
     339             : 
     340           0 :         SetButtonState();
     341           0 :         pDocSh->GetUndoManager()->Clear();
     342             : 
     343           0 :         FillCtrls(nCurrentRow);
     344           0 :         pDocSh->SetDocumentModified();
     345           0 :         pDocSh->PostPaintGridAll();
     346             :     }
     347           0 :     return 0;
     348             : }
     349             : 
     350           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_CloseHdl)
     351             : {
     352           0 :     EndDialog( );
     353           0 :     return 0;
     354             : }
     355             : 
     356           0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_ScrollHdl)
     357             : {
     358           0 :     long nOffset = m_pSlider->GetThumbPos();
     359           0 :     nCurrentRow = nStartRow + nOffset + 1;
     360           0 :     SetButtonState();
     361           0 :     FillCtrls(nCurrentRow);
     362           0 :     return 0;
     363             : }
     364             : 
     365           0 : void ScDataFormDlg::SetButtonState()
     366             : {
     367           0 :     if (nCurrentRow > nEndRow)
     368             :     {
     369           0 :         m_pBtnDelete->Enable( false );
     370           0 :         m_pBtnNext->Enable( false );
     371             :     }
     372             :     else
     373             :     {
     374           0 :         m_pBtnDelete->Enable( true );
     375           0 :         m_pBtnNext->Enable( true );
     376             :     }
     377             : 
     378           0 :     if (nCurrentRow == nStartRow + 1)
     379           0 :         m_pBtnPrev->Enable( false );
     380             :     else
     381           0 :         m_pBtnPrev->Enable( true );
     382             : 
     383           0 :     m_pBtnRestore->Enable( false );
     384           0 :     if ( maEdits.size()>=1 && maEdits[0] != nullptr )
     385           0 :         maEdits[0]->GrabFocus();
     386           0 : }
     387             : 
     388             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11