summaryrefslogtreecommitdiff
path: root/vcl/ios
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2012-03-04 23:24:22 +0200
committerTor Lillqvist <tml@iki.fi>2012-03-05 02:05:22 +0200
commit87618ea84b5b8e2cb0524311315abbcb1c7755be (patch)
tree4d33c72ddb4298876426210c2a7a15e5b2540fc3 /vcl/ios
parent5ab3db2c2e2c622d19211f2c8c0714080af3bfe6 (diff)
Brutal dummy hacks based on "aqua" code just to get iOS stuff to link
Diffstat (limited to 'vcl/ios')
-rw-r--r--vcl/ios/source/gdi/salcoretextfontutils.cxx270
-rw-r--r--vcl/ios/source/gdi/salcoretextlayout.cxx297
-rw-r--r--vcl/ios/source/gdi/salgdiutils.cxx307
-rw-r--r--vcl/ios/source/gdi/salnativewidgets.cxx242
-rw-r--r--vcl/ios/source/window/salframeview.mm268
5 files changed, 1384 insertions, 0 deletions
diff --git a/vcl/ios/source/gdi/salcoretextfontutils.cxx b/vcl/ios/source/gdi/salcoretextfontutils.cxx
new file mode 100644
index 000000000000..b67e9548de25
--- /dev/null
+++ b/vcl/ios/source/gdi/salcoretextfontutils.cxx
@@ -0,0 +1,270 @@
+/* -*- 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 <boost/assert.hpp>
+#include <vector>
+#include <set>
+
+#include "vcl/svapp.hxx"
+
+#include "ios/salgdi.h"
+#include "ios/saldata.hxx"
+#include "ios/salcoretextfontutils.hxx"
+
+// we have to get the font attributes from the name table
+// since neither head's macStyle nor OS/2's panose are easily available
+// during font enumeration. macStyle bits would be not sufficient anyway
+// and SFNT fonts on Mac usually do not contain an OS/2 table.
+static void UpdateAttributesFromPSName( const String& rPSName, ImplDevFontAttributes& rDFA )
+{
+ rtl::OString aPSName( rtl::OUStringToOString( rPSName, RTL_TEXTENCODING_UTF8 ).toAsciiLowerCase() );
+
+ // TODO: use a multi-string ignore-case matcher once it becomes available
+ if( (aPSName.indexOf("regular") != -1)
+ || (aPSName.indexOf("normal") != -1)
+ || (aPSName.indexOf("roman") != -1)
+ || (aPSName.indexOf("medium") != -1)
+ || (aPSName.indexOf("plain") != -1)
+ || (aPSName.indexOf("standard") != -1)
+ || (aPSName.indexOf("std") != -1) )
+ {
+ rDFA.meWidthType = WIDTH_NORMAL;
+ rDFA.meWeight = WEIGHT_NORMAL;
+ rDFA.meItalic = ITALIC_NONE;
+ }
+
+ // heuristics for font weight
+ if (aPSName.indexOf("extrablack") != -1)
+ rDFA.meWeight = WEIGHT_BLACK;
+ else if (aPSName.indexOf("black") != -1)
+ rDFA.meWeight = WEIGHT_BLACK;
+ //else if (aPSName.indexOf("book") != -1)
+ // rDFA.meWeight = WEIGHT_SEMIBOLD;
+ else if( (aPSName.indexOf("semibold") != -1)
+ || (aPSName.indexOf("smbd") != -1))
+ rDFA.meWeight = WEIGHT_SEMIBOLD;
+ else if (aPSName.indexOf("ultrabold") != -1)
+ rDFA.meWeight = WEIGHT_ULTRABOLD;
+ else if (aPSName.indexOf("extrabold") != -1)
+ rDFA.meWeight = WEIGHT_BLACK;
+ else if( (aPSName.indexOf("bold") != -1)
+ || (aPSName.indexOf("-bd") != -1))
+ rDFA.meWeight = WEIGHT_BOLD;
+ else if (aPSName.indexOf("extralight") != -1)
+ rDFA.meWeight = WEIGHT_ULTRALIGHT;
+ else if (aPSName.indexOf("ultralight") != -1)
+ rDFA.meWeight = WEIGHT_ULTRALIGHT;
+ else if (aPSName.indexOf("light") != -1)
+ rDFA.meWeight = WEIGHT_LIGHT;
+ else if (aPSName.indexOf("thin") != -1)
+ rDFA.meWeight = WEIGHT_THIN;
+ else if (aPSName.indexOf("-w3") != -1)
+ rDFA.meWeight = WEIGHT_LIGHT;
+ else if (aPSName.indexOf("-w4") != -1)
+ rDFA.meWeight = WEIGHT_SEMILIGHT;
+ else if (aPSName.indexOf("-w5") != -1)
+ rDFA.meWeight = WEIGHT_NORMAL;
+ else if (aPSName.indexOf("-w6") != -1)
+ rDFA.meWeight = WEIGHT_SEMIBOLD;
+ else if (aPSName.indexOf("-w7") != -1)
+ rDFA.meWeight = WEIGHT_BOLD;
+ else if (aPSName.indexOf("-w8") != -1)
+ rDFA.meWeight = WEIGHT_ULTRABOLD;
+ else if (aPSName.indexOf("-w9") != -1)
+ rDFA.meWeight = WEIGHT_BLACK;
+
+ // heuristics for font slant
+ if( (aPSName.indexOf("italic") != -1)
+ || (aPSName.indexOf(" ital") != -1)
+ || (aPSName.indexOf("cursive") != -1)
+ || (aPSName.indexOf("-it") != -1)
+ || (aPSName.indexOf("lightit") != -1)
+ || (aPSName.indexOf("mediumit") != -1)
+ || (aPSName.indexOf("boldit") != -1)
+ || (aPSName.indexOf("cnit") != -1)
+ || (aPSName.indexOf("bdcn") != -1)
+ || (aPSName.indexOf("bdit") != -1)
+ || (aPSName.indexOf("condit") != -1)
+ || (aPSName.indexOf("bookit") != -1)
+ || (aPSName.indexOf("blackit") != -1) )
+ rDFA.meItalic = ITALIC_NORMAL;
+ if( (aPSName.indexOf("oblique") != -1)
+ || (aPSName.indexOf("inclined") != -1)
+ || (aPSName.indexOf("slanted") != -1) )
+ rDFA.meItalic = ITALIC_OBLIQUE;
+
+ // heuristics for font width
+ if( (aPSName.indexOf("condensed") != -1)
+ || (aPSName.indexOf("-cond") != -1)
+ || (aPSName.indexOf("boldcond") != -1)
+ || (aPSName.indexOf("boldcn") != -1)
+ || (aPSName.indexOf("cnit") != -1) )
+ rDFA.meWidthType = WIDTH_CONDENSED;
+ else if (aPSName.indexOf("narrow") != -1)
+ rDFA.meWidthType = WIDTH_SEMI_CONDENSED;
+ else if (aPSName.indexOf("expanded") != -1)
+ rDFA.meWidthType = WIDTH_EXPANDED;
+ else if (aPSName.indexOf("wide") != -1)
+ rDFA.meWidthType = WIDTH_EXPANDED;
+
+ // heuristics for font pitch
+ if( (aPSName.indexOf("mono") != -1)
+ || (aPSName.indexOf("courier") != -1)
+ || (aPSName.indexOf("monaco") != -1)
+ || (aPSName.indexOf("typewriter") != -1) )
+ rDFA.mePitch = PITCH_FIXED;
+
+ // heuristics for font family type
+ if( (aPSName.indexOf("script") != -1)
+ || (aPSName.indexOf("chancery") != -1)
+ || (aPSName.indexOf("zapfino") != -1))
+ rDFA.meFamily = FAMILY_SCRIPT;
+ else if( (aPSName.indexOf("comic") != -1)
+ || (aPSName.indexOf("outline") != -1)
+ || (aPSName.indexOf("pinpoint") != -1) )
+ rDFA.meFamily = FAMILY_DECORATIVE;
+ else if( (aPSName.indexOf("sans") != -1)
+ || (aPSName.indexOf("arial") != -1) )
+ rDFA.meFamily = FAMILY_SWISS;
+ else if( (aPSName.indexOf("roman") != -1)
+ || (aPSName.indexOf("times") != -1) )
+ rDFA.meFamily = FAMILY_ROMAN;
+
+ // heuristics for codepoint semantic
+ if( (aPSName.indexOf("symbol") != -1)
+ || (aPSName.indexOf("dings") != -1)
+ || (aPSName.indexOf("dingbats") != -1)
+ || (aPSName.indexOf("ornaments") != -1)
+ || (aPSName.indexOf("embellishments") != -1) )
+ rDFA.mbSymbolFlag = true;
+
+ // #i100020# special heuristic for names with single-char styles
+ // NOTE: we are checking name that hasn't been lower-cased
+ if( rPSName.Len() > 3 )
+ {
+ int i = rPSName.Len();
+ sal_Unicode c = rPSName.GetChar( --i );
+ if( c == 'C' ) { // "capitals"
+ rDFA.meFamily = FAMILY_DECORATIVE;
+ c = rPSName.GetChar( --i );
+ }
+ if( c == 'O' ) { // CFF-based OpenType
+ c = rPSName.GetChar( --i );
+ }
+ if( c == 'I' ) { // "italic"
+ rDFA.meItalic = ITALIC_NORMAL;
+ c = rPSName.GetChar( --i );
+ }
+ if( c == 'B' ) // "bold"
+ rDFA.meWeight = WEIGHT_BOLD;
+ if( c == 'C' ) // "capitals"
+ rDFA.meFamily = FAMILY_DECORATIVE;
+ // TODO: check that all single-char styles have been resolved?
+ }
+}
+
+static bool GetDevFontAttributes( CTFontRef nFontRef, ImplDevFontAttributes& rDFA )
+{
+ // all CT fonts are device fonts that can be directly rotated
+ rDFA.mbOrientation = true;
+ rDFA.mbDevice = true;
+ rDFA.mnQuality = 0;
+
+ // reset the attributes
+ rDFA.meFamily = FAMILY_DONTKNOW;
+ rDFA.mePitch = PITCH_VARIABLE;
+ rDFA.meWidthType = WIDTH_NORMAL;
+ rDFA.meWeight = WEIGHT_NORMAL;
+ rDFA.meItalic = ITALIC_NONE;
+ rDFA.mbSymbolFlag = false;
+
+ // Implement...
+
+ return false;
+}
+
+// =======================================================================
+
+SystemFontList::SystemFontList()
+{
+}
+
+SystemFontList::~SystemFontList()
+{
+}
+
+void SystemFontList::AnnounceFonts( ImplDevFontList& rFontList ) const
+{
+}
+
+// not all fonts are suitable for glyph fallback => sort them
+struct GfbCompare{ bool operator()(const ImplIosFontData*, const ImplIosFontData*); };
+
+inline bool GfbCompare::operator()( const ImplIosFontData* pA, const ImplIosFontData* pB )
+{
+ // use symbol fonts only as last resort
+ bool bPreferA = !pA->IsSymbolFont();
+ bool bPreferB = !pB->IsSymbolFont();
+ if( bPreferA != bPreferB )
+ return bPreferA;
+ // prefer scalable fonts
+ bPreferA = pA->IsScalable();
+ bPreferB = pB->IsScalable();
+ if( bPreferA != bPreferB )
+ return bPreferA;
+ // prefer non-slanted fonts
+ bPreferA = (pA->GetSlant() == ITALIC_NONE);
+ bPreferB = (pB->GetSlant() == ITALIC_NONE);
+ if( bPreferA != bPreferB )
+ return bPreferA;
+ // prefer normal weight fonts
+ bPreferA = (pA->GetWeight() == WEIGHT_NORMAL);
+ bPreferB = (pB->GetWeight() == WEIGHT_NORMAL);
+ if( bPreferA != bPreferB )
+ return bPreferA;
+ // prefer normal width fonts
+ bPreferA = (pA->GetWidthType() == WIDTH_NORMAL);
+ bPreferB = (pB->GetWidthType() == WIDTH_NORMAL);
+ if( bPreferA != bPreferB )
+ return bPreferA;
+ return false;
+}
+
+void SystemFontList::InitGlyphFallbacks()
+{
+}
+
+ImplIosFontData* SystemFontList::GetFontDataFromRef( CTFontRef nFontRef ) const
+{
+ IosFontContainer::const_iterator it = maFontContainer.find( nFontRef );
+ if( it == maFontContainer.end() )
+ return NULL;
+ return (*it).second;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/ios/source/gdi/salcoretextlayout.cxx b/vcl/ios/source/gdi/salcoretextlayout.cxx
new file mode 100644
index 000000000000..461bb9c4645f
--- /dev/null
+++ b/vcl/ios/source/gdi/salcoretextlayout.cxx
@@ -0,0 +1,297 @@
+/* -*- 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 "tools/debug.hxx"
+
+#include "ios/saldata.hxx"
+#include "ios/salgdi.h"
+#include "ios/salcoretextfontutils.hxx"
+
+#include "sallayout.hxx"
+#include "salgdi.hxx"
+
+#include <math.h>
+
+class CoreTextLayout : public SalLayout
+{
+public:
+ CoreTextLayout( CTFontSymbolicTraits&, float fFontScale );
+ virtual ~CoreTextLayout();
+
+ virtual bool LayoutText( ImplLayoutArgs& );
+ virtual void AdjustLayout( ImplLayoutArgs& );
+ virtual void DrawText( SalGraphics& ) const;
+
+ virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&,
+ sal_Int32* pGlyphAdvances, int* pCharIndexes ) const;
+
+ virtual long GetTextWidth() const;
+ virtual long FillDXArray( long* pDXArray ) const;
+ virtual int GetTextBreak( long nMaxWidth, long nCharExtra, int nFactor ) const;
+ virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const;
+ virtual bool GetGlyphOutlines( SalGraphics&, PolyPolyVector& ) const;
+ virtual bool GetBoundRect( SalGraphics&, Rectangle& ) const;
+
+ const ImplFontData* GetFallbackFontData( sal_GlyphId ) const;
+
+ virtual void InitFont() const;
+ virtual void MoveGlyph( int nStart, long nNewXPos );
+ virtual void DropGlyph( int nStart );
+ virtual void Simplify( bool bIsBase );
+
+private:
+ // ???
+ float mfFontScale;
+
+private:
+ bool InitGIA( ImplLayoutArgs* pArgs = NULL ) const;
+ bool GetIdealX() const;
+ bool GetDeltaY() const;
+ void InvalidateMeasurements();
+
+ // cached details about the resulting layout
+ // mutable members since these details are all lazy initialized
+ mutable int mnGlyphCount; // glyph count
+ mutable Fixed mnCachedWidth; // cached value of resulting typographical width
+ int mnTrailingSpaceWidth; // in Pixels
+
+ mutable CGGlyph* mpGlyphIds;
+ mutable Fixed* mpCharWidths; // map relative charpos to charwidth
+ mutable int* mpChars2Glyphs; // map relative charpos to absolute glyphpos
+ mutable int* mpGlyphs2Chars; // map absolute glyphpos to absolute charpos
+ mutable bool* mpGlyphRTLFlags; // BiDi status for glyphs: true if RTL
+ mutable Fixed* mpGlyphAdvances; // contains glyph widths for the justified layout
+ mutable Fixed* mpGlyphOrigAdvs; // contains glyph widths for the unjustified layout
+ mutable Fixed* mpDeltaY; // vertical offset from the baseline
+
+ struct SubPortion { int mnMinCharPos, mnEndCharPos; Fixed mnXOffset; };
+ typedef std::vector<SubPortion> SubPortionVector;
+ mutable SubPortionVector maSubPortions;
+
+ // storing details about fonts used in glyph-fallback for this layout
+ mutable class FallbackInfo* mpFallbackInfo;
+
+ // x-offset relative to layout origin
+ // currently only used in RTL-layouts
+ mutable Fixed mnBaseAdv;
+};
+
+class FallbackInfo
+{
+public:
+ FallbackInfo() : mnMaxLevel(0) {}
+ int AddFallback( CTFontRef );
+ const ImplFontData* GetFallbackFontData( int nLevel ) const;
+
+private:
+ const ImplIosFontData* maFontData[ MAX_FALLBACK ];
+ CTFontRef maCTFontRef[ MAX_FALLBACK ];
+ int mnMaxLevel;
+};
+
+CoreTextLayout::CoreTextLayout( CTFontSymbolicTraits& rCoreTextStyle, float fFontScale )
+:
+ mfFontScale( fFontScale ),
+ mnGlyphCount( -1 ),
+ mnCachedWidth( 0 ),
+ mnTrailingSpaceWidth( 0 ),
+ mpGlyphIds( NULL ),
+ mpCharWidths( NULL ),
+ mpChars2Glyphs( NULL ),
+ mpGlyphs2Chars( NULL ),
+ mpGlyphRTLFlags( NULL ),
+ mpGlyphAdvances( NULL ),
+ mpGlyphOrigAdvs( NULL ),
+ mpDeltaY( NULL ),
+ mpFallbackInfo( NULL ),
+ mnBaseAdv( 0 )
+{}
+
+// -----------------------------------------------------------------------
+
+CoreTextLayout::~CoreTextLayout()
+{
+ delete[] mpGlyphRTLFlags;
+ delete[] mpGlyphs2Chars;
+ delete[] mpChars2Glyphs;
+ if( mpCharWidths != mpGlyphAdvances )
+ delete[] mpCharWidths;
+ delete[] mpGlyphIds;
+ delete[] mpGlyphOrigAdvs;
+ delete[] mpGlyphAdvances;
+
+ delete mpFallbackInfo;
+}
+
+bool CoreTextLayout::LayoutText( ImplLayoutArgs& rArgs )
+{
+ // Implement...
+ return true;
+}
+
+void CoreTextLayout::AdjustLayout( ImplLayoutArgs& rArgs )
+{
+ // Implement...
+}
+
+void CoreTextLayout::DrawText( SalGraphics& rGraphics ) const
+{
+ // Implement...
+}
+
+int CoreTextLayout::GetNextGlyphs( int nLen, sal_GlyphId* pGlyphIDs, Point& rPos, int& nStart,
+ sal_Int32* pGlyphAdvances, int* pCharIndexes ) const
+{
+ if( nStart < 0 ) // first glyph requested?
+ nStart = 0;
+
+ // Implement...
+
+ return 0;
+}
+
+long CoreTextLayout::GetTextWidth() const
+{
+ // Implement...
+
+ return 0;
+}
+
+long CoreTextLayout::FillDXArray( long* pDXArray ) const
+{
+ // short circuit requests which don't need full details
+ if( !pDXArray )
+ return GetTextWidth();
+
+ // Implement...
+
+ return 0;
+}
+
+int CoreTextLayout::GetTextBreak( long nMaxWidth, long nCharExtra, int nFactor ) const
+{
+ return 0;
+}
+
+void CoreTextLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) const
+{
+}
+
+bool CoreTextLayout::GetBoundRect( SalGraphics&, Rectangle& rVCLRect ) const
+{
+ return true;
+}
+
+bool CoreTextLayout::InitGIA( ImplLayoutArgs* pArgs ) const
+{
+ // no need to run InitGIA more than once on the same CoreTextLayout object
+ if( mnGlyphCount >= 0 )
+ return true;
+ mnGlyphCount = 0;
+
+ // Implement...
+
+ return true;
+}
+
+// -----------------------------------------------------------------------
+
+bool CoreTextLayout::GetIdealX() const
+{
+ // compute the ideal advance widths only once
+ if( mpGlyphOrigAdvs != NULL )
+ return true;
+
+ // Implement...
+
+ return true;
+}
+
+// -----------------------------------------------------------------------
+
+bool CoreTextLayout::GetDeltaY() const
+{
+ return true;
+}
+
+// -----------------------------------------------------------------------
+
+#define DELETEAZ( X ) { delete[] X; X = NULL; }
+
+void CoreTextLayout::InvalidateMeasurements()
+{
+ mnGlyphCount = -1;
+ DELETEAZ( mpGlyphIds );
+ DELETEAZ( mpCharWidths );
+ DELETEAZ( mpChars2Glyphs );
+ DELETEAZ( mpGlyphs2Chars );
+ DELETEAZ( mpGlyphRTLFlags );
+ DELETEAZ( mpGlyphAdvances );
+ DELETEAZ( mpGlyphOrigAdvs );
+ DELETEAZ( mpDeltaY );
+}
+
+// glyph fallback is supported directly by Ios
+// so methods used only by MultiSalLayout can be dummy implementated
+bool CoreTextLayout::GetGlyphOutlines( SalGraphics&, PolyPolyVector& ) const { return false; }
+void CoreTextLayout::InitFont() const {}
+void CoreTextLayout::MoveGlyph( int /*nStart*/, long /*nNewXPos*/ ) {}
+void CoreTextLayout::DropGlyph( int /*nStart*/ ) {}
+void CoreTextLayout::Simplify( bool /*bIsBase*/ ) {}
+
+// get the ImplFontData for a glyph fallback font
+// for a glyphid that was returned by CoreTextLayout::GetNextGlyphs()
+const ImplFontData* CoreTextLayout::GetFallbackFontData( sal_GlyphId nGlyphId ) const
+{
+ // check if any fallback fonts were needed
+ if( !mpFallbackInfo )
+ return NULL;
+ // check if the current glyph needs a fallback font
+ int nFallbackLevel = (nGlyphId & GF_FONTMASK) >> GF_FONTSHIFT;
+ if( !nFallbackLevel )
+ return NULL;
+ return mpFallbackInfo->GetFallbackFontData( nFallbackLevel );
+}
+
+int FallbackInfo::AddFallback( CTFontRef nFontId )
+{
+ return 0;
+}
+
+const ImplFontData* FallbackInfo::GetFallbackFontData( int nFallbackLevel ) const
+{
+ const ImplIosFontData* pFallbackFont = maFontData[ nFallbackLevel-1 ];
+ return pFallbackFont;
+}
+
+SalLayout* IosSalGraphics::GetTextLayout( ImplLayoutArgs&, int /*nFallbackLevel*/ )
+{
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/ios/source/gdi/salgdiutils.cxx b/vcl/ios/source/gdi/salgdiutils.cxx
new file mode 100644
index 000000000000..e496493f9260
--- /dev/null
+++ b/vcl/ios/source/gdi/salgdiutils.cxx
@@ -0,0 +1,307 @@
+/* -*- 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 <boost/bind.hpp>
+
+#include "basebmp/scanlineformats.hxx"
+#include "basebmp/color.hxx"
+
+#include "basegfx/range/b2drectangle.hxx"
+#include "basegfx/range/b2irange.hxx"
+#include "basegfx/vector/b2ivector.hxx"
+#include "basegfx/polygon/b2dpolygon.hxx"
+#include "basegfx/polygon/b2dpolygontools.hxx"
+
+#include "vcl/svapp.hxx"
+
+#include "ios/salgdi.h"
+#include "ios/salframe.h"
+#include "ios/saldata.hxx"
+
+// ----------------------------------------------------------------------
+
+void IosSalGraphics::SetWindowGraphics( IosSalFrame* pFrame )
+{
+ mpFrame = pFrame;
+
+ mbWindow = true;
+ mbPrinter = false;
+ mbVirDev = false;
+}
+
+void IosSalGraphics::SetPrinterGraphics( CGContextRef xContext, long nDPIX, long nDPIY, double fScale )
+{
+ mbWindow = false;
+ mbPrinter = true;
+ mbVirDev = false;
+
+ mrContext = xContext;
+ mfFakeDPIScale = fScale;
+ mnRealDPIX = nDPIX;
+ mnRealDPIY = nDPIY;
+
+ // a previously set clip path is now invalid
+ if( mxClipPath )
+ {
+ CGPathRelease( mxClipPath );
+ mxClipPath = NULL;
+ }
+
+ if( mrContext )
+ {
+ CGContextSetFillColorSpace( mrContext, GetSalData()->mxRGBSpace );
+ CGContextSetStrokeColorSpace( mrContext, GetSalData()->mxRGBSpace );
+ CGContextSaveGState( mrContext );
+ SetState();
+ }
+}
+
+void IosSalGraphics::SetVirDevGraphics( CGLayerRef xLayer, CGContextRef xContext,
+ int nBitmapDepth )
+{
+ mbWindow = false;
+ mbPrinter = false;
+ mbVirDev = true;
+
+ // set graphics properties
+ mxLayer = xLayer;
+ mrContext = xContext;
+ mnBitmapDepth = nBitmapDepth;
+
+ // return early if the virdev is being destroyed
+ if( !xContext )
+ return;
+
+ // get new graphics properties
+ if( !mxLayer )
+ {
+ mnWidth = CGBitmapContextGetWidth( mrContext );
+ mnHeight = CGBitmapContextGetHeight( mrContext );
+ }
+ else
+ {
+ const CGSize aSize = CGLayerGetSize( mxLayer );
+ mnWidth = static_cast<int>(aSize.width);
+ mnHeight = static_cast<int>(aSize.height);
+ }
+
+ // prepare graphics for drawing
+ const CGColorSpaceRef aCGColorSpace = GetSalData()->mxRGBSpace;
+ CGContextSetFillColorSpace( mrContext, aCGColorSpace );
+ CGContextSetStrokeColorSpace( mrContext, aCGColorSpace );
+
+ // re-enable XorEmulation for the new context
+ if( mpXorEmulation )
+ {
+ mpXorEmulation->SetTarget( mnWidth, mnHeight, mnBitmapDepth, mrContext, mxLayer );
+ if( mpXorEmulation->IsEnabled() )
+ mrContext = mpXorEmulation->GetMaskContext();
+ }
+
+ // initialize stack of CGContext states
+ CGContextSaveGState( mrContext );
+ SetState();
+}
+
+// ----------------------------------------------------------------------
+
+void IosSalGraphics::InvalidateContext()
+{
+ UnsetState();
+ mrContext = 0;
+}
+
+// ----------------------------------------------------------------------
+
+void IosSalGraphics::UnsetState()
+{
+ if( mrContext )
+ {
+ CGContextRestoreGState( mrContext );
+ mrContext = 0;
+ }
+ if( mxClipPath )
+ {
+ CGPathRelease( mxClipPath );
+ mxClipPath = NULL;
+ }
+}
+
+void IosSalGraphics::SetState()
+{
+ CGContextRestoreGState( mrContext );
+ CGContextSaveGState( mrContext );
+
+ // setup clipping
+ if( mxClipPath )
+ {
+ CGContextBeginPath( mrContext ); // discard any existing path
+ CGContextAddPath( mrContext, mxClipPath ); // set the current path to the clipping path
+ CGContextClip( mrContext ); // use it for clipping
+ }
+
+ // set RGB colorspace and line and fill colors
+ CGContextSetFillColor( mrContext, maFillColor.AsArray() );
+ CGContextSetStrokeColor( mrContext, maLineColor.AsArray() );
+ CGContextSetShouldAntialias( mrContext, false );
+ if( mnXorMode == 2 )
+ CGContextSetBlendMode( mrContext, kCGBlendModeDifference );
+}
+
+// ----------------------------------------------------------------------
+
+bool IosSalGraphics::CheckContext()
+{
+ if( mbWindow && mpFrame != NULL )
+ {
+ const unsigned int nWidth = mpFrame->maGeometry.nWidth;
+ const unsigned int nHeight = mpFrame->maGeometry.nHeight;
+
+ CGContextRef rReleaseContext = 0;
+ CGLayerRef rReleaseLayer = NULL;
+
+ // check if a new drawing context is needed (e.g. after a resize)
+ if( (unsigned(mnWidth) != nWidth) || (unsigned(mnHeight) != nHeight) )
+ {
+ mnWidth = nWidth;
+ mnHeight = nHeight;
+ // prepare to release the corresponding resources
+ rReleaseContext = mrContext;
+ rReleaseLayer = mxLayer;
+ mrContext = NULL;
+ mxLayer = NULL;
+ }
+
+ if( !mrContext )
+ {
+#if 0 // No idea
+ const CGSize aLayerSize = {nWidth,nHeight};
+ UIGraphicsContext* puiGContext = [UIGraphicsContext graphicsContextWithWindow: mpFrame->getWindow()];
+ CGContextRef xCGContext = reinterpret_cast<CGContextRef>([pUIGContext graphicsPort]);
+ mxLayer = CGLayerCreateWithContext( xCGContext, aLayerSize, NULL );
+ if( mxLayer )
+ mrContext = CGLayerGetContext( mxLayer );
+#endif
+ if( mrContext )
+ {
+ // copy original layer to resized layer
+ if( rReleaseLayer )
+ CGContextDrawLayerAtPoint( mrContext, CGPointZero, rReleaseLayer );
+
+ CGContextTranslateCTM( mrContext, 0, nHeight );
+ CGContextScaleCTM( mrContext, 1.0, -1.0 );
+ CGContextSetFillColorSpace( mrContext, GetSalData()->mxRGBSpace );
+ CGContextSetStrokeColorSpace( mrContext, GetSalData()->mxRGBSpace );
+ CGContextSaveGState( mrContext );
+ SetState();
+
+ // re-enable XOR emulation for the new context
+ if( mpXorEmulation )
+ mpXorEmulation->SetTarget( mnWidth, mnHeight, mnBitmapDepth, mrContext, mxLayer );
+ }
+ }
+
+ if( rReleaseLayer )
+ CGLayerRelease( rReleaseLayer );
+ else if( rReleaseContext )
+ CGContextRelease( rReleaseContext );
+ }
+
+ DBG_ASSERT( mrContext || mbPrinter, "<<<WARNING>>> IosSalGraphics::CheckContext() FAILED!!!!\n" );
+ return (mrContext != NULL);
+}
+
+
+void IosSalGraphics::RefreshRect(float lX, float lY, float lWidth, float lHeight)
+{
+ if( ! mbWindow ) // view only on Window graphics
+ return;
+
+ if( mpFrame )
+ {
+ // update a little more around the designated rectangle
+ // this helps with antialiased rendering
+ const Rectangle aVclRect(Point(static_cast<long int>(lX-1),
+ static_cast<long int>(lY-1) ),
+ Size( static_cast<long int>(lWidth+2),
+ static_cast<long int>(lHeight+2) ) );
+ mpFrame->maInvalidRect.Union( aVclRect );
+ }
+}
+
+CGPoint* IosSalGraphics::makeCGptArray(sal_uLong nPoints, const SalPoint* pPtAry)
+{
+ CGPoint *CGpoints = new CGPoint[nPoints];
+ if ( CGpoints )
+ {
+ for(sal_uLong i=0;i<nPoints;i++)
+ {
+ CGpoints[i].x = (float)(pPtAry[i].mnX);
+ CGpoints[i].y = (float)(pPtAry[i].mnY);
+ }
+ }
+ return CGpoints;
+}
+
+// -----------------------------------------------------------------------
+
+void IosSalGraphics::UpdateWindow( CGRect& )
+{
+#if 0 // Sigh, this is just basically a copy of the "aqua" code and not
+ // applicable to iOS.
+
+ if( !mpFrame )
+ return;
+ UIGraphicsContext* pContext = [UIGraphicsContext currentContext];
+ if( (mxLayer != NULL) && (pContext != NULL) )
+ {
+ CGContextRef rCGContext = reinterpret_cast<CGContextRef>([pContext graphicsPort]);
+
+ CGMutablePathRef rClip = mpFrame->getClipPath();
+ if( rClip )
+ {
+ CGContextSaveGState( rCGContext );
+ CGContextBeginPath( rCGContext );
+ CGContextAddPath( rCGContext, rClip );
+ CGContextClip( rCGContext );
+ }
+
+ ApplyXorContext();
+ CGContextDrawLayerAtPoint( rCGContext, CGPointZero, mxLayer );
+ if( rClip ) // cleanup clipping
+ CGContextRestoreGState( rCGContext );
+ }
+ else
+ DBG_ASSERT( mpFrame->mbInitShow, "UpdateWindow called on uneligible graphics" );
+#endif
+}
+
+// -----------------------------------------------------------------------
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/ios/source/gdi/salnativewidgets.cxx b/vcl/ios/source/gdi/salnativewidgets.cxx
new file mode 100644
index 000000000000..23d8b8d4589e
--- /dev/null
+++ b/vcl/ios/source/gdi/salnativewidgets.cxx
@@ -0,0 +1,242 @@
+/* -*- 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 "vcl/salnativewidgets.hxx"
+#include "vcl/decoview.hxx"
+#include "vcl/svapp.hxx"
+#include "vcl/timer.hxx"
+
+#include "ios/salconst.h"
+#include "ios/salgdi.h"
+#include "ios/saldata.hxx"
+#include "ios/salframe.h"
+
+#include "premac.h"
+#include <UIKit/UIKit.h>
+#include "postmac.h"
+
+
+/*
+ * IsNativeControlSupported()
+ * --------------------------
+ * Returns sal_True if the platform supports native
+ * drawing of the control defined by nPart.
+ *
+ */
+sal_Bool IosSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
+{
+ bool bOk = sal_False;
+
+ // Native controls are now defaults
+ // If you want to disable experimental native controls code,
+ // just set the environment variable SAL_NO_NWF to something
+ // and vcl controls will be used as default again.
+
+ switch( nType )
+ {
+ case CTRL_PUSHBUTTON:
+ case CTRL_RADIOBUTTON:
+ case CTRL_CHECKBOX:
+ case CTRL_LISTNODE:
+ if( nPart == PART_ENTIRE_CONTROL )
+ return true;
+ break;
+
+ case CTRL_SCROLLBAR:
+ if( nPart == PART_DRAW_BACKGROUND_HORZ ||
+ nPart == PART_DRAW_BACKGROUND_VERT ||
+ nPart == PART_ENTIRE_CONTROL ||
+ nPart == HAS_THREE_BUTTONS )
+ return true;
+ break;
+
+ case CTRL_SLIDER:
+ if( nPart == PART_TRACK_HORZ_AREA || nPart == PART_TRACK_VERT_AREA )
+ return true;
+ break;
+
+ case CTRL_EDITBOX:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == HAS_BACKGROUND_TEXTURE )
+ return true;
+ break;
+
+ case CTRL_MULTILINE_EDITBOX:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == HAS_BACKGROUND_TEXTURE )
+ return true;
+ break;
+
+ case CTRL_SPINBOX:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == PART_ALL_BUTTONS ||
+ nPart == HAS_BACKGROUND_TEXTURE )
+ return true;
+ break;
+
+ case CTRL_SPINBUTTONS:
+ return false;
+ break;
+
+ case CTRL_COMBOBOX:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == HAS_BACKGROUND_TEXTURE )
+ return true;
+ break;
+
+ case CTRL_LISTBOX:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == PART_WINDOW ||
+ nPart == HAS_BACKGROUND_TEXTURE ||
+ nPart == PART_SUB_EDIT
+ )
+ return true;
+ break;
+
+ case CTRL_TAB_ITEM:
+ case CTRL_TAB_PANE:
+ case CTRL_TAB_BODY: // see vcl/source/window/tabpage.cxx
+ case CTRL_FIXEDBORDER:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == PART_TABS_DRAW_RTL ||
+ nPart == HAS_BACKGROUND_TEXTURE )
+ return true;
+ break;
+
+ // when PART_BUTTON is used, toolbar icons are not highlighted when mouse rolls over.
+ // More Ios compliant
+ case CTRL_TOOLBAR:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == PART_DRAW_BACKGROUND_HORZ ||
+ nPart == PART_DRAW_BACKGROUND_VERT)
+ return true;
+ break;
+
+ case CTRL_WINDOW_BACKGROUND:
+ if ( nPart == PART_BACKGROUND_WINDOW ||
+ nPart == PART_BACKGROUND_DIALOG )
+ return true;
+ break;
+
+ case CTRL_MENUBAR:
+ if( nPart == PART_ENTIRE_CONTROL )
+ return true;
+ break;
+
+ case CTRL_TOOLTIP: // ** TO DO
+ break;
+
+ case CTRL_MENU_POPUP:
+ if( nPart == PART_ENTIRE_CONTROL ||
+ nPart == PART_MENU_ITEM ||
+ nPart == PART_MENU_ITEM_CHECK_MARK ||
+ nPart == PART_MENU_ITEM_RADIO_MARK)
+ return true;
+ break;
+ case CTRL_PROGRESS:
+ case CTRL_INTROPROGRESS:
+ if( nPart == PART_ENTIRE_CONTROL )
+ return true;
+ break;
+ case CTRL_FRAME:
+ if( nPart == PART_BORDER )
+ return true;
+ break;
+ case CTRL_LISTNET:
+ if( nPart == PART_ENTIRE_CONTROL )
+ return true;
+ break;
+ }
+
+ return bOk;
+}
+
+/*
+ * HitTestNativeControl()
+ *
+ * If the return value is sal_True, bIsInside contains information whether
+ * aPos was or was not inside the native widget specified by the
+ * nType/nPart combination.
+ */
+sal_Bool IosSalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
+ const Point& rPos, sal_Bool& rIsInside )
+{
+ return sal_False;
+}
+
+UInt32 IosSalGraphics::getState( ControlState nState )
+{
+ return 0;
+}
+
+UInt32 IosSalGraphics::getTrackState( ControlState nState )
+{
+ return 0;
+}
+
+/*
+ * DrawNativeControl()
+ *
+ * Draws the requested control described by nPart/nState.
+ *
+ * rControlRegion: The bounding region of the complete control in VCL frame coordinates.
+ * aValue: An optional value (tristate/numerical/string)
+ * aCaption: A caption or title string (like button text etc)
+ */
+sal_Bool IosSalGraphics::drawNativeControl(ControlType nType,
+ ControlPart nPart,
+ const Rectangle& rControlRegion,
+ ControlState nState,
+ const ImplControlValue& aValue,
+ const rtl::OUString& )
+{
+ return sal_False;
+}
+
+/*
+ * GetNativeControlRegion()
+ *
+ * If the return value is sal_True, rNativeBoundingRegion
+ * contains the true bounding region covered by the control
+ * including any adornment, while rNativeContentRegion contains the area
+ * within the control that can be safely drawn into without drawing over
+ * the borders of the control.
+ *
+ * rControlRegion: The bounding region of the control in VCL frame coordinates.
+ * aValue: An optional value (tristate/numerical/string)
+ * aCaption: A caption or title string (like button text etc)
+ */
+sal_Bool IosSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion, ControlState /*nState*/,
+ const ImplControlValue& aValue, const rtl::OUString&,
+ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
+
+{
+ return sal_False;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/ios/source/window/salframeview.mm b/vcl/ios/source/window/salframeview.mm
new file mode 100644
index 000000000000..68c34a9fbd8e
--- /dev/null
+++ b/vcl/ios/source/window/salframeview.mm
@@ -0,0 +1,268 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*n***********************************************************************
+ *
+ * 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 <sal/alloca.h>
+#include <sal/macros.h>
+
+#include "vcl/window.hxx"
+#include "vcl/svapp.hxx"
+
+#include "ios/salinst.h"
+#include "ios/salgdi.h"
+#include "ios/salframe.h"
+#include "ios/salframeview.h"
+
+#define WHEEL_EVENT_FACTOR 1.5
+
+@implementation SalFrameWindow
+-(id)initWithSalFrame: (IosSalFrame*)pFrame
+{
+ mpFrame = pFrame;
+ CGRect aRect = { { pFrame->maGeometry.nX, pFrame->maGeometry.nY },
+ { pFrame->maGeometry.nWidth, pFrame->maGeometry.nHeight } };
+#if 0
+ NSWindow* pNSWindow = [super initWithContentRect: aRect styleMask: mpFrame->getStyleMask() backing: NSBackingStoreBuffered defer: NO ];
+ [pNSWindow useOptimizedDrawing: YES]; // OSX recommendation when there are no overlapping subviews within the receiver
+ return pNSWindow;
+#endif
+ return nil;
+}
+
+-(IosSalFrame*)getSalFrame
+{
+ return mpFrame;
+}
+
+-(void)displayIfNeeded
+{
+ if( GetSalData() && GetSalData()->mpFirstInstance )
+ {
+ osl::SolarMutex* pMutex = GetSalData()->mpFirstInstance->GetYieldMutex();
+ if( pMutex )
+ {
+ pMutex->acquire();
+ [super displayIfNeeded];
+ pMutex->release();
+ }
+ }
+}
+
+-(BOOL)canBecomeKeyWindow
+{
+ if( (mpFrame->mnStyle &
+ ( SAL_FRAME_STYLE_FLOAT |
+ SAL_FRAME_STYLE_TOOLTIP |
+ SAL_FRAME_STYLE_INTRO
+ )) == 0 )
+ return YES;
+ if( (mpFrame->mnStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) != 0 )
+ return YES;
+ if( (mpFrame->mnStyle & SAL_FRAME_STYLE_FLOAT_FOCUSABLE) )
+ return YES;
+ return [super canBecomeKeyWindow];
+}
+
+-(void)windowDidBecomeKey: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ static const sal_uLong nGuessDocument = SAL_FRAME_STYLE_MOVEABLE|
+ SAL_FRAME_STYLE_SIZEABLE|
+ SAL_FRAME_STYLE_CLOSEABLE;
+
+ mpFrame->CallCallback( SALEVENT_GETFOCUS, 0 );
+ mpFrame->SendPaintEvent(); // repaint controls as active
+ }
+}
+
+-(void)windowDidResignKey: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ mpFrame->CallCallback(SALEVENT_LOSEFOCUS, 0);
+ mpFrame->SendPaintEvent(); // repaint controls as inactive
+ }
+}
+
+-(void)windowDidChangeScreen: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ mpFrame->screenParametersChanged();
+}
+
+-(void)windowDidMove: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ mpFrame->UpdateFrameGeometry();
+ mpFrame->CallCallback( SALEVENT_MOVE, 0 );
+ }
+}
+
+-(void)windowDidResize: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ mpFrame->UpdateFrameGeometry();
+ mpFrame->CallCallback( SALEVENT_RESIZE, 0 );
+ mpFrame->SendPaintEvent();
+ }
+}
+
+-(void)windowDidMiniaturize: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ mpFrame->mbShown = false;
+ mpFrame->UpdateFrameGeometry();
+ mpFrame->CallCallback( SALEVENT_RESIZE, 0 );
+ }
+}
+
+-(void)windowDidDeminiaturize: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ mpFrame->mbShown = true;
+ mpFrame->UpdateFrameGeometry();
+ mpFrame->CallCallback( SALEVENT_RESIZE, 0 );
+ }
+}
+
+-(BOOL)windowShouldClose: (NSNotification*)pNotification
+{
+ (void)pNotification;
+ YIELD_GUARD;
+
+ BOOL bRet = YES;
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ // #i84461# end possible input
+ mpFrame->CallCallback( SALEVENT_ENDEXTTEXTINPUT, 0 );
+ if( IosSalFrame::isAlive( mpFrame ) )
+ {
+ mpFrame->CallCallback( SALEVENT_CLOSE, 0 );
+ bRet = NO; // application will close the window or not, AppKit shouldn't
+ }
+ }
+
+ return bRet;
+}
+
+@end
+
+@implementation SalFrameView
+
+-(id)initWithSalFrame: (IosSalFrame*)pFrame
+{
+ // ???
+
+ mfLastMagnifyTime = 0.0;
+ return self;
+}
+
+-(IosSalFrame*)getSalFrame
+{
+ return mpFrame;
+}
+
+-(BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+-(BOOL)isOpaque
+{
+ return mpFrame ? (mpFrame->getClipPath() != 0 ? NO : YES) : YES;
+}
+
+// helper class similar to a osl::SolarGuard for the SalYieldMutex
+// the difference is that it only does tryToAcquire instead of aquire
+// so dreaded deadlocks like #i93512# are prevented
+class TryGuard
+{
+public:
+ TryGuard() { mbGuarded = ImplSalYieldMutexTryToAcquire(); }
+ ~TryGuard() { if( mbGuarded ) ImplSalYieldMutexRelease(); }
+ bool IsGuarded() { return mbGuarded; }
+private:
+ bool mbGuarded;
+};
+
+-(void)drawRect: (CGRect)aRect
+{
+ // HOTFIX: #i93512# prevent deadlocks if any other thread already has the SalYieldMutex
+ TryGuard aTryGuard;
+ if( !aTryGuard.IsGuarded() )
+ {
+ // NOTE: the mpFrame access below is not guarded yet!
+ // TODO: mpFrame et al need to be guarded by an independent mutex
+ IosSalGraphics* pGraphics = (mpFrame && IosSalFrame::isAlive(mpFrame)) ? mpFrame->mpGraphics : NULL;
+ if( pGraphics )
+ {
+ pGraphics->RefreshRect( aRect );
+ }
+ return;
+ }
+
+ if( mpFrame && IosSalFrame::isAlive( mpFrame ) )
+ {
+ if( mpFrame->mpGraphics )
+ {
+ mpFrame->mpGraphics->UpdateWindow( aRect );
+ if( mpFrame->getClipPath() )
+ [mpFrame->getWindow() invalidateShadow];
+ }
+ }
+}
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */