2000-09-18 15:18:56 +00:00
|
|
|
|
/*************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* $RCSfile: appwin.cxx,v $
|
|
|
|
|
*
|
2002-03-20 08:05:56 +00:00
|
|
|
|
* $Revision: 1.4 $
|
2000-09-18 15:18:56 +00:00
|
|
|
|
*
|
2002-03-20 08:05:56 +00:00
|
|
|
|
* last change: $Author: gh $ $Date: 2002-03-20 09:05:56 $
|
2000-09-18 15:18:56 +00:00
|
|
|
|
*
|
|
|
|
|
* 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 _MSGBOX_HXX //autogen
|
|
|
|
|
#include <vcl/msgbox.hxx>
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef _FSYS_HXX //autogen
|
|
|
|
|
#include <tools/fsys.hxx>
|
|
|
|
|
#endif
|
2001-04-04 12:18:57 +00:00
|
|
|
|
#ifndef _SVTOOLS_STRINGTRANSFER_HXX_
|
|
|
|
|
#include <svtools/stringtransfer.hxx>
|
2000-09-18 15:18:56 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "basic.hrc"
|
|
|
|
|
#include "app.hxx"
|
|
|
|
|
#include "mybasic.hxx"
|
|
|
|
|
#include "status.hxx"
|
|
|
|
|
#include "appwin.hxx"
|
|
|
|
|
#include "dataedit.hxx"
|
|
|
|
|
#include "dialogs.hxx"
|
|
|
|
|
|
|
|
|
|
String *AppWin::pNoName = NULL; // enthaelt den "Untitled"-String
|
|
|
|
|
short AppWin::nNumber = 0; // fortlaufende Nummer
|
|
|
|
|
short AppWin::nCount = 0; // Anzahl Editfenster
|
|
|
|
|
|
|
|
|
|
TYPEINIT0(AppWin);
|
|
|
|
|
AppWin::AppWin( BasicFrame* pParent )
|
|
|
|
|
: DockingWindow( pParent, WB_SIZEMOVE | WB_CLOSEABLE | WB_PINABLE )
|
|
|
|
|
, pDataEdit(NULL)
|
|
|
|
|
, nSkipReload(0)
|
|
|
|
|
, bHasFile( FALSE )
|
|
|
|
|
, bReloadAborted( FALSE )
|
|
|
|
|
, bFind( TRUE )
|
|
|
|
|
, pFrame( pParent )
|
|
|
|
|
{
|
|
|
|
|
// evtl. den Untitled-String laden:
|
|
|
|
|
if( !pNoName )
|
|
|
|
|
pNoName = new String( ResId( IDS_NONAME ) );
|
|
|
|
|
nCount++;
|
|
|
|
|
|
|
|
|
|
// Maximized Status von aktuellem Fenster holen
|
|
|
|
|
USHORT nInitialWinState;
|
|
|
|
|
if ( pFrame->pWork )
|
|
|
|
|
{
|
|
|
|
|
nInitialWinState = pFrame->pWork->GetWinState();
|
|
|
|
|
nInitialWinState &= TT_WIN_STATE_MAX | TT_WIN_STATE_FLOAT;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
nInitialWinState = TT_WIN_STATE_MAX;
|
|
|
|
|
|
|
|
|
|
StartListening( *pFrame );
|
|
|
|
|
pFrame->AddWindow( this );
|
|
|
|
|
|
|
|
|
|
ShowTitleButton( TITLE_BUTTON_DOCKING );
|
|
|
|
|
ShowTitleButton( TITLE_BUTTON_HIDE );
|
|
|
|
|
SetActivateMode( ACTIVATE_MODE_GRABFOCUS );
|
|
|
|
|
|
|
|
|
|
Cascade( nCount );
|
|
|
|
|
if ( TT_WIN_STATE_MAX == nInitialWinState )
|
|
|
|
|
Maximize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AppWin::~AppWin()
|
|
|
|
|
{
|
|
|
|
|
nCount--;
|
|
|
|
|
pFrame->RemoveWindow( this );
|
|
|
|
|
pFrame = NULL; // So da<64> nach BasicRun nicht mehr versucht wird Fenstertext zu setzen
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::SetText( const XubString& rStr )
|
|
|
|
|
{
|
|
|
|
|
DockingWindow::SetText( rStr );
|
|
|
|
|
pFrame->WindowRenamed( this );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::TitleButtonClick( USHORT nButton )
|
|
|
|
|
{
|
|
|
|
|
if ( TITLE_BUTTON_DOCKING == nButton )
|
|
|
|
|
if ( TT_WIN_STATE_MAX != nWinState )
|
|
|
|
|
Maximize();
|
|
|
|
|
else
|
|
|
|
|
Restore();
|
|
|
|
|
else // if ( TITLE_BUTTON_HIDE == nButton )
|
|
|
|
|
Minimize( TRUE );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Maximize()
|
|
|
|
|
{
|
|
|
|
|
if ( TT_WIN_STATE_MAX != nWinState )
|
|
|
|
|
{
|
|
|
|
|
nNormalPos = GetPosPixel();
|
|
|
|
|
nNormalSize = GetSizePixel();
|
|
|
|
|
|
|
|
|
|
SetFloatingMode( FALSE );
|
|
|
|
|
|
|
|
|
|
pFrame->nMaximizedWindows++;
|
|
|
|
|
nWinState = TT_WIN_STATE_MAX;
|
|
|
|
|
}
|
|
|
|
|
long nTitleHeight;
|
|
|
|
|
{
|
|
|
|
|
long nDummy1, nDummy2, nDummy3;
|
|
|
|
|
pFrame->GetBorder( nDummy1, nTitleHeight, nDummy2, nDummy3 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Size aSize = pFrame->GetOutputSizePixel();
|
|
|
|
|
aSize.Height() -= nTitleHeight;
|
|
|
|
|
aSize.Height() -= 2;
|
|
|
|
|
aSize.Width() -= 2;
|
|
|
|
|
SetSizePixel( aSize );
|
|
|
|
|
SetPosPixel( Point( 1,1 ) );
|
|
|
|
|
pFrame->WinMax_Restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Restore()
|
|
|
|
|
{
|
|
|
|
|
SetFloatingMode( TRUE );
|
|
|
|
|
SetPosSizePixel( nNormalPos, nNormalSize );
|
|
|
|
|
|
|
|
|
|
if ( TT_WIN_STATE_MAX == nWinState )
|
|
|
|
|
pFrame->nMaximizedWindows--;
|
|
|
|
|
|
|
|
|
|
nWinState = TT_WIN_STATE_FLOAT;
|
|
|
|
|
pFrame->WinMax_Restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Minimize( BOOL bMinimize )
|
|
|
|
|
{
|
|
|
|
|
if ( bMinimize )
|
|
|
|
|
nWinState |= TT_WIN_STATE_HIDE;
|
|
|
|
|
else
|
|
|
|
|
nWinState &= ~TT_WIN_STATE_HIDE;
|
|
|
|
|
pFrame->WinMax_Restore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Cascade( USHORT nNr )
|
|
|
|
|
{
|
|
|
|
|
Restore();
|
|
|
|
|
|
|
|
|
|
nNr--;
|
|
|
|
|
nNr %= 10;
|
|
|
|
|
nNr++;
|
|
|
|
|
|
|
|
|
|
long nTitleHeight;
|
|
|
|
|
{
|
|
|
|
|
long nDummy1, nDummy2, nDummy3;
|
|
|
|
|
pFrame->GetBorder( nDummy1, nTitleHeight, nDummy2, nDummy3 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Size aWinSize = pFrame->GetOutputSizePixel();
|
|
|
|
|
aWinSize.Width() -= aWinSize.Width() / 5; // auf 80 % reduzieren
|
|
|
|
|
aWinSize.Height() -= nTitleHeight * nNr; // Unten entsprechen k<>rzen
|
|
|
|
|
aWinSize.Height() -= 2;
|
|
|
|
|
|
|
|
|
|
Point nPos( nTitleHeight * nNr, nTitleHeight * nNr );
|
|
|
|
|
|
|
|
|
|
SetPosSizePixel( nPos, aWinSize );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::RequestHelp( const HelpEvent& )
|
|
|
|
|
{
|
|
|
|
|
Help();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Help()
|
|
|
|
|
{
|
|
|
|
|
String s = pDataEdit->GetSelected();
|
|
|
|
|
if( s.Len() ) {
|
|
|
|
|
// Leerstellen davor weg:
|
|
|
|
|
while( s.GetChar(0) == ' ' ) s.Erase( 0, 1 );
|
|
|
|
|
// aBasicApp.pHelp->Start( s );
|
|
|
|
|
} else {
|
|
|
|
|
// aBasicApp.pHelp->Start( HELP_INDEX );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Resize()
|
|
|
|
|
{
|
|
|
|
|
if( pDataEdit )
|
|
|
|
|
{
|
|
|
|
|
pDataEdit->SetPosPixel( Point( 0, 0 ) );
|
|
|
|
|
pDataEdit->SetSizePixel( GetOutputSizePixel() );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::GetFocus()
|
|
|
|
|
{
|
|
|
|
|
pFrame->FocusWindow( this );
|
|
|
|
|
if( pDataEdit ) // Im Destruktor wird GetFocus gerufen, daher diese Abfrage
|
|
|
|
|
{
|
|
|
|
|
pDataEdit->GrabFocus();
|
|
|
|
|
// InitMenu(GetpApp()->GetAppMenu()->GetPopupMenu( RID_APPEDIT )); // So da<64> Delete richtig ist
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
long AppWin::PreNotify( NotifyEvent& rNEvt )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN )
|
|
|
|
|
Activate();
|
|
|
|
|
if ( rNEvt.GetType() == EVENT_GETFOCUS )
|
|
|
|
|
if ( pFrame->pList->Last() != this )
|
|
|
|
|
Activate();
|
|
|
|
|
return FALSE; // Der event soll weiter verarbeitet werden
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Activate()
|
|
|
|
|
{
|
|
|
|
|
GrabFocus();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set up the menu
|
|
|
|
|
long AppWin::InitMenu( Menu* pMenu )
|
|
|
|
|
{
|
2001-04-04 12:18:57 +00:00
|
|
|
|
|
|
|
|
|
::rtl::OUString aTemp;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
TextSelection r = pDataEdit->GetSelection();
|
|
|
|
|
BOOL bMarked = r.HasRange();
|
|
|
|
|
pMenu->EnableItem( RID_EDITREPEAT, (aFind.Len() != 0 ) );
|
|
|
|
|
pMenu->EnableItem( RID_EDITCUT, bMarked );
|
|
|
|
|
pMenu->EnableItem( RID_EDITCOPY, bMarked );
|
2001-06-08 12:44:14 +00:00
|
|
|
|
pMenu->EnableItem( RID_EDITPASTE, ( ::svt::OStringTransfer::PasteString( aTemp, this ) ) );
|
2000-09-18 15:18:56 +00:00
|
|
|
|
pMenu->EnableItem( RID_EDITDEL, bMarked );
|
|
|
|
|
// pMenu->EnableItem( RID_HELPTOPIC, bMarked );
|
|
|
|
|
|
|
|
|
|
BOOL bHasText = pDataEdit->HasText();
|
|
|
|
|
BOOL bRunning = pFrame->Basic().IsRunning();
|
|
|
|
|
BOOL bCanExecute = BOOL( (!bRunning && bHasText) || pFrame->bInBreak );
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTART, bCanExecute );
|
|
|
|
|
pMenu->EnableItem( RID_RUNBREAK, bRunning && !pFrame->bInBreak);
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTOP, bRunning );
|
|
|
|
|
pMenu->EnableItem( RID_RUNTOCURSOR, bCanExecute );
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTEPINTO, bCanExecute );
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTEPOVER, bCanExecute );
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
long AppWin::DeInitMenu( Menu* pMenu )
|
|
|
|
|
{
|
|
|
|
|
pMenu->EnableItem( RID_EDITREPEAT );
|
|
|
|
|
pMenu->EnableItem( RID_EDITCUT );
|
|
|
|
|
pMenu->EnableItem( RID_EDITCOPY );
|
|
|
|
|
pMenu->EnableItem( RID_EDITPASTE );
|
|
|
|
|
pMenu->EnableItem( RID_EDITDEL );
|
|
|
|
|
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTART );
|
|
|
|
|
pMenu->EnableItem( RID_RUNBREAK );
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTOP );
|
|
|
|
|
pMenu->EnableItem( RID_RUNTOCURSOR );
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTEPINTO );
|
|
|
|
|
pMenu->EnableItem( RID_RUNSTEPOVER );
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Menu Handler
|
|
|
|
|
|
|
|
|
|
void AppWin::Command( const CommandEvent& rCEvt )
|
|
|
|
|
{
|
|
|
|
|
TextSelection r = pDataEdit->GetSelection();
|
|
|
|
|
BOOL bHasMark = r.HasRange();
|
|
|
|
|
switch( rCEvt.GetCommand() ) {
|
|
|
|
|
case RID_FILESAVE:
|
|
|
|
|
QuerySave( QUERY_DISK_CHANGED | SAVE_NOT_DIRTY ); break;
|
|
|
|
|
case RID_FILESAVEAS:
|
|
|
|
|
SaveAs(); break;
|
|
|
|
|
case RID_EDITSEARCH:
|
|
|
|
|
Find(); break;
|
|
|
|
|
case RID_EDITREPLACE:
|
|
|
|
|
Replace(); break;
|
|
|
|
|
case RID_EDITREPEAT:
|
|
|
|
|
Repeat(); break;
|
|
|
|
|
case RID_EDITCUT:
|
2001-04-04 12:18:57 +00:00
|
|
|
|
if( bHasMark )
|
|
|
|
|
pDataEdit->Cut();
|
|
|
|
|
break;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
case RID_EDITCOPY:
|
2001-04-04 12:18:57 +00:00
|
|
|
|
if( bHasMark )
|
|
|
|
|
pDataEdit->Copy();
|
|
|
|
|
break;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
case RID_EDITPASTE:
|
2001-04-04 12:18:57 +00:00
|
|
|
|
{
|
|
|
|
|
::rtl::OUString aTemp;
|
2001-06-08 12:44:14 +00:00
|
|
|
|
if( ::svt::OStringTransfer::PasteString( aTemp, this ) )
|
2001-04-04 12:18:57 +00:00
|
|
|
|
pDataEdit->Paste();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
case RID_EDITDEL:
|
|
|
|
|
/*if( bHasMark ) */pDataEdit->Delete();
|
|
|
|
|
break;
|
|
|
|
|
case RID_EDITUNDO:
|
|
|
|
|
pDataEdit->Undo();
|
|
|
|
|
break;
|
|
|
|
|
case RID_EDITREDO:
|
|
|
|
|
pDataEdit->Redo();
|
|
|
|
|
break;
|
|
|
|
|
case COMMAND_CONTEXTMENU:
|
|
|
|
|
{
|
|
|
|
|
PopupMenu *pKontext = NULL;
|
|
|
|
|
pDataEdit->BuildKontextMenu( pKontext );
|
|
|
|
|
if ( pKontext )
|
|
|
|
|
{
|
|
|
|
|
USHORT nRes = pKontext->Execute( this, GetPointerPosPixel() );
|
|
|
|
|
if ( nRes )
|
|
|
|
|
pFrame->Command( nRes );
|
|
|
|
|
delete pKontext;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL AppWin::IsSkipReload()
|
|
|
|
|
{
|
|
|
|
|
return nSkipReload != 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::SkipReload( BOOL bSkip )
|
|
|
|
|
{
|
|
|
|
|
DBG_ASSERT( bSkip || nSkipReload, "SkipReload aufgehoben ohne es zu aktivieren");
|
|
|
|
|
if ( bSkip )
|
|
|
|
|
nSkipReload++;
|
|
|
|
|
else
|
|
|
|
|
nSkipReload--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL AppWin::DiskFileChanged( USHORT nWhat )
|
|
|
|
|
{
|
|
|
|
|
if ( !bHasFile )
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
switch ( nWhat )
|
|
|
|
|
{
|
|
|
|
|
case SINCE_LAST_LOAD:
|
|
|
|
|
{
|
|
|
|
|
if ( bReloadAborted )
|
|
|
|
|
return TRUE;
|
|
|
|
|
else
|
|
|
|
|
return DiskFileChanged( SINCE_LAST_ASK_RELOAD );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SINCE_LAST_ASK_RELOAD:
|
|
|
|
|
{
|
|
|
|
|
String aFilename( GetText() );
|
|
|
|
|
|
|
|
|
|
DirEntry aFile( aFilename );
|
|
|
|
|
FileStat aStat( aFile );
|
|
|
|
|
|
|
|
|
|
return ( !aLastAccess.GetError() != !aStat.GetError() )
|
|
|
|
|
|| aLastAccess.IsYounger( aStat ) || aStat.IsYounger( aLastAccess );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
DBG_ERROR("Not Implemented in AppWin::DiskFileChanged");
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::UpdateFileInfo( USHORT nWhat )
|
|
|
|
|
{
|
|
|
|
|
switch ( nWhat )
|
|
|
|
|
{
|
|
|
|
|
case HAS_BEEN_LOADED:
|
|
|
|
|
{
|
|
|
|
|
bReloadAborted = FALSE;
|
|
|
|
|
UpdateFileInfo( ASKED_RELOAD );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case ASKED_RELOAD:
|
|
|
|
|
{
|
|
|
|
|
String aFilename( GetText() );
|
|
|
|
|
|
|
|
|
|
DirEntry aFile( aFilename );
|
|
|
|
|
aLastAccess.Update( aFile );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
DBG_ERROR("Not Implemented in AppWin::UpdateFileInfo");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::CheckReload()
|
|
|
|
|
{
|
|
|
|
|
if ( IsSkipReload() || !bHasFile )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
String aFilename( GetText() );
|
|
|
|
|
DirEntry aFile( aFilename );
|
|
|
|
|
if ( !aFilename.Len() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( !aFile.Exists() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// FileStat aStat( aFile );
|
|
|
|
|
|
|
|
|
|
if ( DiskFileChanged( SINCE_LAST_ASK_RELOAD ) && ReloadAllowed() )
|
|
|
|
|
{
|
|
|
|
|
UpdateFileInfo( ASKED_RELOAD );
|
|
|
|
|
ToTop();
|
|
|
|
|
Update();
|
|
|
|
|
if ( (IsModified() && QueryBox( this, ResId( IDS_ASKDIRTYRELOAD ) ).Execute() == RET_YES )
|
|
|
|
|
|| ( !IsModified() && ( pFrame->IsAutoReload() || QueryBox( this, ResId( IDS_ASKRELOAD ) ).Execute() == RET_YES ) ) )
|
|
|
|
|
{
|
|
|
|
|
Reload();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bReloadAborted = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppWin::Reload()
|
|
|
|
|
{
|
|
|
|
|
SkipReload();
|
|
|
|
|
TextSelection aSelMemo = pDataEdit->GetSelection();
|
|
|
|
|
Load( GetText() );
|
|
|
|
|
pDataEdit->SetSelection( aSelMemo );
|
|
|
|
|
SkipReload( FALSE );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Datei laden
|
|
|
|
|
|
|
|
|
|
void AppWin::Load( const String& aName )
|
|
|
|
|
{
|
|
|
|
|
SkipReload();
|
|
|
|
|
BOOL bErr;
|
|
|
|
|
|
|
|
|
|
// if( !QuerySave() )
|
|
|
|
|
// return;
|
|
|
|
|
bErr = !pDataEdit->Load( aName );
|
|
|
|
|
if( bErr )
|
|
|
|
|
ErrorBox( this, ResId( IDS_READERROR ) ).Execute();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DirEntry aEntry( aName );
|
|
|
|
|
String aModName = aEntry.GetFull();
|
|
|
|
|
SetText( aModName );
|
|
|
|
|
UpdateFileInfo( HAS_BEEN_LOADED );
|
|
|
|
|
PostLoad();
|
|
|
|
|
bHasFile = TRUE;
|
|
|
|
|
}
|
|
|
|
|
SkipReload( FALSE );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Datei speichern
|
|
|
|
|
|
|
|
|
|
USHORT AppWin::ImplSave()
|
|
|
|
|
{
|
|
|
|
|
SkipReload();
|
2001-04-04 12:18:57 +00:00
|
|
|
|
USHORT nResult = SAVE_RES_NOT_SAVED;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
String s1 = *pNoName;
|
|
|
|
|
String s2 = GetText().Copy( 0, s1.Len() );
|
|
|
|
|
if( s1 == s2 )
|
2001-04-04 12:18:57 +00:00
|
|
|
|
nResult = SaveAs();
|
2000-09-18 15:18:56 +00:00
|
|
|
|
else {
|
|
|
|
|
String aName = GetText();
|
|
|
|
|
if ( pDataEdit->Save( aName ) )
|
|
|
|
|
{
|
2001-04-04 12:18:57 +00:00
|
|
|
|
nResult = SAVE_RES_SAVED;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
bHasFile = TRUE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2001-04-04 12:18:57 +00:00
|
|
|
|
nResult = SAVE_RES_ERROR;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
ErrorBox( this, ResId( IDS_WRITEERROR ) ).Execute();
|
|
|
|
|
}
|
|
|
|
|
UpdateFileInfo( HAS_BEEN_LOADED );
|
|
|
|
|
}
|
|
|
|
|
SkipReload( FALSE );
|
2001-04-04 12:18:57 +00:00
|
|
|
|
return nResult;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// mit neuem Namen speichern
|
|
|
|
|
|
|
|
|
|
USHORT AppWin::SaveAs()
|
|
|
|
|
{
|
|
|
|
|
SkipReload();
|
|
|
|
|
String s1 = *pNoName;
|
|
|
|
|
String s2 = GetText().Copy( 0, s1.Len() );
|
|
|
|
|
if( s1 == s2 ) s2.Erase();
|
|
|
|
|
else s2 = GetText();
|
|
|
|
|
if( pFrame->QueryFileName( s2, GetFileType(), TRUE ) )
|
|
|
|
|
{
|
|
|
|
|
SetText( s2 );
|
|
|
|
|
PostSaveAs();
|
|
|
|
|
SkipReload( FALSE );
|
|
|
|
|
return ImplSave();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SkipReload( FALSE );
|
|
|
|
|
return SAVE_RES_CANCEL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Soll gespeichert werden?
|
|
|
|
|
|
|
|
|
|
USHORT AppWin::QuerySave( QueryBits nBits )
|
|
|
|
|
{
|
|
|
|
|
BOOL bQueryDirty = ( nBits & QUERY_DIRTY ) != 0;
|
|
|
|
|
BOOL bQueryDiskChanged = ( nBits & QUERY_DISK_CHANGED ) != 0;
|
|
|
|
|
BOOL bSaveNotDirty = ( nBits & SAVE_NOT_DIRTY ) != 0;
|
|
|
|
|
|
|
|
|
|
SkipReload();
|
|
|
|
|
short nResult;
|
|
|
|
|
if ( IsModified() || bSaveNotDirty )
|
|
|
|
|
nResult = RET_YES;
|
|
|
|
|
else
|
|
|
|
|
nResult = RET_NO;
|
|
|
|
|
|
2002-03-20 08:05:56 +00:00
|
|
|
|
BOOL bAlwaysEnableInput = pFrame->IsAlwaysEnableInput();
|
|
|
|
|
pFrame->AlwaysEnableInput( FALSE );
|
2000-09-18 15:18:56 +00:00
|
|
|
|
if( ( ( IsModified() || bSaveNotDirty ) && bQueryDirty ) || ( DiskFileChanged( SINCE_LAST_LOAD ) && bQueryDiskChanged ) )
|
|
|
|
|
{
|
|
|
|
|
ToTop();
|
|
|
|
|
if ( ( ( IsModified() && bQueryDirty ) && DiskFileChanged( SINCE_LAST_LOAD ) )
|
|
|
|
|
|| ( IsModified() && ( DiskFileChanged( SINCE_LAST_LOAD ) && bQueryDiskChanged ) ) )
|
|
|
|
|
nResult = QueryBox( this, ResId( IDS_ASK_DIRTY_AND_DISKCHANGE_SAVE ) ).Execute();
|
|
|
|
|
else if ( ( IsModified() && bQueryDirty ) )
|
|
|
|
|
nResult = QueryBox( this, ResId( IDS_ASK_DIRTY_SAVE ) ).Execute();
|
|
|
|
|
else
|
|
|
|
|
nResult = QueryBox( this, ResId( IDS_ASK_DISKCHANGE_SAVE ) ).Execute();
|
|
|
|
|
}
|
2002-03-20 08:05:56 +00:00
|
|
|
|
pFrame->AlwaysEnableInput( bAlwaysEnableInput );
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
|
|
USHORT nReturn;
|
|
|
|
|
switch( nResult )
|
|
|
|
|
{
|
|
|
|
|
case RET_YES:
|
|
|
|
|
nReturn = ImplSave();
|
|
|
|
|
break;
|
|
|
|
|
case RET_NO:
|
|
|
|
|
nReturn = SAVE_RES_NOT_SAVED;
|
|
|
|
|
break;
|
|
|
|
|
case RET_CANCEL:
|
|
|
|
|
nReturn = SAVE_RES_CANCEL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
SkipReload( FALSE );
|
|
|
|
|
return nReturn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL AppWin::Close()
|
|
|
|
|
{
|
|
|
|
|
switch ( QuerySave( QUERY_DIRTY ) )
|
|
|
|
|
{
|
|
|
|
|
case SAVE_RES_NOT_SAVED:
|
|
|
|
|
case SAVE_RES_SAVED:
|
|
|
|
|
{
|
|
|
|
|
DockingWindow::Close();
|
|
|
|
|
delete this;
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SAVE_RES_ERROR: // Fehlermeldung schon ausgegeben
|
|
|
|
|
return FALSE;
|
|
|
|
|
break;
|
|
|
|
|
case SAVE_RES_CANCEL:
|
|
|
|
|
return FALSE;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
DBG_ERROR("Not Implemented in AppWin::Close")
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Text suchen
|
|
|
|
|
|
|
|
|
|
void AppWin::Find()
|
|
|
|
|
{
|
|
|
|
|
ResId aResId( IDD_FIND_DIALOG );
|
|
|
|
|
FindDialog aDlg( this, aResId, aFind );
|
|
|
|
|
if( aDlg.Execute() ) {
|
|
|
|
|
bFind = TRUE;
|
|
|
|
|
Repeat();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Text ersetzen
|
|
|
|
|
|
|
|
|
|
void AppWin::Replace()
|
|
|
|
|
{
|
|
|
|
|
ResId aResId( IDD_REPLACE_DIALOG );
|
|
|
|
|
ReplaceDialog* pDlg = new ReplaceDialog
|
|
|
|
|
(this, aResId, aFind, aReplace );
|
|
|
|
|
if( pDlg->Execute() ) {
|
|
|
|
|
bFind = FALSE;
|
|
|
|
|
Repeat();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Suchen/ersetzen wiederholen
|
|
|
|
|
|
|
|
|
|
void AppWin::Repeat()
|
|
|
|
|
{
|
|
|
|
|
if( (aFind.Len() != 0 ) && ( pDataEdit->Find( aFind ) || (ErrorBox(this,ResId(IDS_PATTERNNOTFOUND)).Execute() && FALSE) ) && !bFind )
|
|
|
|
|
pDataEdit->ReplaceSelected( aReplace );
|
|
|
|
|
}
|
|
|
|
|
|