/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"

#include <editeng/editeng.hxx>
#include <editeng/eeitem.hxx>
#include <editeng/editview.hxx>
#include <editeng/editobj.hxx>
#include <editeng/editstat.hxx>
#include <eerdll.hxx>
#include <editeng/flditem.hxx>
#include <tools/urlobj.hxx>
#include <svx/svxacorr.hxx>
#include <tools/fsys.hxx>
#include <svx/xpoly.hxx>
#include <svtools/filedlg.hxx>

#include <vcl/window.hxx>
#include <vcl/svapp.hxx>
#include <vcl/font.hxx>
#include <vcl/sound.hxx>
#include <vcl/print.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/help.hxx>
#include <vcl/scrbar.hxx>
#include <vcl/wrkwin.hxx>
#include <vcl/msgbox.hxx>

#include <dialdll.hxx>


#define SERVICE_SIMPLEREGISTRY             "com.sun.star.registry.SimpleRegistry"
#include <comphelper/processfactory.hxx>
#include <comphelper/regpathhelper.hxx>
#include <cppuhelper/servicefactory.hxx>
#include <cppuhelper/bootstrap.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/registry/XSimpleRegistry.hpp>
#include <sfx2/sfxuno.hxx>

// SVX
#include <editeng/lrspitem.hxx>
#include <editeng/shdditem.hxx>
#include <editeng/cntritem.hxx>
#include <editeng/crsditem.hxx>
#include <editeng/udlnitem.hxx>
#include <editeng/lspcitem.hxx>
#include <editeng/escpitem.hxx>
#include <editeng/kernitem.hxx>
#include <editeng/akrnitem.hxx>
#include <editeng/wrlmitem.hxx>
#include <editeng/colritem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/postitem.hxx>
#include <editeng/adjitem.hxx>
#include <editeng/wghtitem.hxx>
#include <editeng/fhgtitem.hxx>
#include <editeng/fontitem.hxx>
#include <fwdtitem.hxx>

// SVTOOLS
#include <svl/undo.hxx>
#include <svl/itemset.hxx>
#include <svl/itempool.hxx>
#include <svl/poolitem.hxx>
#include <svtools/printdlg.hxx>

#include <osl/file.hxx>
#include <osl/process.h>
#include <rtl/bootstrap.hxx>

#define TB_LEFT			 1
#define TB_RIGHT		 2
#define TB_CENTER		 3
#define TB_UNDO			 4
#define TB_REDO			 5
#define TB_FONT1		 6
#define TB_FONT2		 7
#define TB_ITALIC		 8
#define TB_BOLD			 9
#define TB_UNDERLINE	10
#define TB_BLACK		11
#define TB_GREEN		12
#define TB_OPEN			13
#define TB_SAVE			14
#define TB_SBL			15
#define TB_SBSA			16
#define TB_LR			17
#define TB_DRAW			18
#define TB_DEFTAB		19
#define TB_OPEN2		20
#define TB_SAVE2		21
#define TB_STDSEL		33
#define TB_MOVE			34
#define TB_PARATTR1		35
#define TB_ROTATE		38
#define TB_RED			43
#define TB_FLAT			46
#define TB_BINOBJ1		47
#define TB_BINOBJ3		49
#define TB_BINOBJ4		50
#define TB_BINOBJ1b		51
#define TB_BINOBJ2b		52
#define TB_ATTRIBS		54
#define TB_IDLE			55
#define TB_BLOCK		56
#define TB_CLONEBIN		57
#define TB_INSERT		58
#define TB_PKERN		59
#define TB_KERN			60
#define TB_SUPER		61
#define TB_SUB			62
#define TB_PRINT		63
#define TB_FONT			64
#define TB_COLORS		65
#define TB_WLM			66
#define TB_OUTL			67
#define TB_INSFLD		68
#define TB_UPDFLD		69
#define TB_ONLINESPELL  70
#define TB_REDLINES		71
#define TB_AUTOCORRECT	72
#define TB_POLY			73
#define TB_HYPH			74

// VARS...
short nRotation = 0;
USHORT nZoom = 100;
sal_Bool bURLClicked = sal_False;

using namespace ::com::sun::star::connection;
using namespace ::vos;
using namespace ::rtl;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::registry;
using namespace ::com::sun::star::lang;



Reference< XMultiServiceFactory > createApplicationServiceManager()
{
    Reference< XMultiServiceFactory > xMS;
	try
	{
		Reference< XComponentContext >    xComponentContext = ::cppu::defaultBootstrap_InitialComponentContext();
        if ( xComponentContext.is() )
		    xMS = xMS.query( xComponentContext->getServiceManager() );
	}
	catch( ::com::sun::star::uno::Exception& )
	{
	}

	return xMS;
}

// --- class EditApp -------------------------------------------------

SV_DECL_PTRARR_DEL( StringList, String*, 0, 4 );
SV_IMPL_PTRARR( StringList, String* );
StringList aSimpleHistory;

class EditApp : public Application
{
public:
	virtual void Main();
};

class MyEditEngine : public EditEngine
{
public:
	MyEditEngine( SfxItemPool* pPool ) : EditEngine( pPool ) { ; }
	virtual String	CalcFieldValue( const SvxFieldItem& rField, USHORT nPara, USHORT nPos, Color*& rTxtColor, Color*& rFldColor );
	virtual void	FieldClicked( const SvxFieldItem& rField, USHORT nPara, USHORT nPos );
	virtual void	FieldSelected( const SvxFieldItem& rField, USHORT nPara, USHORT nPos );
};

XubString __EXPORT MyEditEngine::CalcFieldValue( const SvxFieldItem& rField, USHORT nPara, USHORT nPos, Color*& rpTxtColor, Color*& rpFldColor )
{
	const SvxFieldData* pField = rField.GetField();
	if ( !pField )
		return String( RTL_CONSTASCII_USTRINGPARAM( "<Empty>" ) );

	if ( pField->ISA( SvxDateField ) )
		return ((const SvxDateField*)pField)->GetFormatted( LANGUAGE_SYSTEM, LANGUAGE_SYSTEM );
	else if ( pField->ISA( SvxURLField ) )
	{
		const SvxURLField* pURL = (const SvxURLField*)pField;
		if ( !bURLClicked )
		{
			delete rpTxtColor;
			rpTxtColor = new Color( COL_BLUE );
		}
		else
		{
			delete rpTxtColor;
			rpTxtColor = new Color( COL_RED );
			delete rpFldColor;
			rpFldColor = new Color( COL_YELLOW );
		}
		if ( pURL->GetFormat() == SVXURLFORMAT_URL )
			return pURL->GetURL();
		return pURL->GetRepresentation();
	}
	return String( RTL_CONSTASCII_USTRINGPARAM( "???" ) );
}

void __EXPORT MyEditEngine::FieldClicked( const SvxFieldItem& rField, USHORT nPara, USHORT nPos )
{
	EditEngine::FieldClicked( rField, nPara, nPos );	// Falls URL
	const SvxFieldData* pField = rField.GetField();
	if ( !pField )
		return;

	if ( pField->ISA( SvxURLField ) )
	{
		bURLClicked = TRUE;
		UpdateFields();
	}
	else
		Sound::Beep();
}

void __EXPORT MyEditEngine::FieldSelected( const SvxFieldItem& rField, USHORT nPara, USHORT nPos )
{
	const SvxFieldData* pField = rField.GetField();
	if ( !pField )
		return;

	InfoBox( 0, String( RTL_CONSTASCII_USTRINGPARAM( "Feld selektiert!" ) ) ).Execute();
}


class MyView : public WorkWindow
{
private:
	EditEngine*		pEditEngine;
	EditView*		pEditView;

public:
					MyView( Window* pParent, EditEngine* pEditEngine );
					~MyView();

	virtual void	Paint( const Rectangle& );
	virtual void	Resize();
	virtual void	KeyInput( const KeyEvent& rKeyEvt );
	virtual void	MouseMove( const MouseEvent& rMEvt );
	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
	virtual void	MouseButtonUp( const MouseEvent& rMEvt );
	virtual void	Command( const CommandEvent& rCEvt );
	BOOL    		Drop( const DropEvent& rEvt );
	BOOL    		QueryDrop( DropEvent& rEvt );
};

MyView::MyView( Window* pParent, EditEngine* pEE ) : WorkWindow( pParent, WinBits( WB_STDWORK ) )
{
	pEditEngine = pEE;
	pEditView = new EditView( pEditEngine, this );
	pEditEngine->InsertView( pEditView );
	SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Another View..." ) ) );
//	EnableDrop();
	SetBackgroundBrush( Brush( Color( COL_LIGHTBLUE ) ) );
	Show();
}

MyView::~MyView()
{
	pEditEngine->RemoveView( pEditView );
	delete pEditView;
}

void __EXPORT MyView::Paint( const Rectangle& rRec )
{
	pEditView->Paint( rRec );
}

void __EXPORT MyView::Resize()
{
	Size aPaperSz( GetOutputSize() );
//	aPaperSz.Width() /= 2;
//	aPaperSz.Height() /= 2;
	pEditView->SetOutputArea( Rectangle( Point( 0,0 ), aPaperSz ) );
	pEditView->SetVisArea( Rectangle( Point( 0,0 ), aPaperSz ) );
	Invalidate();
	pEditView->ShowCursor();
}

// --- MyView::KeyInput() --------------------------------------
void __EXPORT MyView::KeyInput( const KeyEvent& rKEvt )
{
	pEditView->PostKeyEvent( rKEvt );
}

void __EXPORT MyView::MouseMove( const MouseEvent& rMEvt )
{
	Point aPos = PixelToLogic( rMEvt.GetPosPixel() );
	if ( pEditView->GetOutputArea().IsInside( aPos ) )
		SetPointer( pEditView->GetPointer() );
	else
		SetPointer( Pointer() );


	pEditView->MouseMove( rMEvt );
}

void __EXPORT MyView::MouseButtonDown( const MouseEvent& rMEvt )
{
	pEditView->MouseButtonDown( rMEvt );
}

void __EXPORT MyView::MouseButtonUp( const MouseEvent& rMEvt )
{
	pEditView->MouseButtonUp( rMEvt );
}

void __EXPORT MyView::Command( const CommandEvent& rCEvt )
{
	if ( rCEvt.GetCommand() == COMMAND_STARTDRAG )
		pEditView->Command(rCEvt);
}

BOOL __EXPORT MyView::Drop( const DropEvent& rEvt )
{
	return pEditView->Drop( rEvt );
}

BOOL __EXPORT MyView::QueryDrop( DropEvent& rEvt )
{
	return pEditView->QueryDrop( rEvt );
}

// --- class EditMainWindow --------------------------------------------
DECLARE_LIST( ViewList, MyView* );

class EditViewWindow : public Window
{
private:
	MyEditEngine*			pEditEngine;
	EditView*				pEditView;
	Pointer 				aStdPtr;
	Pointer 				aURLPtr;
	WorkWindow* 			pTmpWindow;
	ViewList 				aViewList;

	XubString 				aTestStr;


public:
					EditViewWindow( Window* pParent );
					~EditViewWindow();

	virtual void	Paint( const Rectangle& );
	virtual void	Resize();
	virtual void	KeyInput( const KeyEvent& rKeyEvt );
	virtual void	MouseMove( const MouseEvent& rMEvt );
	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
	virtual void	MouseButtonUp( const MouseEvent& rMEvt );
	virtual void	Command( const CommandEvent& rCEvt );
	void			MarkOutputArea();
	BOOL    		Drop( const DropEvent& rEvt );
	BOOL    		QueryDrop( DropEvent& rEvt );

	EditView*		GetEditView() 		{ return pEditView; }
};

class EditMainWindow : public WorkWindow
{
private:
	ToolBox 				aToolBox;
	ScrollBar				aHScrollBar;
	ScrollBar				aVScrollBar;
	EditViewWindow			aViewWin;
	Printer*				pPrinter;

	WorkWindow* 			pTmpWindow;

	EditTextObject*			pRTFObj;
	EditTextObject*			pBinObj;

	FileDialog*				pFileDialogBox;
	FileDialog*				pFileDialogBox2;


protected:
	void			SetScrollBars();
	void			SetScrollBarRanges();
	void			CreatePolygon();

	virtual void	GetFocus();

public:
					EditMainWindow();
					~EditMainWindow();

	virtual void	Resize();

	DECL_LINK( TBSelect, ToolBox * );
	void			UpdateToolBox();

	DECL_LINK( HScrollHdl, ScrollBar * );
	DECL_LINK( VScrollHdl, ScrollBar * );
	DECL_LINK( ShowStatus, EditStatus * );
	void			SetTitle();
};


EditMainWindow::~EditMainWindow()
{
	delete pRTFObj;
	delete pBinObj;
	delete pFileDialogBox;
	delete pFileDialogBox2;
	delete pTmpWindow;
	delete pPrinter;
}

