/**************************************************************
 * 
 * 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_automation.hxx"

#include "editwin.hxx"
#include <tools/stream.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif


sal_Bool GHEditWindow::Close()
{
	if (aInhalt.IsModified())
	{
	}
	delete(this);
	return sal_True;
}

void GHEditWindow::Resize()
{
	aInhalt.SetPosSizePixel(Point(1,1),GetOutputSizePixel());
}

GHEditWindow::GHEditWindow(Window * pParent, String aName, WinBits iWstyle)
: FloatingWindow(pParent)
, aInhalt(this,iWstyle)
{
    SetOutputSizePixel( Size( 120,80 ) );
    Show();
	Resize();
	aInhalt.Show();
	SetText(aName);
}

void GHEditWindow::Clear()
{
	aInhalt.SetText(String());
}

void GHEditWindow::AddText( String aNew, sal_Bool bMoveToEnd)
{
	String aOld = aInhalt.GetText();

	aOld += aNew;
	aOld.ConvertLineEnd();
	aInhalt.SetText(aOld);
	if (bMoveToEnd)
		aInhalt.SetSelection(Selection(SELECTION_MAX,SELECTION_MAX));
}


EditFileWindow::EditFileWindow(Window * pParent, String aName, WinBits iWstyle)
: GHEditWindow(pParent, aName, iWstyle)
, aFileName(aName)
{
	LoadFile();
}

void EditFileWindow::LoadFile()
{

	SvFileStream Stream;
	String       All,Line;

	Stream.Open(aFileName, STREAM_STD_READ);

	if (!Stream.IsOpen())
	{
		AddText(CUniString("could not open ").Append(aFileName).AppendAscii("\n"));
		aFileName.Erase();
		return;
	}

	while (!Stream.IsEof())
	{

		Stream.ReadByteStringLine( Line, RTL_TEXTENCODING_UTF8 );

		All += Line;
		All += '\n';

	}

	All.ConvertLineEnd();

	AddText(All,sal_False);

}

sal_Bool EditFileWindow::Close()
{

	if (aInhalt.IsModified() && QueryBox(this,WB_DEF_YES | WB_YES_NO_CANCEL, String(aFileName).AppendAscii("\nhas been changed.\n\nSave file?")).Execute())
	{

	}
	return GHEditWindow::Close();
}

