{-# LANGUAGE CPP #-}
module DrawingUtils where
import Xtypes
import Drawing
import Graphic
import FixedDrawing
import FlexibleDrawing(blank')
import GCAttrs
import GCtx
import Placers
import MatrixP(matrixP,matrixP')
import Spacers
import Placers2
import TableP(tableP,tableP')
import Geometry
import DrawTypes(DrawCommand(..))
import Alignment(aLeft,aCenter,aTop)
import LayoutDir(LayoutDir(..))
--import EitherUtils(Cont(..))
--import Fudget(K)

#include "exists.h"

boxVisibleD :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
boxVisibleD = Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD
boxD :: [Drawing lbl leaf] -> Drawing lbl leaf
boxD [Drawing lbl leaf]
ds = Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD ([Drawing lbl leaf] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Drawing lbl leaf]
ds) [Drawing lbl leaf]
ds
stackD :: [Drawing lbl leaf] -> Drawing lbl leaf
stackD = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
overlayP (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
vertD :: Drawing lbl leaf -> Drawing lbl leaf
vertD = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
verticalP
vertD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
vertD' = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Placer -> Drawing lbl leaf -> Drawing lbl leaf)
-> (Int -> Placer) -> Int -> Drawing lbl leaf -> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
verticalP'
horizD :: Drawing lbl leaf -> Drawing lbl leaf
horizD = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
horizontalP
horizD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
horizD' = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Placer -> Drawing lbl leaf -> Drawing lbl leaf)
-> (Int -> Placer) -> Int -> Drawing lbl leaf -> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
horizontalP'
vboxD :: [Drawing lbl leaf] -> Drawing lbl leaf
vboxD = Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Drawing lbl leaf -> Drawing lbl leaf
vertD (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
hboxD :: [Drawing lbl leaf] -> Drawing lbl leaf
hboxD = Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Drawing lbl leaf -> Drawing lbl leaf
horizD (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
vboxD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
vboxD' Int
sep = Int -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Int -> Drawing lbl leaf -> Drawing lbl leaf
vertD' Int
sep (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
hboxD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
hboxD' Int
sep = Int -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Int -> Drawing lbl leaf -> Drawing lbl leaf
horizD' Int
sep (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

vertlD :: Drawing lbl leaf -> Drawing lbl leaf
vertlD = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
verticalLeftP
vertlD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
vertlD' = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Placer -> Drawing lbl leaf -> Drawing lbl leaf)
-> (Int -> Placer) -> Int -> Drawing lbl leaf -> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
verticalLeftP'
vboxlD :: [Drawing lbl leaf] -> Drawing lbl leaf
vboxlD = Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Drawing lbl leaf -> Drawing lbl leaf
vertlD (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
vboxlD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
vboxlD' Int
sep = Int -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Int -> Drawing lbl leaf -> Drawing lbl leaf
vertlD' Int
sep (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
horizcD :: Drawing lbl leaf -> Drawing lbl leaf
horizcD = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
horizontalCenterP
horizcD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
horizcD' = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Placer -> Drawing lbl leaf -> Drawing lbl leaf)
-> (Int -> Placer) -> Int -> Drawing lbl leaf -> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
horizontalCenterP'
hboxcD :: [Drawing lbl leaf] -> Drawing lbl leaf
hboxcD = Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Drawing lbl leaf -> Drawing lbl leaf
horizcD (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
hboxcD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
hboxcD' Int
sep = Int -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Int -> Drawing lbl leaf -> Drawing lbl leaf
horizcD' Int
sep (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

tableD :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
tableD Int
n = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> Placer
tableP Int
n) (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
tableD' :: Int -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
tableD' Int
sep Int
n = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> LayoutDir -> Int -> Placer
tableP' Int
n LayoutDir
Horizontal Int
sep) (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

matrixD :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
matrixD Int
n = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> Placer
matrixP Int
n) (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
matrixD' :: Int -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
matrixD' Int
sep Int
n = Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> LayoutDir -> Int -> Placer
matrixP' Int
n LayoutDir
Horizontal Int
sep) (Drawing lbl leaf -> Drawing lbl leaf)
-> ([Drawing lbl leaf] -> Drawing lbl leaf)
-> [Drawing lbl leaf]
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

westD :: Drawing lbl leaf -> Drawing lbl leaf
westD = Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD (Spacer -> Drawing lbl leaf -> Drawing lbl leaf)
-> Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall a b. (a -> b) -> a -> b
$ Alignment -> Alignment -> Spacer
hvAlignS Alignment
aLeft Alignment
aCenter
northwestD :: Drawing lbl leaf -> Drawing lbl leaf
northwestD = Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD (Spacer -> Drawing lbl leaf -> Drawing lbl leaf)
-> Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall a b. (a -> b) -> a -> b
$ Alignment -> Alignment -> Spacer
hvAlignS Alignment
aLeft Alignment
aTop

padD :: Int -> Drawing lbl leaf -> Drawing lbl leaf
padD = Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD(Spacer -> Drawing lbl leaf -> Drawing lbl leaf)
-> (Int -> Spacer) -> Int -> Drawing lbl leaf -> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Int -> Spacer
marginS

fontD :: a -> Drawing lbl leaf -> Drawing lbl leaf
fontD a
fn = [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [FontSpec -> GCAttributes ColorSpec FontSpec
forall a b. b -> GCAttributes a b
GCFont (a -> FontSpec
forall a. (Show a, FontGen a) => a -> FontSpec
fontSpec a
fn)]

--fgnD :: ColorName -> Drawing lbl leaf -> Drawing lbl leaf
--fgnD = fgD.Name

--fontnD :: FontName -> Drawing lbl leaf -> Drawing lbl leaf
--fontnD = fontD.Name

fgD :: a -> Drawing lbl leaf -> Drawing lbl leaf
fgD a
color = [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [ColorSpec -> GCAttributes ColorSpec FontSpec
forall a b. a -> GCAttributes a b
GCForeground (a -> ColorSpec
forall a. (Show a, ColorGen a) => a -> ColorSpec
colorSpec a
color)]
bgD :: a -> Drawing lbl leaf -> Drawing lbl leaf
bgD a
color = [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [ColorSpec -> GCAttributes ColorSpec FontSpec
forall a b. a -> GCAttributes a b
GCBackground (a -> ColorSpec
forall a. (Show a, ColorGen a) => a -> ColorSpec
colorSpec a
color)]
fatD :: Drawing lbl leaf -> Drawing lbl leaf
fatD = [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [Int -> GCAttributes ColorSpec FontSpec
forall a b. Int -> GCAttributes a b
GCLineWidth Int
5,GCCapStyle -> GCAttributes ColorSpec FontSpec
forall a b. GCCapStyle -> GCAttributes a b
GCCapStyle GCCapStyle
CapRound]
--attribD = belowAnnotD.AttribD --hmm
attribD :: GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
attribD = GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
AttribD 
softAttribD :: [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD = GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
attribD(GCSpec -> Drawing lbl leaf -> Drawing lbl leaf)
-> ([GCAttributes ColorSpec FontSpec] -> GCSpec)
-> [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf
-> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[GCAttributes ColorSpec FontSpec] -> GCSpec
SoftGC
hardAttribD :: GCtx -> Drawing lbl leaf -> Drawing lbl leaf
hardAttribD = GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
attribD(GCSpec -> Drawing lbl leaf -> Drawing lbl leaf)
-> (GCtx -> GCSpec) -> GCtx -> Drawing lbl leaf -> Drawing lbl leaf
forall b c a. (b -> c) -> (a -> b) -> a -> c
.GCtx -> GCSpec
HardGC
--spacedD = belowAnnotD.SpacedD  --hmm
spacedD :: Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD = Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
SpacedD

--belowAnnotD f (LabelD a d) = LabelD a (belowAnnotD f d)
--belowAnnotD f d = f d

#ifdef USE_EXIST_Q
data Gfx = EXISTS(a) TSTHACK((Graphic EQV(a)) =>) G EQV(a)
-- deriving Show -- doesn't work because of a HBC bug

instance Show Gfx where showsPrec :: Int -> Gfx -> ShowS
showsPrec Int
n (G a
x) String
s = String
"G "String -> ShowS
forall a. [a] -> [a] -> [a]
++{-showsPrec 10 x-} String
s

instance Graphic Gfx where
  measureGraphicK :: Gfx -> GCtx -> Cont (k i o) MeasuredGraphics
measureGraphicK (G a
x) = a -> GCtx -> Cont (k i o) MeasuredGraphics
forall a (k :: * -> * -> *) i o.
(Graphic a, FudgetIO k) =>
a -> GCtx -> Cont (k i o) MeasuredGraphics
measureGraphicK a
x

g :: a -> Drawing lbl Gfx
g a
x = Gfx -> Drawing lbl Gfx
forall leaf lbl. leaf -> Drawing lbl leaf
atomicD (a -> Gfx
forall a. Graphic a => a -> Gfx
G a
x)

#else

g = atomicD

#endif

filledRectD :: Size -> Drawing lbl Gfx
filledRectD Size
size = FixedDrawing -> Drawing lbl Gfx
forall a lbl. Graphic a => a -> Drawing lbl Gfx
g (Size -> [DrawCommand] -> FixedDrawing
FixD (Size
size) [Rect -> DrawCommand
FillRectangle (Size -> Size -> Rect
Rect Size
origin Size
size)])
rectD :: Size -> Drawing lbl Gfx
rectD Size
size = FixedDrawing -> Drawing lbl Gfx
forall a lbl. Graphic a => a -> Drawing lbl Gfx
g (Size -> [DrawCommand] -> FixedDrawing
FixD (Size
sizeSize -> Size -> Size
forall a. Num a => a -> a -> a
+Size
1) [Rect -> DrawCommand
DrawRectangle (Size -> Size -> Rect
Rect Size
origin Size
size)])
                   -- size+1 assumes that the line width is 1
blankD :: Size -> Drawing lbl Gfx
blankD = FlexibleDrawing -> Drawing lbl Gfx
forall a lbl. Graphic a => a -> Drawing lbl Gfx
g (FlexibleDrawing -> Drawing lbl Gfx)
-> (Size -> FlexibleDrawing) -> Size -> Drawing lbl Gfx
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Size -> FlexibleDrawing
blank' 

holeD :: Drawing lbl Gfx
holeD =
    String -> Drawing lbl Gfx -> Drawing lbl Gfx
forall a lbl leaf.
(Show a, ColorGen a) =>
a -> Drawing lbl leaf -> Drawing lbl leaf
fgD String
"blue3" (Drawing lbl Gfx -> Drawing lbl Gfx)
-> Drawing lbl Gfx -> Drawing lbl Gfx
forall a b. (a -> b) -> a -> b
$ Size -> Drawing lbl Gfx
forall lbl. Size -> Drawing lbl Gfx
rectD Size
size
    --stack [fgD "white" (filledRectD size),rectD size]
  where
    size :: Size
size = Int -> Int -> Size
pP Int
15 Int
13