xref: /aoo41x/main/starmath/source/utility.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_starmath.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir #include <sfx2/app.hxx>
33*cdf0e10cSrcweir #include <vcl/virdev.hxx>
34*cdf0e10cSrcweir #include <tools/string.hxx>
35*cdf0e10cSrcweir #include <tools/tenccvt.hxx>
36*cdf0e10cSrcweir #include <osl/thread.h>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir #include <tools/stream.hxx>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #include "starmath.hrc"
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir #include "utility.hxx"
43*cdf0e10cSrcweir #include "dialog.hxx"
44*cdf0e10cSrcweir #include "view.hxx"
45*cdf0e10cSrcweir #include "smdll.hxx"
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir ////////////////////////////////////////////////////////////
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir // return pointer to active SmViewShell, if this is not possible
51*cdf0e10cSrcweir // return 0 instead.
52*cdf0e10cSrcweir //!! Since this method is based on the current focus it is somewhat
53*cdf0e10cSrcweir //!! unreliable and may return unexpected 0 pointers!
54*cdf0e10cSrcweir SmViewShell * SmGetActiveView()
55*cdf0e10cSrcweir {
56*cdf0e10cSrcweir 	SfxViewShell *pView = SfxViewShell::Current();
57*cdf0e10cSrcweir 	return PTR_CAST(SmViewShell, pView);
58*cdf0e10cSrcweir }
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir ////////////////////////////////////////////////////////////
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir /**************************************************************************/
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir SmPickList::SmPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize) :
67*cdf0e10cSrcweir 	SfxPtrArr((sal_uInt8) nInitSize, 1)
68*cdf0e10cSrcweir {
69*cdf0e10cSrcweir 	nSize = nMaxSize;
70*cdf0e10cSrcweir }
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir SmPickList::~SmPickList()
74*cdf0e10cSrcweir {
75*cdf0e10cSrcweir 	Clear();
76*cdf0e10cSrcweir }
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir SmPickList& SmPickList::operator=(const SmPickList& rList)
80*cdf0e10cSrcweir {
81*cdf0e10cSrcweir 	sal_uInt16	nPos;
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir 	Clear();
84*cdf0e10cSrcweir 	nSize = rList.nSize;
85*cdf0e10cSrcweir 	for (nPos = 0; nPos < rList.Count(); nPos++)
86*cdf0e10cSrcweir 		InsertPtr(nPos, CreateItem(rList.Get(nPos)));
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir 	return *this;
89*cdf0e10cSrcweir }
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir void SmPickList::Insert(const void *pItem)
93*cdf0e10cSrcweir {
94*cdf0e10cSrcweir 	Remove(pItem);
95*cdf0e10cSrcweir 	InsertPtr(0, CreateItem(pItem));
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir 	if (Count() > nSize)
98*cdf0e10cSrcweir 	{
99*cdf0e10cSrcweir 		DestroyItem(GetPtr(nSize));
100*cdf0e10cSrcweir 		RemovePtr(nSize, 1);
101*cdf0e10cSrcweir 	}
102*cdf0e10cSrcweir }
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir void SmPickList::Update(const void *pItem, const void *pNewItem)
106*cdf0e10cSrcweir {
107*cdf0e10cSrcweir 	sal_uInt16	nPos;
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir 	for (nPos = 0; nPos < Count(); nPos++)
110*cdf0e10cSrcweir 		if (CompareItem(GetPtr(nPos), pItem))
111*cdf0e10cSrcweir 		{
112*cdf0e10cSrcweir 			DestroyItem(GetPtr(nPos));
113*cdf0e10cSrcweir 			GetPtr(nPos) = CreateItem(pNewItem);
114*cdf0e10cSrcweir 			break;
115*cdf0e10cSrcweir 		}
116*cdf0e10cSrcweir }
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir void SmPickList::Remove(const void *pItem)
119*cdf0e10cSrcweir {
120*cdf0e10cSrcweir 	sal_uInt16	nPos;
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir 	for (nPos = 0; nPos < Count(); nPos++)
123*cdf0e10cSrcweir 		if (CompareItem(GetPtr(nPos), pItem))
124*cdf0e10cSrcweir 		{
125*cdf0e10cSrcweir 			DestroyItem(GetPtr(nPos));
126*cdf0e10cSrcweir 			RemovePtr(nPos, 1);
127*cdf0e10cSrcweir 			break;
128*cdf0e10cSrcweir 		}
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir void SmPickList::Clear()
132*cdf0e10cSrcweir {
133*cdf0e10cSrcweir 	sal_uInt16	nPos;
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir 	for (nPos = 0; nPos < Count(); nPos++)
136*cdf0e10cSrcweir 		DestroyItem(GetPtr(nPos));
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	RemovePtr(0, Count());
139*cdf0e10cSrcweir }
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir /**************************************************************************/
143*cdf0e10cSrcweir /**************************************************************************/
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir void * SmFontPickList::CreateItem(const String& /*rString*/)
146*cdf0e10cSrcweir {
147*cdf0e10cSrcweir 	return new Font();
148*cdf0e10cSrcweir }
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir void * SmFontPickList::CreateItem(const void *pItem)
151*cdf0e10cSrcweir {
152*cdf0e10cSrcweir 	return new Font(*((Font *) pItem));
153*cdf0e10cSrcweir }
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir void SmFontPickList::DestroyItem(void *pItem)
156*cdf0e10cSrcweir {
157*cdf0e10cSrcweir 	delete (Font *)pItem;
158*cdf0e10cSrcweir }
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir sal_Bool SmFontPickList::CompareItem(const void *pFirstItem, const void *pSecondItem) const
161*cdf0e10cSrcweir {
162*cdf0e10cSrcweir 	Font	*pFirstFont, *pSecondFont;
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir 	pFirstFont	= (Font *)pFirstItem;
165*cdf0e10cSrcweir 	pSecondFont = (Font *)pSecondItem;
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir 	if (pFirstFont->GetName() == pSecondFont->GetName())
168*cdf0e10cSrcweir 		if ((pFirstFont->GetFamily()  == pSecondFont->GetFamily())	&&
169*cdf0e10cSrcweir 			(pFirstFont->GetCharSet() == pSecondFont->GetCharSet()) &&
170*cdf0e10cSrcweir 			(pFirstFont->GetWeight()  == pSecondFont->GetWeight())	&&
171*cdf0e10cSrcweir 			(pFirstFont->GetItalic()  == pSecondFont->GetItalic()))
172*cdf0e10cSrcweir 			return (sal_True);
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 	return sal_False;
175*cdf0e10cSrcweir }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir String SmFontPickList::GetStringItem(void *pItem)
178*cdf0e10cSrcweir {
179*cdf0e10cSrcweir 	Font   *pFont;
180*cdf0e10cSrcweir 	String	aString;
181*cdf0e10cSrcweir     const sal_Char *pDelim = ", ";
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 	pFont = (Font *)pItem;
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir 	aString = pFont->GetName();
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir     if (IsItalic( *pFont ))
188*cdf0e10cSrcweir     {
189*cdf0e10cSrcweir         aString.AppendAscii( pDelim );
190*cdf0e10cSrcweir 		aString += String(SmResId(RID_FONTITALIC));
191*cdf0e10cSrcweir     }
192*cdf0e10cSrcweir     if (IsBold( *pFont ))    // bold?
193*cdf0e10cSrcweir     {
194*cdf0e10cSrcweir         aString.AppendAscii( pDelim );
195*cdf0e10cSrcweir 		aString += String(SmResId(RID_FONTBOLD));
196*cdf0e10cSrcweir     }
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir 	return (aString);
199*cdf0e10cSrcweir }
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir void SmFontPickList::Insert(const Font &rFont)
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir 	SmPickList::Insert((void *)&rFont);
204*cdf0e10cSrcweir }
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir void SmFontPickList::Update(const Font &rFont, const Font &rNewFont)
207*cdf0e10cSrcweir {
208*cdf0e10cSrcweir 	SmPickList::Update((void *)&rFont, (void *)&rNewFont);
209*cdf0e10cSrcweir }
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir void SmFontPickList::Remove(const Font &rFont)
212*cdf0e10cSrcweir {
213*cdf0e10cSrcweir 	SmPickList::Remove((void *)&rFont);
214*cdf0e10cSrcweir }
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir void SmFontPickList::ReadFrom(const SmFontDialog& rDialog)
218*cdf0e10cSrcweir {
219*cdf0e10cSrcweir 	Insert(rDialog.GetFont());
220*cdf0e10cSrcweir }
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir void SmFontPickList::WriteTo(SmFontDialog& rDialog) const
223*cdf0e10cSrcweir {
224*cdf0e10cSrcweir 	rDialog.SetFont(Get());
225*cdf0e10cSrcweir }
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir /**************************************************************************/
229*cdf0e10cSrcweir 
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir /**************************************************************************/
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir IMPL_LINK( SmFontPickListBox, SelectHdl, ListBox *, /*pListBox*/ )
234*cdf0e10cSrcweir {
235*cdf0e10cSrcweir 	sal_uInt16	nPos;
236*cdf0e10cSrcweir 	String	aString;
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir 	nPos = GetSelectEntryPos();
239*cdf0e10cSrcweir 
240*cdf0e10cSrcweir 	if (nPos != 0)
241*cdf0e10cSrcweir 	{
242*cdf0e10cSrcweir 		SmFontPickList::Insert(Get(nPos));
243*cdf0e10cSrcweir 		aString = GetEntry(nPos);
244*cdf0e10cSrcweir 		RemoveEntry(nPos);
245*cdf0e10cSrcweir 		InsertEntry(aString, 0);
246*cdf0e10cSrcweir 	}
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 	SelectEntryPos(0);
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir 	return 0;
251*cdf0e10cSrcweir }
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax) :
255*cdf0e10cSrcweir 	SmFontPickList(nMax, nMax),
256*cdf0e10cSrcweir 	ListBox(pParent, rResId)
257*cdf0e10cSrcweir {
258*cdf0e10cSrcweir 	SetSelectHdl(LINK(this, SmFontPickListBox, SelectHdl));
259*cdf0e10cSrcweir }
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir SmFontPickListBox& SmFontPickListBox::operator=(const SmFontPickList& rList)
263*cdf0e10cSrcweir {
264*cdf0e10cSrcweir 	sal_uInt16 nPos;
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir 	*(SmFontPickList *)this = rList;
267*cdf0e10cSrcweir 
268*cdf0e10cSrcweir 	for (nPos = 0; nPos < Count(); nPos++)
269*cdf0e10cSrcweir 		InsertEntry(GetStringItem(GetPtr(nPos)), nPos);
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir 	if (Count() > 0)
272*cdf0e10cSrcweir 		SelectEntry(GetStringItem(GetPtr(0)));
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir 	return *this;
275*cdf0e10cSrcweir }
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir void SmFontPickListBox::Insert(const Font &rFont)
278*cdf0e10cSrcweir {
279*cdf0e10cSrcweir 	SmFontPickList::Insert(rFont);
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir 	RemoveEntry(GetStringItem(GetPtr(0)));
282*cdf0e10cSrcweir 	InsertEntry(GetStringItem(GetPtr(0)), 0);
283*cdf0e10cSrcweir 	SelectEntry(GetStringItem(GetPtr(0)));
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir 	while (GetEntryCount() > nSize)
286*cdf0e10cSrcweir 		RemoveEntry(GetEntryCount() - 1);
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir 	return;
289*cdf0e10cSrcweir }
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir void SmFontPickListBox::Update(const Font &rFont, const Font &rNewFont)
293*cdf0e10cSrcweir {
294*cdf0e10cSrcweir 	SmFontPickList::Update(rFont, rNewFont);
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir 	// ********************** hier fehlt noch was
297*cdf0e10cSrcweir 
298*cdf0e10cSrcweir 	return;
299*cdf0e10cSrcweir }
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir 
302*cdf0e10cSrcweir void SmFontPickListBox::Remove(const Font &rFont)
303*cdf0e10cSrcweir {
304*cdf0e10cSrcweir 	SmFontPickList::Remove(rFont);
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 	// ********************** hier fehlt noch was
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir 	return;
309*cdf0e10cSrcweir }
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir ////////////////////////////////////////
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir sal_Bool IsItalic( const Font &rFont )
314*cdf0e10cSrcweir {
315*cdf0e10cSrcweir     FontItalic eItalic = rFont.GetItalic();
316*cdf0e10cSrcweir     // the code below leaves only _NONE and _DONTKNOW as not italic
317*cdf0e10cSrcweir     return eItalic == ITALIC_OBLIQUE  ||  eItalic == ITALIC_NORMAL;
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir sal_Bool IsBold( const Font &rFont )
322*cdf0e10cSrcweir {
323*cdf0e10cSrcweir     FontWeight eWeight = rFont.GetWeight();
324*cdf0e10cSrcweir     return eWeight != WEIGHT_DONTKNOW && eWeight > WEIGHT_NORMAL;
325*cdf0e10cSrcweir }
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir 
328*cdf0e10cSrcweir void SmFace::Impl_Init()
329*cdf0e10cSrcweir {
330*cdf0e10cSrcweir     SetSize( GetSize() );
331*cdf0e10cSrcweir     SetTransparent( sal_True );
332*cdf0e10cSrcweir     SetAlign( ALIGN_BASELINE );
333*cdf0e10cSrcweir     SetColor( COL_AUTO );
334*cdf0e10cSrcweir }
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir void SmFace::SetSize(const Size& rSize)
337*cdf0e10cSrcweir {
338*cdf0e10cSrcweir 	Size  aSize (rSize);
339*cdf0e10cSrcweir 
340*cdf0e10cSrcweir 	// check the requested size against minimum value
341*cdf0e10cSrcweir 	static int __READONLY_DATA	nMinVal = SmPtsTo100th_mm(2);
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir 	if (aSize.Height() < nMinVal)
344*cdf0e10cSrcweir 		aSize.Height() = nMinVal;
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir 	//! we don't force a maximum value here because this may prevent eg the
347*cdf0e10cSrcweir 	//! parentheses in "left ( ... right )" from matching up with large
348*cdf0e10cSrcweir 	//! bodies (eg stack{...} with many entries).
349*cdf0e10cSrcweir 	//! Of course this is holds only if characters are used and not polygons.
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir 	Font::SetSize(aSize);
352*cdf0e10cSrcweir }
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir long SmFace::GetBorderWidth() const
356*cdf0e10cSrcweir {
357*cdf0e10cSrcweir 	if (nBorderWidth < 0)
358*cdf0e10cSrcweir 		return GetDefaultBorderWidth();
359*cdf0e10cSrcweir 	else
360*cdf0e10cSrcweir 		return nBorderWidth;
361*cdf0e10cSrcweir }
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir SmFace & SmFace::operator = (const SmFace &rFace)
364*cdf0e10cSrcweir {
365*cdf0e10cSrcweir 	Font::operator = (rFace);
366*cdf0e10cSrcweir 	nBorderWidth = -1;
367*cdf0e10cSrcweir 	return *this;
368*cdf0e10cSrcweir }
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir SmFace & operator *= (SmFace &rFace, const Fraction &rFrac)
372*cdf0e10cSrcweir 	// scales the width and height of 'rFace' by 'rFrac' and returns a
373*cdf0e10cSrcweir 	// reference to 'rFace'.
374*cdf0e10cSrcweir 	// It's main use is to make scaling fonts look easier.
375*cdf0e10cSrcweir {	const Size &rFaceSize = rFace.GetSize();
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir 	rFace.SetSize(Size(Fraction(rFaceSize.Width())	*= rFrac,
378*cdf0e10cSrcweir 					   Fraction(rFaceSize.Height()) *= rFrac));
379*cdf0e10cSrcweir 	return rFace;
380*cdf0e10cSrcweir }
381*cdf0e10cSrcweir 
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir 
384