
/*

    $VER: multitext_plugin 1.3 (25.2.98)

    Author:         Ali Graham ($01)
                    <agraham@hal9000.net.au>

    PLUGIN id:      $02

    Desc.:          TEXT replacement with a number of features.

    Tags:           PLA_MultiText_Text                   [I..]
                    PLA_MultiText_Highlight              [IS.]
                    PLA_MultiText_ThreeD                 [IS.]
                    PLA_MultiText_Justification          [IS.]
                    PLA_MultiText_DrawBar                [IS.]
                    PLA_MultiText_Font                   [I..]
                    PLA_MultiText_Disabled               [IS.]

    Values:         PLV_MultiText_JustifyCenter
                    PLV_MultiText_JustifyLeft
                    PLV_MultiText_JustifyRight

*/

OPT MODULE, PREPROCESS, OSVERSION=37

->> multitext_plugin: Modules

MODULE 'tools/easygui', 'graphics/text', 'tools/ghost',
       'intuition/intuition', 'intuition/screens',
       'graphics/rastport'

MODULE 'utility', 'utility/tagitem'

-><

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */

->> multitext_plugin: Definitions
EXPORT OBJECT multitext_plugin OF plugin PRIVATE

    contents:PTR TO LONG
    highlight
    three_d
    justification
    draw_bar
    font:PTR TO textattr
    disabled

    num_lines

    texts_width
    texts_height

ENDOBJECT

-> PROGRAMMER_ID | MODULE_ID
->      $01      |   $02

EXPORT ENUM PLA_MultiText_Text=$81020001,        ->[I..]
            PLA_MultiText_Highlight,             ->[IS.]
            PLA_MultiText_ThreeD,                ->[IS.]
            PLA_MultiText_Justification,         ->[IS.]
            PLA_MultiText_DrawBar,               ->[IS.]
            PLA_MultiText_Font,                  ->[I..]
            PLA_MultiText_Disabled               ->[IS.]

EXPORT ENUM PLV_MultiText_JustifyCenter=0,
            PLV_MultiText_JustifyLeft,
            PLV_MultiText_JustifyRight

-><

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */

->> multitext_plugin: multitext()
PROC multitext(tags=NIL:PTR TO tagitem) OF multitext_plugin

    IF utilitybase

        self.contents       := GetTagData(PLA_MultiText_Text, [' '], tags)
        self.highlight      := GetTagData(PLA_MultiText_Highlight, FALSE, tags)
        self.three_d        := GetTagData(PLA_MultiText_ThreeD, FALSE, tags)
        self.font           := GetTagData(PLA_MultiText_Font, NIL, tags)
        self.justification  := GetTagData(PLA_MultiText_Justification, PLV_MultiText_JustifyCenter, tags)
        self.draw_bar       := GetTagData(PLA_MultiText_DrawBar, FALSE, tags)
        self.disabled       := GetTagData(PLA_MultiText_Disabled, FALSE, tags)

    ELSE

        Raise("util")

    ENDIF

    IF self.contents THEN self.num_lines:=ListLen(self.contents)

ENDPROC
-><

->> multitext_plugin: set() & get()

PROC set(attr, value) OF multitext_plugin

    SELECT attr

        CASE PLA_MultiText_Highlight

            IF self.highlight<>value

                self.highlight:=value

                IF (self.disabled=FALSE) THEN  self.draw(self.gh.wnd)

            ENDIF

        CASE PLA_MultiText_ThreeD

            IF self.three_d<>value

                self.three_d:=value

                IF (self.disabled=FALSE) THEN  self.draw(self.gh.wnd)

            ENDIF

        CASE PLA_MultiText_Justification

            IF self.justification<>value

                IF (value >= PLV_MultiText_JustifyCenter) AND (value <= PLV_MultiText_JustifyRight)

                    self.justification:=value

                    IF (self.disabled=FALSE) THEN  self.draw(self.gh.wnd)

                ENDIF

            ENDIF

        CASE PLA_MultiText_DrawBar

            IF self.draw_bar<>value

                self.draw_bar:=value

                IF (self.disabled=FALSE) THEN  self.draw(self.gh.wnd)

            ENDIF

        CASE PLA_MultiText_Disabled

            IF self.disabled<>value

                self.disabled:=value

                self.draw(self.gh.wnd)

            ENDIF

    ENDSELECT

ENDPROC

PROC get(attr) OF multitext_plugin IS -1, FALSE

-><

