Files
libreoffice/sw/source/ui/inc/view.hxx

673 lines
22 KiB
C++
Raw Blame History

/*************************************************************************
*
* $RCSfile: view.hxx,v $
*
* $Revision: 1.7 $
*
* last change: $Author: jp $ $Date: 2001-04-30 15:59:40 $
*
* 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): _______________________________________
*
*
************************************************************************/
#ifndef _SWVIEW_HXX
#define _SWVIEW_HXX
#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _VIEWFAC_HXX //autogen
#include <sfx2/viewfac.hxx>
#endif
#ifndef _SFXVIEWSH_HXX //autogen
#include <sfx2/viewsh.hxx>
#endif
#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif
#ifndef _SVX_ZOOMITEM_HXX //autogen
#include <svx/zoomitem.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SHELLID_HXX
#include <shellid.hxx>
#endif
class SwBaseShell;
class Button;
class ImageButton;
class SwTxtFmtColl;
class SwPageDesc;
class SwFrmFmt;
class SwCharFmt;
class SwNumRule;
class SwViewOption;
class SwGlossaryHdl;
class SwDrawBase;
class SvxRuler;
class SvxLRSpaceItem;
class SwDocShell;
class SwScrollbar;
class PrintDialog;
class SvxVCBrowser;
class SvBorder;
class Ruler;
class OutlinerView;
class SvxSearchItem;
class SearchAttrItemList;
class SvxSearchDialog;
class SdrView;
class Dialog;
class SdrObject;
class SdrPageView;
class SwNaviImageButton;
class SwHlpImageButton;
class Outliner;
class SwView;
class SwEditWin;
class SwWrtShell;
class SwView_Impl;
class XSelectionObject;
struct SwSearchOptions;
class FmFormShell;
class CommandEvent;
class InsCaptionOpt;
class SvGlobalName;
namespace com{ namespace sun { namespace star {
namespace view{ class XSelectionSupplier; }
}}}
const long nLeftOfst = -370;
const long nScrollX = 30;
const long nScrollY = 30;
#define MINZOOM 20
#define MAXZOOM 600
#define MAX_MARKS 5
enum ShellModes
{
SEL_TEXT,
SEL_FRAME,
SEL_GRAPHIC,
SEL_OBJECT,
SEL_DRAW,
SEL_DRAW_CTRL,
SEL_DRAW_FORM,
SEL_DRAWTEXT,
SEL_BEZIER,
SEL_LIST_TEXT,
SEL_TABLE_TEXT,
SEL_TABLE_LIST_TEXT
};
/*--------------------------------------------------------------------
Beschreibung: Anwendung einer Vorlage
--------------------------------------------------------------------*/
struct SwApplyTemplate
{
union
{
SwTxtFmtColl* pTxtColl;
SwPageDesc* pPageDesc;
SwFrmFmt* pFrmFmt;
SwCharFmt* pCharFmt;
SwNumRule* pNumRule;
} aColl;
int eType;
USHORT nColor;
BOOL bUndo;
SwApplyTemplate() :
eType(0),
nColor(0),
bUndo(FALSE)
{
aColl.pTxtColl = 0;
}
};
/*--------------------------------------------------------------------
Beschreibung: Sicht auf ein Dokument
--------------------------------------------------------------------*/
class SwView: public SfxViewShell
{
//Messehack (MA,MBA)
friend void lcl_SelectShellForDrop( SwView &rView );
friend class TestTemplateItem;
friend class SwSpellWrapper;
friend class SwHyphWrapper;
friend class SwView_Impl;
friend class SwClipboardChangeListener;
//suchen & ersetzen
static SvxSearchDialog *pSrchDlg;
static SvxSearchItem *pSrchItem;
static USHORT nInsertCtrlState;
static USHORT nWebInsertCtrlState;
static USHORT nInsertObjectCtrlState;
static USHORT nInsertFieldCtrlState;
static USHORT nMoveType; // fuer Buttons unter dem Scrollbar (viewmdi)
static BYTE nActMark; // aktuelle Sprungmarke fuer unbenannte Merker
static BOOL bExtra;
static BOOL bFound;
static BOOL bJustOpened;
static SearchAttrItemList* pSrchList;
static SearchAttrItemList* pReplList;
Timer aTimer; //Fuer verzoegerte ChgLnks waehrend
//einer Aktion
String aPageStr; //Statusanzeige, aktuelle Seite
String sSwViewData,
//and the new cursor position if the user double click in the PagePreView
sNewCrsrPos;
Point aTabColFromDocPos; //Verschieben von Tabellenspalten aus
//aus dem Dokument heraus.
Size aDocSz; // aktuelle Dokumentgroesse
Rectangle aVisArea; // sichtbarer Bereich
SwEditWin *pEditWin;
SwWrtShell *pWrtShell;
SfxShell *pShell; //aktuelle SubShell auf dem Dispatcher
FmFormShell *pFormShell; // DB-FormShell
SwView_Impl *pViewImpl; // Impl-Daten fuer UNO + Basic
SwScrollbar *pHScrollbar, // MDI Bedienelemente
*pVScrollbar;
Window *pScrollFill; // Dummy-Window zum F<>llen der rechten
// unteren Ecke, wenn beide Scrollbars
// aktiv sind
SvxRuler *pHLineal,
*pVLineal;
ImageButton *pTogglePageBtn;
SwHlpImageButton *pPageUpBtn,
*pPageDownBtn;
SwNaviImageButton *pNaviBtn;
SwGlossaryHdl *pGlosHdl; // Henkel Textbausteine
SwDrawBase *pDrawActual;
const SwFrmFmt *pLastTableFormat;
int nSelectionType;
// Aktueller Drawmode
USHORT nDrawSfxId;
USHORT nFormSfxId;
USHORT nLastPasteDestination;
BOOL bCenterCrsr : 1,
bTopCrsr : 1,
bAllwaysShowSel : 1,
bTabColFromDoc : 1,
bSetTabColFromDoc : 1 ,
bAttrChgNotified : 1,
bAttrChgNotifiedWithRegistrations : 1,
bVerbsActive : 1,
bDrawRotate : 1,
bDrawSelMode : 1,
bShowAtResize : 1,
bInOuterResizePixel : 1,
bIsApi : 1,
bPasteState : 1,
bPasteSpecialState : 1
;
// Methoden fuers Suchen
// Suchkontext setzen
BOOL SearchAndWrap(BOOL bApi = FALSE);
BOOL SearchAll(USHORT* pFound = 0);
ULONG FUNC_Search( const SwSearchOptions& rOptions );
void Replace();
inline BOOL IsDocumentBorder();
BOOL IsTextTool() const;
// Bedienelemente verwalten anlegen
void CreateBtns();
DECL_LINK( BtnPage, Button * );
DECL_LINK( TimeoutHdl, Timer * );
inline long GetXScroll() const;
inline long GetYScroll() const;
Point AlignToPixel(const Point& rPt) const;
void CalcPt( Point* pPt,const Rectangle& rRect,
USHORT nRangeX = USHRT_MAX,
USHORT nRangeY = USHRT_MAX);
BOOL GetPageScrollUpOffset(SwTwips& rOff) const;
BOOL GetPageScrollDownOffset(SwTwips& rOff) const;
// Scrollbar Movements
long PageUp();
long PageDown();
long PageUpCrsr(BOOL bSelect);
long PageDownCrsr(BOOL bSelect);
long PhyPageUp();
long PhyPageDown();
int _CreateScrollbar( int bHori );
int _KillScrollbar( int bHori );
DECL_LINK( ScrollHdl, SwScrollbar * );
DECL_LINK( EndScrollHdl, SwScrollbar * );
BOOL UpdateScrollbars();
void CalcVisArea( const Size &rPixelSz );
int _CreateVLineal();
int _KillVLineal();
int _CreateTab();
int _KillTab();
void CreatePageButtons(BOOL bShow);
// Linguistik-Funktionen
void SpellDocument( const String* pStr, BOOL bAllRight = FALSE );
void HyphenateDocument();
BOOL IsDrawTextHyphenate();
void HyphenateDrawText();
void StartThesaurus();
void SpellStart( SvxSpellArea eSpell, BOOL bStartDone,
BOOL bEndDone );
void HyphStart( SvxSpellArea eSpell );
void SpellEnd();
void _SpellDocument( const String* pStr, BOOL bAllRight );
BOOL CheckSpecialCntnt();
void SpellKontext(BOOL bOn = TRUE)
{ bCenterCrsr = bOn; bAllwaysShowSel = bOn; }
// Methoden fuers Printing
virtual SfxPrinter* GetPrinter( BOOL bCreate = FALSE );
virtual PrintDialog* CreatePrintDialog( Window* pParent );
SfxTabPage* CreatePrintOptionsPage( Window* pParent,
const SfxItemSet& rSet);
// fuer Readonly-Umschaltung
virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
void _CheckReadonlyState();
void _CheckReadonlySelection();
// Methode fuer PageDesc drehen
void SwapPageMargin(const SwPageDesc&, SvxLRSpaceItem& rLR);
void _SetZoom( const Size &rEditSz,
SvxZoomType eZoomType,
short nFactor = 100,
BOOL bViewOnly = FALSE);
void CalcAndSetBorderPixel( SvBorder &rToFill, FASTBOOL bInner );
void ShowAtResize();
virtual void Move();
protected:
SwView_Impl* GetViewImpl() {return pViewImpl;}
void ImpSetVerb( int nSelType );
int GetSelectionType() const { return nSelectionType; }
void SetSelectionType(int nSet) { nSelectionType = nSet;}
// fuer die SwWebView
void SetShell( SfxShell* pS ) { pShell = pS; }
void SetFormShell( FmFormShell* pSh ) { pFormShell = pSh; }
virtual void SelectShell();
virtual void Activate(BOOL);
virtual void Deactivate(BOOL);
virtual void InnerResizePixel( const Point &rOfs, const Size &rSize );
virtual void OuterResizePixel( const Point &rOfs, const Size &rSize );
virtual Size GetOptimalSizePixel() const;
void SetImageButtonColor(Color& rColor);
const SwFrmFmt* GetLastTblFrmFmt() const {return pLastTableFormat;}
void SetLastTblFrmFmt(const SwFrmFmt* pSet) {pLastTableFormat = pSet;}
public:
SFX_DECL_VIEWFACTORY(SwView);
SFX_DECL_INTERFACE(SW_VIEWSHELL);
TYPEINFO();
SfxDispatcher &GetDispatcher();
virtual SdrView* GetDrawView() const;
virtual BOOL HasUIFeature( ULONG nFeature );
virtual void ShowCursor( FASTBOOL bOn = TRUE );
virtual ErrCode DoVerb( long nVerb );
virtual USHORT SetPrinter( SfxPrinter* pNew,
USHORT nDiff = SFX_PRINTER_ALL);
virtual ErrCode DoPrint( SfxPrinter *pPrinter, PrintDialog *pPrintDialog,
BOOL bSilent );
ShellModes GetShellMode();
com::sun::star::view::XSelectionSupplier* GetUNOObject();
String GetSelectionTextParam( BOOL bCompleteWords,
BOOL bEraseTrail );
virtual BOOL HasSelection( BOOL bText ) const;
virtual String GetSelectionText( BOOL bCompleteWords = FALSE );
virtual USHORT PrepareClose( BOOL bUI = TRUE, BOOL bForBrowsing = FALSE );
virtual void MarginChanged();
// Shell sofort wechseln -> fuer GetSelectionObject
void StopShellTimer();
// hier wird bei Bedarf SelectShell gerufen (getSelection)
void PrepareGetSelection();
inline SwWrtShell& GetWrtShell () const { return *pWrtShell; }
inline SwWrtShell* GetWrtShellPtr() const { return pWrtShell; }
inline SwEditWin &GetEditWin() { return *pEditWin; }
inline const SwEditWin &GetEditWin () const { return *pEditWin; }
#if defined WIN || defined WNT || defined UNX
void ScannerEventHdl( const ::com::sun::star::lang::EventObject& rEventObject );
#endif
//Handler fuer Textbausteine an die Textshell rausreichen, gfs. anlegen
SwGlossaryHdl* GetGlosHdl();
inline const Rectangle& GetVisArea() const { return aVisArea; }
BOOL IsScroll(const Rectangle& rRect) const;
void Scroll( const Rectangle& rRect,
USHORT nRangeX = USHRT_MAX,
USHORT nRangeY = USHRT_MAX);
long SetVScrollMax(long lMax);
long SetHScrollMax(long lMax);
DECL_LINK( SpellError, void * );
BOOL ExecSpellPopup( const Point& rPt );
BOOL ExecDrwTxtSpellPopup(const Point& rPt);
void SetTabColFromDocPos( const Point &rPt ) { aTabColFromDocPos = rPt; }
void SetTabColFromDoc( BOOL b ) { bTabColFromDoc = b; }
BOOL IsTabColFromDoc() const { return bTabColFromDoc; }
void DocSzChgd( const Size& rNewSize );
const Size& GetDocSz() const { return aDocSz; }
virtual void SetVisArea( const Rectangle&, BOOL bUpdateScrollbar = TRUE);
void SetVisArea( const Point&, BOOL bUpdateScrollbar = TRUE);
void CheckVisArea();
static Dialog* GetSearchDialog();
static USHORT GetMoveType();
static void SetMoveType(USHORT nSet);
void MoveNavigation(BOOL bNext);
static void SetActMark(BYTE nSet);
BOOL HandleWheelCommands( const CommandEvent& );
// Rahmen einfuegen
void InsFrmMode(USHORT nCols);
void SetZoom( SvxZoomType eZoomType, short nFactor = 100, BOOL bViewOnly = FALSE);
virtual void SetZoomFactor( const Fraction &rX, const Fraction & );
inline int StatHScrollbar() const;
inline int CreateHScrollbar();
inline int KillHScrollbar();
inline int CreateVScrollbar();
inline int KillVScrollbar();
inline int StatVScrollbar() const;
inline int CreateVLineal();
inline int KillVLineal();
int StatVLineal() const { return pVLineal != 0; }
void ChangeVLinealMetric(FieldUnit eUnit);
BOOL GetVLinealMetric(FieldUnit& rToFill) const;
inline int CreateTab();
inline int KillTab();
int StatTab() const { return ((Window*)pHLineal)->IsVisible(); }
SvxRuler *GetHLineal() { return pHLineal; }
SvxRuler *GetVLineal() { return pVLineal; }
void InvalidateRulerPos();
void ChangeTabMetric(FieldUnit eUnit);
BOOL GetHLinealMetric(FieldUnit& rToFill) const;
// Handler
void Execute(SfxRequest&);
void ExecPageMove(SfxRequest&);
void ExecStyle(SfxRequest&);
void ExecLingu(SfxRequest&);
void ExecDataBase(SfxRequest&);
void ExecDlg(SfxRequest&);
void ExecDlgExt(SfxRequest&);
void ExecDBDlg(SfxRequest &);
void ExecColl(SfxRequest&);
void ExecutePrint(SfxRequest&);
void ExecDraw(SfxRequest&);
void ExecTabWin(SfxRequest&);
void ExecuteStatusLine(SfxRequest&);
DECL_LINK( ExecRulerClick, Ruler * );
void ExecSearch(SfxRequest&, BOOL bNoMessage = FALSE);
void StateSearch(SfxItemSet &);
void GetState(SfxItemSet&);
void StateStatusLine(SfxItemSet&);
// Funktionen fuer Drawing
void SetDrawFuncPtr(SwDrawBase* pFuncPtr);
inline SwDrawBase* GetDrawFuncPtr(BOOL bBuf = FALSE) const { return pDrawActual; }
void GetDrawState(SfxItemSet &rSet);
void ExitDraw();
inline BOOL IsDrawRotate() { return bDrawRotate; }
inline void FlipDrawRotate() { bDrawRotate = !bDrawRotate; }
inline BOOL IsDrawSelMode() { return bDrawSelMode; }
void SetSelDrawSlot();
inline void FlipDrawSelMode() { bDrawSelMode = !bDrawSelMode; }
void NoRotate(); // Rotate-Mode abschalten
BOOL EnterDrawTextMode(const Point& aDocPos);
void LeaveDrawCreate() { nDrawSfxId = nFormSfxId = USHRT_MAX; }
BOOL IsDrawMode() { return (nDrawSfxId != USHRT_MAX || nFormSfxId != USHRT_MAX); }
BOOL IsFormMode() const;
BOOL IsBezierEditMode();
BOOL AreOnlyFormsSelected() const;
BOOL HasDrwObj(SdrObject *pSdrObj) const;
BOOL HasOnlyObj(SdrObject *pSdrObj, UINT32 eObjInventor) const;
BOOL BeginTextEdit( SdrObject* pObj, SdrPageView* pPV=NULL,
Window* pWin=NULL, BOOL bIsNewObj=FALSE);
void StateTabWin(SfxItemSet&);
// Attribute haben sich geaendert
DECL_LINK( AttrChangedNotify, SwWrtShell * );
// Links bearbeiten
void EditLinkDlg();
void AutoCaption(const USHORT nType, const SvGlobalName *pOleId = 0);
void InsertCaption(const InsCaptionOpt *pOpt);
// Async Aufruf durch Core
void UpdatePageNums(USHORT nPhyNum, USHORT nVirtNum, const String& rPgStr);
String GetPageStr(USHORT nPhyNum, USHORT nVirtNum, const String& rPgStr);
// Shell rausreichen
SfxShell *GetCurShell() { return pShell; }
SwDocShell *GetDocShell();
inline const SwDocShell *GetDocShell() const;
inline FmFormShell *GetFormShell() { return pFormShell; }
//damit in DToren der SubShells ggf. pShell zurueckgesetzt werden kann
void ResetSubShell() { pShell = 0; }
virtual void WriteUserData(String &, BOOL bBrowse = FALSE );
virtual void ReadUserData(const String &, BOOL bBrowse = FALSE );
virtual void ReadUserDataSequence ( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse );
virtual void WriteUserDataSequence ( com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse );
void SetCrsrAtTop( BOOL bFlag, BOOL bCenter = FALSE )
{ bTopCrsr = bFlag, bCenterCrsr = bCenter; }
BOOL IsCrsrAtTop() const { return bTopCrsr; }
BOOL IsCrsrAtCenter() const { return bCenterCrsr; }
BOOL JumpToSwMark( const String& rMark );
long InsertDoc( USHORT nSlotId, const String& rFileName,
const String& rFilterName, INT16 nVersion = 0 );
// status methods for clipboard.
// Status changes now notified from the clipboard.
BOOL IsPasteAllowed();
BOOL IsPasteSpecialAllowed();
SwView(SfxViewFrame* pFrame, SfxViewShell*);
~SwView();
};
// ----------------- inline Methoden ----------------------
inline int SwView::StatHScrollbar() const
{
return 0 != pHScrollbar;
}
inline int SwView::CreateHScrollbar()
{
return StatHScrollbar() ? 1 : _CreateScrollbar( TRUE );
}
inline int SwView::KillHScrollbar()
{
return StatHScrollbar() ? _KillScrollbar( TRUE ) : 1;
}
inline int SwView::StatVScrollbar() const
{
return 0 != pVScrollbar;
}
inline int SwView::CreateVScrollbar()
{
return StatVScrollbar() ? 1 : _CreateScrollbar( FALSE );
}
inline int SwView::KillVScrollbar()
{
return StatVScrollbar() ? _KillScrollbar( FALSE ) : 1;
}
inline int SwView::CreateVLineal()
{
return StatVLineal() ? 1 : _CreateVLineal();
}
inline int SwView::KillVLineal()
{
return StatVLineal() ? _KillVLineal() : 1;
}
inline int SwView::CreateTab()
{
return StatTab() ? 1 : _CreateTab();
}
inline int SwView::KillTab()
{
return StatTab() ? _KillTab() : 1;
}
inline long SwView::GetXScroll() const
{
return aVisArea.GetWidth() * nScrollX / 100L;
}
inline long SwView::GetYScroll() const
{
return aVisArea.GetHeight() * nScrollY / 100L;
}
inline const SwDocShell *SwView::GetDocShell() const
{
return ((SwView*)this)->GetDocShell();
}
//***********************************************************
SfxTabPage* CreatePrintOptionsPage( Window *pParent,
const SfxItemSet &rOptions,
BOOL bPreview);
#endif