    001package org.vishia.commander;
    002
    003import java.util.Iterator;
    004import java.util.Map;
    005import java.util.TreeMap;
    006
    007import org.vishia.gral.base.GralButton;
    008import org.vishia.gral.base.GralMenu;
    009import org.vishia.gral.base.GralPos;
    010import org.vishia.gral.base.GralWidget;
    011import org.vishia.gral.base.GralMng;
    012import org.vishia.gral.ifc.GralButtonKeyMenu;
    013import org.vishia.gral.ifc.GralUserAction;
    014import org.vishia.gral.ifc.GralWidget_ifc;
    015import org.vishia.util.KeyCode;
    016
    017/**This class contains all functionality of the function buttons in The-file-Commander.
    018 * @author Hartmut Schorrig
    019 *
    020 */
    021public class FcmdButtons
    022{
    023
    024  /**Version, history and copyright/copyleft.
    025   * <ul>
    026   * <li>2012-06-16 Hartmut new: {@link #processKey(int)}: Now all control keys are set together with the buttons
    027   *   in {@link #setBtnMenuAndKeys(GralUserAction, String)}.
    028   * <li>2012-01-01 created.
    029   * </ul>
    030   *
    031   * <b>Copyright/Copyleft</b>:<br>
    032   * For this source the LGPL Lesser General Public License,
    033   * published by the Free Software Foundation is valid.
    034   * It means:
    035   * <ol>
    036   * <li> You can use this source without any restriction for any desired purpose.
    037   * <li> You can redistribute copies of this source to everybody.
    038   * <li> Every user of this source, also the user of redistribute copies
    039   *    with or without payment, must accept this license for further using.
    040   * <li> But the LPGL is not appropriate for a whole software product,
    041   *    if this source is only a part of them. It means, the user
    042   *    must publish this part of source,
    043   *    but doesn't need to publish the whole source of the own product.
    044   * <li> You can study and modify (improve) this source
    045   *    for own using or for redistribution, but you have to license the
    046   *    modified sources likewise under this LGPL Lesser General Public License.
    047   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    048   * </ol>
    049   * If you intent to use this source without publishing its usage, you can get
    050   * a second license subscribing a special contract with the author.
    051   *
    052   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    053   */
    054  public static final int version = 20120617;
    055
    056  private final Fcmd main;
    057
    058  GralButton buttonDel;
    059
    060  boolean bButtonVisible = true;
    061
    062  FcmdButtons(Fcmd main){
    063    this.main = main;
    064    main._gralMng.setMainKeyAction(actionMainKeys);
    065  }
    066
    067  static class ButtonAction{
    068    final GralUserAction action;
    069    final String button;
    070    final String text;
    071    public ButtonAction(GralUserAction action, String button, String text)
    072    { this.action = action;
    073      this.button = button;
    074      this.text = text;
    075    }
    076  }
    077
    078  ButtonAction emptyButton = new ButtonAction(null, "", "");
    079
    080  Map<String, ButtonAction> idxButtons = new TreeMap<String, ButtonAction>();
    081
    082  /**This is only a helper String array to associate button texts from {@link FCmdIdent} in form "aF1:Text"
    083   * and there action to the viewable buttons.
    084   * The order of character are in alphabetic one because the given button control texts are processed in that order.
    085   */
    086  final String[] b1 =
    087    {  "F1",  "F2",  "F3",  "F4",  "F5",  "F6",  "F7",  "F8",  "F9", "F10"
    088    , "aF1", "aF2", "aF3", "aF4", "aF5", "aF6", "aF7", "aF8", "aF9", "aF10"
    089    , "cF1", "cF2", "cF3", "cF4", "cF5", "cF6", "cF7", "cF8", "cF9", "cF10"
    090    , "gF1", "gF2", "gF3", "gF4", "gF5", "gF6", "gF7", "gF8", "gF9", "gF10"
    091    , "sF1", "sF2", "sF3", "sF4", "sF5", "sF6", "sF7", "sF8", "sF9", "sF10"
    092    };
    093
    094  /*
    095  int[] keys = { KeyCode.F1, KeyCode.F2, KeyCode.F3, KeyCode.F4, KeyCode.F5, KeyCode.F6, KeyCode.F7, KeyCode.F8, KeyCode.F9, KeyCode.F10
    096      , KeyCode.alt + KeyCode.F1, KeyCode.alt + KeyCode.F2, KeyCode.alt + KeyCode.F3, KeyCode.alt + KeyCode.F4, KeyCode.alt + KeyCode.F5, KeyCode.alt + KeyCode.F6
    097      , KeyCode.alt + KeyCode.F7, KeyCode.alt + KeyCode.F8, KeyCode.alt + KeyCode.F9, KeyCode.alt + KeyCode.F10
    098      , KeyCode.ctrl + KeyCode.F1, KeyCode.ctrl + KeyCode.F2, KeyCode.ctrl + KeyCode.F3, KeyCode.ctrl + KeyCode.F4, KeyCode.ctrl + KeyCode.F5, KeyCode.ctrl + KeyCode.F6
    099      , KeyCode.ctrl + KeyCode.F7, KeyCode.ctrl + KeyCode.F8, KeyCode.ctrl + KeyCode.F9, KeyCode.ctrl + KeyCode.F10
    100      , KeyCode.shiftCtrl + KeyCode.F1, KeyCode.shiftCtrl + KeyCode.F2, KeyCode.shiftCtrl + KeyCode.F3, KeyCode.shiftCtrl + KeyCode.F4, KeyCode.shiftCtrl + KeyCode.F5, KeyCode.shiftCtrl + KeyCode.F6
    101      , KeyCode.shiftCtrl + KeyCode.F7, KeyCode.shiftCtrl + KeyCode.F8, KeyCode.shiftCtrl + KeyCode.F9, KeyCode.shiftCtrl + KeyCode.F10
    102      , KeyCode.shift + KeyCode.F1, KeyCode.shift + KeyCode.F2, KeyCode.shift + KeyCode.F3, KeyCode.shift + KeyCode.F4, KeyCode.shift + KeyCode.F5, KeyCode.shift + KeyCode.F6
    103      , KeyCode.shift + KeyCode.F7, KeyCode.shift + KeyCode.F8, KeyCode.shift + KeyCode.F9, KeyCode.shift + KeyCode.F10
    104  };
    105  */
    106
    107  /**Actions for all keys in {@link #keys}. */
    108  //GralUserAction[] keyAction = new GralUserAction[50];
    109
    110  Map<Integer, GralUserAction> idxKeyAction = new TreeMap<Integer, GralUserAction>();
    111
    112  ButtonAction currentButton;
    113
    114
    115  /**Assign an action to any function button, menu and key.
    116   * @param action The action
    117   * @param buttonText use the form "Btn:text" where button is F1..F12, aF1 etc. text is the text.
    118   */
    119  void setBtnMenuAndKeys(GralUserAction action, String buttonText, int key, int key2, String menu){
    120    if(buttonText !=null){
    121      int posSep = buttonText.indexOf(':');
    122      if(posSep > 0){
    123        ButtonAction buttonAction = new ButtonAction(action, buttonText.substring(0, posSep), buttonText.substring(posSep+1));
    124        idxButtons.put(buttonAction.button, buttonAction);
    125      } else {
    126        System.err.println("faulty button text, should have format \"F1:text\"");
    127      }
    128    }
    129    if(key !=0){
    130      idxKeyAction.put(key, action);
    131    }
    132    if(key2 !=0){
    133      idxKeyAction.put(key2, action);
    134    }
    135    if(menu !=null){
    136      GralMenu menuBar = main.gui.getMenuBar();
    137      menuBar.addMenuItem(menu, action);
    138      //main.gui.addMenuBarArea9ItemGThread(null, menu, action);
    139    }
    140  }
    141
    142
    143  /**Assign an action to any function button, menu and key.
    144   * @param action The action
    145   * @param buttonText use the form "Btn:text" where button is F1..F12, aF1 etc. text is the text.
    146   */
    147  void setBtnMenuAndKeys(GralUserAction action, String buttonText, int key, String menu){
    148    setBtnMenuAndKeys(action, buttonText, key, 0, menu);
    149  }
    150
    151
    152  /**Get the proper button for the requested idx in {@link #b1}.
    153   * @param idx
    154   * @param iterButtonAction
    155   * @return the {@link #emptyButton} if no button matches.
    156   */
    157  ButtonAction getNext(int idx, Iterator<Map.Entry<String, ButtonAction>> iterButtonAction){
    158    String button = b1[idx];
    159    while(iterButtonAction.hasNext() && (currentButton == null || currentButton.button.compareTo(button) < 0)){
    160      currentButton = iterButtonAction.next().getValue();
    161    }
    162    if(currentButton.button.equals(button)){ return currentButton; }
    163    else return emptyButton;
    164  }
    165
    166
    167  /**Assigns the next action to the {@link #keyAction} and creates the button.
    168   * @param idx
    169   * @param iterButtonAction
    170   */
    171  private void addButton(int idx, Iterator<Map.Entry<String, ButtonAction>> iterButtonAction){
    172    ButtonAction button = getNext(idx, iterButtonAction);
    173    GralButton gralButton = main._gralMng.addButton(button.button, button.action, button.text);
    174    gralButton.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.Button." + button.text + ".");
    175    //keyAction[idx] = button.action;
    176  }
    177
    178
    179  void initPanelButtons()
    180  {
    181    //This calls creates the menu entries in the menu bar. The order determines the order in menu bar. It registeres the button strings and keys.
    182    setBtnMenuAndKeys(main.filePropsCmd.actionOpenDialog, main.idents.buttonFileProps, main.idents.keyFileProps, main.idents.menuFilePropsBar);
    183    setBtnMenuAndKeys(main.viewCmd.actionOpenView, main.idents.buttonFileView, main.idents.keyFileView, main.idents.menuFileViewBar);
    184    setBtnMenuAndKeys(main.viewCmd.actionQuickView, null, main.idents.key1QuickView, main.idents.key2QuickView, main.idents.menuBarQuickView);
    185    setBtnMenuAndKeys(main.editWind.actionOpenEdit, main.idents.buttonEditIntern, main.idents.keyEditIntern, main.idents.menuBarEditIntern);
    186    setBtnMenuAndKeys(main.actionEdit, main.idents.buttonFileEdit, main.idents.keyFileEdit, main.idents.menuFileEditBar);
    187    setBtnMenuAndKeys(main.copyCmd.actionConfirmCopy, main.idents.buttonFileCopy, main.idents.keyFileCopy, main.idents.menuConfirmCopyBar);
    188    setBtnMenuAndKeys(main.mkCmd.actionOpenDialog, main.idents.buttonMkdirFile, main.idents.keyFileCreate, main.idents.menuConfirmMkdirFileBar);
    189    setBtnMenuAndKeys(main.deleteCmd.actionConfirmDelete, main.idents.buttonFileDel, main.idents.keyFileDel1, main.idents.menuConfirmFileDelBar);
    190    setBtnMenuAndKeys(main.deleteCmd.actionConfirmDelete, null, main.idents.keyFileDel2, null);
    191    setBtnMenuAndKeys(main.favorPathSelector.actionSetDirOrigin, main.idents.buttonSetOriginDir, main.idents.keyOriginDir1, main.idents.keyOriginDir1, main.idents.menuBarSetOriginDir);
    192    setBtnMenuAndKeys(main.executer.actionExecuteFileByExtension, main.idents.buttonExecute, main.idents.keyExecuteExt, main.idents.menuExecuteBar);
    193    setBtnMenuAndKeys(main.favorPathSelector.actionRefreshFileTable, main.idents.buttonRefereshFiles, main.idents.keyRefresh1, main.idents.menuFileNaviRefreshBar);
    194    setBtnMenuAndKeys(main.favorPathSelector.actionRefreshFileTable, null, main.idents.keyRefresh2, null);
    195    setBtnMenuAndKeys(main.favorPathSelector.actionRefreshFileTable, null, main.idents.keyRefresh3, null);
    196
    197    setBtnMenuAndKeys(main.selectCardThemesLeft, main.idents.buttonFavorLeft, main.idents.keyFavorLeft, main.idents.menuBarNavigationLeft);
    198    setBtnMenuAndKeys(main.selectCardThemesMiddle, main.idents.buttonFavorMiddle, main.idents.keyFavorMiddle, main.idents.menuBarNavigationMiddle);
    199    setBtnMenuAndKeys(main.selectCardThemesRight, main.idents.buttonFavorRight, main.idents.keyFavorRight, main.idents.menuBarNavigationRight);
    200
    201    setBtnMenuAndKeys(main.selectFileCardLeft,  main.idents.buttonSelectPanelLeft,    main.idents.keySelectPanelLeft,   main.idents.menuBarSelectPanelLeft);
    202    setBtnMenuAndKeys(main.selectFileCardLeft,  null,                                main.idents.keySelectPanelLeft2,   null);
    203    setBtnMenuAndKeys(main.selectFileCardMid,   main.idents.buttonSelectPanelMiddle,  main.idents.keySelectPanelMiddle, main.idents.menuBarSelectPanelMiddle);
    204    setBtnMenuAndKeys(main.selectFileCardMid,   null,                                main.idents.keySelectPanelMiddle2, null);
    205    setBtnMenuAndKeys(main.selectFileCardRight, main.idents.buttonSelectPanelRight,   main.idents.keySelectPanelRight,  main.idents.menuBarSelectPanelRight);
    206    setBtnMenuAndKeys(main.selectFileCardRight, null,                                main.idents.keySelectPanelRight2,  null);
    207    setBtnMenuAndKeys(main.selectFileCardOther, main.idents.buttonSelectPanelOther,   main.idents.keySelectPanelOther,  main.idents.menuBarSelectPanelOther);
    208
    209    setBtnMenuAndKeys(main.actionFocusCardInPanelToLeft, main.idents.buttonFocusLeftCard,   main.idents.keyFocusLeftCard,  main.idents.menuBarFocusLeftCard);
    210    setBtnMenuAndKeys(main.actionFocusCardInPanelToRight, main.idents.buttonFocusRightCard,   main.idents.keyFocusRightCard,  main.idents.menuBarFocusRightCard);
    211    setBtnMenuAndKeys(main.actionFocusFileCard, main.idents.buttonFocusFileCard,   main.idents.keyFocusFileCard,  main.idents.menuBarFocusFileCard);
    212    setBtnMenuAndKeys(main.actionFocusThemeCard, main.idents.buttonFocusThemeCard,   main.idents.keyFocusThemeCard,  main.idents.menuBarFocusThemeCard);
    213    setBtnMenuAndKeys(main.actionFocusPanelToLeft, main.idents.buttonFocusPanelToLeft,   main.idents.keyFocusPanelToLeft,  main.idents.menuBarFocusPaneltoLeft);
    214    setBtnMenuAndKeys(main.actionFocusPanelToRight, main.idents.buttonFocusPanelToRight,   main.idents.keyFocusPanelToRight,  main.idents.menuBarFocusPanelToRight);
    215
    216
    217    setBtnMenuAndKeys(main.actionFocusCmdCard, main.idents.buttonFocusCmd, main.idents.keyFocusCmd, main.idents.menuBarNavigatonCmd);
    218    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerNameNonCase, main.idents.buttonFileSortNameNonCase, main.idents.keyFileSortNameNonCase, main.idents.menuBarFileSortNameNonCase);
    219    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerNameCase, main.idents.buttonFileSortNameCase, main.idents.keyFileSortNameCase, main.idents.menuBarFileSortNameCase);
    220    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerExtensionNonCase, main.idents.buttonFileSortExtNonCase, main.idents.keyFileSortExtNonCase, main.idents.menuBarFileSortExtNonCase);
    221    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerExtensionCase, main.idents.buttonFileSortExtCase, main.idents.keyFileSortExtCase, main.idents.menuBarFileSortExtCase);
    222    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerTimestamp, main.idents.buttonFileSortDateNewest, main.idents.keyFileSortDateNewest, main.idents.menuBarFileSortDateNewest);
    223    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerTimestampOldestFirst, main.idents.buttonFileSortOldest, main.idents.keyFileSortDateLast, main.idents.menuBarFileSortDateOldest);
    224    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerLenghLargestFirst, main.idents.buttonFileSortSizeLarge, main.idents.keyFileSortSizeLarge, main.idents.menuBarFileSortSizeLarge);
    225    setBtnMenuAndKeys(main.favorPathSelector.actionSortFilePerLenghSmallestFirst, main.idents.buttonFileSortSizeSmall, main.idents.keyFileSortSizeSmall, main.idents.menuBarFileSortSizeSmall);
    226    setBtnMenuAndKeys(main.favorPathSelector.actionSearchFiles, main.idents.buttonSearchFiles, main.idents.keySearchFiles, main.idents.menuBarSearchFiles);
    227
    228    setBtnMenuAndKeys(main.executer.cmdSelector.actionExecCmdWithFiles, main.idents.buttonExecuteCmdWithFile, main.idents.keyExecuteCmdWithFile, main.idents.keyExecuteCmdWithFile2, main.idents.menuBarExecuteCmdWithFile);
    229    setBtnMenuAndKeys(main.executer.actionEditCmdCfgAct, main.idents.buttonEditCmdCfg, main.idents.keyEditCmdCfg, 0, main.idents.menuBarEditCmdCfg);
    230    setBtnMenuAndKeys(main.executer.actionSetCmdCfgAct, main.idents.buttonReadCmdCfgAct, main.idents.keyReadCmdCfgAct, 0, main.idents.menuBarReadCmdCfgAct);
    231    setBtnMenuAndKeys(actionViewButtons, main.idents.buttonViewButtons, main.idents.keyViewButtons, main.idents.menuBarViewButtons);
    232    setBtnMenuAndKeys(main.windMng.actionWindFullOut, main.idents.buttonWindowOutput, main.idents.keyWindowOutput, main.idents.keyWindowOutput2, main.idents.menuBarWindowOutput);
    233
    234    setBtnMenuAndKeys(main.settings.actionOpenDialog, main.idents.buttonSettings, main.idents.key1Settings, main.idents.key2Settings, main.idents.menuBarSettings);
    235    setBtnMenuAndKeys(main.status.actionOpenDialog, main.idents.buttonStatus, main.idents.key1Status, main.idents.key2Status, main.idents.menuBarStatus);
    236    //setBtnMenuAndKeys(main.actionReadMsgConfig, main.idents.readMsg.buttontext, main.idents.readMsg.key1, main.idents.readMsg.key2, main.idents.readMsg.menu);
    237    for(GralButtonKeyMenu entry: main.idents.entries){
    238      if(entry.action !=null){
    239        setBtnMenuAndKeys(entry.action, entry.buttontext, entry.key1, entry.key2, entry.menu);
    240      }
    241    }
    242    main.gui.addMenuBarArea9ItemGThread("menuBarViewButtons", main.idents.menuBarViewButtons, actionViewButtons);
    243
    244    setBtnMenuAndKeys(main.gui.getActionHelp(), main.idents.buttonHelp, main.idents.keyHelp,main.idents.menuHelpBar);
    245
    246    Iterator<Map.Entry<String, ButtonAction>> iterButtonAction = idxButtons.entrySet().iterator();
    247
    248    main._gralMng.selectPanel("Buttons");
    249    main.statusLine.buildGraphic();
    250
    251    main._gralMng.setPosition(4, GralPos.size + 1, 10, 20, 1, 'r');
    252    main._gralMng.addText("F1");
    253    main._gralMng.addText("F2");
    254    main._gralMng.addText("F3");
    255    main._gralMng.addText("F4");
    256    main._gralMng.addText("F5");
    257    main._gralMng.addText("F6");
    258    main._gralMng.addText("F7");
    259    main._gralMng.addText("F8");
    260    main._gralMng.addText("F9");
    261    main._gralMng.addText("F10");
    262    main._gralMng.setPosition(7, GralPos.size +2, 0, 4, 1, 'd');
    263    main._gralMng.addText("alt -");
    264    main._gralMng.addText("ctr -");
    265    main._gralMng.addText("shctr-");
    266    main._gralMng.addText("sh  -");
    267
    268    main._gralMng.setPosition(5, 7, 4, 14, 1, 'r');
    269    int idx;
    270    for(idx = 0; idx < 10; ++idx){
    271      addButton(idx, iterButtonAction);
    272    }
    273    main._gralMng.setPosition(7, 9, 4, 14, 1, 'r');
    274    for(idx = 10; idx < 20; ++idx){
    275      addButton(idx, iterButtonAction);
    276    }
    277    main._gralMng.setPosition(9, 11, 4, 14, 1, 'r');
    278    for(idx = 20; idx < 30; ++idx){
    279      addButton(idx, iterButtonAction);
    280    }
    281    main._gralMng.setPosition(11, 13, 4, 14, 1, 'r');
    282    for(idx = 30; idx < 40; ++idx){
    283      addButton(idx, iterButtonAction);
    284    }
    285    main._gralMng.setPosition(13, 15, 4, 14, 1, 'r');
    286    for(idx = 40; idx < 50; ++idx){
    287      addButton(idx, iterButtonAction);
    288    }
    289    main.gui.setMinMaxSizeArea("A3C3", 15, 15, 0, 0);
    290  }
    291
    292
    293
    294  /**Searches the given keyCode and processes its action.
    295   * The action was set initially from the {@link #setBtnMenuAndKeys(GralUserAction, String)} with key assignment in {@link FcmdIdents}.
    296   * @param keyCode
    297   * @return true if done.
    298   */
    299  boolean processKey(int keyCode, GralWidget_ifc widg){
    300    GralUserAction action = idxKeyAction.get(keyCode);
    301    if(action !=null){
    302      boolean bDone = action.exec(keyCode, widg);
    303      return bDone;
    304    } else {
    305      return false;
    306    }
    307  }
    308
    309
    310
    311  /**The main key action registered in the {@link GralMng#setMainKeyAction(GralUserAction)}.
    312   */
    313  GralUserAction actionMainKeys = new GralUserAction("actionMainKeys")
    314  {
    315    @Override public boolean exec(int key, GralWidget_ifc widg, Object... params){
    316      return processKey(key, widg);
    317    }
    318  };
    319
    320
    321
    322
    323  /**Action to focus the cmd card.
    324   */
    325  GralUserAction actionViewButtons = new GralUserAction("actionViewButtons")
    326  {
    327    @Override public boolean userActionGui(int key, GralWidget infos, Object... params){
    328      if(KeyCode.isControlFunctionMouseUpOrMenu(key)){  //supress both mouse up and down reaction
    329      if(bButtonVisible){
    330        bButtonVisible = false;
    331        main.gui.setMinMaxSizeArea("A3C3", 4, 4, 0, 0);
    332      } else {
    333        bButtonVisible = true;
    334        main.gui.setMinMaxSizeArea("A3C3", 15, 15, 0, 0);
    335      }
    336      return true;
    337      } else return false;
    338    }
    339  };
    340
    341
    342}