1f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5f6e50924SAndrew Rist * distributed with this work for additional information
6f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10f6e50924SAndrew Rist *
11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12f6e50924SAndrew Rist *
13f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14f6e50924SAndrew Rist * software distributed under the License is distributed on an
15f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17f6e50924SAndrew Rist * specific language governing permissions and limitations
18f6e50924SAndrew Rist * under the License.
19f6e50924SAndrew Rist *
20f6e50924SAndrew Rist *************************************************************/
21f6e50924SAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_svx.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir // include ---------------------------------------------------------------
26cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
27cdf0e10cSrcweir #include "svx/XPropertyTable.hxx"
28cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
29cdf0e10cSrcweir #include <vcl/svapp.hxx>
30cdf0e10cSrcweir #include "xmlxtexp.hxx"
31cdf0e10cSrcweir #include "xmlxtimp.hxx"
32cdf0e10cSrcweir #include <tools/urlobj.hxx>
33cdf0e10cSrcweir #include <vcl/virdev.hxx>
34cdf0e10cSrcweir #include <svx/dialogs.hrc>
35cdf0e10cSrcweir #include <svx/dialmgr.hxx>
36cdf0e10cSrcweir #include <svx/xtable.hxx>
3735726d9dSArmin Le Grand #include <drawinglayer/attribute/fillhatchattribute.hxx>
3835726d9dSArmin Le Grand #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
3935726d9dSArmin Le Grand #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
4035726d9dSArmin Le Grand #include <drawinglayer/processor2d/processor2dtools.hxx>
4135726d9dSArmin Le Grand #include <basegfx/polygon/b2dpolygontools.hxx>
42cdf0e10cSrcweir
43cdf0e10cSrcweir using namespace ::com::sun::star;
44cdf0e10cSrcweir using namespace ::rtl;
45cdf0e10cSrcweir
46cdf0e10cSrcweir sal_Unicode const pszExtHatch[] = {'s','o','h'};
47c7be74b1SArmin Le Grand //char const aChckHatch[] = { 0x04, 0x00, 'S','O','H','L'}; // < 5.2
48c7be74b1SArmin Le Grand //char const aChckHatch0[] = { 0x04, 0x00, 'S','O','H','0'}; // = 5.2
49c7be74b1SArmin Le Grand //char const aChckXML[] = { '<', '?', 'x', 'm', 'l' }; // = 6.0
50cdf0e10cSrcweir
51cdf0e10cSrcweir // -----------------
52cdf0e10cSrcweir // class XHatchList
53cdf0e10cSrcweir // -----------------
54cdf0e10cSrcweir
XHatchList(const String & rPath)55c7be74b1SArmin Le Grand XHatchList::XHatchList(const String& rPath )
5635726d9dSArmin Le Grand : XPropertyList(rPath)
57cdf0e10cSrcweir {
58cdf0e10cSrcweir }
59cdf0e10cSrcweir
~XHatchList()60cdf0e10cSrcweir XHatchList::~XHatchList()
61cdf0e10cSrcweir {
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
Replace(XHatchEntry * pEntry,long nIndex)64cdf0e10cSrcweir XHatchEntry* XHatchList::Replace(XHatchEntry* pEntry, long nIndex )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir return (XHatchEntry*) XPropertyList::Replace(pEntry, nIndex);
67cdf0e10cSrcweir }
68cdf0e10cSrcweir
Remove(long nIndex)69cdf0e10cSrcweir XHatchEntry* XHatchList::Remove(long nIndex)
70cdf0e10cSrcweir {
71c7be74b1SArmin Le Grand return (XHatchEntry*) XPropertyList::Remove(nIndex);
72cdf0e10cSrcweir }
73cdf0e10cSrcweir
GetHatch(long nIndex) const74cdf0e10cSrcweir XHatchEntry* XHatchList::GetHatch(long nIndex) const
75cdf0e10cSrcweir {
76c7be74b1SArmin Le Grand return (XHatchEntry*) XPropertyList::Get(nIndex);
77cdf0e10cSrcweir }
78cdf0e10cSrcweir
Load()793e407bd8SArmin Le Grand bool XHatchList::Load()
80cdf0e10cSrcweir {
8197e8a929SArmin Le Grand if( mbListDirty )
82cdf0e10cSrcweir {
8397e8a929SArmin Le Grand mbListDirty = false;
84cdf0e10cSrcweir
8597e8a929SArmin Le Grand INetURLObject aURL( maPath );
86cdf0e10cSrcweir
87cdf0e10cSrcweir if( INET_PROT_NOT_VALID == aURL.GetProtocol() )
88cdf0e10cSrcweir {
8935726d9dSArmin Le Grand OSL_ENSURE( !maPath.Len(), "invalid URL" );
903e407bd8SArmin Le Grand return false;
91cdf0e10cSrcweir }
92cdf0e10cSrcweir
9397e8a929SArmin Le Grand aURL.Append( maName );
94cdf0e10cSrcweir
95cdf0e10cSrcweir if( !aURL.getExtension().getLength() )
96cdf0e10cSrcweir aURL.setExtension( rtl::OUString( pszExtHatch, 3 ) );
97cdf0e10cSrcweir
98cdf0e10cSrcweir uno::Reference< container::XNameContainer > xTable( SvxUnoXHatchTable_createInstance( this ), uno::UNO_QUERY );
99cdf0e10cSrcweir return SvxXMLXTableImport::load( aURL.GetMainURL( INetURLObject::NO_DECODE ), xTable );
100cdf0e10cSrcweir }
1013e407bd8SArmin Le Grand
1023e407bd8SArmin Le Grand return false;
103cdf0e10cSrcweir }
104cdf0e10cSrcweir
Save()1053e407bd8SArmin Le Grand bool XHatchList::Save()
106cdf0e10cSrcweir {
10797e8a929SArmin Le Grand INetURLObject aURL( maPath );
108cdf0e10cSrcweir
109cdf0e10cSrcweir if( INET_PROT_NOT_VALID == aURL.GetProtocol() )
110cdf0e10cSrcweir {
11135726d9dSArmin Le Grand OSL_ENSURE( !maPath.Len(), "invalid URL" );
1123e407bd8SArmin Le Grand return false;
113cdf0e10cSrcweir }
114cdf0e10cSrcweir
11597e8a929SArmin Le Grand aURL.Append( maName );
116cdf0e10cSrcweir
117cdf0e10cSrcweir if( !aURL.getExtension().getLength() )
118cdf0e10cSrcweir aURL.setExtension( rtl::OUString( pszExtHatch, 3 ) );
119cdf0e10cSrcweir
120cdf0e10cSrcweir uno::Reference< container::XNameContainer > xTable( SvxUnoXHatchTable_createInstance( this ), uno::UNO_QUERY );
121cdf0e10cSrcweir return SvxXMLXTableExportComponent::save( aURL.GetMainURL( INetURLObject::NO_DECODE ), xTable );
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
Create()1243e407bd8SArmin Le Grand bool XHatchList::Create()
125cdf0e10cSrcweir {
126cdf0e10cSrcweir XubString aStr( SVX_RES( RID_SVXSTR_HATCH ) );
127cdf0e10cSrcweir xub_StrLen nLen;
128cdf0e10cSrcweir
129cdf0e10cSrcweir aStr.AppendAscii(" 1");
130cdf0e10cSrcweir nLen = aStr.Len() - 1;
131cdf0e10cSrcweir Insert(new XHatchEntry(XHatch(RGB_Color(COL_BLACK),XHATCH_SINGLE,100, 0),aStr));
132cdf0e10cSrcweir aStr.SetChar(nLen, sal_Unicode('2'));
133cdf0e10cSrcweir Insert(new XHatchEntry(XHatch(RGB_Color(COL_RED ),XHATCH_DOUBLE, 80,450),aStr));
134cdf0e10cSrcweir aStr.SetChar(nLen, sal_Unicode('3'));
135cdf0e10cSrcweir Insert(new XHatchEntry(XHatch(RGB_Color(COL_BLUE ),XHATCH_TRIPLE,120, 0),aStr));
136cdf0e10cSrcweir
1373e407bd8SArmin Le Grand return true;
138cdf0e10cSrcweir }
139cdf0e10cSrcweir
CreateBitmapForUI(long nIndex)14097e8a929SArmin Le Grand Bitmap XHatchList::CreateBitmapForUI( long nIndex )
141cdf0e10cSrcweir {
142c7be74b1SArmin Le Grand Bitmap aRetval;
14335726d9dSArmin Le Grand OSL_ENSURE(nIndex < Count(), "OOps, access out of range (!)");
144cdf0e10cSrcweir
14535726d9dSArmin Le Grand if(nIndex < Count())
146c7be74b1SArmin Le Grand {
147c7be74b1SArmin Le Grand const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
14835726d9dSArmin Le Grand const Size& rSize = rStyleSettings.GetListBoxPreviewDefaultPixelSize();
149c7be74b1SArmin Le Grand
15035726d9dSArmin Le Grand // prepare polygon geometry for rectangle
15135726d9dSArmin Le Grand const basegfx::B2DPolygon aRectangle(
15235726d9dSArmin Le Grand basegfx::tools::createPolygonFromRect(
15335726d9dSArmin Le Grand basegfx::B2DRange(0.0, 0.0, rSize.Width(), rSize.Height())));
154cdf0e10cSrcweir
15535726d9dSArmin Le Grand const XHatch& rHatch = GetHatch(nIndex)->GetHatch();
15635726d9dSArmin Le Grand drawinglayer::attribute::HatchStyle aHatchStyle(drawinglayer::attribute::HATCHSTYLE_TRIPLE);
157cdf0e10cSrcweir
15835726d9dSArmin Le Grand switch(rHatch.GetHatchStyle())
159c7be74b1SArmin Le Grand {
16035726d9dSArmin Le Grand case XHATCH_SINGLE :
16135726d9dSArmin Le Grand {
16235726d9dSArmin Le Grand aHatchStyle = drawinglayer::attribute::HATCHSTYLE_SINGLE;
16335726d9dSArmin Le Grand break;
16435726d9dSArmin Le Grand }
16535726d9dSArmin Le Grand case XHATCH_DOUBLE :
16635726d9dSArmin Le Grand {
16735726d9dSArmin Le Grand aHatchStyle = drawinglayer::attribute::HATCHSTYLE_DOUBLE;
16835726d9dSArmin Le Grand break;
16935726d9dSArmin Le Grand }
17035726d9dSArmin Le Grand default :
17135726d9dSArmin Le Grand {
17235726d9dSArmin Le Grand aHatchStyle = drawinglayer::attribute::HATCHSTYLE_TRIPLE; // XHATCH_TRIPLE
17335726d9dSArmin Le Grand break;
17435726d9dSArmin Le Grand }
175c7be74b1SArmin Le Grand }
176c7be74b1SArmin Le Grand
17735726d9dSArmin Le Grand const basegfx::B2DHomMatrix aScaleMatrix(OutputDevice::LogicToLogic(MAP_100TH_MM, MAP_PIXEL));
17835726d9dSArmin Le Grand const basegfx::B2DVector aScaleVector(aScaleMatrix * basegfx::B2DVector(1.0, 0.0));
17935726d9dSArmin Le Grand const double fScaleValue(aScaleVector.getLength());
18035726d9dSArmin Le Grand
18135726d9dSArmin Le Grand const drawinglayer::attribute::FillHatchAttribute aFillHatch(
18235726d9dSArmin Le Grand aHatchStyle,
18335726d9dSArmin Le Grand (double)rHatch.GetDistance() * fScaleValue,
18435726d9dSArmin Le Grand (double)rHatch.GetAngle() * F_PI1800,
18535726d9dSArmin Le Grand rHatch.GetColor().getBColor(),
18635726d9dSArmin Le Grand 3, // same default as VCL, a minimum of three discrete units (pixels) offset
18735726d9dSArmin Le Grand false);
18835726d9dSArmin Le Grand
18935726d9dSArmin Le Grand const basegfx::BColor aBlack(0.0, 0.0, 0.0);
19035726d9dSArmin Le Grand const drawinglayer::primitive2d::Primitive2DReference aHatchPrimitive(
19135726d9dSArmin Le Grand new drawinglayer::primitive2d::PolyPolygonHatchPrimitive2D(
19235726d9dSArmin Le Grand basegfx::B2DPolyPolygon(aRectangle),
19335726d9dSArmin Le Grand aBlack,
19435726d9dSArmin Le Grand aFillHatch));
19535726d9dSArmin Le Grand
19635726d9dSArmin Le Grand const drawinglayer::primitive2d::Primitive2DReference aBlackRectanglePrimitive(
19735726d9dSArmin Le Grand new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(
19835726d9dSArmin Le Grand aRectangle,
19935726d9dSArmin Le Grand aBlack));
20035726d9dSArmin Le Grand
20135726d9dSArmin Le Grand // prepare VirtualDevice
20235726d9dSArmin Le Grand VirtualDevice aVirtualDevice;
20335726d9dSArmin Le Grand const drawinglayer::geometry::ViewInformation2D aNewViewInformation2D;
20435726d9dSArmin Le Grand
20535726d9dSArmin Le Grand aVirtualDevice.SetOutputSizePixel(rSize);
20635726d9dSArmin Le Grand aVirtualDevice.SetDrawMode(rStyleSettings.GetHighContrastMode()
20735726d9dSArmin Le Grand ? DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT
20835726d9dSArmin Le Grand : DRAWMODE_DEFAULT);
20935726d9dSArmin Le Grand
210*33b19716SArmin Le Grand if(rStyleSettings.GetPreviewUsesCheckeredBackground())
211c7be74b1SArmin Le Grand {
21235726d9dSArmin Le Grand const Point aNull(0, 0);
21335726d9dSArmin Le Grand static const sal_uInt32 nLen(8);
21435726d9dSArmin Le Grand static const Color aW(COL_WHITE);
21535726d9dSArmin Le Grand static const Color aG(0xef, 0xef, 0xef);
216c7be74b1SArmin Le Grand
21735726d9dSArmin Le Grand aVirtualDevice.DrawCheckered(aNull, rSize, nLen, aW, aG);
21835726d9dSArmin Le Grand }
21935726d9dSArmin Le Grand else
22035726d9dSArmin Le Grand {
22135726d9dSArmin Le Grand aVirtualDevice.SetBackground(rStyleSettings.GetFieldColor());
22235726d9dSArmin Le Grand aVirtualDevice.Erase();
22335726d9dSArmin Le Grand }
224c7be74b1SArmin Le Grand
22535726d9dSArmin Le Grand // create processor and draw primitives
22635726d9dSArmin Le Grand drawinglayer::processor2d::BaseProcessor2D* pProcessor2D = drawinglayer::processor2d::createPixelProcessor2DFromOutputDevice(
22735726d9dSArmin Le Grand aVirtualDevice,
22835726d9dSArmin Le Grand aNewViewInformation2D);
229c7be74b1SArmin Le Grand
23035726d9dSArmin Le Grand if(pProcessor2D)
23135726d9dSArmin Le Grand {
23235726d9dSArmin Le Grand drawinglayer::primitive2d::Primitive2DSequence aSequence(2);
233c7be74b1SArmin Le Grand
23435726d9dSArmin Le Grand aSequence[0] = aHatchPrimitive;
23535726d9dSArmin Le Grand aSequence[1] = aBlackRectanglePrimitive;
236c7be74b1SArmin Le Grand
23735726d9dSArmin Le Grand pProcessor2D->process(aSequence);
23835726d9dSArmin Le Grand delete pProcessor2D;
23935726d9dSArmin Le Grand }
240c7be74b1SArmin Le Grand
24135726d9dSArmin Le Grand // get result bitmap and scale
24235726d9dSArmin Le Grand aRetval = aVirtualDevice.GetBitmap(Point(0, 0), aVirtualDevice.GetOutputSizePixel());
243c7be74b1SArmin Le Grand }
244cdf0e10cSrcweir
245c7be74b1SArmin Le Grand return aRetval;
246cdf0e10cSrcweir }
247cdf0e10cSrcweir
248cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
249cdf0e10cSrcweir // eof
250