Files
libreoffice/sw/source/ui/table/chartins.cxx
2001-06-29 05:19:57 +00:00

493 lines
14 KiB
C++

/*************************************************************************
*
* $RCSfile: chartins.cxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: os $ $Date: 2001-06-29 06:19:57 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif
#pragma hdrstop
#define _CHARTINS_CXX
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SCHDLL0_HXX
#include <sch/schdll0.hxx>
#endif
#ifndef _SCH_DLL_HXX //autogen
#include <sch/schdll.hxx>
#endif
#ifndef _SCH_MEMCHRT_HXX
#include <sch/memchrt.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _CHARTINS_HXX
#include <chartins.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _TBLSEL_HXX
#include <tblsel.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _CHARTINS_HRC
#include <chartins.hrc>
#endif
SFX_IMPL_MODELESSDIALOG( SwInsertChartChild, SID_INSERT_DIAGRAM )
/*------------------------------------------------------------------------
Beschreibung: AutoPilot fuer StarChart
------------------------------------------------------------------------*/
SwInsertChartDlg::SwInsertChartDlg( SfxBindings* pBindings,
SfxChildWindow* pChild,
Window *pParent,
SwWrtShell* pSh ) :
SfxModelessDialog( pBindings, pChild, pParent, SW_RES(DLG_INSERT_CHART) ),
aTextFt (this, SW_RES(FT_TEXT )),
aRangeEd (this, SW_RES(ED_RANGE )),
aRangeFt (this, SW_RES(FT_RANGE )),
aFinish (this, SW_RES(BT_FINISH )),
aHelp (this, SW_RES(BT_HELP )),
aCancel (this, SW_RES(BT_CANCEL )),
aHLine (this, SW_RES(FL_HLINE )),
aPrev (this, SW_RES(BT_PREV )),
aNext (this, SW_RES(BT_NEXT )),
aFirstRow (this, SW_RES(CB_FIRST_ROW)),
aFirstCol (this, SW_RES(CB_FIRST_COL)),
aFL1 (this, SW_RES(FL_1 )),
pChartDlg(0),
pWrtShell(pSh),
pInItemSet(0),
pOutItemSet(0),
pChartData(0),
bUpdateChartData(TRUE),
bChartInserted(FALSE)
{
FreeResource();
pSh->Push();
aRangeEd. SetModifyHdl(LINK(this, SwInsertChartDlg, ModifyHdl));
aNext. SetClickHdl(LINK(this, SwInsertChartDlg, NextHdl));
aFinish. SetClickHdl(LINK(this, SwInsertChartDlg, FinishHdl));
aCancel. SetClickHdl(LINK(this, SwInsertChartDlg, CloseHdl));
aFirstRow. SetClickHdl(LINK(this, SwInsertChartDlg, ClickHdl));
aFirstCol. SetClickHdl(LINK(this, SwInsertChartDlg, ClickHdl));
if( pWrtShell->IsCrsrInTbl() )
{
SwFrmFmt* pTblFmt = pWrtShell->GetTableFmt();
aAktTableName = pTblFmt->GetName();
if( !pWrtShell->IsTableMode() )
{
pWrtShell->GetView().GetViewFrame()->GetDispatcher()->
Execute(FN_TABLE_SELECT_ALL, SFX_CALLMODE_SYNCHRON);
}
pWrtShell->UpdateChartData( aAktTableName, pChartData );
String sText( String::CreateFromAscii("<.>") );
sText.Insert( pWrtShell->GetBoxNms(), 2);
sText.Insert( aAktTableName, 1 );
if(sText.GetTokenCount(':') == 2)
aRangeEd.SetText(sText);
ModifyHdl( &aRangeEd );
}
pInItemSet = new SfxItemSet( pWrtShell->GetAttrPool(),
CHATTR_START, CHATTR_END, 0 );
pOutItemSet = new SfxItemSet( pWrtShell->GetAttrPool(),
CHATTR_START, CHATTR_END, 0 );
SFX_APP()->LockDispatcher(TRUE);
pWrtShell->SelTblCells( LINK( this, SwInsertChartDlg,
SelTblCellsNotify) );
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
__EXPORT SwInsertChartDlg::~SwInsertChartDlg()
{
SfxApplication* pSfxApp = SFX_APP();
if(pSfxApp->IsDispatcherLocked())
pSfxApp->LockDispatcher(FALSE);
pWrtShell->EndSelTblCells();
pWrtShell->Pop(bChartInserted);
delete pInItemSet;
delete pOutItemSet;
delete pChartDlg;
delete pChartData;
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
BOOL SwInsertChartDlg::Close()
{
SFX_APP()->LockDispatcher(FALSE);
return SfxModelessDialog::Close();
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
//OS: WNTMSCI4 optimiert sonst SetPosPixel und Hide weg!
#pragma optimize("",off)
IMPL_LINK( SwInsertChartDlg, NextHdl, Button *, pBtn )
{
if ( bUpdateChartData )
UpdateData();
if(!pChartDlg)
{
pChartDlg = SchDLL::CreateAutoPilotDlg( GetParent(), pChartData,
*pInItemSet, *pOutItemSet, TRUE);
}
else if(bUpdateChartData)
{
SchDLL::ChangeChartData(pChartDlg,
pChartData);
}
bUpdateChartData = FALSE;
pChartDlg->SetPosPixel(GetPosPixel());
SfxViewFrame* pVFrame = pWrtShell->GetView().GetViewFrame();
pVFrame->ShowChildWindow(SID_INSERT_DIAGRAM, FALSE);
USHORT nResult = pChartDlg->Execute();
switch( nResult )
{
case RET_OK:
FinishHdl( &aFinish );
break;
case RET_CANCEL:
SetPosPixel(pChartDlg->GetPosPixel());
Close();
break;
default:
SetPosPixel(pChartDlg->GetPosPixel());
pVFrame->ShowChildWindow(SID_INSERT_DIAGRAM, TRUE);
break;
}
return 0;
}
#pragma optimize("",on)
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
IMPL_LINK( SwInsertChartDlg, FinishHdl, Button *, EMPTYARG )
{
pWrtShell->GotoTable(aAktTableName);
pWrtShell->GetView().GetViewFrame()->ToTop();
SwWrtShell* pShell = pWrtShell; // Member auf den Stack wg. Close()
SfxItemSet* pOutSet = pOutItemSet;
pOutItemSet = 0;
bChartInserted = TRUE;
BOOL bCrsrInTbl = pShell->IsCrsrInTbl() != 0;
BOOL bTblCplx = pShell->IsTblComplexForChart();
if( bCrsrInTbl && !bTblCplx && bUpdateChartData )
UpdateData();
SchMemChart *pChData = pChartData; // Member auf den Stack wg. Close() -> aber erst nach UpdateData()
pChartData = 0;
Close();
if( bCrsrInTbl && !bTblCplx )
{
SwTableFUNC( pShell, FALSE ).InsertChart( *pChData, pOutSet );
}
else
{
pShell->Insert( 0, SCH_MOD()->pSchChartDocShellFactory, FALSE );
}
delete pOutSet;
delete pChData;
return 0;
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
IMPL_LINK( SwInsertChartDlg, ClickHdl, CheckBox *, EMPTYARG )
{
bUpdateChartData = TRUE;
return 0;
}
/*------------------------------------------------------------------------
Beschreibung: Handler fuer die Tabellenselektion
------------------------------------------------------------------------*/
IMPL_LINK( SwInsertChartDlg, SelTblCellsNotify, SwWrtShell *, pCaller )
{
SwFrmFmt* pTblFmt = pCaller->GetTableFmt();
SwTable* pTbl = 0;
if(pTblFmt)
{
SwClientIter aIter(*pTblFmt);
pTbl = (SwTable*)aIter.First(TYPE(SwTable));
DBG_ASSERT(pTbl, "keine Tabelle gefunden")
}
if( pTbl && !pCaller->IsTblComplexForChart() )
{
String sCommand = String::CreateFromAscii("<.>");
sCommand.Insert(pCaller->GetBoxNms(),2);
aAktTableName = pTblFmt->GetName();
sCommand.Insert(pTblFmt->GetName(), 1);
aRangeEd.SetText(sCommand);
}
else
{
aRangeEd.SetText(aEmptyStr);
}
ModifyHdl( &aRangeEd );
return 0;
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
IMPL_LINK( SwInsertChartDlg, CloseHdl, Button*, EMPTYARG )
{
Close();
return 0;
}
/*------------------------------------------------------------------------
Beschreibung: Handler fuer Edit
------------------------------------------------------------------------*/
IMPL_LINK( SwInsertChartDlg, ModifyHdl, Edit*, pEdit )
{
// hier muss getestet werden, ob mit dem aktuellen Eintrag eine
// gueltige Selektion einer Tabelle aufgebaut werden kann
BOOL bCorrect = FALSE;
BOOL bFinish = FALSE;
BOOL bChkFirstRow = TRUE, bChkFirstCol = TRUE;
String sContent = pEdit->GetText();
if( !sContent.Len() )
{
bCorrect = pWrtShell->IsCrsrInTbl() != 0;
aAktTableName = sContent;
bFinish = TRUE;
}
else if( sContent.GetChar( 0 ) == '<' &&
sContent.GetTokenCount(':') == 2 &&
sContent.GetChar( sContent.Len() - 1 ) == '>')
{
USHORT nFndPos = sContent.Search( '.' );
String aTable( sContent.Copy( 1, nFndPos - 1 ));
SwFrmFmt* pFmt = pWrtShell->GetTableFmt();
if( ( pFmt && pFmt->GetName() == aTable ) ||
pWrtShell->GotoTable( aTable ) )
{
aAktTableName = aTable;
sContent.Erase( 0, nFndPos + 1 );
sContent.Erase( sContent.Len() - 1 );
SwTable* pTable = SwTable::FindTable( pWrtShell->GetTableFmt() );
SwChartLines aLines;
if( !pTable->IsTblComplexForChart( sContent, &aLines ))
{
bChkFirstCol = 1 < aLines[ 0 ]->Count();
bChkFirstRow = 1 < aLines.Count();
bFinish = bCorrect = TRUE;
}
}
}
aNext.Enable( bCorrect );
aFinish.Enable( bFinish );
if( bChkFirstRow != aFirstRow.IsEnabled() )
{
if( bChkFirstRow )
aFirstRow.Check( aFirstRow.GetSavedValue() );
else
{
aFirstRow.SaveValue();
aFirstRow.Check( FALSE );
}
aFirstRow.Enable( bChkFirstRow );
}
if( bChkFirstCol != aFirstCol.IsEnabled() )
{
if( bChkFirstCol )
aFirstCol.Check( aFirstCol.GetSavedValue() );
else
{
aFirstCol.SaveValue();
aFirstCol.Check( FALSE );
}
aFirstCol.Enable( bChkFirstCol );
}
bUpdateChartData = TRUE;
return 0;
}
void SwInsertChartDlg::UpdateData()
{
if( !pChartData )
pWrtShell->UpdateChartData( aAktTableName, pChartData );
if( pChartData )
{
String aData = aFirstRow.IsChecked() ? '1' : '0';
aData += aFirstCol.IsChecked() ? '1': '0';
pChartData->SomeData2() = aData;
aData = aRangeEd.GetText();
aData.Erase(1, aAktTableName.Len() +1 );
pChartData->SomeData1() = aData;
pWrtShell->UpdateChartData( aAktTableName, pChartData );
}
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
SwInsertChartChild::SwInsertChartChild(Window* pParent,
USHORT nId,
SfxBindings* pBindings,
SfxChildWinInfo* pInfo ) :
SfxChildWindow( pParent, nId )
{
SwView *pView = ::GetActiveView();
SwWrtShell &rSh = pView->GetWrtShell();
pWindow = new SwInsertChartDlg( pBindings, this, pParent, &rSh );
pWindow->SetPosPixel(pInfo->aPos);
pWindow->Show();
}
void __EXPORT AutoEdit::KeyInput( const KeyEvent& rEvt )
{
USHORT nCode = rEvt.GetKeyCode().GetCode();
if( nCode != KEY_SPACE )
Edit::KeyInput( rEvt );
}