/************************************************************** * * 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. * *************************************************************/ #include #include #include #include #include #include #include #include "math.h" #include "time.h" #include "stdlib.h" #include "dtsodcmp.hrc" #include #define MIN(a,b) (a)<(b)?(a):(b) #define MAX(a,b) (a)>(b)?(a):(b) ByteString sDelimiterLine("#=========================================================================="); Depper::Depper( Window* pBaseWindow ): Window( pBaseWindow ), mbIsPrjView(sal_False), maDefPos( 50, 50 ), maDefSize( 60, 25 ), mnViewMask( 1 ), pSubBar( NULL ), pMainBar( NULL ), pSubText( NULL ), pMainText( NULL ), maArrangeDlg( pBaseWindow ), mpPrjIdMapper( NULL ), maToolBox( pBaseWindow, DtSodResId(TID_SOLDEP_MAIN) ), maTaskBarFrame( pBaseWindow, 0) { maArrangeDlg.Hide(); mpProcessWin = pBaseWindow; mpGraphWin = new GraphWin( mpProcessWin, this ); mpGraphPrjWin = new GraphWin( mpProcessWin, this ); //mpBaseWin paints into virtual OutputDevice mpBaseWin = new DepWin( mpGraphWin->GetBufferWindow(), WB_NOBORDER | WB_SIZEABLE | WB_AUTOSIZE ); mpBasePrjWin = new DepWin( mpGraphPrjWin->GetBufferWindow(), WB_NOBORDER | WB_SIZEABLE | WB_AUTOSIZE ); mpGraphWin->SetBackground( Wallpaper( Color( COL_RED ))); mpGraphPrjWin->SetBackground( Wallpaper( Color( COL_BLUE ))); mpGraphPrjWin->Hide(); mpBaseWin->SetBackground( Wallpaper( Color( COL_WHITE ))); mpBasePrjWin->SetBackground( Wallpaper( Color( COL_LIGHTGRAY ))); /* mpGraphWin->SetZOrder( NULL, WINDOW_ZORDER_FIRST ); mpGraphPrjWin->SetZOrder( NULL, WINDOW_ZORDER_FIRST ); mpBaseWin->SetZOrder( NULL, WINDOW_ZORDER_FIRST ); */ mpGraphWin->EnableClipSiblings(); mpGraphPrjWin->EnableClipSiblings(); mpParentProcessWin = mpProcessWin->GetParent(); mpBaseWin->Show(); nZoomed = 0; mpBaseWin->SetPopupHdl( this ); mpBasePrjWin->SetPopupHdl( this ); mpObjectList = new ObjectList(); //ObjectList unbekannt mpObjectPrjList = new ObjectList(); } Depper::~Depper() { // delete mpObjectList; delete mpBaseWin; delete mpGraphWin; } sal_Bool Depper::TogglePrjViewStatus() { GetDepWin()->Hide(); //Hide old content window GetGraphWin()->Hide(); mbIsPrjView = !mbIsPrjView; //switch now GetDepWin()->Invalidate(); GetGraphWin()->Show(); GetDepWin()->Show(); //Show new content window return mbIsPrjView; } void Depper::HideObjectsAndConnections( ObjectList* pObjLst ) { for ( sal_uIntPtr i = 0; i < pObjLst->Count(); i ++ ) { ObjectWin *pWin = pObjLst->GetObject( i ); pWin->Hide(); } mpGraphWin->Hide(); mpBaseWin->Hide(); mpGraphPrjWin->Show(); mpBasePrjWin->Show(); } void Depper::ShowObjectsAndConnections( ObjectList* pObjLst ) { for ( sal_uIntPtr i = 0; i < pObjLst->Count(); i ++ ) { ObjectWin *pWin = pObjLst->GetObject( i ); pWin->Show(); } mpBasePrjWin->Hide(); mpGraphPrjWin->Hide(); mpGraphWin->Show(); mpBaseWin->Show(); } void Depper::RemoveAllObjects( ObjectList* pObjLst ) { sal_uIntPtr i; for ( i = pObjLst->Count(); i > 0; i-- ) delete pObjLst->GetObject( i - 1 ); pObjLst->Clear(); } sal_uInt16 Depper::Save( const ByteString& rFileName ) { DBG_ASSERT( sal_False , "you are dead!" ); SvFileStream aOutFile( String( rFileName, RTL_TEXTENCODING_UTF8 ), STREAM_WRITE ); depper_head dh; sal_uInt16 i; sal_uIntPtr nObjCount = mpObjectList->Count(); ConnectorList* pConList = GetDepWin()->GetConnectorList(); sal_uIntPtr nCnctrCount = pConList->Count(); dh.nID = DEPPER_ID; dh.nObjectCount = nObjCount; dh.nCnctrCount = nCnctrCount; aOutFile.Write( &dh, sizeof( dh )); for ( i=0; i < nObjCount ; i++ ) { mpObjectList->GetObject( i )->Save( aOutFile ); } for ( i=0; i < nCnctrCount ; i++ ) { pConList->GetObject( i )->Save( aOutFile ); } return 0; } sal_uInt16 Depper::WriteSource() { DBG_ASSERT( sal_False , "overload it!" ); return 0; }; sal_uInt16 Depper::ReadSource( sal_Bool bUpdater ) { DBG_ASSERT( sal_False , "overload it!" ); return 0; }; sal_uInt16 Depper::OpenSource() { DBG_ASSERT( sal_False , "overload it!" ); return 0; }; ObjectWin* Depper::ObjIdToPtr( ObjectList* pObjLst, sal_uIntPtr nId ) { sal_uIntPtr nObjCount = pObjLst->Count(); sal_uIntPtr i = 0; ObjectWin* pWin; sal_uIntPtr nWinId = 0; do { pWin = pObjLst->GetObject( i ); nWinId = pWin->GetId(); i++; } while( i < nObjCount && pWin->GetId() != nId ); if ( pWin->GetId() == nId ) return pWin; else return NULL; } void Depper::SetMainProgressBar( sal_uInt16 i) { if ( pMainBar ) { pMainBar->SetValue( 100 ); pMainBar->Update(); } } void Depper::UpdateMainProgressBar(sal_uInt16 i, sal_uInt16 nScaleVal, sal_uInt16 &nStep, sal_Bool bCountingDown ) { sal_uIntPtr val = 0; if ( pMainBar ) { // val = i * 50 / nScaleVal + 1; val = bCountingDown ? 50 + ( nScaleVal - i ) * 50 / nScaleVal : i * 50 / nScaleVal; pMainBar->SetValue( val ); pMainBar->Update(); String sText( String::CreateFromAscii( "Optimize step " )); sText += String::CreateFromInt32( ++nStep ); pSubText->SetText( sText ); } } void Depper::UpdateSubProgrssBar(sal_uIntPtr i) { if ( pSubBar ) { pSubBar->SetValue( i ); pSubBar->Update(); GetpApp()->Reschedule(); } } sal_uInt16 Depper::AutoArrangeDlgStart() { pSubBar = maArrangeDlg.GetSubBar(); pMainBar = maArrangeDlg.GetMainBar(); pSubText = maArrangeDlg.GetSubText(); pMainText = maArrangeDlg.GetMainText(); pMainText->SetText( String::CreateFromAscii( "Overall status" )); maArrangeDlg.Show(); GetDepWin()->Enable( sal_False ); GetDepWin()->Hide(); return 0; } sal_uInt16 Depper::AutoArrangeDlgStop() { maArrangeDlg.Hide(); GetDepWin()->Enable( sal_True ); GetDepWin()->Show(); pSubBar = NULL; pMainBar = NULL; pSubText = NULL; pMainText = NULL; return 0; } sal_uInt16 Depper::Zoom( MapMode& rMapMode ) { sal_uIntPtr i; ObjectWin* pWin; Point aPos; Size aSize; ObjectList* pObjList; pObjList = GetObjectList(); // aSize = mpBaseWin->GetSizePixel(); // mpGraphWin->SetTotalSize( aSize ); // mpGraphWin->EndScroll( 0, 0 ); for ( i = pObjList->Count(); i > 0; i-- ) { pWin = pObjList->GetObject( i - 1 ); aPos = pWin->PixelToLogic( pWin->GetPosPixel()); aSize = pWin->PixelToLogic( pWin->GetSizePixel()); pWin->SetMapMode( rMapMode ); aPos = pWin->LogicToPixel( aPos ); aSize = pWin->LogicToPixel( aSize ); pWin->SetPosSizePixel( aPos, aSize ); } GetDepWin()->Invalidate(); return 0; } sal_uIntPtr Depper::AddObjectToList( DepWin* pParentWin, ObjectList* pObjLst, sal_uIntPtr &LastID, sal_uIntPtr &WinCount, ByteString& rBodyText, sal_Bool bInteract ) { Point aPos; Size aSize = GetDefSize(); aPos = GetDepWin()->LogicToPixel( aPos ); aSize = GetDepWin()->LogicToPixel( aSize ); return AddObjectToList( pParentWin, pObjLst, LastID, WinCount, rBodyText, aPos, aSize ); } sal_uIntPtr Depper::AddObjectToList( DepWin* pParentWin, ObjectList* pObjLst, sal_uIntPtr &LastID, sal_uIntPtr &WinCount, ByteString& rBodyText, Point& rPos, Size& rSize ) { ObjectWin* pWin = new ObjectWin( pParentWin, WB_BORDER ); //pWin->mpDepperDontuseme = this; pWin->SetGlobalViewMask(mnViewMask); // Set ViewMask for all ObjectWin and Connector objects Size aNewSize; aNewSize.Width() = pWin->GetTextWidth( String( rBodyText, RTL_TEXTENCODING_UTF8 )); aNewSize.Height() = pWin->GetTextHeight(); if ( aNewSize.Width() > rSize.Width() - 8 ) { aNewSize.Width() = aNewSize.Width() + 8; aNewSize.Height() = rSize.Height(); } else aNewSize = rSize; pWin->SetPosSizePixel( rPos,aNewSize); MapMode aMapMode = mpBaseWin->GetMapMode(); pWin->SetMapMode( aMapMode ); pObjLst->Insert( pWin, LIST_APPEND ); pWin->SetId( LastID ); LastID++; WinCount++; pWin->SetBodyText( rBodyText ); // pWin->Show(); return pWin->GetId(); } /*void Depper::DrawOutput( OutputDevice* pDevice ) { GetDepWin()->DrawOutput( pDevice ); ObjectList* pObjList = GetObjectList(); for ( sal_uInt16 i = pObjList->Count(); i > 0; i-- ) { ObjectWin* pWin = pObjList->GetObject( i - 1 ); pWin->DrawOutput( pDevice ); } }*/ ObjectWin* Depper::RemoveObjectFromList( ObjectList* pObjLst, sal_uIntPtr &WinCount, sal_uInt16 nId, sal_Bool bDelete ) { ObjectWin* pWin = ObjIdToPtr( pObjLst, nId ); if ( pWin ) { pObjLst->Remove( pWin ); WinCount--; if( bDelete ) delete pWin; return pWin; } else return NULL; } sal_uInt16 Depper::AddConnectorToObjects( ObjectList* pObjLst, sal_uIntPtr nStartId, sal_uIntPtr nEndId ) { ObjectWin* pStartWin = ObjIdToPtr( pObjLst, nStartId ); if ( !pStartWin ) return DEP_STARTID_NOT_FOUND; ObjectWin* pEndWin = ObjIdToPtr( pObjLst, nEndId ); if ( !pEndWin ) return DEP_STARTID_NOT_FOUND; return AddConnectorToObjects( pStartWin, pEndWin ); } sal_uInt16 Depper::RemoveConnectorFromObjects( ObjectList* pObjLst, sal_uIntPtr nStartId, sal_uIntPtr nEndId ) { // DBG_ASSERT( FALSE , "noch nicht" ); ObjectWin* pStartWin = ObjIdToPtr( pObjLst, nStartId ); if ( !pStartWin ) return DEP_STARTID_NOT_FOUND; ObjectWin* pEndWin = ObjIdToPtr( pObjLst, nEndId ); if ( !pEndWin ) return DEP_STARTID_NOT_FOUND; return RemoveConnectorFromObjects( pStartWin, pEndWin ); } sal_uInt16 Depper::AddConnectorToObjects( ObjectWin* pStartWin, ObjectWin* pEndWin ) { if ( pStartWin->ConnectionExistsInAnyDirection( pEndWin )) return 0; Connector* pCon = new Connector( GetDepWin(), WB_NOBORDER ); // pCon->Initialize( pStartWin, pEndWin ); if (pStartWin->IsNullObject()) //null_project pCon->Initialize( pStartWin, pEndWin, sal_False ); else pCon->Initialize( pStartWin, pEndWin, sal_True ); return 0; } sal_uInt16 Depper::RemoveConnectorFromObjects( ObjectWin* pStartWin, ObjectWin* pEndWin ) { Connector* pCon = pStartWin->GetConnector( pStartWin->GetId(), pEndWin->GetId() ); if ( !pCon ) return DEP_CONNECTOR_NOT_FOUND; else { delete pCon; return DEP_OK; } } sal_uIntPtr Depper::HandleNewPrjDialog( ByteString &rBodyText ) { SolNewProjectDlg aNewProjectDlg( GetDepWin(), DtSodResId( RID_SD_DIALOG_NEWPROJECT )); if ( aNewProjectDlg.Execute() ) { rBodyText = ByteString( aNewProjectDlg.maEName.GetText(), RTL_TEXTENCODING_UTF8); //hashtable auf stand halten MyHashObject* pHObject; sal_uIntPtr nObjectId = AddObjectToList( mpBaseWin, mpObjectList, mnSolLastId, mnSolWinCount, rBodyText, sal_False ); pHObject = new MyHashObject( nObjectId, ObjIdToPtr( mpObjectList, 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 != "" ) { sal_uInt16 i; ByteString sDepName; sal_uInt16 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 != "" ) { sal_uInt16 i; ByteString sDepName; sal_uIntPtr nObjectId_l, nHashedId; MyHashObject* pHObject_l; sal_uInt16 nToken = sDeps.GetTokenCount(' '); for ( i = 0 ; i < nToken ; i++) { sDepName = sDeps.GetToken( i, ' ' ); pHObject_l = mpSolIdMapper->Find( sDepName ); if ( !pHObject_l ) { String sMessage; sMessage += String::CreateFromAscii("can't find "); sMessage += String( sDepName, RTL_TEXTENCODING_UTF8 ); sMessage += String::CreateFromAscii(".\ndependency ignored"); WarningBox aBox( GetDepWin(), WB_OK, sMessage); aBox.Execute(); } else { nHashedId = pHObject_l->GetId(); pHObject_l = mpSolIdMapper->Find( rBodyText ); nObjectId_l = pHObject_l->GetId(); AddConnectorToObjects( mpObjectList, nHashedId, nObjectId_l ); } } } return nObjectId; } return 0; } sal_uIntPtr Depper::HandleNewDirectoryDialog(ByteString &rBodyText) { SolNewDirectoryDlg aNewDirectoryDlg( GetDepWin(), DtSodResId( RID_SD_DIALOG_NEWDIRECTORY )); //todo: set defaults if ( aNewDirectoryDlg.Execute() ) { rBodyText = ByteString( aNewDirectoryDlg.maEFlag.GetText(), RTL_TEXTENCODING_UTF8 ); //hashtable auf stand halten MyHashObject* pHObject; sal_uIntPtr nObjectId = AddObjectToList( GetDepWin(), mpObjectPrjList, mnSolLastId, mnSolWinCount, rBodyText ); pHObject = new MyHashObject( nObjectId, ObjIdToPtr( mpObjectPrjList, nObjectId )); mpPrjIdMapper->Insert( rBodyText, pHObject ); // mpPrjIdMapper String sTokenLine; sTokenLine = String( mpPrj->GetPreFix(), RTL_TEXTENCODING_UTF8 ); sTokenLine += '\t'; String sNameConvert = aNewDirectoryDlg.maEName.GetText(); sNameConvert.SearchAndReplaceAll( '/', '\\' ); if ( sNameConvert.GetToken( 0, 0x5c ) != String( mpPrj->GetProjectName(), RTL_TEXTENCODING_UTF8 )) { sTokenLine += String( mpPrj->GetProjectName(), RTL_TEXTENCODING_UTF8 ); sTokenLine += String("\\", RTL_TEXTENCODING_UTF8 ); sTokenLine += sNameConvert; } else sTokenLine += sNameConvert; sTokenLine += '\t'; sTokenLine += aNewDirectoryDlg.maEAction.GetText(); sTokenLine += String( "\t-\t", RTL_TEXTENCODING_UTF8 ); sTokenLine += aNewDirectoryDlg.maEEnv.GetText(); sTokenLine += '\t'; sTokenLine += aNewDirectoryDlg.maEFlag.GetText(); sTokenLine += '\t'; sTokenLine += String( "NULL", RTL_TEXTENCODING_UTF8 ); ByteString bsTokenLine = ByteString( sTokenLine, RTL_TEXTENCODING_UTF8 ); mpStarWriter->InsertTokenLine( bsTokenLine ); if ( aNewDirectoryDlg.maEDeps.GetText() != String( "", RTL_TEXTENCODING_UTF8 )) { sal_uInt16 i; ByteString sDeps = ByteString( aNewDirectoryDlg.maEDeps.GetText(), RTL_TEXTENCODING_UTF8 ); ByteString sDepName; sal_uIntPtr nObjectId_l, nHashedId; MyHashObject* pHObject_l; sal_uInt16 nToken = sDeps.GetTokenCount(' '); for ( i = 0 ; i < nToken ; i++) { sDepName = sDeps.GetToken( i, ' ' ); pHObject_l = mpPrjIdMapper->Find( sDepName ); // mpPrjIdMapper if ( !pHObject_l ) { 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 { sTokenLine += String( sDepName, RTL_TEXTENCODING_UTF8 ); sTokenLine +='\t'; nHashedId = pHObject_l->GetId(); pHObject_l = mpPrjIdMapper->Find( rBodyText ); // mpPrjIdMapper nObjectId_l = pHObject_l->GetId(); AddConnectorToObjects( mpObjectPrjList, nHashedId, nObjectId_l ); } } } if ( mpPrj->Count() > 1 ) { CommandData* pData = mpPrj->GetObject( mpPrj->Count() - 1 ); pData = mpPrj->Replace( pData, mpPrj->Count() - 2 ); mpPrj->Replace( pData, mpPrj->Count() - 1 ); } return nObjectId; } return 0; } // Context-Menue IMPL_LINK( Depper, PopupSelected, PopupMenu*, mpPopup ) { sal_uInt16 nItemId = mpPopup->GetCurItemId(); switch( nItemId ) { case DEPPOPUP_NEW : { ByteString sNewItem = ByteString("new"); //AddObject( mpObjectList, sNewItem , sal_True ); } break; case DEPPOPUP_AUTOARRANGE : //AutoArrange( mpObjectList, mpObjectList, GetStart(), 0 ); break; case DEPPOPUP_LOAD : //Load( ByteString("test.dep")); break; case DEPPOPUP_SAVE : Save( ByteString("test.dep")); break; case DEPPOPUP_WRITE_SOURCE : WriteSource(); break; case DEPPOPUP_READ_SOURCE : ReadSource(sal_True); break; case DEPPOPUP_OPEN_SOURCE : OpenSource(); break; case DEPPOPUP_ZOOMIN : { // DBG_ASSERT( FALSE,"zoomin"); MapMode aMapMode = GetDepWin()->GetMapMode(); aMapMode.SetScaleX( aMapMode.GetScaleX() * Fraction( 1.25 )); aMapMode.SetScaleY( aMapMode.GetScaleY() * Fraction( 1.25 )); GetDepWin()->SetMapMode( aMapMode ); if ( nZoomed < 1 ) { Size aZoomInSize( GetDepWin()->GetSizePixel()); aZoomInSize.Width() *= 1.25; aZoomInSize.Height() *= 1.25; GetDepWin()->SetSizePixel( aZoomInSize ); } nZoomed--; Zoom( aMapMode ); }; break; case DEPPOPUP_ZOOMOUT : { // DBG_ASSERT( FALSE,"zoomout"); MapMode aMapMode = GetDepWin()->GetMapMode(); if ( aMapMode.GetScaleX() > Fraction( 0.25 )) { aMapMode.SetScaleX( aMapMode.GetScaleX() * Fraction( 0.8 )); aMapMode.SetScaleY( aMapMode.GetScaleY() * Fraction( 0.8 )); GetDepWin()->SetMapMode( aMapMode ); if ( nZoomed < 0 ) { Size aZoomOutSize( mpBaseWin->GetSizePixel()); aZoomOutSize.Width() *= 0.8; aZoomOutSize.Height() *= 0.8; GetDepWin()->SetSizePixel( aZoomOutSize ); } nZoomed++; Zoom( aMapMode ); } }; break; case DEPPOPUP_CLEAR : // DBG_ASSERT( FALSE,"clear"); // RemoveAllObjects( mpObjectList ); break; case DEPPOPUP_CLOSE : // DBG_ASSERT( FALSE,"close"); CloseWindow(); break; case DEPPOPUP_HELP : // DBG_ASSERT( FALSE,"help"); ShowHelp(); break; case DEPPOPUP_TEST : // DBG_ASSERT( FALSE,"TEST!"); // test(); break; case DEPPOPUP_SHOW_TOOLBOX: maToolBox.Show(); break; default : DBG_ASSERT( sal_False, "default" ); break; } return 0; }