EditMainWindow::EditMainWindow() :
				WorkWindow( NULL, WB_APP | WB_STDWORK | WB_SVLOOK | WB_CLIPCHILDREN ) ,
				aViewWin( this ),
				aToolBox( this, WinBits( WB_BORDER | WB_SVLOOK | WB_SCROLL | WB_LINESPACING ) ),
				aHScrollBar( this, WinBits( WB_HSCROLL | WB_DRAG ) ),
				aVScrollBar( this, WinBits( WB_VSCROLL | WB_DRAG ) )
{
	pRTFObj = 0;
	pBinObj = 0;

	pFileDialogBox = new FileDialog( this, WinBits( WB_OPEN | WB_SVLOOK ) );
	pFileDialogBox->SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Open" ) ) );
	pFileDialogBox->AddFilter( String( RTL_CONSTASCII_USTRINGPARAM( "Text" )), String( RTL_CONSTASCII_USTRINGPARAM( "*.txt" ) ) );
	pFileDialogBox->AddFilter( String( RTL_CONSTASCII_USTRINGPARAM( "Rich Text Format" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.rtf" ) ) );
	pFileDialogBox->AddFilter( String( RTL_CONSTASCII_USTRINGPARAM( "HTML" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.htm;*.html" ) ) );
	pFileDialogBox->SetCurFilter( String( RTL_CONSTASCII_USTRINGPARAM( "Rich Text Format" ) ) );

	pFileDialogBox2 = new FileDialog( this, WinBits( WB_SAVEAS| WB_SVLOOK ) );
	pFileDialogBox2->SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Save" ) ) );
	pFileDialogBox2->AddFilter( String( RTL_CONSTASCII_USTRINGPARAM( "Text" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.txt" ) ) );
	pFileDialogBox2->AddFilter( String( RTL_CONSTASCII_USTRINGPARAM( "Rich Text Format" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.rtf" ) ) );
	pFileDialogBox2->AddFilter( String( RTL_CONSTASCII_USTRINGPARAM( "HTML" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.htm" ) ) );
	pFileDialogBox2->SetCurFilter( String( RTL_CONSTASCII_USTRINGPARAM( "Rich Text Format" ) ) );

	pPrinter = new Printer;
	pPrinter->SetMapMode( MAP_100TH_MM );
	aViewWin.SetMapMode( pPrinter->GetMapMode() );
	aViewWin.GetEditView()->GetEditEngine()->SetRefDevice( pPrinter );



	pTmpWindow = new WorkWindow( this, WB_STDWORK );

	aToolBox.SetButtonType( BUTTON_TEXT );
	aToolBox.SetLineCount( 4 );

	{
	aToolBox.InsertItem( TB_OPEN, String( RTL_CONSTASCII_USTRINGPARAM( "Open" ) ) );
	aToolBox.InsertItem( TB_SAVE, String( RTL_CONSTASCII_USTRINGPARAM( "Save" ) ) );
	aToolBox.InsertItem( TB_PRINT, String( RTL_CONSTASCII_USTRINGPARAM( "Print" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_LEFT, String( RTL_CONSTASCII_USTRINGPARAM( "L" ) ) );
	aToolBox.InsertItem( TB_CENTER, String( RTL_CONSTASCII_USTRINGPARAM( "C" ) ) );
	aToolBox.InsertItem( TB_RIGHT, String( RTL_CONSTASCII_USTRINGPARAM( "R" ) ) );
	aToolBox.InsertItem( TB_BLOCK, String( RTL_CONSTASCII_USTRINGPARAM( "B" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_UNDO, String( RTL_CONSTASCII_USTRINGPARAM( "Undo" ) ) );
	aToolBox.InsertItem( TB_REDO, String( RTL_CONSTASCII_USTRINGPARAM( "Redo" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_FONT1, String( RTL_CONSTASCII_USTRINGPARAM( "Font1" ) ) );
	aToolBox.InsertItem( TB_FONT2, String( RTL_CONSTASCII_USTRINGPARAM( "Font2" ) ) );
	aToolBox.InsertItem( TB_DEFTAB, String( RTL_CONSTASCII_USTRINGPARAM( "DefTab" ) ) );
	aToolBox.InsertBreak();
	aToolBox.InsertItem( TB_OPEN2, String( RTL_CONSTASCII_USTRINGPARAM( "Read" ) ) );
	aToolBox.InsertItem( TB_SAVE2, String( RTL_CONSTASCII_USTRINGPARAM( "Write" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_FONT, String( RTL_CONSTASCII_USTRINGPARAM( "XXX" ) ) );
	aToolBox.InsertItem( TB_ITALIC, String( RTL_CONSTASCII_USTRINGPARAM( "K" ) ) );
	aToolBox.InsertItem( TB_BOLD, String( RTL_CONSTASCII_USTRINGPARAM( "F" ) ) );
	aToolBox.InsertItem( TB_UNDERLINE, String( RTL_CONSTASCII_USTRINGPARAM( "U" ) ) );
	aToolBox.InsertItem( TB_SUPER, String( RTL_CONSTASCII_USTRINGPARAM( "SP" ) ) );
	aToolBox.InsertItem( TB_SUB, String( RTL_CONSTASCII_USTRINGPARAM( "SB" ) ) );
	aToolBox.InsertItem( TB_PKERN, String( RTL_CONSTASCII_USTRINGPARAM( "PK" ) ) );
	aToolBox.InsertItem( TB_KERN, String( RTL_CONSTASCII_USTRINGPARAM( "TK" ) ) );
	aToolBox.InsertItem( TB_WLM, String( RTL_CONSTASCII_USTRINGPARAM( "W!" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_BLACK, String( RTL_CONSTASCII_USTRINGPARAM( "Black" ) ) );
	aToolBox.InsertItem( TB_GREEN, String( RTL_CONSTASCII_USTRINGPARAM( "Green" ) ) );
	aToolBox.InsertItem( TB_RED, String( RTL_CONSTASCII_USTRINGPARAM( "Red" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_SBL, String( RTL_CONSTASCII_USTRINGPARAM( "SBL" ) ) );
	aToolBox.InsertItem( TB_SBSA, String( RTL_CONSTASCII_USTRINGPARAM( "SBSA" ) ) );
	aToolBox.InsertItem( TB_LR, String( RTL_CONSTASCII_USTRINGPARAM( "LR" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_DRAW, String( RTL_CONSTASCII_USTRINGPARAM( "Draw!" ) ) );
	aToolBox.InsertItem( TB_ROTATE, String( RTL_CONSTASCII_USTRINGPARAM( "Rotate!" ) ) );
	aToolBox.InsertItem( TB_MOVE, String( RTL_CONSTASCII_USTRINGPARAM( "Move->2" ) ) );
	aToolBox.InsertItem( TB_PARATTR1, String( RTL_CONSTASCII_USTRINGPARAM( "ParaAttr0" ) ) );
	aToolBox.InsertItem( TB_ATTRIBS, String( RTL_CONSTASCII_USTRINGPARAM( "GetAttribs" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_INSFLD, String( RTL_CONSTASCII_USTRINGPARAM( "InsFld" ) ) );
	aToolBox.InsertItem( TB_UPDFLD, String( RTL_CONSTASCII_USTRINGPARAM( "UpdFld" ) ) );
	}
	aToolBox.InsertBreak();
	{
	aToolBox.InsertItem( TB_ONLINESPELL, String( RTL_CONSTASCII_USTRINGPARAM( "Spell" ) ) );
	aToolBox.InsertItem( TB_REDLINES, String( RTL_CONSTASCII_USTRINGPARAM( "RedLine" ) ) );
	aToolBox.InsertItem( TB_AUTOCORRECT, String( RTL_CONSTASCII_USTRINGPARAM( "Auto*" ) ) );
	aToolBox.InsertItem( TB_HYPH, String( RTL_CONSTASCII_USTRINGPARAM( "Hyph" ) ) );
	aToolBox.InsertItem( TB_STDSEL, String( RTL_CONSTASCII_USTRINGPARAM( "StdSel" ) ) );
	aToolBox.InsertItem( TB_FLAT, String( RTL_CONSTASCII_USTRINGPARAM( "FlatMode" ) ) );
	aToolBox.InsertItem( TB_OUTL, String( RTL_CONSTASCII_USTRINGPARAM( "Ocomphelper" ) ) );
	aToolBox.InsertItem( TB_POLY, String( RTL_CONSTASCII_USTRINGPARAM( "Poly" ) ) );
	aToolBox.InsertItem( TB_COLORS, String( RTL_CONSTASCII_USTRINGPARAM( "Colors" ) ));
	aToolBox.InsertItem( TB_IDLE, String( RTL_CONSTASCII_USTRINGPARAM( "Idle!" ) ) );
	aToolBox.InsertItem( TB_INSERT, String( RTL_CONSTASCII_USTRINGPARAM( "Insert" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_BINOBJ1, String( RTL_CONSTASCII_USTRINGPARAM( ">BINObj" ) ) );
	aToolBox.InsertItem( TB_BINOBJ1b, String( RTL_CONSTASCII_USTRINGPARAM( ">>BINObj" ) ) );
	aToolBox.InsertItem( TB_BINOBJ2b, String( RTL_CONSTASCII_USTRINGPARAM( "<<BINObj" ) ) );
	aToolBox.InsertItem( TB_CLONEBIN, String( RTL_CONSTASCII_USTRINGPARAM( "Clone" ) ) );
	aToolBox.InsertSeparator();
	aToolBox.InsertItem( TB_BINOBJ3, String( RTL_CONSTASCII_USTRINGPARAM( "StoreBin" ) ) );
	aToolBox.InsertItem( TB_BINOBJ4, String( RTL_CONSTASCII_USTRINGPARAM( "CreatBin" ) ) );
	}

	aToolBox.SetPosPixel( Point( 0, 0 ) );
	aToolBox.SetSelectHdl( LINK( this, EditMainWindow, TBSelect ) );

	SetBackgroundBrush( Brush( Color( COL_LIGHTGRAY ) ) );

	SetPen( PEN_NULL );
	Show();

	aVScrollBar.SetScrollHdl ( LINK( this, EditMainWindow, VScrollHdl ) );
	aVScrollBar.SetLineSize( 300 );
	aVScrollBar.SetPageSize( 2000 );
	aHScrollBar.SetScrollHdl ( LINK( this, EditMainWindow, HScrollHdl ) );
	aHScrollBar.SetLineSize( 300 );
	aHScrollBar.SetPageSize( 2000 );
	aHScrollBar.Enable();
	aVScrollBar.Enable();

	aViewWin.GetEditView()->GetEditEngine()->SetStatusEventHdl( LINK( this, EditMainWindow, ShowStatus ) );

	SetTitle();

	UpdateToolBox();
	aToolBox.Show();
	aViewWin.Show();
}

void EditMainWindow::SetTitle()
{
	String aHeading( String( RTL_CONSTASCII_USTRINGPARAM( "SvEdit!  -  Zoom " ) ) );
	aHeading += String::CreateFromInt32(nZoom);
	aHeading += '%';
	EditEngine* pEditEngine = aViewWin.GetEditView()->GetEditEngine();
	if ( pEditEngine->GetControlWord() & EE_CNTRL_STRETCHING )
	{
		USHORT nX, nY;
		pEditEngine->GetGlobalCharStretching( nX, nY );
		aHeading += String( RTL_CONSTASCII_USTRINGPARAM( ", Stretch=(" ) );
		aHeading += String::CreateFromInt32(nX);
		aHeading += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) );
		aHeading += String::CreateFromInt32(nY);
		aHeading += ')';
	}
	SetText( aHeading );
}

void EditMainWindow::UpdateToolBox()
{
	EditView* pEditView = aViewWin.GetEditView();
	EditEngine* pEditEngine = pEditView->GetEditEngine();
	SfxItemSet aCurSet( pEditView->GetAttribs() );

	ULONG nControl = pEditEngine->GetControlWord();
	aToolBox.EnableItem( TB_UNDO, (BOOL)pEditEngine->GetUndoManager().GetUndoActionCount() );
	aToolBox.EnableItem( TB_REDO, (BOOL)pEditEngine->GetUndoManager().GetRedoActionCount() );
	aToolBox.EnableItem( TB_BINOBJ2b, (BOOL)(long)pBinObj );
	aToolBox.EnableItem( TB_MOVE, pEditEngine->GetParagraphCount() > 3 );
	aToolBox.CheckItem( TB_ONLINESPELL, nControl & EE_CNTRL_ONLINESPELLING ? TRUE : FALSE );
	aToolBox.CheckItem( TB_AUTOCORRECT, nControl & EE_CNTRL_AUTOCORRECT ? TRUE : FALSE );
//	aToolBox.CheckItem( TB_HYPH, nControl & EE_CNTRL_HYPHENATE ? TRUE : FALSE );
	aToolBox.CheckItem( TB_REDLINES, nControl & EE_CNTRL_NOREDLINES ? FALSE : TRUE );
	aToolBox.CheckItem( TB_STDSEL, pEditView->GetSelectionMode() == EE_SELMODE_STD );
	aToolBox.CheckItem( TB_FLAT, pEditEngine->IsFlatMode() );
	aToolBox.CheckItem( TB_OUTL, ( nControl & EE_CNTRL_OUTLINER ) ? TRUE : FALSE );
	aToolBox.CheckItem( TB_POLY, pEditEngine->GetPolygon() ? TRUE : FALSE );
	aToolBox.CheckItem( TB_COLORS, ( nControl & EE_CNTRL_NOCOLORS ) ? FALSE : TRUE );
	aToolBox.CheckItem( TB_IDLE, pEditEngine->IsIdleFormatterEnabled() );
	aToolBox.CheckItem( TB_INSERT, pEditView->IsInsertMode() );

	for ( USHORT nWhich = EE_ITEMS_START; nWhich <= EE_ITEMS_END; nWhich++)
	{
//		if ( aCurSet.GetItemState( nWhich ) == SFX_ITEM_OFF )
//			;
//		else if ( aCurSet.GetItemState( nWhich ) == SFX_ITEM_DONTCARE )
//			;
//		else if ( aCurSet.GetItemState( nWhich ) == SFX_ITEM_ON )
		{
			const SfxPoolItem& rItem = aCurSet.Get( nWhich );
			switch ( nWhich )
			{
				case EE_PARA_HYPHENATE:
					aToolBox.CheckItem( TB_HYPH, ((SfxBoolItem&)rItem).GetValue() != 0 );
				break;
				case EE_PARA_LRSPACE:
					aToolBox.CheckItem( TB_LR, ((SvxLRSpaceItem&)rItem).GetTxtLeft() != 0 );
				break;
				case EE_PARA_ULSPACE:
					aToolBox.CheckItem( TB_SBSA, ((SvxULSpaceItem&)rItem).GetUpper() != 0 );
				break;
				case EE_PARA_SBL:
					aToolBox.CheckItem( TB_SBL, ((SvxLineSpacingItem&)rItem).GetPropLineSpace() != 100 );
				break;
				case EE_PARA_JUST:
				{
					SvxAdjust e = ((SvxAdjustItem&)rItem).GetAdjust();
					aToolBox.CheckItem( TB_LEFT, e == SVX_ADJUST_LEFT );
					aToolBox.CheckItem( TB_RIGHT, e == SVX_ADJUST_RIGHT);
					aToolBox.CheckItem( TB_CENTER, e == SVX_ADJUST_CENTER);
					aToolBox.CheckItem( TB_BLOCK, e == SVX_ADJUST_BLOCK );
				}
				break;
				case EE_PARA_TABS:
				break;
				case EE_CHAR_COLOR:
				{
					Color aColor( ((SvxColorItem&)rItem).GetValue() );
					aToolBox.CheckItem( TB_BLACK, aColor == COL_BLACK );
					aToolBox.CheckItem( TB_GREEN, aColor == COL_GREEN );
					aToolBox.CheckItem( TB_RED, aColor == COL_RED );
				}
				break;
				case EE_CHAR_FONTINFO:
				{
					FontFamily e = ((SvxFontItem&)rItem).GetFamily();
					aToolBox.CheckItem( TB_FONT1, e == FAMILY_ROMAN );
					aToolBox.CheckItem( TB_FONT2, e == FAMILY_SWISS );
				}
				break;
				case EE_CHAR_FONTHEIGHT:
				break;
				case EE_CHAR_WEIGHT:
				{
					FontWeight e = ((SvxWeightItem&)rItem).GetWeight();
					aToolBox.CheckItem( TB_BOLD, e == WEIGHT_BOLD );
				}
				break;
				case EE_CHAR_UNDERLINE:
				{
					aToolBox.CheckItem( TB_UNDERLINE, ((SvxUnderlineItem&)rItem).GetLineStyle() );
				}
				break;
				case EE_CHAR_WLM:
				{
					aToolBox.CheckItem( TB_WLM, ((SvxWordLineModeItem&)rItem).GetValue() );
				}
				break;
				case EE_CHAR_PAIRKERNING:
				{
					aToolBox.CheckItem( TB_PKERN, ((SvxAutoKernItem&)rItem).GetValue() );
				}
				break;
				case EE_CHAR_KERNING:
				{
					aToolBox.CheckItem( TB_KERN, (BOOL)((SvxKerningItem&)rItem).GetValue() );
				}
				break;
				case EE_CHAR_ESCAPEMENT:
				{
					aToolBox.CheckItem( TB_SUPER, ((SvxEscapementItem&)rItem).GetEsc() > 0 );
					aToolBox.CheckItem( TB_SUB, ((SvxEscapementItem&)rItem).GetEsc() < 0 );
				}
				break;
				case EE_CHAR_STRIKEOUT:
				break;
				case EE_CHAR_ITALIC:
				{
					FontItalic e = ((SvxPostureItem&)rItem).GetPosture();
					aToolBox.CheckItem( TB_ITALIC, e == ITALIC_NORMAL );
				}
				break;
				case EE_CHAR_OUTLINE:
				break;
				case EE_CHAR_SHADOW:
				break;
			}
		}
	}
}

IMPL_LINK( EditMainWindow, TBSelect, ToolBox *, p )
{
	EditView* pEditView = aViewWin.GetEditView();
	EditEngine* pEditEngine = pEditView->GetEditEngine();
	USHORT nId = aToolBox.GetCurItemId();
	BOOL bChecked = aToolBox.IsItemChecked( nId );
	SfxPoolItem* pNewItem = 0;
	switch ( nId )
	{
		case TB_LEFT:	pNewItem = new SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST );
						break;
		case TB_RIGHT:	pNewItem = new SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST );
						break;
		case TB_CENTER:	pNewItem = new SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST );
						break;
		case TB_BLOCK:	pNewItem = new SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST );
						break;
		case TB_HYPH: 	pNewItem = new SfxBoolItem( EE_PARA_HYPHENATE, !bChecked );
						break;
		case TB_UNDO:	pEditView->Undo();
						pEditView->ShowCursor();
						break;
		case TB_REDO:	pEditView->Redo();
						pEditView->ShowCursor();
						break;
		case TB_ONLINESPELL: {
							ULONG nControl = pEditView->GetEditEngine()->GetControlWord();
							if ( bChecked )
								nControl = nControl & ~EE_CNTRL_ONLINESPELLING;
							else
								nControl = nControl | EE_CNTRL_ONLINESPELLING;
							pEditView->GetEditEngine()->SetControlWord( nControl );
							}
							break;
		case TB_REDLINES: {
							ULONG nControl = pEditView->GetEditEngine()->GetControlWord();
							if ( !bChecked )
								nControl = nControl & ~EE_CNTRL_NOREDLINES;
							else
								nControl = nControl | EE_CNTRL_NOREDLINES;
							pEditView->GetEditEngine()->SetControlWord( nControl );
							}
							break;
		case TB_AUTOCORRECT: {
							ULONG nControl = pEditView->GetEditEngine()->GetControlWord();
							if ( bChecked )
								nControl = nControl & ~EE_CNTRL_AUTOCORRECT;
							else
								nControl = nControl | EE_CNTRL_AUTOCORRECT;
							pEditView->GetEditEngine()->SetControlWord( nControl );
							}
							break;
		case TB_STDSEL:	if ( bChecked )
							pEditView->SetSelectionMode( EE_SELMODE_TXTONLY );
						else
							pEditView->SetSelectionMode( EE_SELMODE_STD );
						break;
		case TB_FLAT:	pEditEngine->SetFlatMode( !pEditEngine->IsFlatMode() );
						break;
		case TB_COLORS:	{
							ULONG nControl = pEditView->GetEditEngine()->GetControlWord();
							if ( bChecked )
								nControl = nControl | EE_CNTRL_NOCOLORS;
							else
								nControl = nControl & ~EE_CNTRL_NOCOLORS;
							pEditView->GetEditEngine()->SetControlWord( nControl );
						}
//						aViewWin.Invalidate();
						pEditView->GetEditEngine()->Draw( pEditView->GetWindow(), pEditView->GetOutputArea(), pEditView->GetVisArea().TopLeft() );
						break;
		case TB_OUTL:	{
							ULONG nControl = pEditView->GetEditEngine()->GetControlWord();
							if ( !bChecked )
								nControl = nControl | EE_CNTRL_OUTLINER;
							else
								nControl = nControl & ~EE_CNTRL_OUTLINER;
							pEditView->GetEditEngine()->SetControlWord( nControl );
						}
						break;
		case TB_POLY:	{
							if ( !bChecked )
								CreatePolygon();
							else
								pEditView->GetEditEngine()->ClearPolygon();
						}
						break;
		case TB_IDLE:	pEditEngine->EnableIdleFormatter( !pEditEngine->IsIdleFormatterEnabled() );
						break;
		case TB_INSFLD:	{
						static BYTE nFld = 0;
						if ( nFld > 2 )
							nFld = 0;
						if ( nFld == 0 )
						{
							SvxFieldItem aFld( SvxURLField( String( RTL_CONSTASCII_USTRINGPARAM( "www.mopo.de" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "Bla" ) ), SVXURLFORMAT_REPR ), EE_FEATURE_FIELD  );
							pEditView->InsertField( aFld );
						}
						else if ( nFld == 1 )
							pEditView->InsertField( SvxFieldItem( SvxURLField( String( RTL_CONSTASCII_USTRINGPARAM( "www.mopo.de" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "Morgenpost" ) ), SVXURLFORMAT_URL ), EE_FEATURE_FIELD  ) );
						else if ( nFld == 2 )
							pEditView->InsertField( SvxFieldItem( SvxDateField( Date( 1,1,1995 ), SVXDATETYPE_FIX, SVXDATEFORMAT_D ), EE_FEATURE_FIELD ) );

						nFld++;
		}
						break;
		case TB_UPDFLD:	pEditEngine->UpdateFields();
						break;
		case TB_INSERT:	pEditView->SetInsertMode( !pEditView->IsInsertMode() );
						break;
		case TB_FONT1:	pNewItem = new SvxFontItem( FAMILY_ROMAN, String( RTL_CONSTASCII_USTRINGPARAM( "Times New Roman" ) ), String(), PITCH_DONTKNOW, RTL_TEXTENCODING_MS_1252, EE_CHAR_FONTINFO );
						break;
		case TB_FONT2:	pNewItem = new SvxFontItem( FAMILY_SWISS, String( RTL_CONSTASCII_USTRINGPARAM( "Helv" ) ), String(), PITCH_DONTKNOW, RTL_TEXTENCODING_MS_1252, EE_CHAR_FONTINFO );
						break;
/*
		case TB_FONT:
		{
			FontDialog* pDlg = new FontDialog( this, WB_SVLOOK );
			pDlg->SetPrinter( pPrinter );
			Font aFont = pEditEngine->CreateFontFromItemSet( pEditView->GetAttribs() );
			MapMode aPntMode( MAP_POINT );
			MapMode aCurrent( aViewWin.GetMapMode() );
			Size aSz(  aViewWin.LogicToLogic( aFont.GetSize(), &aCurrent, &aPntMode ) );
			aSz.Width() *= 10;
			aSz.Height() *= 10;
			aFont.SetSize(  aSz );
			pDlg->SetSelectFont( aFont );
			if ( pDlg->Execute() )
			{
				Font aNewFont( pDlg->GetSelectFont() );
				aSz = aViewWin.LogicToLogic( aNewFont.GetSize(), &aPntMode, &aCurrent );
				aSz.Width() /= 10;
				aSz.Height() /= 10;
				aNewFont.SetSize( aSz );

				SfxItemSet aSet( pEditEngine->GetEmptyItemSet() );

				pEditEngine->SetFontInfoInItemSet( aSet, aNewFont );
				pEditView->SetAttribs( aSet );
			}
			delete pDlg;
		}
		break;
*/
		case TB_BOLD:	if ( bChecked )
							pNewItem = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT);
						else
							pNewItem = new SvxWeightItem( WEIGHT_BOLD, EE_CHAR_WEIGHT);
						break;
		case TB_ITALIC:	if ( bChecked )
							pNewItem = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC );
						else
							pNewItem = new SvxPostureItem( ITALIC_NORMAL, EE_CHAR_ITALIC );
						break;
		case TB_UNDERLINE:	if ( bChecked )
								pNewItem = new SvxUnderlineItem( UNDERLINE_NONE, EE_CHAR_UNDERLINE );
							else
								pNewItem = new SvxUnderlineItem( UNDERLINE_SINGLE, EE_CHAR_UNDERLINE );
						break;
		case TB_WLM:	pNewItem = new SvxWordLineModeItem( !bChecked, EE_CHAR_WLM );
						break;
		case TB_PKERN:	pNewItem = new SvxAutoKernItem( !bChecked, EE_CHAR_PAIRKERNING );
						break;
		case TB_KERN:	if ( bChecked )
								pNewItem = new SvxKerningItem( 0, EE_CHAR_KERNING );
							else
								pNewItem = new SvxKerningItem( 100, EE_CHAR_KERNING);
						break;
		case TB_SUPER:	if ( bChecked )
								pNewItem = new SvxEscapementItem( SVX_ESCAPEMENT_OFF, EE_CHAR_ESCAPEMENT);
							else
//								pNewItem = new SvxEscapementItem( SVX_ESCAPEMENT_SUPERSCRIPT, EE_CHAR_ESCAPEMENT);
								pNewItem = new SvxEscapementItem( 50, 100, EE_CHAR_ESCAPEMENT );
						break;
		case TB_SUB:	if ( bChecked )
								pNewItem = new SvxEscapementItem( SVX_ESCAPEMENT_OFF, EE_CHAR_ESCAPEMENT);
							else
//								pNewItem = new SvxEscapementItem( SVX_ESCAPEMENT_SUBSCRIPT, EE_CHAR_ESCAPEMENT);
								pNewItem = new SvxEscapementItem( -50, 100, EE_CHAR_ESCAPEMENT );
						break;
		case TB_GREEN:	pNewItem = new SvxColorItem( Color(COL_GREEN), EE_CHAR_COLOR);
						break;
		case TB_RED:	pNewItem = new SvxColorItem( Color(COL_RED), EE_CHAR_COLOR);
						break;
		case TB_BLACK:	pNewItem = new SvxColorItem( Color(COL_BLACK), EE_CHAR_COLOR);
						break;
		case TB_SBL:	pNewItem = new SvxLineSpacingItem( 0, EE_PARA_SBL );
						if ( bChecked )
						{
							((SvxLineSpacingItem*)pNewItem)->SetInterLineSpace( 0 );
						}
						else
						{
							((SvxLineSpacingItem*)pNewItem)->SetPropLineSpace( 150 );
						}
						break;
		case TB_SBSA:	pNewItem = new SvxULSpaceItem( EE_PARA_ULSPACE );
						if ( !bChecked )
						{
							((SvxULSpaceItem*)pNewItem)->SetUpper( 400 );
							((SvxULSpaceItem*)pNewItem)->SetLower( 400 );
						}
						break;
		case TB_LR:		pNewItem = new SvxLRSpaceItem( EE_PARA_LRSPACE );
						if ( !bChecked )
						{
							((SvxLRSpaceItem*)pNewItem)->SetTxtLeft( 1000 );
							((SvxLRSpaceItem*)pNewItem)->SetTxtFirstLineOfst( -500 );
							((SvxLRSpaceItem*)pNewItem)->SetRight( 500 );
						}
						break;
		case TB_DEFTAB:	if ( bChecked )
							pEditEngine->SetDefTab( 2000 );
						else
							pEditEngine->SetDefTab( 600 );
						pEditView->ShowCursor();
						aToolBox.CheckItem( nId, !bChecked );
						break;
		case TB_DRAW:   {
							pTmpWindow->SetMapMode( aViewWin.GetMapMode() );
							pTmpWindow->SetBackgroundBrush( Brush( Color( COL_GRAY ) ) );
							pTmpWindow->SetFillInBrush( Brush( Color( COL_LIGHTGRAY ) ) );
							pTmpWindow->Show();
							pTmpWindow->Invalidate();
							pTmpWindow->Update();
							pTmpWindow->DrawText( Point( 20, 20 ), String( RTL_CONSTASCII_USTRINGPARAM( "It's a Test..." ) ) );
							Rectangle aRect( Point( 500, 500 ), Size( 10000, 4000 ) );
							pTmpWindow->DrawRect( aRect );
							pEditEngine->Draw( pTmpWindow, aRect, Point( 0, 0 ) );
							nRotation = 0;
						}
						break;
		case TB_ROTATE:   {
							nRotation += 100;
							if ( nRotation == 3600 )
								nRotation = 0;
							pTmpWindow->SetMapMode( aViewWin.GetMapMode() );
							pTmpWindow->SetBackgroundBrush( Brush( Color( COL_LIGHTGRAY ) ) );
							pTmpWindow->SetFillInBrush( Brush( Color( COL_LIGHTGRAY ) ) );
							pTmpWindow->Show();
							pTmpWindow->Invalidate();
							pTmpWindow->Update();
							pTmpWindow->DrawText( Point( 20, 20 ), String( RTL_CONSTASCII_USTRINGPARAM( "It's a Test..." ) ) );
							Rectangle aRect( Point( 500, 500 ), Size( 10000, 4000 ) );
							pEditEngine->Draw( pTmpWindow, Point( 2000, 4000 ), nRotation );
						}
						break;

		case TB_MOVE:
		{
			ESelection aESel = pEditView->GetSelection();
			USHORT nStartPara = Min( aESel.nStartPara, aESel.nEndPara );
			USHORT nEndPara = Max( aESel.nStartPara, aESel.nEndPara );
			pEditView->MoveParagraphs( Range(nStartPara,nEndPara), 2 );
		}
		break;
		case TB_PARATTR1:
		{
			pEditEngine->SetUpdateMode( FALSE );
			USHORT nPara = 0;
			SfxItemSet aSet( pEditEngine->GetEmptyItemSet() );
			aSet.Put( SvxFontItem( FAMILY_DECORATIVE, String( RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) ), String(),PITCH_DONTKNOW, RTL_TEXTENCODING_MS_1252, EE_CHAR_FONTINFO ) );
			aSet.Put( SvxColorItem( Color(COL_MAGENTA), EE_CHAR_COLOR ) );
			aSet.Put( SvxFontHeightItem(600, 100, EE_CHAR_FONTHEIGHT) );
			aSet.Put( SvxPostureItem( ITALIC_NORMAL, EE_CHAR_ITALIC ) );
			aSet.Put( SvxLRSpaceItem( 0, 0, 1000, 0, EE_PARA_LRSPACE ) );
			pEditView->SetParaAttribs( aSet, nPara );
			pEditEngine->SetUpdateMode( TRUE );
			pEditView->ShowCursor();
		}
		break;
		case TB_BINOBJ1:
		{
			delete pBinObj;
			pBinObj = pEditEngine->CreateTextObject();
		}
		break;
		case TB_BINOBJ1b:
		{
			delete pBinObj;
			pBinObj = pEditView->CreateTextObject();
		}
		break;
		case TB_CLONEBIN:
		{
			if ( pBinObj )
			{
				EditTextObject* p = pBinObj->Clone();
				delete pBinObj;
				pBinObj = p;
			}
		}
		break;
		case TB_BINOBJ2b:
		{
			if ( pBinObj )
			{
				pEditView->InsertText( *pBinObj );
			}
		}
		break;
		case TB_BINOBJ3:
		{
			if ( !pFileDialogBox2->Execute() )
				return FALSE;
			DirEntry aDirEntry( pFileDialogBox2->GetPath() );
			SvFileStream aStrm( aDirEntry.GetFull(), STREAM_WRITE | STREAM_TRUNC );
			EditTextObject* pTmpObj = pEditEngine->CreateTextObject();
			pTmpObj->Store( aStrm );
			DBG_ASSERT( !aStrm.GetError(), "Store: Error!" );
			delete pTmpObj;
		}
		break;
		case TB_BINOBJ4:
		{
			if ( !pFileDialogBox->Execute() )
				return FALSE;
			DirEntry aDirEntry( pFileDialogBox->GetPath() );
			SvFileStream aStrm( aDirEntry.GetFull(), STREAM_READ );
			delete pBinObj;
			pBinObj = EditTextObject::Create( aStrm );
//			EditTextObject* pTmpObj = pEditEngine->CreateTextObject( aStrm );
//			pEditEngine->SetText( *pTmpObj );
//			pEditView->ShowCursor();
//			delete pTmpObj;
		}
		break;
		case TB_OPEN:
		case TB_OPEN2:
		{
			if ( !pFileDialogBox->Execute() )
				return FALSE;
			DirEntry aDirEntry( pFileDialogBox->GetPath() );
			aDirEntry.ToAbs();
			String aFileName( aDirEntry.GetFull() );
			SvFileStream aStrm( aFileName, STREAM_READ );
			if ( aStrm.GetError() )
				InfoBox( 0, String( RTL_CONSTASCII_USTRINGPARAM( "StreamError!" ) ) ).Execute();
			Application::EnterWait();
			if ( nId == TB_OPEN )
			{
				if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "rtf" ) )
					pEditEngine->Read( aStrm, EE_FORMAT_RTF );
				if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "htm" ) )
					pEditEngine->Read( aStrm, EE_FORMAT_HTML );
				if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "html" ) )
					pEditEngine->Read( aStrm, EE_FORMAT_HTML );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "bin" ) )
					pEditEngine->Read( aStrm, EE_FORMAT_BIN );
				else
					pEditEngine->Read( aStrm, EE_FORMAT_TEXT );

				pEditView->ShowCursor();
			}
			else
			{
				if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "rtf" ) )
					pEditView->Read( aStrm, EE_FORMAT_RTF );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "bin" ) )
					pEditView->Read( aStrm, EE_FORMAT_BIN );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "html" ) )
					pEditView->Read( aStrm, EE_FORMAT_HTML );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "htm" ) )
					pEditView->Read( aStrm, EE_FORMAT_HTML );
				else
					pEditView->Read( aStrm, EE_FORMAT_TEXT );
			}

			Application::LeaveWait();

		}
		break;
		case TB_PRINT:
		{
			pPrinter->SetPageQueueSize( 1 );
			PrintDialog aPrnDlg( this );
			aPrnDlg.SetPrinter( pPrinter );
			if ( aPrnDlg.Execute() )
			{
				pPrinter->StartJob( String( RTL_CONSTASCII_USTRINGPARAM( "SvEdit - PrinterTest" ) ) );
				pPrinter->StartPage();
				Size aSz( pEditEngine->CalcTextWidth(), pEditEngine->GetTextHeight() );
				Pen aPen( PEN_SOLID );
				aPen.SetColor( Color( COL_BLACK ) );
				pPrinter->SetPen( aPen );
				Rectangle aR( Point( 2000, 4000 ), aSz );
				pPrinter->DrawRect( aR );
				// So folgt auf IIISi, 75DPI kein Ausdruck!
//				pPrinter->SetClipRegion( Region( aR ) );
				pEditEngine->Draw( pPrinter, Point( 2000, 4000 ), nRotation );
//				pPrinter->SetClipRegion();
				pPrinter->EndPage();
				pPrinter->EndJob();
			}
		}
		break;
		case TB_SAVE:
		case TB_SAVE2:
		{
			if ( !pFileDialogBox2->Execute() )
				return FALSE;
			DirEntry aDirEntry( pFileDialogBox2->GetPath() );
//			DirEntry aDirEntry( String( RTL_CONSTASCII_USTRINGPARAM( "d:\\xxx.rtf" ) ) );
			SvFileStream aStrm( aDirEntry.GetFull(), STREAM_WRITE | STREAM_TRUNC );
			Application::EnterWait();
			if ( nId == TB_SAVE )
			{
				if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "rtf") )
					pEditEngine->Write( aStrm, EE_FORMAT_RTF );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "bin" ) )
					pEditEngine->Write( aStrm, EE_FORMAT_BIN );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "html" ) )
					pEditEngine->Write( aStrm, EE_FORMAT_HTML );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "htm" ) )
					pEditEngine->Write( aStrm, EE_FORMAT_HTML );
				else
					pEditEngine->Write( aStrm, EE_FORMAT_TEXT );
			}
			else
			{
				if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "rtf" ) )
					pEditView->Write( aStrm, EE_FORMAT_RTF );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "bin" ) )
					pEditView->Write( aStrm, EE_FORMAT_BIN );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "html" ) )
					pEditView->Write( aStrm, EE_FORMAT_HTML );
				else if ( aDirEntry.GetExtension().EqualsIgnoreCaseAscii( "htm" ) )
					pEditView->Write( aStrm, EE_FORMAT_HTML );
				else
					pEditView->Write( aStrm, EE_FORMAT_TEXT );
			}
			Application::LeaveWait();
		}
		break;
		case TB_ATTRIBS:
		{
			SfxItemSet aCurSet = pEditView->GetAttribs();
			XubString aDebStr( String( RTL_CONSTASCII_USTRINGPARAM( "Attribute in Selektion:" ) ) );
			aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "\nVorlage:" ) );
			XubString aStyle;
