office-gobmx/starmath/source/utility.cxx
2011-11-27 13:23:17 -06:00

376 lines
8.5 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#include <sfx2/app.hxx>
#include <vcl/virdev.hxx>
#include <tools/string.hxx>
#include <tools/tenccvt.hxx>
#include <osl/thread.h>
#include <tools/stream.hxx>
#include "starmath.hrc"
#include "utility.hxx"
#include "dialog.hxx"
#include "view.hxx"
#include "smdll.hxx"
////////////////////////////////////////////////////////////
// return pointer to active SmViewShell, if this is not possible
// return 0 instead.
//!! Since this method is based on the current focus it is somewhat
//!! unreliable and may return unexpected 0 pointers!
SmViewShell * SmGetActiveView()
{
SfxViewShell *pView = SfxViewShell::Current();
return PTR_CAST(SmViewShell, pView);
}
////////////////////////////////////////////////////////////
/**************************************************************************/
SmPickList::SmPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize) :
SfxPtrArr((sal_uInt8) nInitSize, 1)
{
nSize = nMaxSize;
}
SmPickList::~SmPickList()
{
Clear();
}
SmPickList& SmPickList::operator=(const SmPickList& rList)
{
sal_uInt16 nPos;
Clear();
nSize = rList.nSize;
for (nPos = 0; nPos < rList.Count(); nPos++)
InsertPtr(nPos, CreateItem(rList.Get(nPos)));
return *this;
}
void SmPickList::Insert(const void *pItem)
{
Remove(pItem);
InsertPtr(0, CreateItem(pItem));
if (Count() > nSize)
{
DestroyItem(GetPtr(nSize));
RemovePtr(nSize, 1);
}
}
void SmPickList::Update(const void *pItem, const void *pNewItem)
{
sal_uInt16 nPos;
for (nPos = 0; nPos < Count(); nPos++)
if (CompareItem(GetPtr(nPos), pItem))
{
DestroyItem(GetPtr(nPos));
GetPtr(nPos) = CreateItem(pNewItem);
break;
}
}
void SmPickList::Remove(const void *pItem)
{
sal_uInt16 nPos;
for (nPos = 0; nPos < Count(); nPos++)
if (CompareItem(GetPtr(nPos), pItem))
{
DestroyItem(GetPtr(nPos));
RemovePtr(nPos, 1);
break;
}
}
void SmPickList::Clear()
{
sal_uInt16 nPos;
for (nPos = 0; nPos < Count(); nPos++)
DestroyItem(GetPtr(nPos));
RemovePtr(0, Count());
}
/**************************************************************************/
void * SmFontPickList::CreateItem(const String& /*rString*/)
{
return new Font();
}
void * SmFontPickList::CreateItem(const void *pItem)
{
return new Font(*((Font *) pItem));
}
void SmFontPickList::DestroyItem(void *pItem)
{
delete (Font *)pItem;
}
bool SmFontPickList::CompareItem(const void *pFirstItem, const void *pSecondItem) const
{
Font *pFirstFont, *pSecondFont;
pFirstFont = (Font *)pFirstItem;
pSecondFont = (Font *)pSecondItem;
if (pFirstFont->GetName() == pSecondFont->GetName())
if ((pFirstFont->GetFamily() == pSecondFont->GetFamily()) &&
(pFirstFont->GetCharSet() == pSecondFont->GetCharSet()) &&
(pFirstFont->GetWeight() == pSecondFont->GetWeight()) &&
(pFirstFont->GetItalic() == pSecondFont->GetItalic()))
return (true);
return false;
}
String SmFontPickList::GetStringItem(void *pItem)
{
Font *pFont;
String aString;
const sal_Char *pDelim = ", ";
pFont = (Font *)pItem;
aString = pFont->GetName();
if (IsItalic( *pFont ))
{
aString.AppendAscii( pDelim );
aString += String(SmResId(RID_FONTITALIC));
}
if (IsBold( *pFont ))
{
aString.AppendAscii( pDelim );
aString += String(SmResId(RID_FONTBOLD));
}
return (aString);
}
void SmFontPickList::Insert(const Font &rFont)
{
SmPickList::Insert((void *)&rFont);
}
void SmFontPickList::Update(const Font &rFont, const Font &rNewFont)
{
SmPickList::Update((void *)&rFont, (void *)&rNewFont);
}
void SmFontPickList::Remove(const Font &rFont)
{
SmPickList::Remove((void *)&rFont);
}
void SmFontPickList::ReadFrom(const SmFontDialog& rDialog)
{
Insert(rDialog.GetFont());
}
void SmFontPickList::WriteTo(SmFontDialog& rDialog) const
{
rDialog.SetFont(Get());
}
/**************************************************************************/
IMPL_LINK( SmFontPickListBox, SelectHdl, ListBox *, /*pListBox*/ )
{
sal_uInt16 nPos;
String aString;
nPos = GetSelectEntryPos();
if (nPos != 0)
{
SmFontPickList::Insert(Get(nPos));
aString = GetEntry(nPos);
RemoveEntry(nPos);
InsertEntry(aString, 0);
}
SelectEntryPos(0);
return 0;
}
SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax) :
SmFontPickList(nMax, nMax),
ListBox(pParent, rResId)
{
SetSelectHdl(LINK(this, SmFontPickListBox, SelectHdl));
}
SmFontPickListBox& SmFontPickListBox::operator=(const SmFontPickList& rList)
{
sal_uInt16 nPos;
*(SmFontPickList *)this = rList;
for (nPos = 0; nPos < Count(); nPos++)
InsertEntry(GetStringItem(GetPtr(nPos)), nPos);
if (Count() > 0)
SelectEntry(GetStringItem(GetPtr(0)));
return *this;
}
void SmFontPickListBox::Insert(const Font &rFont)
{
SmFontPickList::Insert(rFont);
RemoveEntry(GetStringItem(GetPtr(0)));
InsertEntry(GetStringItem(GetPtr(0)), 0);
SelectEntry(GetStringItem(GetPtr(0)));
while (GetEntryCount() > nSize)
RemoveEntry(GetEntryCount() - 1);
return;
}
void SmFontPickListBox::Update(const Font &rFont, const Font &rNewFont)
{
SmFontPickList::Update(rFont, rNewFont);
return;
}
void SmFontPickListBox::Remove(const Font &rFont)
{
SmFontPickList::Remove(rFont);
return;
}
////////////////////////////////////////
bool IsItalic( const Font &rFont )
{
FontItalic eItalic = rFont.GetItalic();
// the code below leaves only _NONE and _DONTKNOW as not italic
return eItalic == ITALIC_OBLIQUE || eItalic == ITALIC_NORMAL;
}
bool IsBold( const Font &rFont )
{
FontWeight eWeight = rFont.GetWeight();
return eWeight != WEIGHT_DONTKNOW && eWeight > WEIGHT_NORMAL;
}
void SmFace::Impl_Init()
{
SetSize( GetSize() );
SetTransparent( true );
SetAlign( ALIGN_BASELINE );
SetColor( COL_AUTO );
}
void SmFace::SetSize(const Size& rSize)
{
Size aSize (rSize);
// check the requested size against minimum value
static int const nMinVal = SmPtsTo100th_mm(2);
if (aSize.Height() < nMinVal)
aSize.Height() = nMinVal;
//! we don't force a maximum value here because this may prevent eg the
//! parentheses in "left ( ... right )" from matching up with large
//! bodies (eg stack{...} with many entries).
//! Of course this is holds only if characters are used and not polygons.
Font::SetSize(aSize);
}
long SmFace::GetBorderWidth() const
{
if (nBorderWidth < 0)
return GetDefaultBorderWidth();
else
return nBorderWidth;
}
SmFace & SmFace::operator = (const SmFace &rFace)
{
Font::operator = (rFace);
nBorderWidth = -1;
return *this;
}
SmFace & operator *= (SmFace &rFace, const Fraction &rFrac)
// scales the width and height of 'rFace' by 'rFrac' and returns a
// reference to 'rFace'.
// It's main use is to make scaling fonts look easier.
{ const Size &rFaceSize = rFace.GetSize();
rFace.SetSize(Size(Fraction(rFaceSize.Width()) *= rFrac,
Fraction(rFaceSize.Height()) *= rFrac));
return rFace;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */