home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / term-source.lha / TranslationPanel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  15.6 KB  |  752 lines

  1. /*
  2. **    TranslationPanel.c
  3. **
  4. **    Character code translation editing panel
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16. enum    {    GAD_PAGE=1,GAD_USE,GAD_DEFAULT,GAD_LOAD,GAD_SAVE,GAD_CANCEL,GAD_CLOSE,
  17.             GAD_DISCARD,
  18.             GAD_CHAR=700
  19.         };
  20.  
  21. STATIC BOOL
  22. CodePanel(struct Window *Window,UBYTE CharCode,struct TranslationEntry **SendTable,struct TranslationEntry **ReceiveTable)
  23. {
  24.     struct LayoutHandle    *Handle;
  25.     BOOL                 Result = FALSE;
  26.  
  27.     if(Handle = LT_CreateHandleTags(Window -> WScreen,
  28.         LH_LocaleHook,    &LocaleHook,
  29.     TAG_DONE))
  30.     {
  31.         struct Window    *PanelWindow;
  32.         UBYTE             SendBuffer[256],
  33.                          ReceiveBuffer[256];
  34.  
  35.         if(SendTable[CharCode])
  36.             TranslateBack(SendTable[CharCode] -> String,SendTable[CharCode] -> Len,SendBuffer);
  37.         else
  38.             SendBuffer[0] = 0;
  39.  
  40.         if(ReceiveTable[CharCode])
  41.             TranslateBack(ReceiveTable[CharCode] -> String,ReceiveTable[CharCode] -> Len,ReceiveBuffer);
  42.         else
  43.             ReceiveBuffer[0] = 0;
  44.  
  45.         LT_New(Handle,
  46.             LA_Type,    VERTICAL_KIND,
  47.         TAG_DONE);
  48.         {
  49.             UBYTE    OctalBuffer[6],HexBuffer[6],BinBuffer[10];
  50.             LONG    i,Code;
  51.  
  52.             OctalBuffer[0] = '0';
  53.  
  54.             for(Code = CharCode, i = 0 ; i < 3 ; i++)
  55.             {
  56.                 OctalBuffer[2 - i + 1] = '0' + (Code & 7);
  57.  
  58.                 Code = Code >> 3;
  59.             }
  60.  
  61.             OctalBuffer[4] = 0;
  62.  
  63.             SPrintf(HexBuffer,"$%02lx",CharCode);
  64.  
  65.             BinBuffer[0] = '%';
  66.  
  67.             for(Code = CharCode, i = 0 ; i < 8 ; i++)
  68.             {
  69.                 BinBuffer[7 - i + 1] = '0' + (Code & 1);
  70.  
  71.                 Code = Code >> 1;
  72.             }
  73.  
  74.             BinBuffer[9] = 0;
  75.  
  76.             if(CharCodes[CharCode][0] == '1' && CharCodes[CharCode][1])
  77.                 SPrintf(SharedBuffer,LocaleString(MSG_V36_1772),CharCodes[CharCode]);
  78.             else
  79.                 SPrintf(SharedBuffer,LocaleString(MSG_V36_1773),CharCode,CharCodes[CharCode]);
  80.  
  81.             SPrintf(SharedBuffer + strlen(SharedBuffer)," · %s · %s · %s",HexBuffer,OctalBuffer,BinBuffer);
  82.  
  83.             LT_New(Handle,
  84.                 LA_Type,        VERTICAL_KIND,
  85.                 LA_LabelText,    SharedBuffer,
  86.             TAG_DONE);
  87.             {
  88.                 LT_New(Handle,
  89.                     LA_Type,                STRING_KIND,
  90.                     LA_LabelID,                MSG_TRANSLATIONPANEL_SEND_CODE_AS_GAD,
  91.                     LA_STRPTR,                SendBuffer,
  92.                     LA_Chars,                30,
  93.                     STRINGA_Justification,    GACT_STRINGCENTER,
  94.                     GTST_MaxChars,            255,
  95.                 TAG_DONE);
  96.  
  97.                 LT_New(Handle,
  98.                     LA_Type,                STRING_KIND,
  99.                     LA_LabelID,                MSG_TRANSLATIONPANEL_RECEIVE_CODE_AS_GAD,
  100.                     LA_STRPTR,                ReceiveBuffer,
  101.                     STRINGA_Justification,    GACT_STRINGCENTER,
  102.                     GTST_MaxChars,            255,
  103.                 TAG_DONE);
  104.  
  105.                 LT_EndGroup(Handle);
  106.             }
  107.  
  108.             LT_New(Handle,
  109.                 LA_Type,VERTICAL_KIND,
  110.             TAG_DONE);
  111.             {
  112.                 LT_New(Handle,
  113.                     LA_Type,        XBAR_KIND,
  114.                     LAXB_FullSize,    TRUE,
  115.                 TAG_DONE);
  116.  
  117.                 LT_EndGroup(Handle);
  118.             }
  119.  
  120.             LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  121.                 LAGR_SameSize,    TRUE,
  122.                 LAGR_Spread,    TRUE,
  123.             TAG_DONE);
  124.             {
  125.                 LT_New(Handle,
  126.                     LA_Type,        BUTTON_KIND,
  127.                     LA_LabelID,        MSG_GLOBAL_USE_GAD,
  128.                     LA_ID,            GAD_USE,
  129.                     LABT_ReturnKey,    TRUE,
  130.                     LABT_ExtraFat,    TRUE,
  131.                 TAG_DONE);
  132.  
  133.                 LT_New(Handle,
  134.                     LA_Type,        BUTTON_KIND,
  135.                     LA_LabelID,        MSG_GLOBAL_CANCEL_GAD,
  136.                     LA_ID,            GAD_CANCEL,
  137.                     LABT_EscKey,    TRUE,
  138.                 TAG_DONE);
  139.  
  140.                 LT_EndGroup(Handle);
  141.             }
  142.  
  143.             LT_EndGroup(Handle);
  144.         }
  145.  
  146.         if(PanelWindow = LT_Build(Handle,
  147.             LAWN_TitleID,        MSG_TRANSLATIONPANEL_CHARACTER_CODE_TRANSLATION_TXT,
  148.             LAWN_IDCMP,            IDCMP_CLOSEWINDOW,
  149.             LAWN_HelpHook,        &GuideHook,
  150.             LAWN_Parent,        Window,
  151.             WA_DepthGadget,        TRUE,
  152.             WA_CloseGadget,        TRUE,
  153.             WA_DragBar,            TRUE,
  154.             WA_RMBTrap,            TRUE,
  155.             WA_Activate,        TRUE,
  156.             WA_SimpleRefresh,    TRUE,
  157.         TAG_DONE))
  158.         {
  159.             struct IntuiMessage    *Message;
  160.             BOOL                 Done = FALSE;
  161.             ULONG                 MsgClass;
  162.             struct Gadget        *MsgGadget;
  163.  
  164.             LT_ShowWindow(Handle,TRUE);
  165.  
  166.             GuideContext(CONTEXT_TRANSLATION);
  167.  
  168.             PushWindow(PanelWindow);
  169.  
  170.             do
  171.             {
  172.                 if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  173.                     break;
  174.  
  175.                 while(Message = (struct IntuiMessage *)LT_GetIMsg(Handle))
  176.                 {
  177.                     MsgClass    = Message -> Class;
  178.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  179.  
  180.                     LT_ReplyIMsg(Message);
  181.  
  182.                     if(MsgClass == IDCMP_CLOSEWINDOW)
  183.                         Done = TRUE;
  184.  
  185.                     if(MsgClass == IDCMP_GADGETUP)
  186.                     {
  187.                         switch(MsgGadget -> GadgetID)
  188.                         {
  189.                             case GAD_USE:
  190.  
  191.                                 LT_UpdateStrings(Handle);
  192.  
  193.                                 if(SendBuffer[0])
  194.                                 {
  195.                                     struct TranslationEntry *Entry = AllocTranslationEntry(SendBuffer);
  196.  
  197.                                     if(Entry)
  198.                                     {
  199.                                         if(SendTable[CharCode])
  200.                                             FreeTranslationEntry(SendTable[CharCode]);
  201.  
  202.                                         SendTable[CharCode] = Entry;
  203.  
  204.                                         Result = TRUE;
  205.                                     }
  206.                                 }
  207.                                 else
  208.                                 {
  209.                                     if(SendTable[CharCode])
  210.                                         FreeTranslationEntry(SendTable[CharCode]);
  211.  
  212.                                     SendTable[CharCode] = NULL;
  213.  
  214.                                     Result = TRUE;
  215.                                 }
  216.  
  217.                                 if(ReceiveBuffer[0])
  218.                                 {
  219.                                     struct TranslationEntry *Entry = AllocTranslationEntry(ReceiveBuffer);
  220.  
  221.                                     if(Entry)
  222.                                     {
  223.                                         if(ReceiveTable[CharCode])
  224.                                             FreeTranslationEntry(ReceiveTable[CharCode]);
  225.  
  226.                                         ReceiveTable[CharCode] = Entry;
  227.  
  228.                                         Result = TRUE;
  229.                                     }
  230.                                 }
  231.                                 else
  232.                                 {
  233.                                     if(ReceiveTable[CharCode])
  234.                                         FreeTranslationEntry(ReceiveTable[CharCode]);
  235.  
  236.                                     ReceiveTable[CharCode] = NULL;
  237.  
  238.                                     Result = TRUE;
  239.                                 }
  240.  
  241.                                 Done = TRUE;
  242.                                 break;
  243.  
  244.                             case GAD_CANCEL:
  245.  
  246.                                 Done = TRUE;
  247.                                 break;
  248.                         }
  249.                     }
  250.                 }
  251.             }
  252.             while(!Done);
  253.  
  254.             PopWindow();
  255.         }
  256.  
  257.         LT_DeleteHandle(Handle);
  258.     }
  259.  
  260.     return(Result);
  261. }
  262.  
  263. BOOL
  264. TranslationPanelConfig(struct Configuration *LocalConfig,struct TranslationEntry ***SendTablePtr,struct TranslationEntry ***ReceiveTablePtr,STRPTR LastTranslation,struct Window *Parent,BOOLEAN *ChangePtr)
  265. {
  266.     struct LayoutHandle        *Handle;
  267.     BOOL                     MadeChanges = FALSE,
  268.                              Created = FALSE;
  269.  
  270.     struct TranslationEntry    **SendTable    = *SendTablePtr,
  271.                             **ReceiveTable    = *ReceiveTablePtr;
  272.  
  273.     if(!SendTable)
  274.     {
  275.         if(!(SendTable = AllocTranslationTable()))
  276.         {
  277.             DisplayBeep(Window -> WScreen);
  278.  
  279.             return(FALSE);
  280.         }
  281.  
  282.         if(!(ReceiveTable = AllocTranslationTable()))
  283.         {
  284.             DisplayBeep(Window -> WScreen);
  285.  
  286.             FreeTranslationTable(SendTable);
  287.  
  288.             return(FALSE);
  289.         }
  290.  
  291.         if(!FillTranslationTable(SendTable))
  292.         {
  293.             DisplayBeep(Window -> WScreen);
  294.  
  295.             FreeTranslationTable(SendTable);
  296.             FreeTranslationTable(ReceiveTable);
  297.  
  298.             return(FALSE);
  299.         }
  300.  
  301.         if(!FillTranslationTable(ReceiveTable))
  302.         {
  303.             DisplayBeep(Window -> WScreen);
  304.  
  305.             FreeTranslationTable(SendTable);
  306.             FreeTranslationTable(ReceiveTable);
  307.  
  308.             return(FALSE);
  309.         }
  310.  
  311.         Created = TRUE;
  312.     }
  313.  
  314.     *SendTablePtr        = SendTable;
  315.     *ReceiveTablePtr    = ReceiveTable;
  316.  
  317.     if(Handle = LT_CreateHandleTags(Parent -> WScreen,
  318.         LH_LocaleHook,    &LocaleHook,
  319.     TAG_DONE))
  320.     {
  321.         struct Window    *PanelWindow;
  322.         LONG             i,Width,Max = 0;
  323.  
  324.         for(i = 0 ; i < 256 ; i++)
  325.         {
  326.             if((Width = LT_LabelChars(Handle,CharCodes[i])) > Max)
  327.                 Max = Width;
  328.         }
  329.  
  330.         LT_New(Handle,
  331.             LA_Type,VERTICAL_KIND,
  332.         TAG_DONE);
  333.         {
  334.             LT_New(Handle,
  335.                 LA_Type,VERTICAL_KIND,
  336.             TAG_DONE);
  337.             {
  338.                 STATIC STRPTR Halfs[] =
  339.                 {
  340.                     "NUL-DEL",
  341.                     "128-\"ÿ\"",
  342.                     NULL
  343.                 };
  344.  
  345.                 LT_New(Handle,
  346.                     LA_Type,        TAB_KIND,
  347.                     LA_LabelID,        MSG_TRANSLATIONPANEL_CHARACTER_PAGE_GAD,
  348.                     LA_ID,            GAD_PAGE,
  349.                     GTCY_Labels,    Halfs,
  350.                     LA_NoKey,        TRUE,
  351.                     LATB_FullWidth,    TRUE,
  352.                 TAG_DONE);
  353.  
  354.                 LT_EndGroup(Handle);
  355.             }
  356.  
  357.             LT_New(Handle,
  358.                 LA_Type,VERTICAL_KIND,
  359.             TAG_DONE);
  360.             {
  361.                 LONG i,j;
  362.  
  363.                 for(i = 0 ; i < 8 ; i++)
  364.                 {
  365.                     LT_New(Handle,
  366.                         LA_Type,        HORIZONTAL_KIND,
  367.                         LA_SameSize,    TRUE,
  368.                     TAG_DONE);
  369.                     {
  370.                         for(j = 0 ; j < 16 ; j++)
  371.                         {
  372.                             LT_New(Handle,
  373.                                 LA_Type,        BUTTON_KIND,
  374.                                 LA_LabelText,    CharCodes[i * 16 + j],
  375.                                 LA_ID,            GAD_CHAR + i * 16 + j,
  376.                                 LA_Chars,        Max,
  377.                                 LA_NoKey,        TRUE,
  378.                             TAG_DONE);
  379.                         }
  380.  
  381.                         LT_EndGroup(Handle);
  382.                     }
  383.                 }
  384.  
  385.                 LT_EndGroup(Handle);
  386.             }
  387.  
  388.             LT_New(Handle,
  389.                 LA_Type,VERTICAL_KIND,
  390.             TAG_DONE);
  391.             {
  392.                 LT_New(Handle,
  393.                     LA_Type,        XBAR_KIND,
  394.                     LAXB_FullSize,    TRUE,
  395.                 TAG_DONE);
  396.  
  397.                 LT_EndGroup(Handle);
  398.             }
  399.  
  400.             LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  401.                 LAGR_Spread,TRUE,
  402.             TAG_DONE);
  403.             {
  404.                 LT_New(Handle,
  405.                     LA_Type,        BUTTON_KIND,
  406.                     LA_LabelID,        MSG_GLOBAL_USE_GAD,
  407.                     LA_ID,            GAD_USE,
  408.                     LA_NoKey,        TRUE,
  409.                     LABT_ExtraFat,    TRUE,
  410.                 TAG_DONE);
  411.  
  412.                 LT_New(Handle,
  413.                     LA_Type,        BUTTON_KIND,
  414.                     LA_LabelID,        MSG_GLOBAL_DEFAULT_GAD,
  415.                     LA_ID,            GAD_DEFAULT,
  416.                     LA_NoKey,        TRUE,
  417.                     LABT_ExtraFat,    TRUE,
  418.                 TAG_DONE);
  419.  
  420.                 LT_New(Handle,
  421.                     LA_Type,        BUTTON_KIND,
  422.                     LA_LabelID,        MSG_GLOBAL_LOAD_GAD,
  423.                     LA_ID,            GAD_LOAD,
  424.                     LA_NoKey,        TRUE,
  425.                     LABT_ExtraFat,    TRUE,
  426.                 TAG_DONE);
  427.  
  428.                 LT_New(Handle,
  429.                     LA_Type,        BUTTON_KIND,
  430.                     LA_LabelID,        MSG_GLOBAL_SAVE_GAD,
  431.                     LA_ID,            GAD_SAVE,
  432.                     LA_NoKey,        TRUE,
  433.                     LABT_ExtraFat,    TRUE,
  434.                 TAG_DONE);
  435.  
  436.                 LT_New(Handle,
  437.                     LA_Type,        BUTTON_KIND,
  438.                     LA_LabelID,        MSG_DISCARD_GAD,
  439.                     LA_ID,            GAD_DISCARD,
  440.                     LA_NoKey,        TRUE,
  441.                     LABT_ExtraFat,    TRUE,
  442.                 TAG_DONE);
  443.  
  444.                 LT_New(Handle,
  445.                     LA_Type,        BUTTON_KIND,
  446.                     LA_LabelID,        MSG_GLOBAL_CLOSE_TXT,
  447.                     LA_ID,            GAD_CANCEL,
  448.                     LA_NoKey,        TRUE,
  449.                     LABT_ExtraFat,    TRUE,
  450.                 TAG_DONE);
  451.  
  452.                 LT_EndGroup(Handle);
  453.             }
  454.  
  455.             LT_EndGroup(Handle);
  456.         }
  457.  
  458.         if(PanelWindow = LT_Build(Handle,
  459.             LAWN_TitleID,        MSG_TRANSLATIONPANEL_CHARACTER_TABLE_TXT,
  460.             LAWN_IDCMP,            IDCMP_CLOSEWINDOW,
  461.             LAWN_HelpHook,        &GuideHook,
  462.             LAWN_Parent,        Parent,
  463.             WA_DepthGadget,        TRUE,
  464.             WA_CloseGadget,        TRUE,
  465.             WA_DragBar,            TRUE,
  466.             WA_RMBTrap,            TRUE,
  467.             WA_Activate,        TRUE,
  468.             WA_SimpleRefresh,    TRUE,
  469.         TAG_DONE))
  470.         {
  471.             struct IntuiMessage        *Message;
  472.             BOOL                     Done = FALSE;
  473.             ULONG                     MsgClass,
  474.                                      MsgQualifier;
  475.             UWORD                     MsgCode;
  476.             struct Gadget            *MsgGadget;
  477.             LONG                     CharBase = 0,i;
  478.             UBYTE                     DummyBuffer[256],
  479.                                     *DummyChar;
  480.             struct FileRequester    *FileRequest;
  481.             LONG                     KeyCode;
  482.  
  483.             PushWindow(PanelWindow);
  484.  
  485.             LT_ShowWindow(Handle,TRUE);
  486.  
  487.             do
  488.             {
  489.                 if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  490.                     break;
  491.  
  492.                 while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
  493.                 {
  494.                     MsgClass        = Message -> Class;
  495.                     MsgQualifier    = Message -> Qualifier;
  496.                     MsgCode            = Message -> Code;
  497.                     MsgGadget        = (struct Gadget *)Message -> IAddress;
  498.  
  499.                     if(MsgClass == IDCMP_RAWKEY)
  500.                         KeyCode = LT_GetCode(MsgQualifier,MsgClass,MsgCode,MsgGadget);
  501.                     else
  502.                         KeyCode = -1;
  503.  
  504.                     GT_ReplyIMsg(Message);
  505.  
  506.                     LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  507.  
  508.                     if(MsgClass == IDCMP_CLOSEWINDOW && KeyCode == -1)
  509.                         Done = TRUE;
  510.  
  511.                     if(KeyCode != -1)
  512.                     {
  513.                         if(KeyCode >= CharBase && KeyCode < CharBase + 128)
  514.                             LT_PressButton(Handle,GAD_CHAR + KeyCode - CharBase);
  515.  
  516.                         LT_LockWindow(PanelWindow);
  517.  
  518.                         MadeChanges |= CodePanel(PanelWindow,KeyCode,SendTable,ReceiveTable);
  519.  
  520.                         if(ChangePtr)
  521.                             *ChangePtr |= MadeChanges;
  522.  
  523.                         LT_UnlockWindow(PanelWindow);
  524.  
  525.                         LT_ShowWindow(Handle,TRUE);
  526.                     }
  527.  
  528.                     if(MsgClass == IDCMP_GADGETUP)
  529.                     {
  530.                         switch(MsgGadget -> GadgetID)
  531.                         {
  532.                             case GAD_PAGE:
  533.  
  534.                                 LT_LockWindow(PanelWindow);
  535.  
  536.                                 if(MsgCode)
  537.                                 {
  538.                                     for(i = 0 ; i < 128 ; i++)
  539.                                         LT_SetAttributes(Handle,GAD_CHAR + i,LA_LabelText,CharCodes[128 + i],TAG_DONE);
  540.  
  541.                                     CharBase = 128;
  542.                                 }
  543.                                 else
  544.                                 {
  545.                                     for(i = 0 ; i < 128 ; i++)
  546.                                         LT_SetAttributes(Handle,GAD_CHAR + i,LA_LabelText,CharCodes[0 + i],TAG_DONE);
  547.  
  548.                                     CharBase = 0;
  549.                                 }
  550.  
  551.                                 if(!LT_Rebuild(Handle,NULL,0,0,FALSE))
  552.                                 {
  553.                                     LT_DeleteHandle(Handle);
  554.  
  555.                                     Handle = NULL;
  556.  
  557.                                     Done = TRUE;
  558.                                 }
  559.                                 else
  560.                                     LT_UnlockWindow(PanelWindow);
  561.  
  562.                                 break;
  563.  
  564.                             case GAD_DISCARD:
  565.  
  566.                                 MadeChanges = Done = TRUE;
  567.                                 LastTranslation[0] = 0;
  568.  
  569.                                 if(LocalConfig)
  570.                                     strcpy(LocalConfig->TranslationFileName,LastTranslation);
  571.  
  572.                             case GAD_DEFAULT:
  573.  
  574.                                 if(SendTable)
  575.                                 {
  576.                                     struct TranslationEntry **Table;
  577.  
  578.                                     if(Table = AllocTranslationTable())
  579.                                     {
  580.                                         if(FillTranslationTable(Table))
  581.                                         {
  582.                                             FreeTranslationTable(SendTable);
  583.  
  584.                                             SendTable = Table;
  585.                                         }
  586.                                     }
  587.                                 }
  588.  
  589.                                 if(ReceiveTable)
  590.                                 {
  591.                                     struct TranslationEntry **Table;
  592.  
  593.                                     if(Table = AllocTranslationTable())
  594.                                     {
  595.                                         if(FillTranslationTable(Table))
  596.                                         {
  597.                                             FreeTranslationTable(ReceiveTable);
  598.  
  599.                                             ReceiveTable = Table;
  600.                                         }
  601.                                     }
  602.                                 }
  603.  
  604.                                 break;
  605.  
  606.                             case GAD_CLOSE:
  607.                             case GAD_USE:
  608.  
  609.                                 Done = TRUE;
  610.                                 break;
  611.  
  612.                             case GAD_CANCEL:
  613.  
  614.                                 Done = TRUE;
  615.                                 break;
  616.  
  617.                             case GAD_LOAD:
  618.  
  619.                                 strcpy(DummyBuffer,LastTranslation);
  620.  
  621.                                 DummyChar = PathPart(DummyBuffer);
  622.  
  623.                                 *DummyChar = 0;
  624.  
  625.                                 LT_LockWindow(PanelWindow);
  626.  
  627.                                 if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_TRANSLATIONPANEL_LOAD_TRANSLATION_TABLES_TXT),DummyBuffer,FilePart(LastTranslation),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  628.                                 {
  629.                                     struct TranslationEntry **Send,**Receive = NULL;
  630.                                     BOOL Success = FALSE;
  631.  
  632.                                     if(Send = AllocTranslationTable())
  633.                                     {
  634.                                         if(Receive = AllocTranslationTable())
  635.                                             Success = LoadTranslationTables(DummyBuffer,Send,Receive);
  636.                                     }
  637.  
  638.                                     if(!Success)
  639.                                     {
  640.                                         ShowError(PanelWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
  641.  
  642.                                         if(Send)
  643.                                             FreeTranslationTable(Send);
  644.  
  645.                                         if(Receive)
  646.                                             FreeTranslationTable(Receive);
  647.                                     }
  648.                                     else
  649.                                     {
  650.                                         if(LocalConfig)
  651.                                             strcpy(LocalConfig -> TranslationFileName,DummyBuffer);
  652.  
  653.                                         strcpy(LastTranslation,DummyBuffer);
  654.  
  655.                                         MadeChanges    = TRUE;
  656.                                         Created        = FALSE;
  657.  
  658.                                         FreeTranslationTable(SendTable);
  659.                                         FreeTranslationTable(ReceiveTable);
  660.  
  661.                                         SendTable        = Send;
  662.                                         ReceiveTable    = Receive;
  663.  
  664.                                         if(ChangePtr)
  665.                                             *ChangePtr = FALSE;
  666.                                     }
  667.  
  668.                                     FreeAslRequest(FileRequest);
  669.                                 }
  670.  
  671.                                 LT_UnlockWindow(PanelWindow);
  672.                                 break;
  673.  
  674.                             case GAD_SAVE:
  675.  
  676.                                 strcpy(DummyBuffer,LastTranslation);
  677.  
  678.                                 DummyChar = PathPart(DummyBuffer);
  679.  
  680.                                 *DummyChar = 0;
  681.  
  682.                                 LT_LockWindow(PanelWindow);
  683.  
  684.                                 if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_TRANSLATIONPANEL_SAVE_TRANSLATION_TABLES_TXT),DummyBuffer,FilePart(LastTranslation),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  685.                                 {
  686.                                     if(!SaveTranslationTables(DummyBuffer,SendTable,ReceiveTable))
  687.                                         ShowError(PanelWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  688.                                     else
  689.                                     {
  690.                                         strcpy(LastTranslation,DummyBuffer);
  691.  
  692.                                         if(LocalConfig)
  693.                                             strcpy(LocalConfig->TranslationFileName,LastTranslation);
  694.  
  695.                                         Created = FALSE;
  696.  
  697.                                         if(ChangePtr)
  698.                                             *ChangePtr = FALSE;
  699.                                     }
  700.  
  701.                                     FreeAslRequest(FileRequest);
  702.                                 }
  703.  
  704.                                 LT_UnlockWindow(PanelWindow);
  705.                                 break;
  706.  
  707.                             default:
  708.  
  709.                                 if(MsgGadget -> GadgetID >= GAD_CHAR && MsgGadget -> GadgetID < GAD_CHAR + 128)
  710.                                 {
  711.                                     LT_LockWindow(PanelWindow);
  712.  
  713.                                     MadeChanges |= CodePanel(PanelWindow,CharBase + MsgGadget -> GadgetID - GAD_CHAR,SendTable,ReceiveTable);
  714.  
  715.                                     if(ChangePtr)
  716.                                         *ChangePtr |= MadeChanges;
  717.  
  718.                                     LT_UnlockWindow(PanelWindow);
  719.  
  720.                                     LT_ShowWindow(Handle,TRUE);
  721.                                 }
  722.  
  723.                                 break;
  724.                         }
  725.                     }
  726.                 }
  727.             }
  728.             while(!Done);
  729.  
  730.             PopWindow();
  731.         }
  732.  
  733.         LT_DeleteHandle(Handle);
  734.     }
  735.  
  736.     if((!MadeChanges && Created) || (IsStandardTable(SendTable) && IsStandardTable(ReceiveTable)))
  737.     {
  738.         FreeTranslationTable(SendTable);
  739.  
  740.         SendTable = NULL;
  741.  
  742.         FreeTranslationTable(ReceiveTable);
  743.  
  744.         ReceiveTable = NULL;
  745.     }
  746.  
  747.     *SendTablePtr        = SendTable;
  748.     *ReceiveTablePtr    = ReceiveTable;
  749.  
  750.     return(MadeChanges);
  751. }
  752.