/* NOWIN.C */

#include <notes.g>
#include <notes.rsg>
#include <hwim.h>
#include "nolayout.h"

GLREF_D PR_NOCOMMAN *DatApp2;
GLREF_D LAYOUT_DATA ld;

LOCAL_C VOID DrawTextInWindow(INT wid,TEXT *pstr)
    {
    W_WINDATA wd;

    wInquireWindow(wid,&wd);
    wd.extent.tl.x=wd.extent.tl.y=0;
    gPrintBoxText((P_RECT *)(&wd.extent),ld.FontAscent+1,
                                    G_TEXT_ALIGN_CENTRE,0,pstr,p_slen(pstr));
    }

#pragma METHOD_CALL

METHOD VOID nowin_wn_key(PR_NOWIN *self,INT keycode,INT mods)
    {
    if (keycode==W_KEY_TAB)
        p_send3(DatApp2,O_NCO_SWITCH_FOCUS,mods);
    else
        p_send4(self->nowin.edwin,O_WN_KEY,keycode,mods);
    }

METHOD VOID nowin_wn_emphasise(PR_NOWIN *self,INT emphasise)
    {
    p_supersend3(self,O_WN_EMPHASISE,emphasise);
    p_send3(self->nowin.edwin,O_WN_EMPHASISE,emphasise);
    }

METHOD VOID nowin_wn_draw(PR_NOWIN *self)
    {
    p_supersend2(self,O_WN_DRAW);
    p_send2(self->nowin.edwin,O_WN_DRAW);
    }

METHOD VOID nowin_wn_init(PR_NOWIN *self,IN_EDWIN *pined,IN_EDWIN_X *pinx)
    {
    W_WINDATA wd;

    wd.extent.tl=pinx->pos;
    wd.extent.width=pined->vulen;
    wd.extent.height=ld.FontHeight+2;
    if (pined->flags&IN_EDWIN_VISLINES_SUPPLIED)
        wd.extent.height*=pinx->vislines;
    wd.extent.height+=EDGE_HEIGHT;
    p_send5(self,O_WN_CONNECT,NULL,W_WIN_EXTENT,&wd);
    self->win.flags=PR_BWIN_CORNER_4|PR_BWIN_SHADOW_2;
    pinx->pos.x=EDGE_TLX;
    pinx->pos.y=EDGE_TLY;
    pined->vulen-=EDGE_WIDTH;
    p_send4(self,O_NW_INIT,pined,pinx);
    self->nowin.edwin=f_newsend(CAT_NOTES_HWIM,C_EDWIN,
                                                O_WN_INIT,pined,self,pinx);
    }

METHOD VOID nowin_nw_increase_width(PR_NOWIN *self,INT increase)
    {
    W_WINDATA wd;
    PR_EDWIN *edwin;

    wInvalidateWin(self->win.id);
    wInquireWindow(self->win.id,&wd);
    wd.extent.width+=increase;
    wSetWindow(self->win.id,W_WIN_EXTENT,&wd);
    edwin=self->nowin.edwin;
    p_send3(edwin,O_EW_SENSE_SIZE,&wd.extent);
    edwin->edwin.margins.right+=increase;
    wd.extent.width+=increase;
    p_send4(edwin,O_EW_SET_SIZE,&wd.extent,NULL);
    }

METHOD VOID notitwin_wn_key(PR_NOWIN *self,INT keycode,INT mods)
    {
    if (keycode==W_KEY_RETURN)
        p_send3(DatApp2,O_NCO_SWITCH_FOCUS,mods);
    else
        p_supersend4(self,O_WN_KEY,keycode,mods);
    }

METHOD VOID nofndwin_wn_key(PR_NOWIN *self,INT keycode,INT mods)
    {
    if (keycode==W_KEY_RETURN)
        p_send3(DatApp2,O_NCO_QUICK_FIND,mods&W_SHIFT_MODIFIER? -1: +1);
    else
        p_supersend4(self,O_WN_KEY,keycode,mods);
    }

METHOD VOID nofndwin_destroy(PR_NOFNDWIN *self)
    {
    p_free(self->nofndwin.prompt);
    p_supersend2(self,O_DESTROY);
    }

METHOD VOID nofndwin_nw_init(PR_NOFNDWIN *self,IN_EDWIN *pined,IN_EDWIN_X *pinx)
    {
    UWORD width;

    self->nofndwin.x=EDGE_TLX;
    self->nofndwin.y=EDGE_TLY+(1+ld.FontAscent);
    self->nofndwin.len=
            hLoadResource(NOSTR_FIND_PROMPT,&self->nofndwin.prompt)-1;
    width=gTextWidth(WS_FONT_SYSTEM,G_STY_ITALIC,
                                self->nofndwin.prompt,self->nofndwin.len);
    pinx->pos.x=EDGE_TLX+width;
    pined->vulen-=width;
    }

METHOD VOID nofndwin_wn_draw(PR_NOFNDWIN *self)
    {
    p_supersend2(self,O_WN_DRAW);
    hSetGStyle(G_STY_ITALIC);
    gPrintText(self->nofndwin.x,self->nofndwin.y,
                                self->nofndwin.prompt,self->nofndwin.len);
    hSetGStyle(G_STY_NORMAL);
    }

METHOD VOID notagwin_wn_set(PR_NOTAGWIN *self,INT on)
    {
    if (on==self->notagwin.on)
        return;
    wInvalidateWin(self->win.id);
    self->notagwin.on=on;
    }

#define TICK_SYM_AS_STRING "\014"

METHOD VOID notagwin_wn_draw(PR_NOTAGWIN *self)
    {
    DrawTextInWindow(self->win.id,self->notagwin.on? TICK_SYM_AS_STRING: "");
    }

METHOD INT notagwin_wn_sense(PR_NOTAGWIN *self)
    {
    return(hGetSWid(TICK_SYM_AS_STRING)+TEXT_WINDOW_EDGE_WIDTH);
    }

METHOD VOID nocntwin_wn_set(PR_NOCNTWIN *self,INT val,INT max)
    {
    if (val==self->nocntwin.val && max==self->nocntwin.max)
        return;
    wInvalidateWin(self->win.id);
    self->nocntwin.val=val;
    self->nocntwin.max=max;
    }

METHOD VOID nocntwin_wn_draw(PR_NOCNTWIN *self)
    {
    TEXT buf[10];

    p_atos(&buf[0],"%d/%d",self->nocntwin.val,self->nocntwin.max);
    DrawTextInWindow(self->win.id,&buf[0]);
    }

METHOD INT nocntwin_wn_sense(PR_NOCNTWIN *self)
    {
    return(hGetSWid("99/99")+TEXT_WINDOW_EDGE_WIDTH);
    }
