{curl 7.0, 8.0 applet}
{curl-file-attributes character-encoding = "utf8"}

{applet 
   manifest = "kanji.mcurl",
   {compiler-directives 
      careful? = true
|| ,       strict-serialization? = true
   },
   resync-file = "resync-curl.txt"
}

{import * from LOGIQUEWERKS.AULE}
|| {define-alias KanjiTranslit = LOGIQUEWERKS.AULE.KanjiTranslit }

{import KanjiTranslit as KanjiTranslit from LOGIQUEWERKS.AULE.KANJI, using-name=KANJI}

|| {include "randomizer-kanji.scurl"}

{document-style PlainDocument}

|| {include {manifest-url "file", "manif-colours.scurl"}}
|| {include {manifest-url "file", "manif-kanji-classes.scurl"}}

{set-document-properties background=bkgrnd}

{disable-inspection-gesture}

{on-applet-suspend do
  {exit 0}
}

{def author = "rs"}

{let searching?:bool = true}

{def filename = "./kanjidic2-freq-non-joyo-02.bin"}

{def tag = {String "漢字"} }  || 

{let char-of-the-day:char = '狸'}  || tanuki ; note required - not raccoon, but sometimes "raccoon dog"

|| {let info:{Array-of String} = {new {Array-of String}}}

|| {let notes:{Array-of String} = {new {Array-of String}}}

{let kanji-array:{Array-of KanjiTranslit} = {new {Array-of KanjiTranslit}}}

{def base = 1000}

{let kanji-table:Table =
    {Table
        border-color = "grey",
        border-width = 3px,
        border-style = BorderStyle.flat,
        cell-border-width = 1px,
        cell-border-style="flat", shadow-color = "lightgrey",
        cell-border-color="grey",
        cell-margin = 6pt,
        margin = 24pt,
        {row-prototype
            width={make-elastic minimum-size=800pt},
            font-weight = "normal",
            color = kanji-colour, 
            background = bkgrnd,
||            "List # \ ",
            "\ kanji", "\ meaning", {text  \ notes \  \  \  \  \   \   \  \  \  \  \  \  \  \  \  \  \   \  \  \  \  \  \  \ \ \ \ }
        }
    }
}

{do
        {def kanji-input = {url filename} }


    {with-open-streams kanji-input-strm = {SerializeInputStream {read-open-byte kanji-input}} do
            {try
              set kanji-array = {deserialize kanji-input-strm, {Array-of KanjiTranslit}}
             catch th:Exception do
         {output "kanji error ", {value th.message} }
     finally
         {kanji-input-strm.close}
            }
   }
}

{let empty-str:String = ""}
{let kanji-array-x:{FastArray-of KanjiTranslit} = {{FastArray-of KanjiTranslit}.from-size 500,{KanjiTranslit ' ',empty-str}}}

{let idx:int = base}