//			pEditView->GetStyleSheet( aStyle, eFam );
			aDebStr += aStyle;
			for ( USHORT nWhich = EE_ITEMS_START; nWhich <= EE_ITEMS_END; nWhich++)
			{
				aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "\n" ) );
				aDebStr += String::CreateFromInt32( nWhich );
				aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "\t" ) );
				if ( aCurSet.GetItemState( nWhich ) == SFX_ITEM_OFF )
					aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "---" ) );
				else if ( aCurSet.GetItemState( nWhich ) == SFX_ITEM_DONTCARE )
					aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "XXX" ) );
				else if ( aCurSet.GetItemState( nWhich ) == SFX_ITEM_ON )
				{
					const SfxPoolItem& rItem = aCurSet.Get( nWhich );
					switch ( nWhich )
					{
						case EE_PARA_LRSPACE:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FI=" ) );
                            aDebStr += String::CreateFromInt32( ((SvxLRSpaceItem&)rItem).GetTxtFirstLineOfst() );
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( ", LI=" ) );
                            aDebStr += String::CreateFromInt32( ((SvxLRSpaceItem&)rItem).GetTxtLeft() );
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( ", RI=" ) );
							aDebStr += String::CreateFromInt32( ((SvxLRSpaceItem&)rItem).GetRight() );
						break;
						case EE_PARA_ULSPACE:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "SB=" ) );
							aDebStr += String::CreateFromInt32( ((SvxULSpaceItem&)rItem).GetUpper() );
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( ", SA=" ) );
							aDebStr += String::CreateFromInt32( ((SvxULSpaceItem&)rItem).GetLower() );
						break;
						case EE_PARA_SBL:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "SBL=" ) );
							aDebStr += String::CreateFromInt32( ((SvxLineSpacingItem&)rItem).GetInterLineSpace() );
						break;
						case EE_PARA_JUST:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "SvxAdust=" ) );
							aDebStr += String::CreateFromInt32( (USHORT)((SvxAdjustItem&)rItem).GetAdjust() );
						break;
						case EE_PARA_TABS:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "Tabs = ?" ) );
						break;
						case EE_CHAR_COLOR:
						{
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "Color= " ) );
							Color aColor( ((SvxColorItem&)rItem).GetValue() );
							aDebStr += String::CreateFromInt32( aColor.GetRed() );
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) );
							aDebStr += String::CreateFromInt32( aColor.GetGreen() );
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) );
							aDebStr += String::CreateFromInt32( aColor.GetBlue() );
						}
						break;
						case EE_CHAR_FONTINFO:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "Font=" ) );
							aDebStr += ((SvxFontItem&)rItem).GetFamilyName();
						break;
						case EE_CHAR_FONTHEIGHT:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "Groesse=" ) );
							aDebStr += String::CreateFromInt32( ((SvxFontHeightItem&)rItem).GetHeight() );
						break;
						case EE_CHAR_WEIGHT:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FontWeight=" ) );
							aDebStr += String::CreateFromInt32( ((SvxWeightItem&)rItem).GetWeight() );
						break;
						case EE_CHAR_UNDERLINE:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FontUnderline=" ) );
							aDebStr += String::CreateFromInt32( ((SvxUnderlineItem&)rItem).GetLineStyle() );
						break;
						case EE_CHAR_WLM:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "WordLineMode=" ) );
							aDebStr += String::CreateFromInt32( ((SvxWordLineModeItem&)rItem).GetValue() );
						break;
						case EE_CHAR_STRIKEOUT:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FontStrikeout=" ) );
							aDebStr += String::CreateFromInt32( ((SvxCrossedOutItem&)rItem).GetStrikeout() );
						break;
						case EE_CHAR_ITALIC:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FontPosture=" ) );
							aDebStr += String::CreateFromInt32( ((SvxPostureItem&)rItem).GetPosture() );
						break;
						case EE_CHAR_OUTLINE:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FontOutline=" ) );
							aDebStr += String::CreateFromInt32( ((SvxContourItem&)rItem).GetValue() );
						break;
						case EE_CHAR_SHADOW:
							aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "FontShadowed=" ) );
							aDebStr += String::CreateFromInt32( ((SvxShadowedItem&)rItem).GetValue() );
						break;
					}
				}
				else
					aDebStr += String( RTL_CONSTASCII_USTRINGPARAM( "?" ) );
			}
			InfoBox( 0, aDebStr ).Execute();
		}
		break;
	}

	if ( pNewItem )
	{
		SfxItemSet aSet = pEditView->GetEmptyItemSet();
		aSet.Put( *pNewItem );
		pEditView->SetAttribs( aSet );
		delete pNewItem;
	}
	UpdateToolBox();
	return 0;
}

