office-gobmx/soldep/source/soldep.cxx
2004-02-26 13:51:54 +00:00

566 lines
19 KiB
C++
Raw Blame History

/*************************************************************************
*
* $RCSfile: soldep.cxx,v $
*
* $Revision: 1.1 $
*
* last change: $Author: obo $ $Date: 2004-02-26 14:48:16 $
*
* 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): _______________________________________
*
*
************************************************************************/
#include <osl/file.hxx>
#include <rtl/ustring.hxx>
#include <tools/debug.hxx>
#include <bootstrp/sstring.hxx>
#include <svtools/filedlg.hxx>
#include <tools/iparser.hxx>
#include <tools/geninfo.hxx>
#include <bootstrp/appdef.hxx>
#include "depper.hxx"
#include "soldep.hxx"
#include "soldlg.hxx"
#include "dtsodcmp.hrc"
IMPLEMENT_HASHTABLE_OWNER( SolIdMapper, ByteString, ULONG* );
ByteString sDelimiterLine("#==========================================================================");
//
// class SolDep
//
/*****************************************************************************/
SolDep::SolDep( Window* pBaseWindow )
/*****************************************************************************/
: Depper( pBaseWindow ),
mpPrjDep( NULL )
{
mpSolIdMapper = new SolIdMapper( 63997 );
mpStarWriter = new StarWriter( msSourceName, TRUE );
mpBaseWin->mpPopup->InsertSeparator();
mpBaseWin->mpPopup->InsertItem( DEPPOPUP_READ_SOURCE, String::CreateFromAscii("Revert all changes") );
mpBaseWin->mpPopup->InsertSeparator();
mpBaseWin->mpPopup->InsertItem( DEPPOPUP_OPEN_SOURCE, String::CreateFromAscii("Open") );
mpBaseWin->mpPopup->InsertItem( DEPPOPUP_WRITE_SOURCE, String::CreateFromAscii("Save") );
// mpBaseWin->mpPopup->InsertItem( DEPPOPUP_CLOSE, String::CreateFromAscii("Close") );
// mpBaseWin->mpPopup->InsertItem( DEPPOPUP_HELP, String::CreateFromAscii("Help") );
}
/*****************************************************************************/
SolDep::~SolDep()
/*****************************************************************************/
{
delete mpSolIdMapper;
delete mpStarWriter;
delete mpPrjDep;
delete pStandLst;
}
/*****************************************************************************/
void SolDep::Init()
/*****************************************************************************/
{
InformationParser aParser;
String sStandLst( GetDefStandList(), RTL_TEXTENCODING_ASCII_US );
pStandLst = aParser.Execute( sStandLst );
if ( pStandLst ) {
if ( GetVersion())
ReadSource();
}
}
/*****************************************************************************/
void SolDep::Init( ByteString &rVersion, GenericInformationList *pVersionList )
/*****************************************************************************/
{
if ( pVersionList )
pStandLst = new GenericInformationList( *pVersionList );
else {
InformationParser aParser;
String sStandLst( GetDefStandList(), RTL_TEXTENCODING_ASCII_US );
pStandLst = aParser.Execute( sStandLst );
}
if ( pStandLst ) {
msVersion = rVersion;
ReadSource();
}
}
/*****************************************************************************/
BOOL SolDep::GetVersion()
/*****************************************************************************/
{
SolSelectVersionDlg aVersionDlg( mpBaseWin, pStandLst );
if ( aVersionDlg.Execute() == RET_OK ) {
msVersion = aVersionDlg.GetVersion();
return TRUE;
}
return FALSE;
}
/*****************************************************************************/
ObjectWin *SolDep::RemoveObject( USHORT nId, BOOL bDelete )
/*****************************************************************************/
{
Prj* pPrj;
//hshtable auf stand halten
ObjectWin* pWin = Depper::RemoveObject( nId, FALSE );
if ( pWin )
{
ByteString aBodyText( pWin->GetBodyText() );
if( pPrj = mpStarWriter->GetPrj( aBodyText ))
{
mpStarWriter->Remove( pPrj );
//cleanup ist teuer...
mpStarWriter->CleanUp();
delete pPrj;
}
else
DBG_ASSERT( FALSE, "project not found - write" );
mpSolIdMapper->Delete( aBodyText );
if ( bDelete )
delete pWin;
return pWin;
}
else
return NULL;
}
/*****************************************************************************/
ULONG SolDep::AddObject( ByteString& rBodyText, BOOL bInteract )
/*****************************************************************************/
{
if ( bInteract )
{
SolNewProjectDlg aNewProjectDlg( mpBaseWin, DtSodResId( RID_SD_DIALOG_NEWPROJECT ));
if ( aNewProjectDlg.Execute() )
{
rBodyText = ByteString( aNewProjectDlg.maEName.GetText(), RTL_TEXTENCODING_UTF8);
//hashtable auf stand halten
MyHashObject* pHObject;
ULONG nObjectId = Depper::AddObject( rBodyText, FALSE );
pHObject = new MyHashObject( nObjectId, ObjIdToPtr( nObjectId ));
mpSolIdMapper->Insert( rBodyText, pHObject );
ByteString sTokenLine( aNewProjectDlg.maEShort.GetText(), RTL_TEXTENCODING_UTF8 );
sTokenLine += '\t';
sTokenLine += ByteString( aNewProjectDlg.maEName.GetText(), RTL_TEXTENCODING_UTF8 );
sTokenLine += "\t:\t";
ByteString sDeps = ByteString( aNewProjectDlg.maEDeps.GetText(), RTL_TEXTENCODING_UTF8 );
if ( sDeps != "" )
{
USHORT i;
ByteString sDepName;
USHORT nToken = sDeps.GetTokenCount(' ');
for ( i = 0 ; i < nToken ; i++)
{
sDepName = sDeps.GetToken( i, ' ' );
sTokenLine += sDepName;
sTokenLine +='\t';
}
}
sTokenLine +="NULL";
mpStarWriter->InsertTokenLine( sTokenLine );
mpStarWriter->InsertTokenLine( sDelimiterLine );
if ( sDeps != "" )
{
USHORT i;
ByteString sDepName;
ULONG nObjectId, nHashedId;
MyHashObject* pHObject;
USHORT nToken = sDeps.GetTokenCount(' ');
for ( i = 0 ; i < nToken ; i++)
{
sDepName = sDeps.GetToken( i, ' ' );
pHObject = mpSolIdMapper->Find( sDepName );
if ( !pHObject )
{
String sMessage;
sMessage += String::CreateFromAscii("can't find ");
sMessage += String( sDepName, RTL_TEXTENCODING_UTF8 );
sMessage += String::CreateFromAscii(".\ndependency ignored");
WarningBox aBox( mpBaseWin, WB_OK, sMessage);
aBox.Execute();
}
else
{
nHashedId = pHObject->GetId();
pHObject = mpSolIdMapper->Find( rBodyText );
nObjectId = pHObject->GetId();
Depper::AddConnector( nHashedId, nObjectId );
}
}
}
return nObjectId;
}
return 0;
}
else
{
//hashtable auf stand halten
MyHashObject* pHObject;
ULONG nObjectId = Depper::AddObject( rBodyText, FALSE );
pHObject = new MyHashObject( nObjectId, ObjIdToPtr( nObjectId ));
mpSolIdMapper->Insert( rBodyText, pHObject );
return nObjectId;
}
}
/*****************************************************************************/
USHORT SolDep::AddConnector( ObjectWin* pStartWin, ObjectWin* pEndWin )
/*****************************************************************************/
{
// DBG_ASSERT( FALSE , "not yet" );
ByteString sEndName = pEndWin->GetBodyText();
ByteString sStartName = pStartWin->GetBodyText();
Prj* pPrj = mpStarWriter->GetPrj( sEndName );
if ( pPrj )
{
pPrj->AddDependencies( sStartName );
return Depper::AddConnector( pStartWin, pEndWin );
}
else
{
DBG_ASSERT( FALSE , "non existing Project" );
return 1;
}
}
/*****************************************************************************/
USHORT SolDep::RemoveConnector( ObjectWin* pStartWin, ObjectWin* pEndWin )
/*****************************************************************************/
{
SByteStringList* pPrjDeps = NULL;
ByteString sEndName = pEndWin->GetBodyText();
ByteString sStartName = pStartWin->GetBodyText();
Prj* pPrj = mpStarWriter->GetPrj( sEndName );
pPrjDeps = pPrj->GetDependencies( FALSE );
if ( pPrjDeps )
{
ByteString* pString;
ULONG nPrjDepsCount = pPrjDeps->Count();
for ( ULONG j = nPrjDepsCount; j > 0; j-- )
{
pString = pPrjDeps->GetObject( j - 1 );
if ( pString->GetToken( 0, '.') == sStartName )
pPrjDeps->Remove( pString );
}
}
return Depper::RemoveConnector( pStartWin, pEndWin );
}
/*****************************************************************************/
void SolDep::RemoveAllObjects( ObjWinList* pObjLst )
/*****************************************************************************/
{
Depper::RemoveAllObjects( pObjLst );
if ( mpSolIdMapper )
{
delete mpSolIdMapper;
mpSolIdMapper = NULL;
}
if ( mpStarWriter )
{
delete mpStarWriter;
mpStarWriter = NULL;
}
}
/*****************************************************************************/
ULONG SolDep::GetStart()
/*****************************************************************************/
{
// DBG_ASSERT( FALSE , "soldep" );
MyHashObject* pHObject = mpSolIdMapper->Find( "null_project" );
if ( !pHObject ) {
ByteString sNullProject = ByteString( "null_project" );
ULONG nObjectId = AddObject( sNullProject, FALSE );
ObjIdToPtr( nObjectId )->SetViewMask( 1 );
return nObjectId;
}
return pHObject->GetId();
}
/*****************************************************************************/
USHORT SolDep::OpenSource()
/*****************************************************************************/
{
if ( pStandLst ) {
if ( GetVersion())
return ReadSource();
}
return 0;
}
/*****************************************************************************/
USHORT SolDep::ReadSource()
/*****************************************************************************/
{
mpBaseWin->EnablePaint( FALSE );
ULONG nObjectId, nHashedId;
ULONG i;
MyHashObject* pHObject;
ByteString* pStr;
ObjectWin *pStartWin, *pEndWin;
RemoveAllObjects( pObjectList );
delete mpSolIdMapper;
delete mpStarWriter;
mpSolIdMapper = new SolIdMapper( 63997 );
mpStarWriter = new StarWriter( pStandLst, msVersion, TRUE, getenv(SOURCEROOT) );
ByteString sTitle( SOLDEPL_NAME );
if ( mpStarWriter->GetMode() == STAR_MODE_SINGLE_PARSE ) {
sTitle += ByteString( " - mode: single file [" );
sTitle += (ByteString) mpStarWriter->GetName();
sTitle += ByteString( "]" );
}
else if ( mpStarWriter->GetMode() == STAR_MODE_MULTIPLE_PARSE ) {
sTitle += ByteString( " - mode: multiple files [" );
sTitle += ByteString(getenv(SOURCEROOT));
sTitle += ByteString( "]" );
}
SetTitle( String( sTitle, RTL_TEXTENCODING_UTF8) );
ULONG nCount = mpStarWriter->Count();
for ( i=0; i<nCount; i++ )
{
Prj *pPrj = mpStarWriter->GetObject(i);
ByteString sProjectName = pPrj->GetProjectName();
nObjectId = AddObject( sProjectName, FALSE );
ObjIdToPtr( nObjectId )->SetViewMask( 1 );
}
for ( i=0; i<nCount; i++ )
{
Prj *pPrj = mpStarWriter->GetObject(i);
SByteStringList *pLst = pPrj->GetDependencies( FALSE );
if ( pLst )
{
ULONG nDepCount = pLst->Count();
for ( ULONG m=0; m<nDepCount; m++)
{
pStr = pLst->GetObject(m);
pHObject = mpSolIdMapper->Find( *pStr );
if ( !pHObject )
{
// create new prj
Prj *pNewPrj = new Prj( *pStr );
ByteString sNewProjectName = pNewPrj->GetProjectName();
nObjectId = AddObject( sNewProjectName, FALSE );
pHObject = mpSolIdMapper->Find( *pStr );
ObjIdToPtr( nObjectId )->SetViewMask( 2 );
}
nHashedId = pHObject->GetId();
ByteString sF_Os2 = pPrj->GetProjectName();
pStr = &sF_Os2;
pHObject = mpSolIdMapper->Find( *pStr );
nObjectId = pHObject->GetId();
pStartWin = ObjIdToPtr( nHashedId );
pEndWin = ObjIdToPtr( nObjectId );
// Depper::AddConnector( nHashedId, nObjectId );
Depper::AddConnector( pStartWin, pEndWin );
}
}
}
AutoArrange( GetStart(), 0 );
mpBaseWin->EnablePaint( TRUE );
return 0;
}
/*****************************************************************************/
USHORT SolDep::WriteSource()
/*****************************************************************************/
{
USHORT nMode = mpStarWriter->GetMode();
if ( nMode == STAR_MODE_SINGLE_PARSE ) {
ByteString sFileName = mpStarWriter->GetName();
if ( sFileName.Len()) {
mpStarWriter->Write( String( sFileName, RTL_TEXTENCODING_UTF8) );
mpStarWriter->RemoveProject( ByteString( "null_project"));
}
}
else if ( nMode == STAR_MODE_MULTIPLE_PARSE ) {
//*OBO*
//String sRoot = mpStarWriter->GetSourceRoot();
//nicht mehr unterst<73>tzt mpStarWriter->GetSourceRoot()
String sRoot = String(getenv(SOURCEROOT), RTL_TEXTENCODING_UTF8);
ByteString sFileName = mpStarWriter->GetName();
DirEntry aEntry( sFileName );
aEntry.ToAbs();
aEntry = aEntry.GetPath().GetPath().GetPath();
if ( sRoot.Len()) {
mpStarWriter->RemoveProject( ByteString( "null_project"));
mpStarWriter->WriteMultiple( sRoot );
}
}
return 1;
}
/*****************************************************************************/
BOOL SolDep::ViewContent( ByteString& rObjectName )
/*****************************************************************************/
{
pFocusWin = NULL;
for ( ULONG i = 0; i < pObjectList->Count() && !pFocusWin; i++ )
if ( pObjectList->GetObject( i )->HasFocus())
pFocusWin = pObjectList->GetObject( i );
if ( mpPrjDep )
delete mpPrjDep;
mpGraphWin->Hide();
mpBaseWin->Hide();
mpPrjDep = new PrjDep( mpProcessWin );
mpPrjDep->SetCloseHdl( LINK( this, SolDep, PrjCloseHdl ));
mpProcessWin->Resize();
return mpPrjDep->Init( rObjectName, mpStarWriter );
}
/*****************************************************************************/
IMPL_LINK( SolDep, PrjCloseHdl, PrjDep *, pPrjDep )
/*****************************************************************************/
{
delete mpPrjDep;
mpPrjDep = NULL;
mpGraphWin->Show();
mpBaseWin->Show();
if ( pFocusWin ) {
pFocusWin->GrabFocus();
pFocusWin = NULL;
}
return 0;
}
/*****************************************************************************/
USHORT SolDep::CloseWindow()
/*****************************************************************************/
{
((SystemWindow*)mpProcessWin)->Close();
return 0;
}
/*****************************************************************************/
void SolDep::ShowHelp()
/*****************************************************************************/
{
SvFileStream aHelpFile( String::CreateFromAscii( "g:\\soldep.hlp" ), STREAM_READ );
String aHelpText;
String aGetStr;
ByteString sRead;
if ( aHelpFile.IsOpen() )
{
while ( aHelpFile.ReadLine( sRead ) )
{
aGetStr = String( sRead, RTL_TEXTENCODING_UTF8 );
aHelpText += aGetStr;
aHelpText += String::CreateFromAscii("\n");
}
}
else
aHelpText = String::CreateFromAscii("No Helpfile found.");
SolHelpDlg aHelpDlg( mpBaseWin, DtSodResId( RID_SD_DIALOG_HELP ));
aHelpDlg.maMLEHelp.SetText( aHelpText );
aHelpDlg.maMLEHelp.SetReadOnly();
aHelpDlg.maMLEHelp.EnableFocusSelectionHide( TRUE );
aHelpDlg.Execute();
}
/*****************************************************************************/
void SolDep::test()
/*****************************************************************************/
{
FileDialog aTestDlg( mpBaseWin, WB_STDDIALOG );
aTestDlg.SetDefaultExt( String::CreateFromAscii( "lst" ));
if ( aTestDlg.Execute() )
{
WarningBox aBox( mpBaseWin, WB_OK, aTestDlg.GetPath());
aBox.Execute();
}
}