->> multitext_plugin: draw()
PROC draw(win:PTR TO window, font=NIL:PTR TO textattr) OF multitext_plugin

    DEF justification, a, cursor_height,
        left_side, right_side, text_start,
        text_width, line_height

    IF win

        SetStdRast(win.rport)

        clear(win, self.x, self.y, self.xs, self.ys)

        IF self.disabled=FALSE

            IF self.font;       font:=self.font
            ELSEIF font=NIL;    font:=win.wscreen.font
            ENDIF

            justification:=self.justification

            cursor_height:=self.y + 1
            line_height:=cursor_height + (font.ysize / 2)

            FOR a:=0 TO (self.num_lines-1)

                left_side:=self.x + 4
                right_side:=self.x + self.xs - 5

                text_width:=IntuiTextLength([1, 0, RP_JAM1, 0, 0, font, self.contents[a], NIL]:intuitext)

                SELECT justification

                    CASE PLV_MultiText_JustifyLeft

                        print_text(self, self.contents[a], font, left_side, cursor_height)
                        IF self.draw_bar THEN draw_line((left_side + text_width + 4), right_side, line_height)

                    CASE PLV_MultiText_JustifyRight

                        IF self.draw_bar THEN draw_line(left_side, (right_side - (text_width + 4)), line_height)
                        print_text(self, self.contents[a], font, (right_side - text_width), cursor_height)

                    DEFAULT

                        text_start:=left_side + (((right_side - left_side) - text_width) / 2) + 1

                        IF self.draw_bar THEN draw_line(left_side, (text_start - 4), line_height)
                        print_text(self, self.contents[a], font, text_start, cursor_height)
                        IF self.draw_bar THEN draw_line((text_start + text_width + 4), right_side, line_height)

                ENDSELECT

                cursor_height:=cursor_height + font.ysize + 2
                line_height:=cursor_height + (font.ysize / 2)

            ENDFOR

        ELSE

            ghost(win, self.x, self.y, self.xs, self.ys)

        ENDIF

    ENDIF

    /*

            line_height:=self.y + (self.text_height/2)

            left_side:=self.x + 2
            right_side:=self.x + self.xs -3

            gap:=6

            IF self.font;       font:=self.font
            ELSEIF font=NIL;    font:=win.wscreen.font
            ENDIF

            justification:=self.justification

            SELECT justification

                CASE PLV_MultiText_JustifyLeft

                    print_text(self, font, left_side, self.y)
                    IF self.draw_bar THEN draw_line((left_side + self.text_width + gap), right_side, line_height)

                CASE PLV_MultiText_JustifyRight

                    IF self.draw_bar THEN draw_line(left_side, (right_side - (self.text_width + gap)), line_height)
                    print_text(self, font, (right_side - self.text_width), self.y)

                DEFAULT

                    text_start:=left_side + (((right_side - left_side) - self.text_width) / 2) + 1

                    IF self.draw_bar THEN draw_line(left_side, (text_start - gap), line_height)
                    print_text(self, font, text_start, self.y)
                    IF self.draw_bar THEN draw_line((text_start + self.text_width + gap), right_side, line_height)

            ENDSELECT

    */

ENDPROC
-><

->> multitext_plugin: min_size() & will_resize()
PROC min_size(font:PTR TO textattr, font_height) OF multitext_plugin

    DEF a

    self.texts_width:=0
    self.texts_height:=0

    IF self.font

        font:=self.font
        font_height:=self.font.ysize

    ENDIF

    FOR a:=0 TO (self.num_lines-1)

        self.texts_width:=Max(self.texts_width, IntuiTextLength([1, 0, RP_JAM1, 0, 0, font, self.contents[a], NIL]:intuitext))

        self.texts_height:=self.texts_height + font_height + 2

    ENDFOR

ENDPROC (self.texts_width + 8), (self.texts_height + 2)

PROC will_resize() OF multitext_plugin IS COND_RESIZEX

-><

->> multitext_plugin: render()

PROC render(font:PTR TO textattr, x, y, xs, ys, win:PTR TO window) OF multitext_plugin

    self.draw(win, font)

ENDPROC

-><

->> private to multitext_plugin.draw(): draw_line() & print_text()
PROC draw_line(x1, x2, y)

    Line(x1, y, x2, y, 1)
    Line(x1, y+1, x2, y+1, 2)

ENDPROC

PROC print_text(m:PTR TO multitext_plugin, text:PTR TO CHAR, font:PTR TO textattr, x, y)

    DEF bt_col, ft_col

    IF m.highlight

        bt_col:=1; ft_col:=2

    ELSE

        bt_col:=2; ft_col:=1

    ENDIF

    IF m.three_d THEN PrintIText(stdrast, [bt_col, 0, RP_JAM1, 1, 1, font, text, NIL]:intuitext, x, y)

    PrintIText(stdrast, [ft_col, 0, RP_JAM1, 0, 0, font, text, NIL]:intuitext, x, y)

ENDPROC
-><