void EditMainWindow::CreatePolygon()
{
	EditView* pEditView = aViewWin.GetEditView();
	Size aSz = pEditView->GetWindow()->GetOutputSize();
	Point aOffset( aSz.Width()/8, aSz.Height()/8 );
	aSz.Width() *= 3;
	aSz.Width() /= 4;
	aSz.Height() *= 3;
	aSz.Height() /= 4;
	Polygon aPoly( 5 );
	aPoly.SetPoint( Point( aSz.Width()/2, 0 ), 0 );
	aPoly.SetPoint( Point( aSz.Width(), aSz.Height()/3 ), 1 );
	aPoly.SetPoint( Point( aSz.Width()/2, aSz.Height() ), 2 );
	aPoly.SetPoint( Point( 0, aSz.Height()/2 ), 3 );
	aPoly.SetPoint( Point( aSz.Width()/2, 0 ), 4 );
	PolyPolygon aPPoly( aPoly );
	pEditView->GetEditEngine()->SetPolygon( aPPoly );
	pEditView->SetOutputArea( Rectangle( aOffset, aSz ) );
	ULONG nWord = pEditView->GetControlWord();
	nWord &= ~(EV_CNTRL_AUTOSCROLL);
	pEditView->SetControlWord( nWord );
	aViewWin.Invalidate();
}

