From a5f81d8c07022c086723a587488750ef055439e3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Karsten=20Ball=C3=BCder?= Date: Mon, 29 Jun 1998 12:44:36 +0000 Subject: [PATCH] Added my wxWindows based layout engine to the repository. It arranges text and graphics for display on a wxDC. This code is licensed under the LGPL. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@157 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- user/wxLayout/Makefile.in | 26 ++ user/wxLayout/Micon.xpm | 309 ++++++++++++++ user/wxLayout/README | 50 +++ user/wxLayout/kbList.cpp | 320 +++++++++++++++ user/wxLayout/kbList.h | 290 +++++++++++++ user/wxLayout/wxLayout.cpp | 273 +++++++++++++ user/wxLayout/wxLayout.h | 57 +++ user/wxLayout/wxllist.cpp | 789 ++++++++++++++++++++++++++++++++++++ user/wxLayout/wxllist.h | 246 +++++++++++ user/wxLayout/wxlparser.cpp | 186 +++++++++ user/wxLayout/wxlparser.h | 57 +++ user/wxLayout/wxlwindow.cpp | 149 +++++++ user/wxLayout/wxlwindow.h | 48 +++ 13 files changed, 2800 insertions(+) create mode 100644 user/wxLayout/Makefile.in create mode 100644 user/wxLayout/Micon.xpm create mode 100644 user/wxLayout/README create mode 100644 user/wxLayout/kbList.cpp create mode 100644 user/wxLayout/kbList.h create mode 100644 user/wxLayout/wxLayout.cpp create mode 100644 user/wxLayout/wxLayout.h create mode 100644 user/wxLayout/wxllist.cpp create mode 100644 user/wxLayout/wxllist.h create mode 100644 user/wxLayout/wxlparser.cpp create mode 100644 user/wxLayout/wxlparser.h create mode 100644 user/wxLayout/wxlwindow.cpp create mode 100644 user/wxLayout/wxlwindow.h diff --git a/user/wxLayout/Makefile.in b/user/wxLayout/Makefile.in new file mode 100644 index 0000000000..dbf3623736 --- /dev/null +++ b/user/wxLayout/Makefile.in @@ -0,0 +1,26 @@ +# WXXT base directory +WXBASEDIR=@WXBASEDIR@ + +# set the OS type for compilation +OS=@OS@ +# compile a library only +RULE=bin + +# define library name +BIN_TARGET=wxLayout +# define library sources +BIN_SRC=\ +wxLayout.cpp kbList.cpp wxlist.cpp wxlwindow.cpp wxlparser.cpp + +#define library objects +BIN_OBJ=\ +wxLayout.o kbList.o wxllist.o wxlwindow.o wxlparser.o + +# additional things needed to link +BIN_LINK= + +# additional things needed to compile +ADD_COMPILE= + +# include the definitions now +include ../../../template.mak diff --git a/user/wxLayout/Micon.xpm b/user/wxLayout/Micon.xpm new file mode 100644 index 0000000000..153d3a4a7b --- /dev/null +++ b/user/wxLayout/Micon.xpm @@ -0,0 +1,309 @@ +/* XPM */ +static char *Micon_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 64 48 254 2", +/* colors */ +".. c #040207", +".# c #6482b4", +".a c #2a4471", +".b c #9cc2d4", +".c c #4c627f", +".d c #94918e", +".e c #0c243e", +".f c #4c4a4a", +".g c #3c63a8", +".h c #7ca2ac", +".i c #24447e", +".j c #2c2c2c", +".k c #5482cc", +".l c #d4d0d0", +".m c #99aab7", +".n c #5c74b1", +".o c #2c5287", +".p c #1a2a4d", +".q c #acdefc", +".r c #646362", +".s c #7491d0", +".t c #bcc4bf", +".u c #5273aa", +".v c #b4b1aa", +".w c #3d5583", +".x c #828482", +".y c #8c9490", +".z c #6f7369", +".A c #1c365c", +".B c #041220", +".C c #2c325c", +".D c #94b6e4", +".E c #3e4242", +".F c #648edc", +".G c #d4f2fc", +".H c #cbd3d1", +".I c #3c54a1", +".J c #243244", +".K c #4c69aa", +".L c #7c8ba2", +".M c #4c5d84", +".N c #34497f", +".O c #1c2228", +".P c #6484c5", +".Q c #6a7788", +".R c #9ba09b", +".S c #2c3634", +".T c #acb6b4", +".U c #141517", +".V c #a0c4e8", +".W c #515753", +".X c #5c76cc", +".Y c #1b2f51", +".Z c #4472c4", +".0 c #7c8a88", +".1 c #5a6262", +".2 c #a4aba6", +".3 c #bcc8d5", +".4 c #7494df", +".5 c #84b2d4", +".6 c #6784d9", +".7 c #acd3e4", +".8 c #304b72", +".9 c #2c4c81", +"#. c #3c5b93", +"## c #5468bc", +"#a c #b5bbb0", +"#b c #1c3765", +"#c c #444e44", +"#d c #ecece8", +"#e c #7ca3dc", +"#f c #d4deda", +"#g c #345495", +"#h c #1c2641", +"#i c #94a6cc", +"#j c #243252", +"#k c #a7acb5", +"#l c #5c7ab3", +"#m c #0a152d", +"#n c #c4def0", +"#o c #686e84", +"#p c #a4a19e", +"#q c #3e3c3a", +"#r c #84aaee", +"#s c #040a09", +"#t c #3c6294", +"#u c #7c929c", +"#v c #3c5c9d", +"#w c #4e6ead", +"#x c #344458", +"#y c #446bae", +"#z c #696b6a", +"#A c #547cbc", +"#B c #789ae3", +"#C c #112a44", +"#D c #4f504b", +"#E c #2c3140", +"#F c #8c8688", +"#G c #5e5c5c", +"#H c #8c8c80", +"#I c #cccccc", +"#J c #4c6398", +"#K c #c7cbc4", +"#L c #5174b8", +"#M c #3d558e", +"#N c #2c3c5f", +"#O c #acbad4", +"#P c #3f495a", +"#Q c #354e82", +"#R c #6a8ac7", +"#S c #767c84", +"#T c #30374b", +"#U c #b1c9e7", +"#V c #1b315d", +"#W c #537bcb", +"#X c #c4bec0", +"#Y c #243e6a", +"#Z c #969892", +"#0 c #7e858e", +"#1 c #94b3f1", +"#2 c #c2d4e8", +"#3 c #141e35", +"#4 c #acb2ac", +"#5 c #c4ced0", +"#6 c #2b4d8e", +"#7 c #445ca2", +"#8 c #2c3e6f", +"#9 c #14243e", +"a. c #f1fdfa", +"a# c #8c9abc", +"aa c #d7f9f9", +"ab c #5a697e", +"ac c #c7ebf7", +"ad c #bceefc", +"ae c #b4c2b4", +"af c #889cf0", +"ag c #d8d6c8", +"ah c #748598", +"ai c #b4d2fc", +"aj c #4c5eb0", +"ak c #3f4f64", +"al c #8492bc", +"am c #161d1e", +"an c #5d7dcf", +"ao c #5c86d6", +"ap c #9cacc8", +"aq c #6c92e6", +"ar c #e4ecec", +"as c #89b7ef", +"at c #a6d0f8", +"au c #e4e2e0", +"av c #8c98a4", +"aw c #ccdaec", +"ax c #94bee4", +"ay c #232b2b", +"az c #1c2b43", +"aA c #0c1c33", +"aB c #99bcf7", +"aC c #6c72bc", +"aD c #7c766c", +"aE c #a4a2b4", +"aF c #6c7eac", +"aG c #e4d6dc", +"aH c #e4fefc", +"aI c #84aeb4", +"aJ c #b4b6bf", +"aK c #345b9b", +"aL c #bce2ef", +"aM c #ccc6bc", +"aN c #82a3ef", +"aO c #7c7b77", +"aP c #040c1e", +"aQ c #6c7e94", +"aR c #9ca69c", +"aS c #acbebc", +"aT c #a2cafa", +"aU c #545e5f", +"aV c #5c6a74", +"aW c #cae6ee", +"aX c #5c6e7c", +"aY c #5474c6", +"aZ c #fcfaf4", +"a0 c #344672", +"a1 c #446ec4", +"a2 c #b4c4d4", +"a3 c #313231", +"a4 c #9cb2b4", +"a5 c #345a8c", +"a6 c #7496d4", +"a7 c #0c1a24", +"a8 c #444a47", +"a9 c #343e3c", +"b. c #dce6e4", +"b# c #a9b2bc", +"ba c #a6a6a3", +"bb c #446a9c", +"bc c #c4f2f8", +"bd c #445667", +"be c #727475", +"bf c #6a7896", +"bg c #9aa0a7", +"bh c #9ec4fa", +"bi c #545a61", +"bj c #6474e0", +"bk c #546674", +"bl c #b8bcbd", +"bm c #5d7cbf", +"bn c #515255", +"bo c #979a9f", +"bp c #849cd0", +"bq c #546a8f", +"br c #d7d8d5", +"bs c #688ada", +"bt c #4f6ebe", +"bu c #343e4c", +"bv c #dafefc", +"bw c #acd6fc", +"bx c #b4b6b0", +"by c #8c9a94", +"bz c #203a44", +"bA c #a4b6c8", +"bB c #4c6a98", +"bC c #040214", +"bD c #5c74be", +"bE c #4c5c98", +"bF c #24325c", +"bG c #8c8c8f", +"bH c #4464a7", +"bI c #2c457e", +"bJ c #5c83c7", +"bK c #34538a", +"bL c #b4dff1", +"bM c #7c92d4", +"bN c #c4c4c0", +"bO c #243759", +"bP c #0c151e", +"bQ c #9cb2d4", +"bR c #6c8fd3", +"bS c #546aab", +"bT c #848c9f", +"bU c #242420", +"bV c #6c83c0", +"bW c #343935", +"bX c #848b89", +"bY c #acaca6", +"bZ c #c4cad0", +"b0 c #445c90", +"b1 c #243865", +"b2 c #dce0dc", +"b3 c #747b76", +"b4 c #8cacee", +"b5 c #0c0c08", +"b6 c #446299", +"b7 c #8493a4", +/* pixels */ +"................................................................................................................................", +"..................................bC....bC....bC..bC....bC..bCbCbCbC..bCbC..bC..bC..bC..bCbC..bC..bC....bC....bC................", +"..#9#C#h#C.p.Y.Y.Y#j.Y.Y.Y#V#V#Vb1bFb1b1#8#Y.a.a#Q#Q.a.N#Q.abI.i.9bI#Q#MbK#M.wb0#M.9.N.N.N.9.abI.a#Y#Yb1b1#b#bb1b1b1#V#V#V#Vaz..", +"..#h#C.p.p#9.Y.Y#j.AbObO.A.AbO.Ab1#Y#Y#8.a.aa0.N.8.w.w#QbK.w.ibI.9#6#Q#.#Mb0b0#J#MbK#M.NbK.N.9.NbI.N#YbIb1#Y#8#8bOb1bO#j#V#Caz..", +"..#9.e#h#C.p.p.Y.YbO.A#b#N.a#8#Y#bb1#8#Y.Na0.9.8#Q.w.Mb0#Q#MbK.9bK#g#6.Kb6#J#J#wb0#M#MbKbK#Q#M.9bI.N.N.a.N.a.a.ab1b1#V.Y#V.Y.Y..", +"..#9#C.p#h.p.p.p.Y#VbO#b.a.ia0.9#Q.N#YbI.a.N.N.N.w#Q.wb6b6b0b6#.#g#v#M.K#w#L.n.n#vbH#.bH.Ib6aK#MbK.9#Q#Q#Q#Q.a#Yb1.AbF#VbO.Y#j..", +"..#h#h.p.p.p.Y.p#bbF#bb1#Y.a.8.N#Q#M#M#Q.N.9#QbK#M#Mb0b0.ubB.K.K#..K#v#w.nbmbV.nbHbS#w#7#w#vb0#.#M#Mb0#M#Q.9#Y#Yb1#Yb1b1.Y.Y.Y..", +"..#h#9.p.p.p#V#V#b#b#Y#Y.a.ibI.N.w#Mb0b6#7#M#Q#QbK#.b6b6bq#l.n#LbHbH#y#L#R.s.4#AaY#w#w#L.K.KbH.g.KbH#v#M.9bI.i.8.a#Yb1.A.A.A#j..", +"..#h#C.p.p.Y#V#V#bb1.abIbI#6.o.o#g.oaK#tbH.K.KbH#M.Iaj.K#w.n#R.P#Rbt#W#W.4bpb4aoanbsaobm#La1#L#A#L.ga5bK#g#g#Q.8#Y#bb1b1bOb1bO..", +"...p.p.Y#V.Y#V.Ab1#YbI.9#Q#Q#M#M#7#7#M#v.M#J.K.K.nbS#MbH.nbm.#b4.s#Baq#Wb4aB#1aqaq#R.P.##l#RbmbD.K#7#J#J#.#Q.9.i.N.a#Y#Yb1.Aaz..", +"..az#C#V#j#V.A#N#8.N.N.ibObz#T.J#E.J#T#Tbu.Y.8#..K.nbVbD#wbm.4a6aTb4aoaNaTaiasaNa6.n.m.3bZ#2bN.3aR#2#2.3#J#Q#MbK.8.a#8#b.AbO#j..", +"..#h.p.p.Y.Yb1bO.ibI#g#Mbd#hambU.jbW.Sa3aybP.Y.9bHbH.ubm#BbM.P#rbhbc.qasbL.G.VbhaBbpbZaJbobxbl#I#a#abXbP#V.9#6.NbI#8#8#bbF#V#j..", +"..az#C.Y.Y.Y#bb1.abI#Q.oaj#Pa3a3aya3a3bW.Eayb0.K.g#y.K#LanbRbhaTaxbLbvbLbvbvaLadaTai.mbobYba#Xbl.H#I#P#m#.#M#QbIbI#Y#Yb1#b#V#j..", +"..az.p.p#VbObO#Y.a.N#g#g.I#xbW.j.ja3.E.Ebnbib0bmananbm#wanbs.4asacbLbvaHa.aHbvbc.7aIbY#p#pblbl#Kbe#F#k#9#..I#g#6.i#8#8b1b1.A#j..", +"..#h#C.p.YbO#bb1a0bIbKbK#7#xaya3.jaya3#q.Wbn.J.wbD#Lbm.X#Bb4bhat.b#na.a.a.aZaHaHaW#k#a.vagbNaObl#I.vb3#3#w.K#7#v#M#QbIa0#Y#N#N..", +"..#haz.p#V.YbO#Y#Y.N.9#g#7#P.EbUa8#q#D.f.f.fbi#hbB#LaY.n.P#R#e.5.7aLa.a.aZaZa.a.aS#5#p.d#p.t.l.HbYaObo.Y#w.Kb6#.#M.Na0.a#8#NbO..", +"..#h#C.YbO#V#N#Y.8#Q#g#t##ak.j.W.f.Wbn#Gbe#zbnaU.M#Ra6#eaNb4bh.7bLaWa.aZaZaZa.br.H.2ba.H.T#fau.H.H#p.x#3#w.K#tb0#Q#Q.a#8#Nb1bO..", +"..az#j#j.Ab1#N.a.8#Q#.bb##ak.Ebnbn.1.Ua8.zaO#z.xbubqbsbR.saqaN#1bw.7aaaHa.b.a.a4bZ#k#dbgbP.H#IbG#4bY#o#9#w.K#7b0#Q.8.a#8#NbObO..", +"..az#j.Y.YbO#8.a.8#Q#7#t##bd.r#D#D.rbPaV#G#z.x.y#z.p.u#W.6#B#r#eaTaTaLaWaaaI#5#aau#XbraU#8.HbN.T.RbY#0#9#w.Kb6#M#Q#Qa0#Y#Y#N#N..", +"..#h#j.YbOb1bO#Ya0.NbKa5aj.c.f#G#z.1#3.Mbe#zaO.x#pbT#.bmbsbs.F#1#easat.Gbc.hb.b2aragbgbPaC.3#k.v#4babe#9.KbH#7b0#Qak.a.i#N#Y#T..", +"..az.Y#j.Y.Ab1#Y.8.N#gbK.IaX.r.raDaV.Bb0bfbeb3bab3#HazbBaYbsaqbRaf#1.DaB#na2#K#4b3.ybC.Yaf#k#Z.y.d#p#S#3#v#7#M#g.N.N.a#N#Y#NbO..", +"..#h.p#C#jbFbO#8.a.NbK#.#7bk.z.zb3#H#9aKbm#J.y#Hbablb#.e.PaqbmbsaNaN#1aB#2bZ.x.2aub3.AbSbjapbobobo.rbn#9#v#gbK.9bI.a.a#Yb1bObO..", +"..#haz.YbF#VbO#Y.abI#QaK.I.Q.z.WaO#za7b0an.ub#.R.y.R#XbXbEbtbJbR#Bbsb4.D.3.v#p#za3#s.ubJbj#u.WbWb3.Rbe#9#v#v#g.9bI#Yb1b1#b.A#j..", +"..#h#C.p#C.Y#bbO#YbI.9.o.Iab#Zb3.x.da7bK#WbmalbTae.t#F#Gaz.nbsaqbJ.6#R#U#aaMbx#KbPbz#laoanb#ba.2.RbG#G#9#v#v#g.9bI.ab1#bbF#Vaz..", +"..#haz.p.p#V#Vb1#Y.a#6bK#7bk.1#z#Z.y#m#.a1a1bq.LbX#HblbN.3#N.PaobJafbQ.3.tblbx.TazbB.X.kaYb7bG.d.x#ZaV#3bH#v#Q.NbI#8b1b1.A.Y.Y..", +"..az#h#C.p#VbO#b#YbIbK#g#7aQ.d.y.RbX#mbK#y#ybt.#bZ#IaM.l.2bdbmanaobMap.t.2bY.2.ObO.s.X#W.6bX#F.yaOaD#G#9b6#7.I#Q.a.ab1#bbF.Y.Y..", +"..#9#h.p.p#V#Vb1.a.NbK#..IaQ.xbob3aO#m.9#L.ZaY#w#iaJagaGbr#5.8aF.4a#blbN#Z#Z.WaP#l#l.6#WaY#0aO.y.xb3#PaA#7b6bK#QbI#8b1bO.A#V.Y..", +"..#h.p#C#V.YbO#Y.abI.9aK.Ibf#D.1bYbY#mbK#ybt#ybHbSbT#aba.tbx#S.M#B.y#kbxbYbYaP.YbR#A.6bmbt.Lb3#z.W#Dbn#3bK#.#M#Q.N#Yb1b1#V.Yaz..", +"..#h#C.p#V.p#b.A.a#Y#Q#..Ib7#kbe#4#pa7bK#ybH.g.gbHbfbZbN#4bNbgakah#Zbg#F.x.1#9bK.P#A.X.#btbTaO.W.r.ra8.e#Q.o#Q#Q.a.ab1bO.A.Yaz..", +"..#h.p#h#C#VbOb1#YbI.9.o.I.L#H#Z.2.vaA#QbHaK.g.g#y#7#nbr#a.H.vaE.zaU#4blbebCbIaK#Lbm#LbJbtaXaO.z#z#G.EaA#g#Q.9bI.a.a#Nb1#jbO.Y..", +"..#h#C#h#V.p#V.A.a#8.9.9.Iah#4bY#4bGbP#QaKaKaKaK#7#wbEbg.z.zay.E#a#K.2#ZbCbO#v#gbH.Xbb.ubDbk#z.r#c.f.E#9#Q#6bI.i#8b1#YbO.AbO.J..", +"..#h.p#9.p.p#b.A#8#Y.9.9.I.0.R.2bN#XbP.NaK.IaK#v.IbS.KaQaR.Wbl#K.RbY.R.y#9#M#gaKbH.Kbb#yaCbk.r#Ga8#D#TaAbK#6.i.a#Y#bbObO.Y#jaz..", +"..#9#9.p.p.Y#V.Ab1#YbI.9#7a#bn.Hb2#FaP.a.I#g#g#g#v#7bHb0.L.HbY.y.0#ZaObC.8b0#g#6aKbH#wbb#LaX#D#q.Ea3.UaAbK#QbI#Y#Y#bbO.AbO.Y.Y..", +"..#9#h#h#C.p.Y#V#Y#Y#6.obEbk.H.2bUbe#m.a#g#g#Q#M#M#vaK#6bq#k.d.x.y#Z..az#M#v.o#6.o#v#L#tbSbda8bU.Ub5.O#3#6#6bI.ib1#bbF.Y#C.Yaz..", +"..#9#9.p.p.p#Vb1#Y.N#6.o#Q#O.R.xaM.HaPa0bK#Q#Q#M#M#MbK#gb0akb3aO.xbX#9#x#v#g.N#6.9.wbH#yb0bn#D.f#q.j.U#3.N#6#8.i#b#b.Y.p.Y.paz..", +"..#9#h#9.p.p#V#bb1#8bI#g.NbAb.br.t#H#m#Y#Q#g#Q.9.9.N#6.o#gb0avbG#Z...Y.w#g#6bIbIbIbK#v.K#Ma7#s#s....#haA#Q.NbI#Yb1#V#V#V.p.paz..", +"..#9#9#9.p.p#VbO#Y#8#6.i#M.Q#z.H#f#K.B#Y#6.9.N.9bIbI.9.9#M#M#JbybP.B.Nb0.NbIbI#Y.ibI#vbH.wbubW.E.Sa3a7#m.o#Q#Y#Yb1#V#V#C.p.p.e..", +"..#3#9#9#9.Y#V#VbF#Y#8#6ak#O#db2br.HaP#N.N#QbIbI.a#Y.i.8#M#Qa0.L.B.p#Q#Q.i.i.i#Y.ibI#Q#..c.E.ja3a3bWambP.N.9#Y#Y#b#b#V.p.p.p#9..", +"..#3.e#9.p.p.Y.Yb1b1#Y#.#Ubgbl.T#S..aw#obI.a.a#8#Y#Y.a#YbI.Na0.8bO#8a0#Qa0#8b1#Y#Y#8#Q.ibO#Ta9a9bWa3ay#Eb1.a.ab1#V#V.Y.p.p.e#9..", +"..#3#9.p#h#C.p.Y#Vb1#b#V.a.Y.Y.Y#CazbO.eb1#8#Y#b#bb1b1#8bI#Y.8.abIb1#Y.Nb1#Y#Y#Y#b#Y.9.8.8.C.JbO#j.Yaz#C.p.Y#bb1#V.p.p.p#C.e#9..", +"..#9#9#9.p#9.p.Y.Y#V#b#bb1#8.i#8.a.a#Y#Y#Y#Yb1b1#b#bb1#N#Y#8b1#Y#Yb1#8#Yb1#b#b#b#bb1#Y.N.w.8.N.8#Q.8.i.a#b#Y#bbO#V.Y.p#C.p.p#9..", +"..#3#9.e#9.p.p#9#C.Y#V#b#b#b#Y#Y#Y#Y#Y#Yb1b1bO#V.Y#j#Vb1b1bObObObO.Ab1#N.A.AbF#V#V#V#b#8.aa0.a.ibI.8#Y#Yb1#V#V#V#V.p.p#9.p.e#9..", +"..#3#3#9.e.e.p.p.p.p#V.Y#b#b#Vb1#b#Yb1.A#V.Y.Y.Y.Y.Y.A#j.YbO#VbO.Y#jbO#b#j#j#V.Y#V#V#bb1#Y.a#Yb1.a#8b1b1#b.A#V#C.p.p.p.p.e.e#9..", +"..#3aAaA#3#9.e.e#9#C#C.Y.p.Y#V#VbF#VbO.Y#j.p.p.Y#C#j.Y#j.Y#j.Y#j.Y.YbO.Y#j.Y.p.p.p.p.Y#VbOb1#NbObOb1b1.A#V.p.p.p#C.p#9#9#9.e#9..", +"..#3#9.e#3aA#9.e#9.p.p.e.p.p.p#V#j.Y.Y.Y#9.p.p#9.Yaz.Yaz.paz.Y.paz.Y.Y#j#C.p#C.p#C#C.p#V#VbO#VbF#V#j#V#j.p.p.p#C.p#9#C#C#9.e#9..", +"..#3aA#9aA#9aA.e#9.e#9#9.p.p.p.p#Caz.Y#C.p.p#9.p#C#Caz.p#Caz.Y#C.p#9#j.p#h.p#C#C#C.e.p#9.Y#j.Y.Y.p.p.p#C.p.p#9#9#9#9#9.e#9.e#3..", +"..#3.e#3.e#3.e#9#9aA#9.e.e.e.p#C.p#h#Caz#9.p.p.p#h.Y#9.p.p#C.paz.p#h.Yaz#9.p#C.e.e.e.p.p#9.p.paz#C.paz.Y#9.p.e#9.e#9#9#9#9aA#9..", +"......bC..bC..bCbCbCbCbCbCbC..bC....bC..bCbCbCbCbC..bC....bC......bC..bCbCbCbCbCbCbCbCbCbCbC....bC......bCbC..bC..bC..bC........" +}; diff --git a/user/wxLayout/README b/user/wxLayout/README new file mode 100644 index 0000000000..bedb164c71 --- /dev/null +++ b/user/wxLayout/README @@ -0,0 +1,50 @@ + +README for wxLayout classes +--------------------------- + +All the source in this directory is copyrighted under the +LGPL (GNU LIBRARY PUBLIC LICENSE), by Karsten Ballueder . + + +This is still work in progress, so if you want to make any significant +changes, please get in touch with me before. + +There are three building blocks for richt text editing: + +wxllist : + +The wxLayoutList layout engine. It is a linked list of wxLayoutObjects +which can arrange and display them on any wxDC. I am trying to keep +this class as simple as possible, to be just the core layout +engine. All "convenience" functions should be defined in classes built +on top of this. +The wxLayoutList is derived from kbList, a double-linked list with an +interface modelled after the STL list. As wxLayoutList depends on the +way kbList treats iterators (i.e. the iterator value after an insert() +or erase() operation), I don't feel like rewriting it for wxList. + +wxlwindow : + +Contains a class wxLayoutWindow, derived from wxScrolledWindow which +can directly be used as a rich-text display or editing window. The +function responsible for keyboard handling is virtual and can be +overloaded for different keybindings. wxLayoutWindow can sent fake +menu-events to the application to react to the user clicking on +objects. + +wxlparser: + +Contains several high level functions operating on +wxLayoutList. Currently implemented is inserting of text (including +linebreaks) and export of objects, text or html. +Planned for the future is an html parser for importing html. + + + +wxLayout.cpp is a simple test program. It will export Text and HTML to +stdout and demonstrate some of the features and bugs of wxLayoutList. + +There are still things to do and I'm working on them. :-) + +Karsten Ballueder 29 June 1998 + diff --git a/user/wxLayout/kbList.cpp b/user/wxLayout/kbList.cpp new file mode 100644 index 0000000000..7ff7409845 --- /dev/null +++ b/user/wxLayout/kbList.cpp @@ -0,0 +1,320 @@ +/*-*- c++ -*-******************************************************** + * kbList.cc : a double linked list * + * * + * (C) 1998 by Karsten Ballüder (Ballueder@usa.net) * + * * + * $Id$ * + * * + * $Log$ + * Revision 1.1 1998/06/29 12:44:36 KB + * Added my wxWindows based layout engine to the repository. + * It arranges text and graphics for display on a wxDC. + * This code is licensed under the LGPL. + * + * Revision 1.1.1.1 1998/06/13 21:51:12 karsten + * initial code + * + * Revision 1.4 1998/05/24 14:48:00 KB + * lots of progress on Python, but cannot call functions yet + * kbList fixes again? + * + * Revision 1.3 1998/05/18 17:48:34 KB + * more list<>->kbList changes, fixes for wxXt, improved makefiles + * + * Revision 1.2 1998/05/14 16:39:31 VZ + * + * fixed SIGSEGV in ~kbList if the list is empty + * + * Revision 1.1 1998/05/13 19:02:11 KB + * added kbList, adapted MimeTypes for it, more python, new icons + * + *******************************************************************/ + +#ifdef __GNUG__ +# pragma implementation "kbList.h" +#endif + +#include "kbList.h" + + +kbListNode::kbListNode( void *ielement, + kbListNode *iprev, + kbListNode *inext) +{ + next = inext; + prev = iprev; + if(prev) + prev->next = this; + if(next) + next->prev = this; + element = ielement; +} + +kbListNode::~kbListNode() +{ + if(prev) + prev->next = next; + if(next) + next->prev = prev; +} + + +kbList::iterator::iterator(kbListNode *n) +{ + node = n; +} + +void * +kbList::iterator::operator*() +{ + return node->element; +} + +kbList::iterator & +kbList::iterator::operator++() +{ + node = node ? node->next : NULL; + return *this; +} + +kbList::iterator & +kbList::iterator::operator--() +{ + node = node ? node->prev : NULL; + return *this; +} +kbList::iterator & +kbList::iterator::operator++(int foo) +{ + return operator++(); +} + +kbList::iterator & +kbList::iterator::operator--(int bar) +{ + return operator--(); +} + + +bool +kbList::iterator::operator !=(kbList::iterator const & i) const +{ + return node != i.node; +} + +bool +kbList::iterator::operator ==(kbList::iterator const & i) const +{ + return node == i.node; +} + +kbList::kbList(bool ownsEntriesFlag) +{ + first = NULL; + last = NULL; + ownsEntries = ownsEntriesFlag; +} + +void +kbList::push_back(void *element) +{ + if(! first) // special case of empty list + { + first = new kbListNode(element); + last = first; + return; + } + else + last = new kbListNode(element, last); +} + +void +kbList::push_front(void *element) +{ + if(! first) // special case of empty list + { + push_back(element); + return; + } + else + first = new kbListNode(element, NULL, first); +} + +void * +kbList::pop_back(void) +{ + iterator i; + void *data; + bool ownsFlagBak = ownsEntries; + i = tail(); + data = *i; + ownsEntries = false; + erase(i); + ownsEntries = ownsFlagBak; + return data; +} + +void * +kbList::pop_front(void) +{ + iterator i; + void *data; + bool ownsFlagBak = ownsEntries; + + i = begin(); + data = *i; + ownsEntries = false; + erase(i); + ownsEntries = ownsFlagBak; + return data; + +} + +void +kbList::insert(kbList::iterator & i, void *element) +{ + if(! i.Node()) + return; + else if(i.Node() == first) + { + push_front(element); + return; + } + else if(i.Node() == last) + { + push_back(element); + return; + } + i = kbList::iterator(new kbListNode(element, i.Node()->prev, i.Node())); +} + +void +kbList::erase(kbList::iterator & i) +{ + kbListNode + *node = i.Node(), + *prev, *next; + + if(! node) // illegal iterator + return; + + prev = node->prev; + next = node->next; + + // correct first/last: + if(node == first) + first = node->next; + if(node == last) // don't put else here! + last = node->prev; + + // build new links: + if(prev) + prev->next = next; + if(next) + next->prev = prev; + + // delete this node and contents: + if(ownsEntries) + delete *i; + delete i.Node(); + + // change the iterator to next element: + i = kbList::iterator(next); +} + +kbList::~kbList() +{ + kbListNode *next; + + while ( first != NULL ) + { + next = first->next; + if(ownsEntries) + delete first->element; + delete first; + first = next; + } +} + +kbList::iterator +kbList::begin(void) const +{ + return kbList::iterator(first); +} + +kbList::iterator +kbList::tail(void) const +{ + return kbList::iterator(last); +} + +kbList::iterator +kbList::end(void) const +{ + return kbList::iterator(NULL); // the one after the last +} + +unsigned +kbList::size(void) const // inefficient +{ + unsigned count = 0; + kbList::iterator i; + for(i = begin(); i != end(); i++, count++) + ; + return count; +} + + + + + + + +#ifdef KBLIST_TEST + +#include + +KBLIST_DEFINE(kbListInt,int); + +int main(void) +{ + int + n, *ptr; + kbListInt + l; + kbListInt::iterator + i; + + for(n = 0; n < 10; n++) + { + ptr = new int; + *ptr = n*n; + l.push_back(ptr); + } + + i = l.begin(); // first element + i++; // 2nd + i++; // 3rd + i++; // 4th, insert here: + ptr = new int; + *ptr = 4444; + l.insert(i,ptr); + + // this cannot work, because l.end() returns NULL: + i = l.end(); // behind last + i--; // still behind last + l.erase(i); // doesn't do anything + + // this works: + i = l.tail(); // last element + i--; + --i; + l.erase(i); // erase 3rd last element (49) + + for(i = l.begin(); i != l.end(); i++) + cout << *i << '\t' << *((int *)*i) << endl; + + + return 0; +} +#endif diff --git a/user/wxLayout/kbList.h b/user/wxLayout/kbList.h new file mode 100644 index 0000000000..277157861f --- /dev/null +++ b/user/wxLayout/kbList.h @@ -0,0 +1,290 @@ +/*-*- c++ -*-******************************************************** + * kbList.h : a double linked list * + * * + * (C) 1998 by Karsten Ballüder (Ballueder@usa.net) * + * * + * $Id$ + * $Log$ + * Revision 1.1 1998/06/29 12:44:36 KB + * Added my wxWindows based layout engine to the repository. + * It arranges text and graphics for display on a wxDC. + * This code is licensed under the LGPL. + * + * Revision 1.6 1998/06/27 20:06:10 KB + * Added my layout code. + * + *******************************************************************/ + +#ifndef KBLIST_H +# define KBLIST_H + +#ifdef __GNUG__ +# pragma interface "kbList.h" +#endif + +#ifndef NULL +# define NULL 0 +#endif + +/**@name Double linked list implementation. */ +//@{ + +/** kbListNode is a class used by kbList. It represents a single + element in the list. It is not intended for general use outside + kbList functions. +*/ +struct kbListNode +{ + /// pointer to next node or NULL + struct kbListNode *next; + /// pointer to previous node or NULL + struct kbListNode *prev; + /// pointer to the actual data + void *element; + /** Constructor - it automatically links the node into the list, if + the iprev, inext parameters are given. + @param ielement pointer to the data for this node (i.e. the data itself) + @param iprev if not NULL, use this as previous element in list + @param inext if not NULL, use this as next element in list + */ + kbListNode( void *ielement, + kbListNode *iprev = NULL, + kbListNode *inext = NULL); + /// Destructor. + ~kbListNode(); +}; + +/** The main list class, handling void pointers as data. + */ + +class kbList +{ +public: + /// An iterator class for kbList, just like for the STL classes. + class iterator + { + protected: + /// the node to which this iterator points + kbListNode *node; + friend class kbList; + public: + /** Constructor. + @param n if not NULL, the node to which to point + */ + iterator(kbListNode *n = NULL); + /** Dereference operator. + @return the data pointer of the node belonging to this + iterator + */ + void * operator*(); + + /** Increment operator - prefix, goes to next node in list. + @return itself + */ + iterator & operator++(); + + /** Decrement operator - prefix, goes to previous node in list. + @return itself + */ + iterator & operator--(); + + /** Increment operator - prefix, goes to next node in list. + @return itself + */ + iterator & operator++(int); //postfix + + /** Decrement operator - prefix, goes to previous node in list. + @return itself + */ + iterator & operator--(int); //postfix + + /** Comparison operator. + @return true if not equal. + */ + bool operator !=(iterator const &) const; + + /* Comparison operator. + @return true if equal + */ + bool operator ==(iterator const &) const; + + /** Returns a pointer to the node associated with this iterator. + This function is not for general use and should be + protected. However, if protected, it cannot be called from + derived classes' iterators. (Is this a bug in gcc/egcs?) + @return the node pointer + */ + inline kbListNode * Node(void) const + { return node; } + }; + + /** Constructor. + @param ownsEntriesFlag if true, the list owns the entries and + will issue a delete on each of them when deleting them. If + false, the entries themselves will not get deleted. Do not use + this with array types! + */ + kbList(bool ownsEntriesFlag = true); + + /** Destructor. + If entries are owned, they will all get deleted from here. + */ + ~kbList(); + + /** Tell list whether it owns objects. If owned, they can be + deleted by list. See the constructor for more details. + @param ownsflag if true, list will own entries + */ + void ownsObjects(bool ownsflag = true) + { ownsEntries = ownsflag; } + + /** Query whether list owns entries. + @return true if list owns entries + */ + bool ownsObjects(void) + { return ownsEntries; } + + /** Add an entry at the end of the list. + @param element pointer to data + */ + void push_back(void *element); + + /** Add an entry at the head of the list. + @param element pointer to data + */ + void push_front(void *element); + + /** Get element from end of the list and delete it. + NOTE: In this case the element's data will not get deleted by + the list. It is the responsibility of the caller to free it. + @return the element data + */ + void *pop_back(void); + + /** Get element from head of the list and delete it. + NOTE: In this case the element's data will not get deleted by + the list. It is the responsibility of the caller to free it. + @return the element data + */ + void *pop_front(void); + + /** Insert an element into the list. + @param i an iterator pointing to the element, before which the new one should be inserted + @param element the element data + */ + void insert(iterator & i, void *element); + + /** Erase an element, move iterator to following element. + @param i iterator pointing to the element to be deleted + */ + void erase(iterator & i); + + /* Get head of list. + @return iterator pointing to head of list + */ + iterator begin(void) const; + + /* Get end of list. + @return iterator pointing after the end of the list. This is an + invalid iterator which cannot be dereferenced or decremented. It is + only of use in comparisons. NOTE: this is different from STL! + @see tail + */ + iterator end(void) const; + + /* Get last element in list. + @return iterator pointing to the last element in the list. + @see end + */ + iterator tail(void) const; + + /* Get the number of elements in the list. + @return number of elements in the list + */ + unsigned size(void) const; + + /* Query whether list is empty. + @return true if list is empty + */ + bool empty(void) const + { return first == NULL ; } + +private: + /// if true, list owns entries + bool ownsEntries; + /// pointer to first element in list + kbListNode *first; + /// pointer to last element in list + kbListNode *last; + + /// forbid copy construction + kbList(kbList const &foo); + /// forbid assignments + kbList& operator=(const kbList& foo); +}; + +/// just for backward compatibility, will be removed soon +typedef kbList::iterator kbListIterator; +/// cast an iterator to a pointer, compatibility only to be removed +#define kbListICast(type, iterator) ((type *)*iterator) +/// cast an iterator to a const pointer, compatibility only to be removed +#define kbListIcCast(type, iterator) ((type const *)*iterator) + +/** Macro to define a kbList with a given name, having elements of + pointer to the given type. I.e. KBLIST_DEFINE(Int,int) would + create a kbListInt type holding int pointers. +*/ +#define KBLIST_DEFINE(name,type) \ +class name : public kbList \ +{ \ +public: \ + class iterator : public kbList::iterator \ + { \ + protected: \ + inline iterator(kbList::iterator const & i) \ + { node = i.Node(); } \ + friend class name; \ + public: \ + inline iterator(kbListNode *n = NULL) \ + : kbList::iterator(n) {} \ + inline type * operator*() \ + /* the cast is needed for MS VC++ 5.0 */ \ + { return (type *)((kbList::iterator *)this)->operator*() ; } \ + }; \ + inline name(bool ownsEntriesFlag = true) \ + : kbList(ownsEntriesFlag) {} \ + \ + inline void push_back(type *element) \ + { kbList::push_back((void *)element); } \ + \ + inline void push_front(type *element) \ + { kbList::push_front((void *)element); } \ + \ + inline type *pop_back(void) \ + { return (type *) kbList::pop_back(); } \ + \ + inline type *pop_front(void) \ + { return (type *) kbList::pop_front(); } \ + \ + inline void insert(iterator & i, type *element) \ + { kbList::insert(i, (void *) element); } \ + \ + void erase(iterator & i) \ + { kbList::erase(i); } \ + \ + inline iterator begin(void) const \ + { return kbList::begin(); } \ + \ + inline iterator end(void) const \ + { return kbList::end(); } \ + \ + inline iterator tail(void) const \ + { return kbList::tail(); } \ +} + +#ifdef MCONFIG_H +/// define the most commonly used list type once: +KBLIST_DEFINE(kbStringList, String); +#endif + +#endif // KBLIST_H diff --git a/user/wxLayout/wxLayout.cpp b/user/wxLayout/wxLayout.cpp new file mode 100644 index 0000000000..7aefb35cbc --- /dev/null +++ b/user/wxLayout/wxLayout.cpp @@ -0,0 +1,273 @@ +/* + * Program: wxLayout + * + * Author: Karsten Ballüder + * + * Copyright: (C) 1998, Karsten Ballüder + * + */ + +#ifdef __GNUG__ +#pragma implementation "wxLayout.h" +#endif + +#include "wxLayout.h" +#include "wx/textfile.h" + + +#include "Micon.xpm" + +// for testing only: +#include + +//----------------------------------------------------------------------------- +// main program +//----------------------------------------------------------------------------- + +IMPLEMENT_APP(MyApp) + +//----------------------------------------------------------------------------- +// MyFrame +//----------------------------------------------------------------------------- + + enum ids{ ID_EDIT = 1, ID_ADD_SAMPLE, ID_CLEAR, ID_PRINT, ID_DPRINT, + ID_DEBUG, ID_QUIT, ID_CLICK, ID_HTML, ID_TEXT }; + + +IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) + + BEGIN_EVENT_TABLE(MyFrame,wxFrame) + EVT_MENU (-1, MyFrame::OnCommand) + EVT_COMMAND (-1,-1, MyFrame::OnCommand) + EVT_CHAR (wxLayoutWindow::OnChar) + END_EVENT_TABLE() + + MyFrame::MyFrame(void) : + wxFrame( NULL, -1, "wxLayout", wxPoint(20,20), wxSize(600,360) ) +{ + CreateStatusBar( 1 ); + + SetStatusText( "wxLayout by Karsten Ballüder." ); + + wxMenu *file_menu = new wxMenu( "Menu 1" ); + file_menu->Append( ID_CLEAR, "Clear"); + file_menu->Append( ID_ADD_SAMPLE, "Example"); + file_menu->Append( ID_EDIT, "Edit"); + file_menu->Append( ID_DEBUG, "Debug"); + file_menu->Append( ID_PRINT, "Print"); + file_menu->Append( ID_DPRINT, "Direct Print"); + file_menu->Append( ID_TEXT, "Export Text"); + file_menu->Append( ID_HTML, "Export HTML"); + file_menu->Append( ID_QUIT, "Exit"); + + wxMenuBar *menu_bar = new wxMenuBar(); + menu_bar->Append(file_menu, "File" ); + menu_bar->Show( TRUE ); + + SetMenuBar( menu_bar ); + + m_lwin = new wxLayoutWindow(this); + m_lwin->SetEventId(ID_CLICK); + m_lwin->GetLayoutList().SetEditable(true); + m_lwin->SetFocus(); +}; + +void +MyFrame::AddSampleText(wxLayoutList &llist) +{ + + llist.SetFont(wxROMAN,24,wxNORMAL,wxNORMAL, false); + + llist.Insert("The quick brown fox jumps over the lazy dog."); + llist.LineBreak(); + + llist.Insert("Hello "); + llist.Insert(new wxLayoutObjectIcon(new wxIcon(Micon_xpm,-1,-1))); + llist.Insert("World!"); + + + llist.Insert("The quick brown fox jumps..."); + llist.LineBreak(); + + llist.Insert("over the lazy dog."); + llist.SetFont(-1,-1,-1,-1,true); + llist.Insert("underlined"); + llist.SetFont(-1,-1,-1,-1,false); + llist.SetFont(wxROMAN); + llist.Insert("This is "); + llist.SetFont(-1,-1,-1,wxBOLD); llist.Insert("BOLD "); llist.SetFont(-1,-1,-1,wxNORMAL); + llist.Insert("and "); + llist.SetFont(-1,-1,wxITALIC); + llist.Insert("italics "); + llist.SetFont(-1,-1,wxNORMAL); + llist.LineBreak(); + + llist.Insert("and "); + llist.SetFont(-1,-1,wxSLANT); + llist.Insert("slanted"); + llist.SetFont(-1,-1,wxNORMAL); + llist.Insert(" text."); + llist.LineBreak(); + + llist.Insert("and "); + llist.SetFont(-1,-1,-1,-1,-1,"blue"); + llist.Insert("blue"); + llist.SetFont(-1,-1,-1,-1,-1,"black"); + llist.Insert("and "); + llist.SetFont(-1,-1,-1,-1,-1,"red","black"); + llist.Insert("red on black"); + llist.SetFont(-1,-1,-1,-1,-1,"black"); + llist.Insert(" text."); + llist.LineBreak(); + + llist.SetFont(-1,-1,wxSLANT); + llist.Insert("Slanted"); + llist.SetFont(-1,-1,wxNORMAL); + llist.Insert(" and normal text and "); + llist.SetFont(-1,-1,wxSLANT); + llist.Insert("slanted"); + llist.SetFont(-1,-1,wxNORMAL); + llist.Insert(" again."); + llist.LineBreak(); + + // add some more text for testing: + llist.Insert("And here the source for the test program:"); + llist.LineBreak(); + llist.SetFont(wxTELETYPE,16); + char buffer[1024]; + FILE *in = fopen("wxLayout.cpp","r"); + if(in) + { + for(;;) + { + fgets(buffer,1024,in); + if(feof(in)) + break; + llist.Insert(buffer); + llist.LineBreak(); + } + } + + m_lwin->Refresh(); + m_lwin->UpdateScrollbars(); +} + +void +MyFrame::Clear(void) +{ + m_lwin->Erase(); + m_lwin->UpdateScrollbars(); +} + +/* test the editing */ +void MyFrame::Edit(void) +{ + wxLayoutList & llist = m_lwin->GetLayoutList(); + m_lwin->SetEventId(ID_CLICK); + + llist.MoveCursor(0); + llist.MoveCursor(5); + llist.MoveCursor(0,2); + llist.Delete(2); + llist.MoveCursor(2); + llist.Insert("not all so "); + llist.LineBreak(); + m_lwin->Refresh(); +} + +void MyFrame::OnCommand( wxCommandEvent &event ) +{ + cerr << "id:" << event.GetId() << endl; + switch (event.GetId()) + { + case ID_QUIT: + Close( TRUE ); + break; + case ID_PRINT: + m_lwin->Print(); + break; + case ID_DPRINT: + { + wxLayoutList llist; + AddSampleText(llist); + wxPostScriptDC dc("layout.ps",true,this); + if (dc.Ok() && dc.StartDoc((char *)_("Printing message..."))) + { + //dc.SetUserScale(1.0, 1.0); + llist.Draw(dc); + dc.EndDoc(); + } + } + break; + case ID_EDIT: + Edit(); + break; + case ID_ADD_SAMPLE: + AddSampleText(m_lwin->GetLayoutList()); + break; + case ID_CLEAR: + Clear(); + break; + case ID_DEBUG: + m_lwin->GetLayoutList().Debug(); + break; + case ID_CLICK: + cerr << "Received click event." << endl; + break; + case ID_HTML: + { + wxLayoutExportObject *export; + wxLayoutList::iterator i = m_lwin->GetLayoutList().begin(); + + while((export = wxLayoutExport(m_lwin->GetLayoutList(), + i,WXLO_EXPORT_AS_HTML)) != NULL) + { + if(export->type == WXLO_EXPORT_HTML) + cout << *(export->content.text); + else + cout << "