home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d832 / term.lha / Term / term-3.1-Source.lha / TranslationPanel.c < prev    next >
C/C++ Source or Header  |  1993-02-18  |  20KB  |  801 lines

  1. /*
  2. **    TranslationPanel.c
  3. **
  4. **    Character code translation editing panel
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12.     /* The character table. */
  13.  
  14. STATIC STRPTR CharCodes[256] =
  15. {
  16.     "NUL","SOH","STX","ETX","EOT","ENQ","ACK","BEL","BS" ,"HT" ,"LF" ,"VT" ,"FF" ,"CR" ,"SO" ,"SI" ,
  17.     "DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM" ,"SUB","ESC","FS" ,"GS" ,"RS" ,"US" ,
  18.     "SP" , "!" , "\"", "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/" ,
  19.      "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?" ,
  20.      "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" ,
  21.      "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\\", "]" , "^" , "_" ,
  22.      "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o" ,
  23.      "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" ,"DEL",
  24.     "128","129","130","131","132","133","134","135","136","137","138","139","140","141","SS2","SS3",
  25.     "DCS","145","146","147","148","149","150","151","152","153","154","CSI","ST" ,"OSC","PM" ,"APC",
  26.     "NBS", "¡" , "¢" , "£" , "¤" , "¥" , "¦" , "§" , "¨" , "©" , "ª" , "«" , "¬" ,"SHY", "®" , "¯" ,
  27.      "°" , "±" , "²" , "³" , "´" , "µ" , "¶" , "·" , "¸" , "¹" , "º" , "»" , "¼" , "½" , "¾" , "¿" ,
  28.      "À" , "Á" , "Â" , "Ã" , "Ä" , "Å" , "Æ" , "Ç" , "È" , "É" , "Ê" , "Ë" , "Ì" , "Í" , "Î" , "Ï" ,
  29.      "Ð" , "Ñ" , "Ò" , "Ó" , "Ô" , "Õ" , "Ö" , "×" , "Ø" , "Ù" , "Ú" , "Û" , "Ü" , "Ý" , "Þ" , "ß" ,
  30.      "à" , "á" , "â" , "ã" , "ä" , "å" , "æ" , "ç" , "è" , "é" , "ê" , "ë" , "ì" , "í" , "î" , "ï" ,
  31.      "ð" , "ñ" , "ò" , "ó" , "ô" , "õ" , "ö" , "÷" , "ø" , "ù" , "ú" , "û" , "ü" , "ý" , "þ" , "ÿ"
  32. };
  33.  
  34.     /* Main control panel gadget IDs. */
  35.  
  36. enum    {    MAINGAD_HALF=256,MAINGAD_USE,MAINGAD_LOAD,MAINGAD_SAVE,MAINGAD_CANCEL };
  37.  
  38.     /* The local settings panel gadget IDs. */
  39.  
  40. enum    {    SUBGAD_CODE,SUBGAD_SEND,SUBGAD_RECEIVE,SUBGAD_USE,SUBGAD_CANCEL };
  41.  
  42. STATIC STRPTR Halfs[] =
  43. {
  44.     "NUL-DEL",
  45.     "128-\"ÿ\"",
  46.     NULL
  47. };
  48.  
  49. STATIC struct Gadget *
  50. CreateAllMainGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,BYTE *Half)
  51. {
  52.     struct Gadget        *Gadget;
  53.     struct NewGadget     NewGadget;
  54.     UWORD             Counter;
  55.  
  56.     FOREVER
  57.     {
  58.         SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  59.  
  60.         memset(&NewGadget,0,sizeof(struct NewGadget));
  61.  
  62.         if(Gadget = CreateContext(GadgetList))
  63.         {
  64.             WORD i,From,To;
  65.  
  66.             switch(*Half)
  67.             {
  68.                 case 0:
  69.  
  70.                     From    = 0;
  71.                     To    = 127;
  72.  
  73.                     break;
  74.  
  75.                 case 1:
  76.  
  77.                     From    = 128;
  78.                     To    = 255;
  79.  
  80.                     break;
  81.  
  82.                 case 2:
  83.  
  84.                     From    = 0;
  85.                     To    = 255;
  86.  
  87.                     break;
  88.             }
  89.  
  90.             SZ_ResetMaxWidth();
  91.  
  92.             for(i = From ; i <= To ; i++)
  93.                 SZ_UpdateMaxWidth(BUTTON_KIND,CharCodes[i],0,NULL);
  94.  
  95.             SZ_SetWidth(SZ_ResetMaxWidth());
  96.  
  97.             for(i = From ; i <= To ; i++)
  98.             {
  99.                 if(i == (To + 1) / 2 - 1)
  100.                 {
  101.                     if(SZ_GetWindowHeight() > Window -> WScreen -> Height / 2)
  102.                     {
  103.                         if(*Half == 2)
  104.                         {
  105.                             *Half = 0;
  106.  
  107.                             To = 127;
  108.                         }
  109.                     }
  110.                 }
  111.  
  112.                 NewGadget . ng_GadgetText    = CharCodes[i];
  113.                 NewGadget . ng_GadgetID        = i;
  114.  
  115.                 if(!(i % 16))
  116.                 {
  117.                     GadgetArray[i] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  118.                         SZ_Adjust,    TRUE,
  119.                         SZ_AutoWidth,    TRUE,
  120.  
  121.                         SZ_GroupCount,    16,
  122.                         SZ_AlignBottom,    TRUE,
  123.                     TAG_DONE);
  124.                 }
  125.                 else
  126.                 {
  127.                     GadgetArray[i] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  128.                         SZ_Adjust,    TRUE,
  129.                         SZ_AutoWidth,    TRUE,
  130.  
  131.                         SZ_GroupNext,    TRUE,
  132.                     TAG_DONE);
  133.                 }
  134.             }
  135.  
  136.             if(*Half < 2)
  137.             {
  138.                 Counter = MAINGAD_HALF;
  139.  
  140.                 NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSLATIONPANEL_CHARACTER_PAGE_GAD);
  141.                 NewGadget . ng_GadgetID        = Counter;
  142.  
  143.                 GadgetArray[Counter++] = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
  144.                     SZ_Adjust,    TRUE,
  145.                     SZ_AlignExtra,    TRUE,
  146.                     SZ_AlignCentre,    TRUE,
  147.                     SZ_AlignBottom,    TRUE,
  148.  
  149.                     GTCY_Labels,    Halfs,
  150.                     GTCY_Active,    *Half,
  151.                 TAG_DONE);
  152.             }
  153.             else
  154.                 Counter = MAINGAD_USE;
  155.  
  156.             SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
  157.             SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  158.             SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_LOAD_GAD),0,NULL);
  159.             SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  160.  
  161.             SZ_SetWidth(SZ_ResetMaxWidth());
  162.  
  163.             NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_USE_GAD);
  164.             NewGadget . ng_GadgetID        = Counter;
  165.             NewGadget . ng_Flags        = 0;
  166.  
  167.             GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  168.                 SZ_Adjust,    TRUE,
  169.                 SZ_AutoWidth,    TRUE,
  170.                 SZ_AlignExtra,    TRUE,
  171.                 SZ_AlignLeft,    TRUE,
  172.                 SZ_AlignBottom,    TRUE,
  173.                 SZ_GroupCount,    4,
  174.             TAG_DONE);
  175.  
  176.             NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_LOAD_GAD);
  177.             NewGadget . ng_GadgetID        = Counter;
  178.  
  179.             GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  180.                 SZ_Adjust,    TRUE,
  181.                 SZ_AutoWidth,    TRUE,
  182.                 SZ_GroupNext,    TRUE,
  183.             TAG_DONE);
  184.  
  185.             NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_SAVE_GAD);
  186.             NewGadget . ng_GadgetID        = Counter;
  187.  
  188.             GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  189.                 SZ_Adjust,    TRUE,
  190.                 SZ_AutoWidth,    TRUE,
  191.                 SZ_GroupNext,    TRUE,
  192.             TAG_DONE);
  193.  
  194.             NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  195.             NewGadget . ng_GadgetID        = Counter;
  196.  
  197.             GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  198.                 SZ_Adjust,    TRUE,
  199.                 SZ_AutoWidth,    TRUE,
  200.                 SZ_GroupNext,    TRUE,
  201.             TAG_DONE);
  202.  
  203.             if(SZ_GetWindowHeight() > Window -> WScreen -> Height)
  204.             {
  205.                 FreeGadgets(*GadgetList);
  206.  
  207.                 *GadgetList = NULL;
  208.  
  209.                 if(*Half == 2)
  210.                     *Half = 0;
  211.                 else
  212.                     return(NULL);
  213.             }
  214.             else
  215.                 return(Gadget);
  216.         }
  217.         else
  218.             return(NULL);
  219.     }
  220. }
  221.  
  222. STATIC struct Gadget *
  223. CreateAllSubGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,STRPTR Buffer)
  224. {
  225.     struct Gadget        *Gadget;
  226.     struct NewGadget     NewGadget;
  227.     UWORD             Counter = 0;
  228.  
  229.     SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  230.  
  231.     memset(&NewGadget,0,sizeof(struct NewGadget));
  232.  
  233.     if(Gadget = CreateContext(GadgetList))
  234.     {
  235.         SZ_ResetMaxWidth();
  236.  
  237.         SZ_UpdateMaxWidth(TEXT_KIND,NULL,strlen(Buffer),NULL);
  238.         SZ_UpdateMaxWidth(STRING_KIND,NULL,40,NULL);
  239.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
  240.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  241.  
  242.         SZ_SetWidth(SZ_ResetMaxWidth());
  243.  
  244.         SZ_InitWidth();
  245.  
  246.         NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSLATIONPANEL_CHARACTER_CODE_GAD);
  247.         NewGadget . ng_GadgetID        = Counter;
  248.         NewGadget . ng_Flags        = PLACETEXT_ABOVE;
  249.  
  250.         GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
  251.             SZ_Adjust,    TRUE,
  252.             SZ_AlignCentre,    TRUE,
  253.             SZ_Chars,    strlen(Buffer),
  254.  
  255.             GTTX_Text,    Buffer,
  256.             GTTX_Border,    TRUE,
  257.         TAG_DONE);
  258.  
  259.         NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSLATIONPANEL_SEND_CODE_AS_GAD);
  260.         NewGadget . ng_GadgetID        = Counter;
  261.  
  262.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  263.             SZ_Adjust,        TRUE,
  264.             SZ_AlignExtra,        TRUE,
  265.             SZ_AlignBottom,        TRUE,
  266.             SZ_AlignLeft,        TRUE,
  267.             SZ_Chars,        40,
  268.             STRINGA_Justification,    GACT_STRINGCENTER,
  269.  
  270.             GTST_MaxChars,        255,
  271.             GA_Immediate,        TRUE,
  272.         TAG_DONE);
  273.  
  274.         NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSLATIONPANEL_RECEIVE_CODE_AS_GAD);
  275.         NewGadget . ng_GadgetID        = Counter;
  276.  
  277.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  278.             SZ_Adjust,        TRUE,
  279.             SZ_AlignExtra,        TRUE,
  280.             SZ_AlignBottom,        TRUE,
  281.             SZ_AlignLeft,        TRUE,
  282.             SZ_Chars,        40,
  283.             STRINGA_Justification,    GACT_STRINGCENTER,
  284.  
  285.             GTST_MaxChars,        255,
  286.             GA_Immediate,        TRUE,
  287.         TAG_DONE);
  288.  
  289.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
  290.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  291.  
  292.         SZ_SetWidth(SZ_ResetMaxWidth());
  293.  
  294.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_USE_GAD);
  295.         NewGadget . ng_GadgetID        = Counter;
  296.         NewGadget . ng_Flags        = 0;
  297.  
  298.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  299.             SZ_Adjust,    TRUE,
  300.             SZ_AutoWidth,    TRUE,
  301.             SZ_AlignExtra,    TRUE,
  302.             SZ_AlignLeft,    TRUE,
  303.             SZ_AlignBottom,    TRUE,
  304.         TAG_DONE);
  305.  
  306.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  307.         NewGadget . ng_GadgetID        = Counter;
  308.  
  309.         GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  310.             SZ_Adjust,    TRUE,
  311.             SZ_AutoWidth,    TRUE,
  312.             SZ_AlignRight,    TRUE,
  313.         TAG_DONE);
  314.     }
  315.  
  316.     return(Gadget);
  317. }
  318.  
  319. STATIC BYTE
  320. SubPanel(UBYTE CharCode)
  321. {
  322.     struct Window    *PanelWindow;
  323.     struct Gadget    *GadgetList = NULL;
  324.     struct Gadget    *GadgetArray[SUBGAD_CANCEL + 1];
  325.     BYTE         Result = FALSE;
  326.  
  327.     if(CharCodes[CharCode][0] == '1' && CharCodes[CharCode][1])
  328.         strcpy(SharedBuffer,CharCodes[CharCode]);
  329.     else
  330.         SPrintf(SharedBuffer,"%ld (\"%s\")",CharCode,CharCodes[CharCode]);
  331.  
  332.     if(CreateAllSubGadgets(GadgetArray,&GadgetList,SharedBuffer))
  333.     {
  334.         if(PanelWindow = OpenWindowTags(NULL,
  335.             WA_Left,    GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
  336.             WA_Top,        GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())    / 2,
  337.             WA_Width,    SZ_GetWindowWidth(),
  338.             WA_Height,    SZ_GetWindowHeight(),
  339.  
  340.             WA_Activate,    TRUE,
  341.             WA_DragBar,    TRUE,
  342.             WA_DepthGadget,    TRUE,
  343.             WA_RMBTrap,    TRUE,
  344.             WA_DepthGadget,    TRUE,
  345.             WA_CloseGadget,    TRUE,
  346.             WA_CustomScreen,Window -> WScreen,
  347.  
  348.             WA_IDCMP,    IDCMP_GADGETDOWN | IDCMP_ACTIVEWINDOW | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_VANILLAKEY | BUTTONIDCMP | STRINGIDCMP,
  349.  
  350.             WA_Title,    LocaleString(MSG_TRANSLATIONPANEL_CHARACTER_CODE_TRANSLATION_TXT),
  351.         TAG_DONE))
  352.         {
  353.             struct IntuiMessage    *Massage;
  354.             ULONG             IClass,Code;
  355.             struct Gadget        *Gadget;
  356.             BYTE             Terminated = FALSE;
  357.             STRPTR             SendText    = NULL,
  358.                          ReceiveText    = NULL;
  359.  
  360.             GuideContext(CONTEXT_TRANSLATION);
  361.  
  362.             PushWindow(PanelWindow);
  363.  
  364.             AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  365.             RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  366.             GT_RefreshWindow(PanelWindow,NULL);
  367.  
  368.             ActiveGadget = NULL;
  369.  
  370.             if(SendTable[CharCode])
  371.             {
  372.                 TranslateBack(SendTable[CharCode] -> String,SendTable[CharCode] -> Len,SharedBuffer);
  373.  
  374.                 GT_SetGadgetAttrs(GadgetArray[SUBGAD_SEND],PanelWindow,NULL,
  375.                     GTST_String,SharedBuffer,
  376.                 TAG_DONE);
  377.             }
  378.  
  379.             if(ReceiveTable[CharCode])
  380.             {
  381.                 TranslateBack(ReceiveTable[CharCode] -> String,ReceiveTable[CharCode] -> Len,SharedBuffer);
  382.  
  383.                 GT_SetGadgetAttrs(GadgetArray[SUBGAD_RECEIVE],PanelWindow,NULL,
  384.                     GTST_String,SharedBuffer,
  385.                 TAG_DONE);
  386.             }
  387.  
  388.             SetSignal(0,SIG_BREAK);
  389.  
  390.             while(!Terminated)
  391.             {
  392.                 if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  393.                     break;
  394.  
  395.                 while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  396.                 {
  397.                     IClass    = Massage -> Class;
  398.                     Code    = Massage -> Code;
  399.                     Gadget    = (struct Gadget *)Massage -> IAddress;
  400.  
  401.                     GT_ReplyIMsg(Massage);
  402.  
  403.                     KeySelect(GadgetArray,SUBGAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);
  404.  
  405.                     if(IClass == IDCMP_ACTIVEWINDOW && ActiveGadget)
  406.                         ActivateGadget(ActiveGadget,PanelWindow,NULL);
  407.  
  408.                     if(IClass == IDCMP_GADGETDOWN)
  409.                     {
  410.                         if((Gadget -> GadgetType & GTYP_GTYPEMASK) == GTYP_STRGADGET)
  411.                             ActiveGadget = Gadget;
  412.                     }
  413.  
  414.                     if(IClass == IDCMP_CLOSEWINDOW)
  415.                         Terminated = TRUE;
  416.  
  417.                     if(IClass == IDCMP_GADGETUP)
  418.                     {
  419.                         switch(Gadget -> GadgetID)
  420.                         {
  421.                             case SUBGAD_SEND:
  422.  
  423.                                 ActivateGadget(ActiveGadget = GadgetArray[SUBGAD_RECEIVE],PanelWindow,NULL);
  424.                                 break;
  425.  
  426.                             case SUBGAD_USE:
  427.  
  428.                                 SendText    = SZ_GetString(GadgetArray[SUBGAD_SEND]);
  429.                                 ReceiveText    = SZ_GetString(GadgetArray[SUBGAD_RECEIVE]);
  430.  
  431.                                 Terminated = TRUE;
  432.                                 break;
  433.  
  434.                             case SUBGAD_CANCEL:
  435.  
  436.                                 Terminated = TRUE;
  437.                                 break;
  438.                         }
  439.                     }
  440.                 }
  441.             }
  442.  
  443.             if(GadgetList)
  444.                 RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  445.  
  446.             if(SendText)
  447.             {
  448.                 if(*SendText)
  449.                 {
  450.                     struct TranslationEntry *Entry = AllocTranslationEntry(SendText);
  451.  
  452.                     if(Entry)
  453.                     {
  454.                         if(SendTable[CharCode])
  455.                             FreeTranslationEntry(SendTable[CharCode]);
  456.  
  457.                         SendTable[CharCode] = Entry;
  458.  
  459.                         Result = TRUE;
  460.                     }
  461.                 }
  462.                 else
  463.                 {
  464.                     if(SendTable[CharCode])
  465.                         FreeTranslationEntry(SendTable[CharCode]);
  466.  
  467.                     SendTable[CharCode] = NULL;
  468.  
  469.                     Result = TRUE;
  470.                 }
  471.             }
  472.  
  473.             if(ReceiveText)
  474.             {
  475.                 if(*ReceiveText)
  476.                 {
  477.                     struct TranslationEntry *Entry = AllocTranslationEntry(ReceiveText);
  478.  
  479.                     if(Entry)
  480.                     {
  481.                         if(ReceiveTable[CharCode])
  482.                             FreeTranslationEntry(ReceiveTable[CharCode]);
  483.  
  484.                         ReceiveTable[CharCode] = Entry;
  485.  
  486.                         Result = TRUE;
  487.                     }
  488.                 }
  489.                 else
  490.                 {
  491.                     if(ReceiveTable[CharCode])
  492.                         FreeTranslationEntry(ReceiveTable[CharCode]);
  493.  
  494.                     ReceiveTable[CharCode] = NULL;
  495.  
  496.                     Result = TRUE;
  497.                 }
  498.             }
  499.  
  500.             PopWindow();
  501.  
  502.             CloseWindow(PanelWindow);
  503.         }
  504.     }
  505.  
  506.     FreeGadgets(GadgetList);
  507.  
  508.     return(Result);
  509. }
  510.  
  511. BYTE
  512. TranslationPanel()
  513. {
  514.     struct Window    *PanelWindow;
  515.     struct Gadget    *GadgetList = NULL;
  516.     struct Gadget    **GadgetArray;
  517.     BYTE         Half        = 2;
  518.     BYTE         MadeChanges    = FALSE,
  519.              Created    = FALSE;
  520.  
  521.     if(!SendTable)
  522.     {
  523.         if(!(SendTable = AllocTranslationTable()))
  524.         {
  525.             DisplayBeep(Window -> WScreen);
  526.  
  527.             return(FALSE);
  528.         }
  529.  
  530.         if(!(ReceiveTable = AllocTranslationTable()))
  531.         {
  532.             DisplayBeep(Window -> WScreen);
  533.  
  534.             FreeTranslationTable(SendTable);
  535.  
  536.             SendTable = NULL;
  537.  
  538.             return(FALSE);
  539.         }
  540.  
  541.         if(!FillTranslationTable(SendTable))
  542.         {
  543.             DisplayBeep(Window -> WScreen);
  544.  
  545.             FreeTranslationTable(SendTable);
  546.  
  547.             SendTable = NULL;
  548.  
  549.             FreeTranslationTable(ReceiveTable);
  550.  
  551.             ReceiveTable = NULL;
  552.  
  553.             return(FALSE);
  554.         }
  555.  
  556.         if(!FillTranslationTable(ReceiveTable))
  557.         {
  558.             DisplayBeep(Window -> WScreen);
  559.  
  560.             FreeTranslationTable(SendTable);
  561.  
  562.             SendTable = NULL;
  563.  
  564.             FreeTranslationTable(ReceiveTable);
  565.  
  566.             ReceiveTable = NULL;
  567.  
  568.             return(FALSE);
  569.         }
  570.  
  571.         Created = TRUE;
  572.     }
  573.  
  574.     if(GadgetArray = (struct Gadget **)AllocVec(sizeof(struct Gadget *) * (MAINGAD_CANCEL + 1),MEMF_ANY | MEMF_CLEAR))
  575.     {
  576.         if(CreateAllMainGadgets(GadgetArray,&GadgetList,&Half))
  577.         {
  578.             if(PanelWindow = OpenWindowTags(NULL,
  579.                 WA_Left,    GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
  580.                 WA_Top,        GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())    / 2,
  581.                 WA_Width,    SZ_GetWindowWidth(),
  582.                 WA_Height,    SZ_GetWindowHeight(),
  583.  
  584.                 WA_Activate,    TRUE,
  585.                 WA_DragBar,    TRUE,
  586.                 WA_DepthGadget,    TRUE,
  587.                 WA_RMBTrap,    TRUE,
  588.                 WA_DepthGadget,    TRUE,
  589.                 WA_CloseGadget,    TRUE,
  590.                 WA_CustomScreen,Window -> WScreen,
  591.  
  592.                 WA_IDCMP,    IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | BUTTONIDCMP | CYCLEIDCMP,
  593.  
  594.                 WA_Title,    LocaleString(MSG_TRANSLATIONPANEL_CHARACTER_TABLE_TXT),
  595.             TAG_DONE))
  596.             {
  597.                 struct IntuiMessage    *Massage;
  598.                 ULONG             IClass,Code;
  599.                 struct Gadget        *Gadget;
  600.                 BYTE             Terminated = FALSE;
  601.  
  602.                 UBYTE             DummyBuffer[256],
  603.                             *DummyChar;
  604.  
  605.                 struct FileRequester    *FileRequest;
  606.  
  607.                 PushWindow(PanelWindow);
  608.  
  609.                 AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  610.                 RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  611.                 GT_RefreshWindow(PanelWindow,NULL);
  612.  
  613.                 ActiveGadget = NULL;
  614.  
  615.                 SetSignal(0,SIG_BREAK);
  616.  
  617.                 while(!Terminated)
  618.                 {
  619.                     if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  620.                         break;
  621.  
  622.                     while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  623.                     {
  624.                         IClass    = Massage -> Class;
  625.                         Code    = Massage -> Code;
  626.                         Gadget    = (struct Gadget *)Massage -> IAddress;
  627.  
  628.                         GT_ReplyIMsg(Massage);
  629.  
  630.                         if(IClass == IDCMP_VANILLAKEY)
  631.                             KeySelect(GadgetArray,MAINGAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);
  632.  
  633.                         if(IClass == IDCMP_CLOSEWINDOW)
  634.                             Terminated = TRUE;
  635.  
  636.                         if(IClass == IDCMP_GADGETUP)
  637.                         {
  638.                             switch(Gadget -> GadgetID)
  639.                             {
  640.                                 case MAINGAD_HALF:
  641.  
  642.                                     BlockWindow(PanelWindow);
  643.  
  644.                                     Half = Code;
  645.  
  646.                                     RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  647.  
  648.                                     FreeGadgets(GadgetList);
  649.  
  650.                                     GadgetList = NULL;
  651.  
  652.                                     if(CreateAllMainGadgets(GadgetArray,&GadgetList,&Half))
  653.                                     {
  654.                                         AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  655.                                         RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  656.                                         GT_RefreshWindow(PanelWindow,NULL);
  657.  
  658.                                         ActiveGadget = NULL;
  659.                                     }
  660.  
  661.                                     ReleaseWindow(PanelWindow);
  662.  
  663.                                     break;
  664.  
  665.                                 case MAINGAD_LOAD:
  666.  
  667.                                     strcpy(DummyBuffer,LastTranslation);
  668.  
  669.                                     DummyChar = PathPart(DummyBuffer);
  670.  
  671.                                     *DummyChar = 0;
  672.  
  673.                                     BlockWindow(PanelWindow);
  674.  
  675.                                     if(FileRequest = GetFile(LocaleString(MSG_TRANSLATIONPANEL_LOAD_TRANSLATION_TABLES_TXT),DummyBuffer,FilePart(LastTranslation),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT)))
  676.                                     {
  677.                                         struct TranslationEntry **Send,**Receive = NULL;
  678.                                         BYTE Success = FALSE;
  679.  
  680.                                         if(Send = AllocTranslationTable())
  681.                                         {
  682.                                             if(Receive = AllocTranslationTable())
  683.                                                 Success = LoadTranslationTables(DummyBuffer,Send,Receive);
  684.                                         }
  685.  
  686.                                         if(!Success)
  687.                                         {
  688.                                             MyEasyRequest(Window,LocaleString(MSG_TRANSLATIONPANEL_COULD_NOT_LOAD_TRANSLATION_TABLES_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  689.  
  690.                                             if(Send)
  691.                                                 FreeTranslationTable(Send);
  692.  
  693.                                             if(Receive)
  694.                                                 FreeTranslationTable(Receive);
  695.                                         }
  696.                                         else
  697.                                         {
  698.                                             strcpy(Config -> FileConfig -> TranslationFileName,DummyBuffer);
  699.  
  700.                                             strcpy(LastTranslation,DummyBuffer);
  701.  
  702.                                             MadeChanges    = FALSE;
  703.                                             Created        = FALSE;
  704.  
  705.                                             FreeTranslationTable(SendTable);
  706.                                             FreeTranslationTable(ReceiveTable);
  707.  
  708.                                             SendTable    = Send;
  709.                                             ReceiveTable    = Receive;
  710.                                         }
  711.                                     }
  712.  
  713.                                     ReleaseWindow(PanelWindow);
  714.  
  715.                                     break;
  716.  
  717.                                 case MAINGAD_SAVE:
  718.  
  719.                                     strcpy(DummyBuffer,LastTranslation);
  720.  
  721.                                     DummyChar = PathPart(DummyBuffer);
  722.  
  723.                                     *DummyChar = 0;
  724.  
  725.                                     BlockWindow(PanelWindow);
  726.  
  727.                                     if(FileRequest = GetFile(LocaleString(MSG_TRANSLATIONPANEL_SAVE_TRANSLATION_TABLES_TXT),DummyBuffer,FilePart(LastTranslation),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT)))
  728.                                     {
  729.                                         if(!SaveTranslationTables(DummyBuffer,SendTable,ReceiveTable))
  730.                                             MyEasyRequest(Window,LocaleString(MSG_TRANSLATIONPANEL_COULD_NOT_SAVE_TRANSLATION_TABLES_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  731.                                         else
  732.                                         {
  733.                                             strcpy(LastTranslation,DummyBuffer);
  734.  
  735.                                             MadeChanges = FALSE;
  736.  
  737.                                             Created = FALSE;
  738.                                         }
  739.                                     }
  740.  
  741.                                     ReleaseWindow(PanelWindow);
  742.  
  743.                                     break;
  744.  
  745.                                 case MAINGAD_USE:
  746.  
  747.                                     strcpy(Config -> FileConfig -> TranslationFileName,LastTranslation);
  748.  
  749.                                     Terminated = TRUE;
  750.                                     break;
  751.  
  752.                                 case MAINGAD_CANCEL:
  753.  
  754.                                     Terminated = TRUE;
  755.                                     break;
  756.  
  757.                                 default:
  758.  
  759.                                     if(Gadget -> GadgetID < 256)
  760.                                     {
  761.                                         BlockWindow(PanelWindow);
  762.  
  763.                                         MadeChanges |= SubPanel(Gadget -> GadgetID);
  764.  
  765.                                         ReleaseWindow(PanelWindow);
  766.                                     }
  767.  
  768.                                     break;
  769.                             }
  770.                         }
  771.                     }
  772.                 }
  773.  
  774.                 if(GadgetList)
  775.                     RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  776.  
  777.                 PopWindow();
  778.  
  779.                 CloseWindow(PanelWindow);
  780.             }
  781.         }
  782.  
  783.         FreeGadgets(GadgetList);
  784.  
  785.         FreeVec(GadgetArray);
  786.     }
  787.  
  788.     if(!MadeChanges && Created || (IsStandardTable(SendTable) && IsStandardTable(ReceiveTable)))
  789.     {
  790.         FreeTranslationTable(SendTable);
  791.  
  792.         SendTable = NULL;
  793.  
  794.         FreeTranslationTable(ReceiveTable);
  795.  
  796.         ReceiveTable = NULL;
  797.     }
  798.  
  799.     return(MadeChanges);
  800. }
  801.