void __EXPORT EditMainWindow::GetFocus()
{
	aViewWin.GrabFocus();
}

IMPL_LINK_INLINE_START( EditMainWindow, HScrollHdl, ScrollBar *, pScrl )
{
	EditView* pEditView = aViewWin.GetEditView();
	pEditView->Scroll( -pScrl->GetDelta(), 0, RGCHK_PAPERSZ1 );
	return 0;
}
IMPL_LINK_INLINE_END( EditMainWindow, HScrollHdl, ScrollBar *, pScrl )

IMPL_LINK_INLINE_START( EditMainWindow, VScrollHdl, ScrollBar *, pScrl )
{
	EditView* pEditView = aViewWin.GetEditView();
	pEditView->Scroll( 0, -pScrl->GetDelta(), RGCHK_PAPERSZ1 );
	return 0;
}
IMPL_LINK_INLINE_END( EditMainWindow, VScrollHdl, ScrollBar *, pScrl )

void EditMainWindow::SetScrollBarRanges()
{
	EditView* pEditView = aViewWin.GetEditView();
	long y = pEditView->GetEditEngine()->GetTextHeight();
	long x = pEditView->GetEditEngine()->GetPaperSize().Width();

	aHScrollBar.SetRange( Range( 0, x ) );
	aVScrollBar.SetRange( Range( 0, y ) );
}

void EditMainWindow::SetScrollBars()
{
	EditView* pEditView = aViewWin.GetEditView();
	Size aSz = GetOutputSizePixel();
	Size aRealSz( aSz );
	long nScrollbarWidthPixel = aVScrollBar.GetSizePixel().Width();
	long nTBHeight = aToolBox.GetSizePixel().Height();
	aSz.Height() -= nTBHeight;
	Size aOrgSz( aSz );

	// VScroll...
	aSz.Height() += 2;
	Point aPoint( ( aSz.Width()- nScrollbarWidthPixel+1 ), -1+nTBHeight);
	aSz.Width() = nScrollbarWidthPixel;
	aVScrollBar.SetPosSizePixel( aPoint, aSz );

	// HScroll...
	aSz = aOrgSz;
	Point aPoint2( 0, aRealSz.Height()-aHScrollBar.GetSizePixel().Height()+1 ); // TB-Height schon drin!
	aSz.Width() -= aVScrollBar.GetSizePixel().Width();
	aSz.Width() += 2;

	aSz.Height() = nScrollbarWidthPixel;
	aHScrollBar.SetPosSizePixel( aPoint2, aSz );

	aHScrollBar.SetVisibleSize( pEditView->GetOutputArea().GetWidth() );
	aVScrollBar.SetVisibleSize( pEditView->GetOutputArea().GetHeight() );

	SetScrollBarRanges();

	aVScrollBar.Show();
	aHScrollBar.Show();
}