{let guiMarkHere?:bool = true}
{let topGuiMark:#GuiMark = null}
{let tableTopGuiMark:#GuiMark = null}
{let startGuiMark:#GuiMark = null}
{let stopGuiMark:#GuiMark = null}
{let startGuiMark2:#GuiMark = null}
{let stopGuiMark2:#GuiMark = null}
{let endGuiMark:#GuiMark = null}
{let tx:TextVisual = {text "this"}}
{let start:bool = true}
{let buf:StringBuf = {StringBuf.default size=256 }}
{let i-x:int = 0}

{for val:KanjiTranslit in kanji-array do
    {if (not val.meaning.empty?) then
      set kanji-array-x[i-x] = val
      {inc i-x}
}}

{def rows-in-view = 10}
{let indices:{Array-of int} = {create-seq kanji-array-x.size}}
{let today-idx:int = {kanji-today-idx2 rows-in-view, (kanji-array-x.size - rows-in-view), indices}}
{set char-of-the-day = kanji-array-x[today-idx].kanji}
{let val:#KanjiTranslit = kanji-array-x[0]}

{with-busy-cursor
  {for idx in indices do
    set val = kanji-array-x[idx]

|| {for val:#KanjiTranslit in kanji-array do
        {if-non-null val then
    {if val.meaning.size > 0 then
        set tx =  {text font-size=24pt, font-family="HanaMinA, Arial Unicode MS", {value {String val.kanji} }}
        {kanji-table.add {row-prototype
||                            {text {String (val.index - base)}},
                            tx,
                            {text font-size=14pt, font-family="serif", {value val.meaning}},
                            {text \ }
                        }
        }
        {if guiMarkHere? then
                set topGuiMark = {tx.graphical-parent.make-gui-mark}
                set tableTopGuiMark = {tx.graphical-parent.make-gui-mark} ||{topGuiMark.clone}
                set guiMarkHere? = false
        }
    }
  }
}}
{if not guiMarkHere? then
     set endGuiMark = {tx.graphical-parent.make-gui-mark}
}

{def searchField = {TextField 
width={make-elastic minimum-size=80pt, preferred-size=240pt},
                       border-width=1px,
                       border-color="silver",
                       font-size=14pt,color=kanji-colour, control-content-background=bkgrnd, 
                       value={String char-of-the-day},
                       {on ev:ValueFinished do
                           {if searching? then
                               set topGuiMark = tableTopGuiMark
                           }
                       }
}}

{def scrollBox={ScrollBox kanji-table}}

{value {VBox  width={make-elastic}, margin=16px, spacing=12px,         
           color = kanji-colour,
           background = bkgrnd, 
           {on ae:AttachEvent at vb:VBox do
               set vb.context-menu-for-view = ae.root-frame.context-menu-for-text-field
               set ae.root-frame.context-menu-for-view = vb.context-menu-for-view
           },

           {HBox
               {Fill},
               {heading level=2, Kanjidic2 frequent Japanese kanji not in Jōyō : {value tag} \ }, searchField,
               {Fill width=2pt},
               {CommandButton
                   label = {Label "Find"},
                               {on a:Action at gr:Graphic do
                                   let str:String = {String searchField.value}
                                   {if not str.empty? then
                                       set (startGuiMark,stopGuiMark) =  {kanji-table.search-next {TextSearchPattern pattern=str}, gm=topGuiMark}
                                       {if-non-null startGuiMark, stopGuiMark then
                                         {if startGuiMark.valid? then 
                                           let (start-x:Distance, start-y:Distance) = {startGuiMark.current-location true }
                                           let (stop-x:Distance, stop-y:Distance) = {stopGuiMark.current-location false }
                                           {if kanji-table.layout-valid? then
                                               let (x1:Distance,y1:Distance) = {topGuiMark.current-location true}
                                               let (x2:Distance,y2:Distance) = {endGuiMark.current-location false}   
                                               {scrollBox.scroll-to-object startGuiMark.graphic,vertical-only?=true}
                                               {if stopGuiMark.valid? then 
                                                   set topGuiMark = {stopGuiMark.clone}
                                                   {try
                                                       set (startGuiMark2,stopGuiMark2) =  {kanji-table.search-next {TextSearchPattern pattern=str}, gm=topGuiMark}
                                                   catch ex:Exception do {output "search-next failed"}
                                                   }
                                                   {if-non-null startGuiMark2 then
|| {output "valid move and stopped"}
                                                   else
|| {output "no move was detected"}
                                                      set topGuiMark = tableTopGuiMark
                                                      set searching? = false
                                                  }
                                               }
                                           }
                                       }
                                       else
|| {output "no move"}
                                         set topGuiMark = tableTopGuiMark
                                         set searching? = false
                                      }
                               }
                      }
               },
               {Fill}
           },
           {hrule height=3px, color="silver"},
           {VBox height={make-elastic},
              {HBox {Fill},scrollBox,{Fill}}
           },
           {HBox background=bkgrnd,
                 {Fill},
                 {text {link href={url {String "http://kanji.aule-browser.com/"}}, {text font-size=14pt, color="gold", Aule Page}} for Japanese Kanji},
                 {Fill}
               }
       }
}