blob: 4bed4d7ac694ad4f99b8e04cb122d8348e56823b [file] [log] [blame]
/**************************************************************
*
* 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_sd.hxx"
#ifdef SD_DLLIMPLEMENTATION
#undef SD_DLLIMPLEMENTATION
#endif
#include "custsdlg.hxx"
#include "custsdlg.hrc"
#include "strings.hrc"
#include "sdresid.hxx"
#include "drawdoc.hxx"
#include "sdpage.hxx"
#include "cusshow.hxx"
#include "app.hxx"
#include <vcl/msgbox.hxx>
/////////////////////
// SdCustomShowDlg //
/////////////////////
/*************************************************************************
|* Konstruktor
\************************************************************************/
SdCustomShowDlg::SdCustomShowDlg( Window* pWindow,
SdDrawDocument& rDrawDoc ) :
ModalDialog ( pWindow, SdResId( DLG_CUSTOMSHOW ) ),
aLbCustomShows ( this, SdResId( LB_CUSTOMSHOWS ) ),
aCbxUseCustomShow( this, SdResId( CBX_USE_CUSTOMSHOW ) ),
aBtnNew ( this, SdResId( BTN_NEW ) ),
aBtnEdit ( this, SdResId( BTN_EDIT ) ),
aBtnRemove ( this, SdResId( BTN_REMOVE ) ),
aBtnCopy ( this, SdResId( BTN_COPY ) ),
aBtnHelp ( this, SdResId( BTN_HELP ) ),
aBtnStartShow ( this, SdResId( BTN_STARTSHOW ) ),
aBtnOK ( this, SdResId( BTN_OK ) ),
rDoc ( rDrawDoc ),
pCustomShowList ( NULL ),
pCustomShow ( NULL ),
bModified ( sal_False )
{
FreeResource();
Link aLink( LINK( this, SdCustomShowDlg, ClickButtonHdl ) );
aBtnNew.SetClickHdl( aLink );
aBtnEdit.SetClickHdl( aLink );
aBtnRemove.SetClickHdl( aLink );
aBtnCopy.SetClickHdl( aLink );
aCbxUseCustomShow.SetClickHdl( aLink );
aLbCustomShows.SetSelectHdl( aLink );
aBtnStartShow.SetClickHdl( LINK( this, SdCustomShowDlg, StartShowHdl ) ); // Testweise
// CustomShow-Liste des Docs abrufen
pCustomShowList = rDoc.GetCustomShowList();
if( pCustomShowList )
{
long nPosToSelect = pCustomShowList->GetCurPos();
// ListBox mit CustomShows fuellen
for( pCustomShow = (SdCustomShow*) pCustomShowList->First();
pCustomShow != NULL;
pCustomShow = (SdCustomShow*) pCustomShowList->Next() )
{
aLbCustomShows.InsertEntry( pCustomShow->GetName() );
}
aLbCustomShows.SelectEntryPos( (sal_uInt16)nPosToSelect );
pCustomShowList->Seek( nPosToSelect );
}
aCbxUseCustomShow.Check( pCustomShowList && rDoc.getPresentationSettings().mbCustomShow );
CheckState();
}
/*************************************************************************
|* Dtor
\************************************************************************/
SdCustomShowDlg::~SdCustomShowDlg()
{
}
/*************************************************************************
|* CheckState
\************************************************************************/
void SdCustomShowDlg::CheckState()
{
sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos();
sal_Bool bEnable = nPos != LISTBOX_ENTRY_NOTFOUND;
aBtnEdit.Enable( bEnable );
aBtnRemove.Enable( bEnable );
aBtnCopy.Enable( bEnable );
aCbxUseCustomShow.Enable( bEnable );
aBtnStartShow.Enable( true );
if( bEnable )
pCustomShowList->Seek( nPos );
}
/*************************************************************************
|* ButtonHdl()
\************************************************************************/
IMPL_LINK( SdCustomShowDlg, ClickButtonHdl, void *, p )
{
// Neue CustomShow
if( p == &aBtnNew )
{
pCustomShow = NULL;
SdDefineCustomShowDlg aDlg( this, rDoc, pCustomShow );
if( aDlg.Execute() == RET_OK )
{
if( pCustomShow )
{
if( !pCustomShowList )
pCustomShowList = rDoc.GetCustomShowList( sal_True );
pCustomShowList->Insert( pCustomShow, LIST_APPEND );
pCustomShowList->Last();
aLbCustomShows.InsertEntry( pCustomShow->GetName() );
aLbCustomShows.SelectEntry( pCustomShow->GetName() );
}
if( aDlg.IsModified() )
bModified = sal_True;
}
else if( pCustomShow )
DELETEZ( pCustomShow );
}
// CustomShow bearbeiten
else if( p == &aBtnEdit )
{
sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
DBG_ASSERT( pCustomShowList, "pCustomShowList existiert nicht" );
pCustomShow = (SdCustomShow*) pCustomShowList->GetObject( nPos );
SdDefineCustomShowDlg aDlg( this, rDoc, pCustomShow );
if( aDlg.Execute() == RET_OK )
{
if( pCustomShow )
{
pCustomShowList->Replace( pCustomShow, nPos );
pCustomShowList->Seek( nPos );
aLbCustomShows.RemoveEntry( nPos );
aLbCustomShows.InsertEntry( pCustomShow->GetName(), nPos );
aLbCustomShows.SelectEntryPos( nPos );
}
if( aDlg.IsModified() )
bModified = sal_True;
}
}
}
// CustomShow loeschen
else if( p == &aBtnRemove )
{
sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
delete (SdCustomShow*) pCustomShowList->Remove( nPos );
aLbCustomShows.RemoveEntry( nPos );
aLbCustomShows.SelectEntryPos( nPos == 0 ? nPos : nPos - 1 );
bModified = sal_True;
}
}
// CustomShow kopieren
else if( p == &aBtnCopy )
{
sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
SdCustomShow* pShow = new SdCustomShow( *(SdCustomShow*) pCustomShowList->GetObject( nPos ) );
String aStr( pShow->GetName() );
String aStrCopy( SdResId( STR_COPY_CUSTOMSHOW ) );
sal_uInt16 nStrPos = aStr.Search( aStrCopy );
sal_uInt16 nNum = 1;
if( nStrPos == STRING_NOTFOUND )
{
aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) );
aStr.Append( aStrCopy );
aStr.Append( UniString::CreateFromInt32( nNum ) );
aStr.Append( sal_Unicode(')') );
nStrPos = aStr.Search( aStrCopy );
}
nStrPos = nStrPos + (sal_uInt16)aStrCopy.Len();
// Um nicht ins Nirvana zu greifen (--> Endlosschleife)
if( nStrPos >= aStr.Len() )
{
aStr.Append( sal_Unicode(' ') );
aStr.Append( UniString::CreateFromInt32( nNum ) );
}
// Name ueberpruefen...
sal_Bool bDifferent = sal_False;
//long nPosToSelect = pCustomShowList->GetCurPos();
while( !bDifferent )
{
bDifferent = sal_True;
for( pCustomShow = (SdCustomShow*) pCustomShowList->First();
pCustomShow != NULL && bDifferent;
pCustomShow = (SdCustomShow*) pCustomShowList->Next() )
{
if( aStr == pCustomShow->GetName() )
bDifferent = sal_False;
}
if( !bDifferent )
{
// Nummer entfernen und durch um 1 erhoehte ersetzen
const CharClass* pCharClass = rDoc.GetCharClass();
while( pCharClass->isDigit( aStr, nStrPos ) )
aStr.Erase( nStrPos, 1 );
aStr.Insert( UniString::CreateFromInt32( ++nNum ), nStrPos);
}
}
//pCustomShowList->Seek( nPosToSelect );
pShow->SetName( aStr );
pCustomShowList->Insert( pShow, LIST_APPEND );
pCustomShowList->Last();
aLbCustomShows.InsertEntry( pShow->GetName() );
aLbCustomShows.SelectEntry( pShow->GetName() );
bModified = sal_True;
}
}
else if( p == &aLbCustomShows )
{
sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
pCustomShowList->Seek( nPos );
bModified = sal_True;
}
else if( p == &aCbxUseCustomShow )
{
bModified = sal_True;
}
CheckState();
return( 0L );
}
/*************************************************************************
|* StartShow-Hdl
\************************************************************************/
IMPL_LINK( SdCustomShowDlg, StartShowHdl, Button *, EMPTYARG )
{
EndDialog( RET_YES );
return 0;
}
/*************************************************************************
|* CheckState
\************************************************************************/
sal_Bool SdCustomShowDlg::IsCustomShow() const
{
return( aCbxUseCustomShow.IsEnabled() && aCbxUseCustomShow.IsChecked() );
}
///////////////////////////
// SdDefineCustomShowDlg //
///////////////////////////
/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/
SdDefineCustomShowDlg::SdDefineCustomShowDlg( Window* pWindow,
SdDrawDocument& rDrawDoc, SdCustomShow*& rpCS ) :
ModalDialog ( pWindow, SdResId( DLG_DEFINE_CUSTOMSHOW ) ),
aFtName ( this, SdResId( FT_NAME ) ),
aEdtName ( this, SdResId( EDT_NAME ) ),
aFtPages ( this, SdResId( FT_PAGES ) ),
aLbPages ( this, SdResId( LB_PAGES ) ),
aBtnAdd ( this, SdResId( BTN_ADD ) ),
aBtnRemove ( this, SdResId( BTN_REMOVE ) ),
aFtCustomPages ( this, SdResId( FT_CUSTOM_PAGES ) ),
aLbCustomPages ( this, SdResId( LB_CUSTOM_PAGES ) ),
aBtnOK ( this, SdResId( BTN_OK ) ),
aBtnCancel ( this, SdResId( BTN_CANCEL ) ),
aBtnHelp ( this, SdResId( BTN_HELP ) ),
rDoc ( rDrawDoc ),
rpCustomShow ( rpCS ),
bModified ( sal_False )
{
FreeResource();
Link aLink = LINK( this, SdDefineCustomShowDlg, ClickButtonHdl );
aBtnAdd.SetClickHdl( aLink );
aBtnRemove.SetClickHdl( aLink );
aEdtName.SetModifyHdl( aLink );
aLbPages.SetSelectHdl( aLink ); // wegen Status
aLbCustomPages.SetSelectHdl( aLink ); // wegen Status
aBtnOK.SetClickHdl( LINK( this, SdDefineCustomShowDlg, OKHdl ) );
SdPage* pPage;
// Listbox mit Seitennamen des Docs fuellen
for( long nPage = 0L;
nPage < rDoc.GetSdPageCount( PK_STANDARD );
nPage++ )
{
pPage = rDoc.GetSdPage( (sal_uInt16) nPage, PK_STANDARD );
String aStr( pPage->GetName() );
aLbPages.InsertEntry( aStr );
}
//aLbPages.SelectEntryPos( 0 );
if( rpCustomShow )
{
aOldName = rpCustomShow->GetName();
aEdtName.SetText( aOldName );
// ListBox mit CustomShow-Seiten fuellen
for( pPage = (SdPage*) rpCustomShow->First();
pPage != NULL;
pPage = (SdPage*) rpCustomShow->Next() )
{
SvLBoxEntry* pEntry = aLbCustomPages.InsertEntry( pPage->GetName() );
pEntry->SetUserData( pPage );
}
}
else
{
rpCustomShow = new SdCustomShow( &rDoc );
aEdtName.SetText( String( SdResId( STR_NEW_CUSTOMSHOW ) ) );
aEdtName.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
rpCustomShow->SetName( aEdtName.GetText() );
}
aLbCustomPages.SetDragDropMode( SV_DRAGDROP_CTRL_MOVE );
aLbCustomPages.SetHighlightRange();
aBtnOK.Enable( sal_False );
CheckState();
}
/*************************************************************************
|*
|* Dtor
|*
\************************************************************************/
SdDefineCustomShowDlg::~SdDefineCustomShowDlg()
{
}
/*************************************************************************
|* CheckState
\************************************************************************/
void SdDefineCustomShowDlg::CheckState()
{
sal_Bool bPages = aLbPages.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND;
//sal_Bool bCSPages = aLbCustomPages.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND;
sal_Bool bCSPages = aLbCustomPages.FirstSelected() != NULL;
sal_Bool bCount = aLbCustomPages.GetEntryCount() > 0;
aBtnOK.Enable( bCount );
aBtnAdd.Enable( bPages );
aBtnRemove.Enable( bCSPages );
}
/*************************************************************************
|* ButtonHdl()
\************************************************************************/
IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl, void *, p )
{
if( p == &aBtnAdd )
{
sal_uInt16 nCount = aLbPages.GetSelectEntryCount();
if( nCount > 0 )
{
sal_uLong nPosCP = LIST_APPEND;
SvLBoxEntry* pEntry = aLbCustomPages.FirstSelected();
if( pEntry )
nPosCP = aLbCustomPages.GetModel()->GetAbsPos( pEntry ) + 1L;
for( sal_uInt16 i = 0; i < nCount; i++ )
{
String aStr = aLbPages.GetSelectEntry( i );
pEntry = aLbCustomPages.InsertEntry( aStr,
0, sal_False, nPosCP );
aLbCustomPages.Select( pEntry );
SdPage* pPage = rDoc.GetSdPage( (sal_uInt16) aLbPages.
GetSelectEntryPos( i ), PK_STANDARD );
pEntry->SetUserData( pPage );
if( nPosCP != LIST_APPEND )
nPosCP++;
}
bModified = sal_True;
}
}
else if( p == &aBtnRemove )
{
//sal_uInt16 nPos = aLbCustomPages.GetSelectEntryPos();
SvLBoxEntry* pEntry = aLbCustomPages.FirstSelected();
if( pEntry )
{
sal_uLong nPos = aLbCustomPages.GetModel()->GetAbsPos( pEntry );
//rpCustomShow->Remove( nPos );
//aLbCustomPages.RemoveEntry( nPos );
aLbCustomPages.GetModel()->Remove( aLbCustomPages.GetModel()->GetEntryAtAbsPos( nPos ) );
bModified = sal_True;
}
}
else if( p == &aEdtName )
{
//rpCustomShow->SetName( aEdtName.GetText() );
bModified = sal_True;
}
CheckState();
return( 0L );
}
/*************************************************************************
|* CheckCustomShow():
|* Ueberprueft die Page-Pointer der Show, da die Eintraege ueber die
|* TreeLB verschoben und kopiert werden kĀ”nnen
\************************************************************************/
void SdDefineCustomShowDlg::CheckCustomShow()
{
sal_Bool bDifferent = sal_False;
SdPage* pPage = NULL;
SvLBoxEntry* pEntry = NULL;
// Anzahl vergleichen
if( rpCustomShow->Count() != aLbCustomPages.GetEntryCount() )
{
rpCustomShow->Clear();
bDifferent = sal_True;
}
// Seiten-Pointer vergleichen
if( !bDifferent )
{
for( pPage = (SdPage*) rpCustomShow->First(), pEntry = aLbCustomPages.First();
pPage != NULL && pEntry != NULL && !bDifferent;
pPage = (SdPage*) rpCustomShow->Next(), pEntry = aLbCustomPages.Next( pEntry ) )
{
if( pPage != pEntry->GetUserData() )
{
rpCustomShow->Clear();
bDifferent = sal_True;
}
}
}
// Seiten-Pointer neu setzen
if( bDifferent )
{
for( pEntry = aLbCustomPages.First();
pEntry != NULL;
pEntry = aLbCustomPages.Next( pEntry ) )
{
pPage = (SdPage*) pEntry->GetUserData();
rpCustomShow->Insert( pPage, LIST_APPEND );
}
bModified = sal_True;
}
// Name vergleichen und ggfs. setzen
String aStr( aEdtName.GetText() );
if( rpCustomShow->GetName() != aStr )
{
rpCustomShow->SetName( aStr );
bModified = sal_True;
}
}
/*************************************************************************
|* OK-Hdl
\************************************************************************/
IMPL_LINK( SdDefineCustomShowDlg, OKHdl, Button *, EMPTYARG )
{
// Name ueberpruefen...
sal_Bool bDifferent = sal_True;
List* pCustomShowList = rDoc.GetCustomShowList();
if( pCustomShowList )
{
String aName( aEdtName.GetText() );
SdCustomShow* pCustomShow;
long nPosToSelect = pCustomShowList->GetCurPos();
for( pCustomShow = (SdCustomShow*) pCustomShowList->First();
pCustomShow != NULL;
pCustomShow = (SdCustomShow*) pCustomShowList->Next() )
{
if( aName == pCustomShow->GetName() && aName != aOldName )
bDifferent = sal_False;
}
pCustomShowList->Seek( nPosToSelect );
}
if( bDifferent )
{
CheckCustomShow();
EndDialog( RET_OK );
}
else
{
WarningBox( this, WinBits( WB_OK ),
String( SdResId( STR_WARN_NAME_DUPLICATE ) ) ).Execute();
aEdtName.GrabFocus();
}
return 0;
}