void __EXPORT EditMainWindow::Resize()
{
	long nBorder = aVScrollBar.GetSizePixel().Width();
	long nExtra = 10;
	Size aTBSz = aToolBox.CalcWindowSizePixel();
	Size aOutSzPixel( GetOutputSizePixel() );
	aToolBox.SetSizePixel( Size( aOutSzPixel.Width(), aTBSz.Height()) );

	aViewWin.SetSizePixel( Size( aOutSzPixel.Width()-nBorder-2*nExtra, aOutSzPixel.Height()-aTBSz.Height()-2*nExtra-nBorder) );

	aViewWin.SetPosPixel( Point( nExtra, aTBSz.Height()+nExtra ) );

	SetScrollBars();

	EditView* pEditView = aViewWin.GetEditView();
	if ( pEditView && pEditView->GetEditEngine()->GetPolygon() )
		CreatePolygon();
}

IMPL_LINK( EditMainWindow, ShowStatus, EditStatus *, pStat )
{
	EditView* pEditView = aViewWin.GetEditView();
	EditEngine* pEditEngine = pEditView->GetEditEngine();
	if ( ( pStat->GetStatusWord() & EE_STAT_TEXTWIDTHCHANGED ) || ( pStat->GetStatusWord() & EE_STAT_TEXTHEIGHTCHANGED ) )
	{
		aViewWin.MarkOutputArea();
		if ( pEditEngine->GetTextHeight() < (ULONG)pEditView->GetOutputArea().GetHeight() )
		{
			// Wird durch RGCHK_PAPERSZ1 'geklippt'
			if ( !( pEditEngine->GetControlWord() & EE_CNTRL_AUTOPAGESIZE) )
				pEditView->Scroll( -(long)pEditEngine->CalcTextWidth(), -(long)pEditEngine->GetTextHeight(), RGCHK_PAPERSZ1 );
		}
		SetScrollBarRanges();
	}
	if ( pStat->GetStatusWord() & EE_STAT_HSCROLL )
		aHScrollBar.SetThumbPos( pEditView->GetVisArea().Left() );
	if ( pStat->GetStatusWord() & EE_STAT_VSCROLL )
		aVScrollBar.SetThumbPos( pEditView->GetVisArea().Top() );

	return 0;
}


EditViewWindow::~EditViewWindow()
{
	// erst die angemeldeten Views zerstoeren
	// (melden sich selbst ab)
	MyView* pView = aViewList.First();
	while ( pView )
	{
		delete pView;
		pView = aViewList.Next();
	}

	pEditEngine->RemoveView( pEditView );
	delete pEditView;
	// Beim Zerstoeren der Styles am Ende, EditEngine noch nicht kaputt,
	// wird der Handler gerufen, ich zerstore hier aber schon die View!
	pEditEngine->SetStatusEventHdl( Link() );
//	SvxAutoCorrect* pAutoCorrekt = pEditEngine->GetAutoCorrect();
//	pEditEngine->SetAutoCorrect( 0 );
//	delete pAutoCorrekt;
	delete pEditEngine;
}

EditViewWindow::EditViewWindow( Window* pParent ) :
				Window( pParent ), aURLPtr( POINTER_HAND )
{
	SetBackgroundBrush( Brush( Color( COL_WHITE ) ) );
	SetMapMode( MAP_100TH_MM );	
//	EnableDrop();

	SfxItemPool* pPool = EditEngine::CreatePool();
	Font aFont = GetSettings().GetStyleSettings().GetAppFont();
	MapMode aPntMode( MAP_POINT );
	MapMode aCurrent( GetMapMode() );
	Size aSz( LogicToLogic( Size( 12, 0 ), &aPntMode, &aCurrent ) );
	aFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "Times New Roman" ) ) );
	pPool->SetPoolDefaultItem( SvxFontItem( aFont.GetFamily(), aFont.GetName(), String(),aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO ) );
	pPool->SetPoolDefaultItem( SvxFontHeightItem( aSz.Width(), 100, EE_CHAR_FONTHEIGHT ) );
	pEditEngine = new MyEditEngine( pPool );

	Size aPaperSz( 10000,8000 );
	pEditEngine->SetPaperSize( aPaperSz );

	pEditView = new EditView( pEditEngine, this );
	pEditView->SetBackgroundColor( Color( COL_WHITE ) );
	pEditView->SetOutputArea( Rectangle( Point( 100, 100 ), aPaperSz ) );
	pEditEngine->SetDefaultLanguage( LANGUAGE_ENGLISH );
	pEditEngine->InsertView( pEditView );

	SetPosSizePixel( Point( 10, 10 ), Size( 600, 400 ) );
	SetPen( PEN_NULL );
	Show();

	// Feldbefehle grau hinterlegen
	ULONG n = pEditEngine->GetControlWord();
	n = n | (EE_CNTRL_MARKFIELDS|EE_CNTRL_AUTOCOMPLETE);
	pEditEngine->SetControlWord( n );

	// Test: Autozentrierung
//	ULONG n = pEditEngine->GetControlWord();
//	n = n | EE_CNTRL_AUTOPAGESIZE;
//	pEditEngine->SetControlWord( n );

	// OneLineSpeling
#ifdef WNT
//	pEditEngine->CreateSpeller( DirEntry( String( RTL_CONSTASCII_USTRINGPARAM( "n:\\offenv\\wnti" ) ) ),
//								DirEntry( String( RTL_CONSTASCII_USTRINGPARAM( "n:\\offenv\\wnti" ) ) ) );
//	pEditEngine->GetSpeller()->SetActualLanguage( LANGUAGE_GERMAN );
//	pEditEngine->GetSpeller()->SetDefaultLanguage( LANGUAGE_GERMAN );
//	pEditEngine->GetSpeller()->SetMinTrail( 2 );

	// AutoCorrect wird nie zerstoert
//	pEditEngine->SetAutoCorrect( new SvxAutoCorrect( String( RTL_CONSTASCII_USTRINGPARAM( "d:\\prj\\office\\autotext\\autocorr.dat" ) ) ) );
#endif
}

void __EXPORT EditViewWindow::Paint( const Rectangle& rRec )
{
	if ( pEditView->GetEditEngine()->GetPolygon() )
	{
		// Die Punkte des Polygons beziehen sich auf die View...
		MapMode aMapMode( GetMapMode() );
		aMapMode.SetOrigin( pEditView->GetOutputArea().TopLeft() );
		SetMapMode( aMapMode );
		DrawPolyPolygon( *pEditView->GetEditEngine()->GetPolygon() );
		aMapMode.SetOrigin( Point() );
		SetMapMode( aMapMode );
	}
	pEditView->Paint( rRec );
	MarkOutputArea();
}

void EditViewWindow::MarkOutputArea()
{
	static Rectangle aCurFrame;
	Rectangle aOutArea( pEditView->GetOutputArea() );
	aOutArea = LogicToPixel( aOutArea );
	aOutArea.Left()--;
	aOutArea.Right()++;
	aOutArea.Top()--;
	aOutArea.Bottom()++;
	aOutArea = PixelToLogic( aOutArea );
	SetPen( Pen( Color( COL_RED ) ) );
	SetFillInBrush( Brush( BRUSH_NULL ) );
	DrawRect( aOutArea );
	if ( !aCurFrame.IsEmpty() )
	{
		if ( aCurFrame.Left() < aOutArea.Left() )
			Invalidate( Rectangle( aCurFrame.TopLeft(), Size( aOutArea.Left()-aCurFrame.Left(), aCurFrame.GetHeight() ) ) );
		if ( aCurFrame.Right() > aOutArea.Right() )
		{
			long nW = aCurFrame.Right() - aOutArea.Right();
			Point aPos( aCurFrame.TopRight() );
			aPos.X() -= nW;
			Invalidate( Rectangle( aPos, Size( nW, aCurFrame.GetHeight() ) ) );
		}
		if ( aCurFrame.Top() < aOutArea.Top() )
			Invalidate( Rectangle( aCurFrame.TopLeft(), Size( aCurFrame.GetWidth(), aOutArea.Top() - aCurFrame.Top() ) ) );
		if ( aCurFrame.Bottom() > aOutArea.Bottom() )
		{
			long nH = aCurFrame.Bottom() - aOutArea.Bottom();
			Point aPos( aCurFrame.BottomLeft() );
			aPos.Y() -= nH;
			Invalidate( Rectangle( aPos, Size( aCurFrame.GetWidth(), nH ) ) );
		}
	}
	aCurFrame = aOutArea;
}

void __EXPORT EditViewWindow::Resize()
{
	Size aPaperSz( GetOutputSize() );
	pEditView->SetOutputArea( Rectangle( Point(0,0), aPaperSz ) );
	pEditEngine->SetPaperSize( Size( aPaperSz.Width()*1, aPaperSz.Height()*1 ) );
	pEditView->ShowCursor();
	Invalidate();
}

