Hack: store/restore font name box mru entries

When a LibreOffice window with a FontNameBox control is closed the
list of mru entries for the control is stored in a file,
discarding the previous saved entry list; when a document is opened or
created the last saved mru entry list for the FontNameBox control is
restored.
This commit is contained in:
Marco Cecchetti 2011-04-14 12:36:44 +02:00 committed by Cédric Bosdonnat
parent 4fc170d3e8
commit f82a46dabe
2 changed files with 86 additions and 2 deletions

View file

@ -31,6 +31,7 @@
#include "svtools/svtdllapi.h"
#include <tools/string.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/combobox.hxx>
#include <vcl/image.hxx>
@ -56,6 +57,8 @@ typedef ::std::vector< ImplFontNameListData* > ImplFontList;
#define CHANGE_DIST ( ( sal_uInt16 ) 4 )
#define ADAPT_DIST ( ( sal_uInt16 ) 8 )
/*************************************************************************
Beschreibung
@ -461,8 +464,9 @@ private:
Image maImagePrinterFont;
Image maImageBitmapFont;
Image maImageScalableFont;
sal_Bool mbWYSIWYG;
sal_Bool mbSymbols;
sal_Bool mbWYSIWYG;
sal_Bool mbSymbols;
String maFontMRUEntriesFile;
#ifdef _CTRLBOX_CXX
SVT_DLLPRIVATE void ImplCalcUserItemSize();
@ -472,6 +476,8 @@ private:
void InitBitmaps( void );
protected:
virtual void DataChanged( const DataChangedEvent& rDCEvt );
void LoadMRUEntries( const String& aFontMRUEntriesFile, xub_Unicode cSep = ';' );
void SaveMRUEntries( const String& aFontMRUEntriesFile, xub_Unicode cSep = ';' ) const;
public:
FontNameBox( Window* pParent,
WinBits nWinStyle = WB_SORT );
@ -489,6 +495,8 @@ public:
sal_Bool IsSymbolsEnabled() const { return mbSymbols; }
private:
void InitFontMRUEntriesFile();
// declared as private because some compilers would generate the default functions
FontNameBox( const FontNameBox& );
FontNameBox& operator =( const FontNameBox& );

View file

@ -31,8 +31,10 @@
#define _CTRLBOX_CXX
#include <tools/debug.hxx>
#include <tools/stream.hxx>
#include <vcl/svapp.hxx>
#include <vcl/field.hxx>
#include <vcl/helper.hxx>
#include <sal/macros.h>
#include <comphelper/processfactory.hxx>
#include <unotools/charclass.hxx>
@ -48,6 +50,10 @@
#include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx>
#if OSL_DEBUG_LEVEL > 1
#include <cstdio>
#endif
#define IMGINNERTEXTSPACE 2
#define IMGOUTERTEXTSPACE 5
#define EXTRAFONTSIZE 5
@ -56,7 +62,10 @@
#define TWIPS_TO_PT100(val) (val * 5)
#define PT100_TO_TWIPS(val) (val / 5)
#define FONTNAMEBOXMRUENTRIESFILE "/user/config/fontnameboxmruentries"
using namespace ::com::sun::star;
using namespace psp;
// ========================================================================
// ColorListBox
@ -986,6 +995,7 @@ FontNameBox::FontNameBox( Window* pParent, WinBits nWinStyle ) :
mpFontList = NULL;
mbWYSIWYG = sal_False;
mbSymbols = sal_False;
InitFontMRUEntriesFile();
}
// -------------------------------------------------------------------
@ -997,12 +1007,14 @@ FontNameBox::FontNameBox( Window* pParent, const ResId& rResId ) :
mpFontList = NULL;
mbWYSIWYG = sal_False;
mbSymbols = sal_False;
InitFontMRUEntriesFile();
}
// -------------------------------------------------------------------
FontNameBox::~FontNameBox()
{
SaveMRUEntries (maFontMRUEntriesFile);
ImplDestroyFontList();
}
@ -1018,6 +1030,63 @@ void FontNameBox::DataChanged( const DataChangedEvent& rDCEvt )
// -------------------------------------------------------------------
void FontNameBox::SaveMRUEntries( const String& aFontMRUEntriesFile, xub_Unicode cSep ) const
{
ByteString aEntries = ByteString( GetMRUEntries( cSep ), RTL_TEXTENCODING_UTF8 );
if( ! aEntries.Len() || ! aFontMRUEntriesFile.Len() )
return;
SvFileStream aStream;
aStream.Open( aFontMRUEntriesFile, STREAM_WRITE | STREAM_TRUNC );
if( ! (aStream.IsOpen() && aStream.IsWritable()) )
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "FontNameBox::SaveMRUEntries: opening mru entries file %s failed\n", ByteString(aFontMRUEntriesFile , RTL_TEXTENCODING_UTF8 ).GetBuffer() );
#endif
return;
}
aStream.SetLineDelimiter( LINEEND_LF );
aStream.WriteLine( aEntries );
aStream.WriteLine( ByteString() );
}
// -------------------------------------------------------------------
void FontNameBox::LoadMRUEntries( const String& aFontMRUEntriesFile, xub_Unicode cSep )
{
if( ! aFontMRUEntriesFile.Len() )
return;
SvFileStream aStream( aFontMRUEntriesFile, STREAM_READ );
if( ! aStream.IsOpen() )
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "FontNameBox::LoadMRUEntries: opening mru entries file %s failed\n", ByteString( aFontMRUEntriesFile, RTL_TEXTENCODING_UTF8 ).GetBuffer() );
#endif
return;
}
ByteString aLine;
aStream.ReadLine( aLine );
XubString aEntries = XubString( aLine, RTL_TEXTENCODING_UTF8 );
SetMRUEntries( aEntries, cSep );
}
// ------------------------------------------------------------------
void FontNameBox::InitFontMRUEntriesFile()
{
maFontMRUEntriesFile = getOfficePath( UserPath );
if( maFontMRUEntriesFile.Len() )
{
maFontMRUEntriesFile.AppendAscii( FONTNAMEBOXMRUENTRIESFILE );
}
}
// -------------------------------------------------------------------
void FontNameBox::InitBitmaps( void )
{
maImagePrinterFont = Image( SvtResId( RID_IMG_PRINTERFONT ) );
@ -1045,6 +1114,8 @@ void FontNameBox::Fill( const FontList* pList )
{
// store old text and clear box
XubString aOldText = GetText();
XubString rEntries = GetMRUEntries();
sal_Bool bLoadFromFile = ! rEntries.Len();
Clear();
ImplDestroyFontList();
@ -1070,6 +1141,11 @@ void FontNameBox::Fill( const FontList* pList )
}
}
if ( bLoadFromFile )
LoadMRUEntries (maFontMRUEntriesFile);
else
SetMRUEntries( rEntries );
ImplCalcUserItemSize();
// restore text