home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classsource.lha / ClassSource / Layouter / Windows / LWindows.c
Encoding:
C/C++ Source or Header  |  1995-02-12  |  13.3 KB  |  545 lines

  1. #include <classes/Layouter/Windows.h>
  2.  
  3. #pragma -
  4. #include <pragma/graphics_lib.h>
  5. #include <pragma/utility_lib.h>
  6. #pragma +
  7.  
  8. LayouterSizeHandlerC::LayouterSizeHandlerC(LayouterWindowC &w)
  9.     : WindowNewsizeHandlerC(w),
  10.       window(w)
  11. {
  12. }
  13.  
  14. VOID LayouterSizeHandlerC::newsize()
  15. {
  16.     window.root.layout(0,0,
  17.         window.window()->Width,
  18.         window.window()->Height);
  19.     EraseRect(window.rastPort(),
  20.         window.window()->BorderLeft,
  21.         window.window()->BorderTop,
  22.         window.window()->Width - window.window()->BorderRight - 1,
  23.         window.window()->Height - window.window()->BorderBottom - 1);
  24.     window.refreshFrame();
  25.     window.gadgets.rebuild(TRUE);
  26. }
  27.  
  28. // *************************************************************
  29.  
  30. LayouterVerifyHandlerC::LayouterVerifyHandlerC(LayouterWindowC &w)
  31.     : WindowSizeverifyHandlerC(w),
  32.       window(w)
  33. {
  34. }
  35.  
  36. VOID LayouterVerifyHandlerC::verify()
  37. {
  38.     window.clearGadgetList(FALSE,FALSE);
  39. }
  40.  
  41. // *************************************************************
  42.  
  43. LayouterMinsizeHandlerC::LayouterMinsizeHandlerC(LayouterWindowC &w)
  44.     : WindowChangeHandlerC(w),
  45.       window(w),
  46.       active(FALSE)
  47. {
  48. }
  49.  
  50. VOID LayouterMinsizeHandlerC::change()
  51. {
  52.     if (active)
  53.     {
  54.         window.limits(window.window()->Width,window.window()->Height,
  55.             window.maxWSet ? window.window()->Width : ~0,
  56.             window.maxHSet ? window.window()->Height : ~0);
  57.         active = FALSE;
  58.     };
  59. }
  60.  
  61. // *************************************************************
  62.  
  63. BorderTransparentGroupC::BorderTransparentGroupC()
  64.     : TransparentGroupLayoutC()
  65. {
  66.     innerTop = 0;
  67.     innerBottom = 0;
  68.     innerLeft = 0;
  69.     innerRight = 0;
  70. }
  71.  
  72. // *************************************************************
  73.  
  74. LayouterWindowC::LayouterWindowC(GTIDCMPortC &port, ScreenC &s,
  75.         TextAttrC &font, Tag tag1type, ...)
  76.     : GTWindowC(port, (struct TagItem *) &tag1type),
  77.       root(),
  78.       innerL(), leftL(), rightL(), topL(), bottomL(),
  79.       sizeTop(0,0), sizeBottom(0,0), sizeLeft(0,0), sizeRight(0,0),
  80.       sizeTopGeo(sizeTop,
  81.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0,
  82.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0),
  83.       sizeBottomGeo(sizeBottom,
  84.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
  85.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0),
  86.       sizeLeftGeo(sizeLeft,
  87.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0,
  88.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0),
  89.       sizeRightGeo(sizeRight,
  90.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
  91.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0),
  92.       innerGeo(innerL,
  93.           LAYOUT_OPPBORDER,&topGeo,0,LAYOUT_OPPBORDER,&bottomGeo,0,
  94.           LAYOUT_OPPBORDER,&leftGeo,0,LAYOUT_OPPBORDER,&rightGeo,0),
  95.       leftGeo(leftL,
  96.           LAYOUT_OPPBORDER,&topGeo,0,LAYOUT_OPPBORDER,&bottomGeo,0,
  97.           LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0),
  98.       rightGeo(rightL,
  99.           LAYOUT_OPPBORDER,&topGeo,0,LAYOUT_GROUP,NULL,0,
  100.           LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0),
  101.       topGeo(topL,
  102.           LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0,
  103.           LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0),
  104.       bottomGeo(bottomL,
  105.           LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
  106.           LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0),
  107.       vinfo(),
  108.       gadgets(*this),
  109.       titlegadgets(),
  110.       gtgadgets(font,vinfo,*this),
  111.       refreshhandler(*this),
  112.       sizehandler(*this),
  113.       verifyhandler(*this),
  114.       minsizehandler(*this),
  115.       maxWSet(FALSE),
  116.       maxHSet(FALSE)
  117. {
  118.     addIDCMP(IDCMP_GADGETUP);
  119.     wScreen = &s;
  120.     gadgets.add(titlegadgets);
  121.     gadgets.add(gtgadgets);
  122.     guiFont = &font;
  123.     guiFallback = &font;
  124.     titleFont = &font;
  125.     titleFallback = &font;
  126.     leftGeo.add(sizeLeftGeo);
  127.     rightGeo.add(sizeRightGeo);
  128.     topGeo.add(sizeTopGeo);
  129.     bottomGeo.add(sizeBottomGeo);
  130.     root.add(innerGeo);
  131.     root.add(leftGeo);
  132.     root.add(topGeo);
  133.     root.add(rightGeo);
  134.     root.add(bottomGeo);
  135. }
  136.  
  137. LayouterWindowC::LayouterWindowC(GTIDCMPortC &port, ScreenC &s,
  138.         TextAttrC &font, struct TagItem *tags)
  139.     : GTWindowC(port, tags),
  140.       root(),
  141.       innerL(), leftL(), rightL(), topL(), bottomL(),
  142.       sizeTop(0,0), sizeBottom(0,0), sizeLeft(0,0), sizeRight(0,0),
  143.       sizeTopGeo(sizeTop,
  144.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0,
  145.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0),
  146.       sizeBottomGeo(sizeBottom,
  147.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
  148.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0),
  149.       sizeLeftGeo(sizeLeft,
  150.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0,
  151.        LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0),
  152.       sizeRightGeo(sizeRight,
  153.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
  154.        LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0),
  155.       innerGeo(innerL,
  156.           LAYOUT_OPPBORDER,&topGeo,0,LAYOUT_OPPBORDER,&bottomGeo,0,
  157.           LAYOUT_OPPBORDER,&leftGeo,0,LAYOUT_OPPBORDER,&rightGeo,0),
  158.       leftGeo(leftL,
  159.           LAYOUT_OPPBORDER,&topGeo,0,LAYOUT_OPPBORDER,&bottomGeo,0,
  160.           LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0),
  161.       rightGeo(rightL,
  162.           LAYOUT_OPPBORDER,&topGeo,0,LAYOUT_GROUP,NULL,0,
  163.           LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0),
  164.       topGeo(topL,
  165.           LAYOUT_GROUP,NULL,0,LAYOUT_SIZE,NULL,0,
  166.           LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0),
  167.       bottomGeo(bottomL,
  168.           LAYOUT_SIZE,NULL,0,LAYOUT_GROUP,NULL,0,
  169.           LAYOUT_GROUP,NULL,0,LAYOUT_GROUP,NULL,0),
  170.       vinfo(),
  171.       gadgets(*this),
  172.       titlegadgets(),
  173.       gtgadgets(font,vinfo,*this),
  174.       refreshhandler(*this),
  175.       sizehandler(*this),
  176.       verifyhandler(*this),
  177.       minsizehandler(*this),
  178.       maxWSet(FALSE),
  179.       maxHSet(FALSE)
  180. {
  181.     addIDCMP(IDCMP_GADGETUP);
  182.     wScreen = &s;
  183.     gadgets.add(titlegadgets);
  184.     gadgets.add(gtgadgets);
  185.     guiFont = &font;
  186.     guiFallback = &font;
  187.     titleFont = &font;
  188.     titleFallback = &font;
  189.     leftGeo.add(sizeLeftGeo);
  190.     rightGeo.add(sizeRightGeo);
  191.     topGeo.add(sizeTopGeo);
  192.     bottomGeo.add(sizeBottomGeo);
  193.     root.add(leftGeo);
  194.     root.add(topGeo);
  195.     root.add(rightGeo);
  196.     root.add(bottomGeo);
  197.     root.add(innerGeo);
  198. }
  199.  
  200. BOOL LayouterWindowC::isValid()
  201. {
  202.     BOOL retval = vinfo.isValid() && screen()->isOpen();
  203.     return retval;
  204. }
  205.  
  206. VOID LayouterWindowC::setFallbackFonts(TextAttrC *font, TextAttrC *titlefont)
  207. {
  208.     if (font)
  209.     {
  210.         guiFallback = font;
  211.     };
  212.     if (titlefont)
  213.     {
  214.         titleFallback = titlefont;
  215.     };
  216. }
  217.  
  218. VOID LayouterWindowC::open(struct TagItem *tags)
  219. {
  220.     if (isOpen())
  221.     {
  222.         toFront();
  223.         activate();
  224.     }
  225.     else {
  226.         if (!vinfo.isValid())
  227.             vinfo.getInfo(*wScreen);
  228.         if (!isValid())
  229.             throw WindowX();
  230.  
  231.         topL.setInnerTopBorder(screen()->screen()->Font->ta_YSize + 1);
  232.         topL.setInnerLeftBorder(screen()->screen()->WBorLeft);
  233.         topL.setInnerRightBorder(screen()->screen()->WBorRight);
  234.         bottomL.setInnerLeftBorder(screen()->screen()->WBorLeft);
  235.         leftL.setInnerTopBorder(screen()->screen()->WBorTop);
  236.         rightL.setInnerTopBorder(screen()->screen()->WBorTop);
  237.         BOOL sizeB = GetTagData(WA_SizeBBottom,FALSE,tags)
  238.             || creationTags().getData(WA_SizeBBottom,FALSE);
  239.         BOOL sizeR = GetTagData(WA_SizeBRight,FALSE,tags)
  240.             || creationTags().getData(WA_SizeBRight,FALSE);
  241.         BOOL sizeG = GetTagData(WA_SizeGadget,FALSE,tags)
  242.             || creationTags().getData(WA_SizeGadget,FALSE);
  243.         BOOL hires = (screen()->screen()->Flags & SCREENHIRES) != NULL;
  244.         if (sizeG)
  245.         {
  246.             if (hires)
  247.             {
  248.                 rightL.setInnerBottomBorder(10);
  249.                 bottomL.setInnerRightBorder(18);
  250.             }
  251.             else {
  252.                 rightL.setInnerBottomBorder(11);
  253.                 bottomL.setInnerRightBorder(13);
  254.             };
  255.         };
  256.         sizeTop.setHeight(screen()->screen()->WBorTop);
  257.         sizeLeft.setWidth(screen()->screen()->WBorLeft);
  258.         if (sizeB)
  259.         {
  260.             if (hires)
  261.                 sizeBottom.setHeight(10)
  262.             else
  263.                 sizeBottom.setHeight(11);
  264.         }
  265.         else {
  266.             sizeBottom.setHeight(screen()->screen()->WBorBottom);
  267.         };
  268.         if (sizeR || (!sizeB && sizeG))
  269.         {
  270.             if (hires)
  271.                 sizeRight.setWidth(18)
  272.             else
  273.                 sizeRight.setWidth(13);
  274.         }
  275.         else {
  276.             sizeRight.setWidth(screen()->screen()->WBorRight);
  277.         };
  278.  
  279.         setTextAttrs(guiFont,titleFont);
  280.         root.layout(0,0,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE);
  281.         WORD minW = root.width();
  282.         WORD minH = root.height();
  283.         BOOL reLayout = FALSE;
  284.         WORD width = GetTagData(WA_Width,creationTags().getData(WA_Width,0),tags);
  285.         if (width <= root.width())
  286.             width = root.width()
  287.         else
  288.             reLayout = TRUE;
  289.         WORD height = GetTagData(WA_Height,creationTags().getData(WA_Height,0),tags);
  290.         if (height <= root.height())
  291.             height = root.height()
  292.         else
  293.             reLayout = TRUE;
  294.         if (reLayout)
  295.         {
  296.             root.layout(0,0,width,height);
  297.         };
  298.         gadgets.rebuild();
  299.         maxWSet = FALSE;
  300.         WORD maxW = GetTagData(WA_MaxWidth,creationTags().getData(WA_MaxWidth,~0),tags);
  301.         if (maxW == 0)
  302.         {
  303.             maxW = width;
  304.             maxWSet = TRUE;
  305.         };
  306.         maxHSet = FALSE;
  307.         WORD maxH = GetTagData(WA_MaxHeight,creationTags().getData(WA_MaxHeight,~0),tags);
  308.         if (maxH == 0)
  309.         {
  310.             maxH = height;
  311.             maxHSet = TRUE;
  312.         };
  313.         GTWindowC::open(
  314.             WA_MinWidth, minW,
  315.             WA_MinHeight, minH,
  316.             WA_AutoAdjust, TRUE,
  317.             WA_Width, width,
  318.             WA_Height, height,
  319.             WA_MaxWidth, maxW,
  320.             WA_MaxHeight, maxH,
  321.             screen()->screen()->Flags & PUBLICSCREEN ?
  322.                 WA_PubScreen : WA_CustomScreen, screen()->screen(),
  323.             TAG_MORE,tags);
  324.     };
  325. }
  326.  
  327. BOOL LayouterWindowC::changeFont(TextAttrC *gui, TextAttrC *title,
  328.         BOOL avoidResize)
  329. {
  330.     BOOL retval = TRUE;
  331.     TextAttrC *oldfont = font();
  332.     TextAttrC *oldtitle = titlefont();
  333.     clearGadgetList(FALSE,FALSE);
  334.     if (!setFonts(gui,title,avoidResize))
  335.     {
  336.         if (!setFonts(guiFallback, titleFallback,avoidResize))
  337.         {
  338.             // hier sollte man auf keinen Fall reinkommen - die Fallbacks
  339.             // sollten immer funktionieren.
  340.             if (!setFonts(oldfont,oldtitle,FALSE))
  341.             {
  342.                 // Dieser Alert kommt hoffentlich nie...
  343.                 // DisplayAlert(RECOVERY_ALERT,"\0\0\0Illegal fonts.\0",40);
  344.             };
  345.             retval = FALSE;
  346.         };
  347.     };
  348.     return retval;
  349. }
  350.  
  351. BOOL LayouterWindowC::reLayout(BOOL avoidResize)
  352. {
  353.     if (isOpen())
  354.     {
  355.         WORD w = root.width();
  356.         WORD h = root.height();
  357.         clearGadgetList(FALSE,FALSE);
  358.         root.layout(0,0,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE);
  359.         WORD width = root.width();
  360.         WORD height = root.height();
  361.         if (!avoidResize || width > w || height > h)
  362.         {
  363.             limits(1,1,~0,~0);
  364.             minsizehandler.activate(TRUE);
  365.             BOOL retval = changeSize(width,height);
  366.             return retval;
  367.         }
  368.         else {
  369.             limits(maxWSet ? w : width, maxHSet ? h : height,
  370.                 maxWSet ? w : ~0,maxHSet ? h : ~0);
  371.             root.layout(0,0,w,h);
  372.             if (isOpen())
  373.             {
  374.                 EraseRect(rastPort(),
  375.                     window()->BorderLeft,
  376.                     window()->BorderTop,
  377.                     window()->Width - window()->BorderRight - 1,
  378.                     window()->Height - window()->BorderBottom - 1);
  379.             };
  380.             refreshFrame();
  381.             gadgets.rebuild(TRUE);
  382.             return TRUE;
  383.         };
  384.     };
  385.     return TRUE;
  386. }
  387.  
  388. VOID LayouterWindowC::setTextAttrs(TextAttrC *font, TextAttrC *titlefont)
  389. {
  390.     if (font)
  391.     {
  392.         guiFont = font;
  393.     }
  394.     if (titlefont)
  395.     {
  396.         titleFont = titlefont;
  397.     };
  398.     gadgets.setTextAttr(guiFont);
  399.     titlegadgets.setTextAttr(titleFont);
  400. }
  401.  
  402. BOOL LayouterWindowC::setFonts(TextAttrC *font, TextAttrC *titlefont,
  403.     BOOL avoidResize)
  404. {
  405.     setTextAttrs(font,titlefont);
  406.     return reLayout(avoidResize);
  407. }
  408.  
  409. // *************************************************************
  410.  
  411. LayouterWindowListC::LayouterWindowListC()
  412. {
  413. }
  414.  
  415. VOID LayouterWindowListC::add(LayouterWindowC &w)
  416. {
  417.     WindowListC::add(w);
  418. }
  419.  
  420. VOID LayouterWindowListC::setFallbackFonts(TextAttrC *font,
  421.         TextAttrC *titlefont)
  422. {
  423.     ListCursorC lc(*this);
  424.     while (!lc.isDone())
  425.     {
  426.         ((LayouterWindowC *) lc.item())->setFallbackFonts(font,titlefont);
  427.         lc.next();
  428.     };
  429. }
  430.  
  431. BOOL LayouterWindowListC::changeFont(TextAttrC *font, TextAttrC *titlefont,
  432.         BOOL avoidResize)
  433. {
  434.     ListCursorC lc(*this);
  435.     while (!lc.isDone())
  436.     {
  437.         ((LayouterWindowC *) lc.item())->changeFont(font,titlefont,avoidResize);
  438.         lc.next();
  439.     };
  440.     return TRUE;
  441. }
  442.  
  443. // *************************************************************
  444.  
  445. StandardWindowC::StandardWindowC(GTIDCMPortC &p, ScreenC &s,
  446.     GadgetC *defaultGadget, Tag tag1type, ...)
  447.     : LayouterWindowC(p,s,defaultF,
  448.         WA_DepthGadget, TRUE,
  449.         WA_DragBar, TRUE,
  450.         WA_CloseGadget, GetTagData(WA_CloseGadget,TRUE,(struct TagItem *) &tag1type),
  451.         WA_SizeGadget, GetTagData(WA_SizeGadget,TRUE,(struct TagItem *) &tag1type),
  452.         TAG_MORE, (struct TagItem *) &tag1type),
  453.       defaultF("topaz.font",8),
  454.       textF(new LTextAttrC(defaultF)),
  455.       titleF(new LTextAttrC(defaultF)),
  456.       textFB(new LTextAttrC(defaultF)),
  457.       titleFB(new LTextAttrC(defaultF)),
  458.       bold(NULL,0,FSF_BOLD),
  459.       defgadget(defaultGadget),
  460.       firstOpened(FALSE)
  461. {
  462.     bold.assign(*font());
  463. }
  464.  
  465. StandardWindowC::StandardWindowC(GTIDCMPortC &p, ScreenC &s,
  466.     GadgetC *defaultGadget, struct TagItem *tags)
  467.     : LayouterWindowC(p,s,defaultF,
  468.         WA_DepthGadget, TRUE,
  469.         WA_DragBar, TRUE,
  470.         WA_CloseGadget, GetTagData(WA_CloseGadget,TRUE,tags),
  471.         WA_SizeGadget, GetTagData(WA_SizeGadget,TRUE,tags),
  472.         TAG_MORE, tags),
  473.       defaultF("topaz.font",8),
  474.       textF(new LTextAttrC(defaultF)),
  475.       titleF(new LTextAttrC(defaultF)),
  476.       textFB(new LTextAttrC(defaultF)),
  477.       titleFB(new LTextAttrC(defaultF)),
  478.       bold(NULL,0,FSF_BOLD),
  479.       defgadget(defaultGadget),
  480.       firstOpened(FALSE)
  481. {
  482.     bold.assign(*font());
  483. }
  484.  
  485. VOID StandardWindowC::open(struct TagItem *tags)
  486. {
  487.     if (!firstOpened)
  488.     {
  489.         if (screen()->isOpen())
  490.         {
  491.             firstOpened = TRUE;
  492.             changeFont(&TextAttrC(*screen()->screen()->Font),
  493.                 &TextAttrC(*screen()->screen()->Font));
  494.         };
  495.     };
  496.     LayouterWindowC::open(tags);
  497. }
  498.  
  499. VOID StandardWindowC::setFallbackFonts(TextAttrC *font, TextAttrC *titlefont)
  500. {
  501.     LayouterWindowC::setFallbackFonts(font,titlefont);
  502. }
  503.  
  504. BOOL StandardWindowC::changeFont(TextAttrC *font, TextAttrC *titlefont,
  505.         BOOL avoidResize)
  506. {
  507.     LTextAttrC *f = NULL;
  508.     if (font)
  509.     {
  510.         f = new LTextAttrC(*font->attr());
  511.     };
  512.     LTextAttrC *tf = NULL;
  513.     if (titlefont)
  514.     {
  515.         tf = new LTextAttrC(*titlefont->attr());
  516.     };
  517.     BOOL retval = LayouterWindowC::changeFont(f,tf,avoidResize);
  518.     if (retval)
  519.     {
  520.         if (textF)
  521.             delete textF;
  522.         textF = f;
  523.         if (titleF)
  524.             delete titleF;
  525.         titleF = tf;
  526.     };
  527.     return retval;
  528. }
  529.  
  530. VOID StandardWindowC::setTextAttrs(TextAttrC *font, TextAttrC *titlefont)
  531. {
  532.     if (font)
  533.     {
  534.         bold.assign(*font);
  535.     };
  536.     LayouterWindowC::setTextAttrs(font,titlefont);
  537.     if (font)
  538.     {
  539.         if (defgadget)
  540.             defgadget->setTextAttr(&bold);
  541.     };
  542. }
  543.  
  544. // *************************************************************
  545.