void __EXPORT EditViewWindow::KeyInput( const KeyEvent& rKEvt )
{
	sal_Unicode nCharCode = rKEvt.GetCharCode();

	USHORT nCode = rKEvt.GetKeyCode().GetCode();
	// Auswertung fuer besondere Einstellungen....
	if ( ( nCode == KEY_A) && rKEvt.GetKeyCode().IsMod1() )
		pEditView->SetSelection( ESelection( 0, 0, 0xFFFF, 0xFFFF ) );
	else if ( ( nCode == KEY_R ) && rKEvt.GetKeyCode().IsMod2() )
		Invalidate();
	else if ( ( nCode == KEY_L ) && rKEvt.GetKeyCode().IsMod2() )
	{
		ULONG n = pEditEngine->GetControlWord();
		n = n | EE_CNTRL_ONECHARPERLINE;
		pEditEngine->SetControlWord( n );
		pEditEngine->QuickFormatDoc();
	}
	else if ( ( nCode == KEY_Z ) && rKEvt.GetKeyCode().IsMod2() )
	{
		pEditView->RemoveAttribs();
	}
	else if ( ( nCode == KEY_V ) && rKEvt.GetKeyCode().IsMod2() )
	{
		pEditEngine->SetVertical( TRUE );
		Invalidate();
	}
	else if ( ( ( nCode == KEY_ADD ) || ( nCode == KEY_SUBTRACT ) )&& rKEvt.GetKeyCode().IsMod2() )
	{
		short nDiff = ( nCode == KEY_ADD ) ? (+5) : (-5);
		if ( nZoom > 1000 )
			nDiff *= 20;
		if ( nZoom <= 25 )
			nDiff /= 5;
		if ( ( nZoom + nDiff ) > 0 )
			nZoom += nDiff;
		MapMode aMapMode( MAP_100TH_MM, Point(0,0), Fraction(nZoom,100), Fraction(nZoom,100) );
		SetMapMode( aMapMode );
		((EditMainWindow*)GetParent())->SetTitle();

		if ( rKEvt.GetKeyCode().IsMod1() )
		{
			InfoBox( 0, String( RTL_CONSTASCII_USTRINGPARAM( "ChangingRefMapMode..." ) ) ).Execute();
			pEditEngine->SetRefMapMode( aMapMode );
		}
		Invalidate();
	}
	else if ( rKEvt.GetKeyCode().IsMod2() &&
			( ( nCode == KEY_UP) || ( nCode == KEY_DOWN ) ||
			  ( nCode == KEY_LEFT ) || ( nCode == KEY_RIGHT ) ) )
	{
		if( rKEvt.GetKeyCode().IsMod1() )
		{
			ULONG nCtrl = pEditEngine->GetControlWord();
			if ( ! ( nCtrl & EE_CNTRL_STRETCHING ) )
			{
				nCtrl |= EE_CNTRL_STRETCHING;
				pEditEngine->SetControlWord( nCtrl );
			}
			USHORT nX, nY;
			pEditEngine->GetGlobalCharStretching( nX, nY );
			if ( ( nCode == KEY_DOWN ) && ( nY > 5 ) )
				nY += 5;
			else if ( nCode == KEY_UP )
				nY -= 5;
			else if ( nCode == KEY_RIGHT )
				nX += 5;
			else if ( ( nCode == KEY_LEFT ) && ( nX > 5 ) )
				nX -= 5;
			pEditEngine->SetGlobalCharStretching( nX, nY );
			((EditMainWindow*)GetParent())->SetTitle();
		}
		else	// ZeichenAttr
		{
			SfxItemSet aAttrs( pEditView->GetAttribs() );
			SfxItemSet aNewAttrs( pEditEngine->GetEmptyItemSet() );
			const SvxFontWidthItem& rItem = (const SvxFontWidthItem&)aAttrs.Get( EE_CHAR_FONTWIDTH );
			USHORT nProp = rItem.GetProp();
			if ( nCode == KEY_RIGHT )
				nProp += 5;
			else if ( ( nCode == KEY_LEFT ) && ( nProp > 5 ) )
				nProp -= 5;
			aNewAttrs.Put( SvxFontWidthItem( 0, nProp, EE_CHAR_FONTWIDTH ) );
			pEditView->SetAttribs( aNewAttrs );
		}
	}
	else if ( ( nCode == KEY_O ) && rKEvt.GetKeyCode().IsMod2() )
	{
		MapMode aMapMode( GetMapMode() );
		aMapMode.SetOrigin( Point( 41, 41 ) );
		SetMapMode( aMapMode );
		Invalidate();
	}
	else if ( ( nCode == KEY_B ) && rKEvt.GetKeyCode().IsMod2() )
	{
		SfxItemSet aSet = pEditView->GetEmptyItemSet();
		aSet.Put( SvxFontHeightItem(800, 100, EE_CHAR_FONTHEIGHT) );
		pEditView->SetAttribs( aSet );
	}
	else if ( ( nCode == KEY_P ) && rKEvt.GetKeyCode().IsMod2() )
	{
//				ESelection aSel = pEditView->GetSelection();
//				for ( ULONG n = aSel.nStartPara; n <= aSel.nEndPara; n++ )
//				{
//					InfoBox( 0, pEditEngine->GetText( n ) ).Execute();
//				}
		InfoBox( 0, pEditView->GetSelected() ).Execute();

	}
	else if ( rKEvt.GetKeyCode().IsMod2() &&
				( nCode >= KEY_1 ) && ( nCode <= KEY_9 ) )
	{
		ULONG nEECtrl = pEditEngine->GetControlWord();
		nEECtrl = nEECtrl | EE_CNTRL_AUTOPAGESIZE;
		pEditEngine->SetControlWord( nEECtrl );

		ULONG nEVCtrl = pEditView->GetControlWord();
		nEVCtrl |= EV_CNTRL_AUTOSIZE;
		pEditView->SetControlWord( nEVCtrl );

		pEditView->SetAnchorMode( (EVAnchorMode)(nCode-KEY_1) );
		pEditView->SetOutputArea( Rectangle( Point(0,0), GetOutputSize() ) );
		pEditEngine->SetMaxAutoPaperSize( GetOutputSize() );
		pEditEngine->SetPaperSize( Size( 0, 0 ) );
	}
	else if ( rKEvt.GetKeyCode().IsMod2() && ( nCode == KEY_0 ) )
	{
		ULONG nEVCtrl = pEditView->GetControlWord();
		nEVCtrl = nEVCtrl | EV_CNTRL_AUTOSIZE;
		pEditView->SetControlWord( nEVCtrl );

		Size aOutSz( GetOutputSize() );
		Size aPaperSz( aOutSz.Width() / 2, 0 );
		pEditView->SetOutputArea( Rectangle( Point(), aPaperSz ) );
		pEditEngine->SetPaperSize( aPaperSz );
		// Max-Height wird bei View verwendet,
		// MinSize/MaxSize nur, wenn AUTOPAGESIZE ( KEY_1 - KEY_9 )
		pEditEngine->SetMaxAutoPaperSize( Size( aOutSz.Width() / 2, aOutSz.Height() / 2 ) );
		pEditEngine->SetMinAutoPaperSize( Size( aOutSz.Width() / 8, aOutSz.Height() / 8 ) );
	}
	else if ( ( nCode == KEY_J ) && rKEvt.GetKeyCode().IsMod2() )
	{
		Size aTextSz( pEditEngine->CalcTextWidth(), pEditEngine->GetTextHeight() );
		Rectangle aRect( pEditView->GetOutputArea().TopLeft(), aTextSz );
		Brush aTmpBrush( Color( COL_LIGHTBLUE ), BRUSH_25 );
		Brush aOldBrush( GetFillInBrush() );
		SetFillInBrush( aTmpBrush );
		DrawRect( aRect );
		SetFillInBrush( aOldBrush );
		pEditView->Paint( aRect );
	}
	else if ( ( nCode == KEY_H ) && rKEvt.GetKeyCode().IsMod2() )
	{
		Push();
		Size aSz( pEditEngine->CalcTextWidth(), pEditEngine->GetTextHeight() );
		Pen aPen( PEN_SOLID );
		Brush aBrush( Color( COL_GRAY ), BRUSH_SOLID );
		aPen.SetColor( Color( COL_BLACK ) );
		SetPen( aPen );
		SetFillInBrush( aBrush );
		Rectangle aR( pEditView->GetOutputArea().TopLeft(), aSz );
		DrawRect( aR );
		Pop();
		pEditEngine->Draw( this, pEditView->GetOutputArea() );
		pEditView->ShowCursor( TRUE, TRUE );
	}

	// Eingabe an EditEngine...
	else
	{
		BOOL bDone = pEditView->PostKeyEvent( rKEvt );
		if ( !bDone )
			Window::KeyInput( rKEvt );
	}

	((EditMainWindow*)GetParent())->UpdateToolBox();
}

void __EXPORT EditViewWindow::MouseMove( const MouseEvent& rMEvt )
{
	Point aPos = PixelToLogic( rMEvt.GetPosPixel() );
	if ( pEditView->GetOutputArea().IsInside( aPos ) )
	{
		const SvxFieldItem* pField = pEditView->GetFieldUnderMousePointer();
		if ( pField )
			SetPointer( aURLPtr );
		else
			SetPointer( pEditView->GetPointer() );

//		aPos -= pEditView->GetOutputArea().TopLeft();
//		aPos += pEditView->GetVisArea().TopLeft();
//		if ( pEditView->GetEditEngine()->IsTextPos( aPos, PixelToLogic( Size( 5, 0 ) ).Width() ) )
//			SetPointer( pEditView->GetPointer() );
//		else
//			SetPointer( Pointer( POINTER_REFHAND ) );

	}
	else
		SetPointer( aStdPtr );

//	static long x = 0;
//	x++;
//	DBG_ASSERT( x < 1000, String( RTL_CONSTASCII_USTRINGPARAM( "?" ) ) );
	pEditView->MouseMove( rMEvt );
}

void __EXPORT EditViewWindow::MouseButtonDown( const MouseEvent& rMEvt )
{
	GrabFocus();
	pEditView->MouseButtonDown( rMEvt );
}

void __EXPORT EditViewWindow::MouseButtonUp( const MouseEvent& rMEvt )
{
	pEditView->MouseButtonUp( rMEvt );
	((EditMainWindow*)GetParent())->UpdateToolBox();
}

void __EXPORT EditViewWindow::Command( const CommandEvent& rCEvt )
{
	if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
	{
		if( pEditView->IsWrongSpelledWordAtPos( rCEvt.GetMousePosPixel() ) )
			pEditView->ExecuteSpellPopup( rCEvt.GetMousePosPixel() );
	}
	else
		pEditView->Command(rCEvt);

}

BOOL __EXPORT EditViewWindow::Drop( const DropEvent& rEvt )
{
	return pEditView->Drop( rEvt );
}

BOOL __EXPORT EditViewWindow::QueryDrop( DropEvent& rEvt )
{
	return pEditView->QueryDrop( rEvt );
}

// --- aEditApp ------------------------------------------------------

void __EXPORT EditApp::Main()
{
#ifdef WNT
	SvFactory::Init();
#endif

    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >  xSMgr = createApplicationServiceManager();
	::comphelper::setProcessServiceFactory( xSMgr );
	
	EditDLL aEditDll;
	SvxGlobalItemData aItemData;
	SvxFieldItem::GetClassManager().SV_CLASS_REGISTER( SvxDateField );
	SvxFieldItem::GetClassManager().SV_CLASS_REGISTER( SvxURLField );
	
	Help::EnableQuickHelp();
	
	EditMainWindow aWindow;
	Execute();
}

EditApp aEditApp;
