    001package org.vishia.commander;
    002
    003import java.io.File;
    004import java.util.LinkedList;
    005import java.util.List;
    006import java.util.Map;
    007import java.util.TreeMap;
    008
    009import org.vishia.fileRemote.FileRemote;
    010import org.vishia.gral.base.GralButton;
    011import org.vishia.gral.base.GralPos;
    012import org.vishia.gral.base.GralValueBar;
    013import org.vishia.gral.base.GralWidget;
    014import org.vishia.gral.base.GralWindow;
    015import org.vishia.gral.ifc.GralTextField_ifc;
    016import org.vishia.gral.ifc.GralUserAction;
    017import org.vishia.gral.ifc.GralWindow_ifc;
    018import org.vishia.util.FileCompare;
    019import org.vishia.util.KeyCode;
    020
    021
    022public final class FcmdFilesCp {
    023
    024  /**Version, history and license
    025   * <ul>
    026   * <li>2012-04-17 Compares only mid and right panel.
    027   * <li>2011-12-00 Hartmut creation.
    028   * </ul>
    029   *
    030   * <b>Copyright/Copyleft</b>:
    031   * For this source the LGPL Lesser General Public License,
    032   * published by the Free Software Foundation is valid.
    033   * It means:
    034   * <ol>
    035   * <li> You can use this source without any restriction for any desired purpose.
    036   * <li> You can redistribute copies of this source to everybody.
    037   * <li> Every user of this source, also the user of redistribute copies
    038   *    with or without payment, must accept this license for further using.
    039   * <li> But the LPGL ist not appropriate for a whole software product,
    040   *    if this source is only a part of them. It means, the user
    041   *    must publish this part of source,
    042   *    but don't need to publish the whole source of the own product.
    043   * <li> You can study and modify (improve) this source
    044   *    for own using or for redistribution, but you have to license the
    045   *    modified sources likewise under this LGPL Lesser General Public License.
    046   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    047   * </ol>
    048   * If you are intent to use this sources without publishing its usage, you can get
    049   * a second license subscribing a special contract with the author.
    050   *
    051   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    052   */
    053  public final static int version = 20120417;
    054
    055
    056  final Fcmd main;
    057
    058  GralWindow_ifc windConfirmCompare;
    059
    060  GralTextField_ifc widgPath1, widgPath2;
    061
    062  GralValueBar widgProgression;
    063
    064  /**Buttons. */
    065  GralButton widgSyncWalk, widgGetDir, widgCompare;
    066
    067
    068
    069  /**Composition of the comparer. */
    070  final FileCompare comparer = new FileCompare(0, null, 0);
    071
    072  /**List for results of comparison as tree. */
    073  List<FileCompare.Result> result = new LinkedList<FileCompare.Result>();
    074
    075  /**List for results of comparison as index sorted to local file paths. */
    076  final Map<String, FileCompare.Result> idxFilepath4Result = new TreeMap<String, FileCompare.Result>();
    077
    078  /**The both selected file cards which are used for comparison.
    079   * For that file cards a synchronous walk through files may be done.
    080   */
    081  FcmdFileCard card1, card2;
    082
    083  /**The both directories where the comparison was started. */
    084  FileRemote file1, file2;
    085
    086  FcmdFilesCp(Fcmd main){
    087    this.main = main;
    088  }
    089
    090  void buildGraphic(){
    091    main.gui.addMenuBarArea9ItemGThread("menuFilesCpBar", main.idents.menuFilesCpBar, actionConfirmCp);
    092    main._gralMng.selectPanel("primaryWindow");
    093    main._gralMng.setPosition(-19, 0, -47, 0, 1, 'r'); //right buttom, about half less display width and hight.
    094
    095    windConfirmCompare = main._gralMng.createWindow("windConfirmCompare", main.idents.windConfirmCompare, GralWindow.windConcurrently);
    096    //System.out.println(" window: " + main.gralMng.pos.panel.getPixelPositionSize().toString());
    097
    098    main._gralMng.setPosition(4, GralPos.size -3.5f, 1, -1, 0, 'd', 0.5f);
    099    widgPath1 = main._gralMng.addTextField("comparePath1", true, "compare:", "t");
    100    widgPath1.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.folderCmp.");
    101    widgPath2 = main._gralMng.addTextField("comparePath2", true, "with:", "t");
    102    widgPath2.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.folderCmp.");
    103
    104    main._gralMng.setPosition(-1, GralPos.size - 3, 1, GralPos.size + 8, 0, 'r',2);
    105    main._gralMng.addButton(null, actionFilesCp, "esc", null, "esc");
    106    //widgSyncWalk = main.gralMng.addSwitchButton(null, null, "sync", null, null, "sync", "wh", "gn");
    107    //widgSyncWalk.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.folderCmp.");
    108    widgGetDir = main._gralMng.addButton(null, actionFilesCp, "get", null, "get dir");
    109    widgGetDir.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.folderCmp.");
    110    widgCompare = main._gralMng.addButton(null, actionFilesCp, "cp", null, "compare");
    111    widgCompare.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.folderCmp.");
    112    widgCompare.setPrimaryWidgetOfPanel();
    113  }
    114
    115
    116
    117
    118
    119
    120
    121  private void buildIdxResult(FileCompare.Result item, int recursion){
    122    if(recursion > 100)
    123      throw new IllegalArgumentException("too many deepness of file tree");
    124    String relpath;
    125    if(item.file1 !=null){
    126      int posRel = file1.getAbsolutePath().length() +1;  //after / starts the local path
    127      relpath = item.file1.getAbsolutePath().substring(posRel);
    128    } else {
    129      int posRel = file2.getAbsolutePath().length() +1;  //after / starts the local path
    130      relpath = item.file2.getAbsolutePath().substring(posRel);
    131    }
    132    idxFilepath4Result.put(relpath, item);
    133    if(item.subFiles !=null && item.subFiles.size() >0){
    134      for(FileCompare.Result sub: item.subFiles){
    135        buildIdxResult(sub, recursion +1);
    136      }
    137    }
    138  }
    139
    140
    141
    142  /**Action if button "get dirs" is pressed.
    143   *
    144   */
    145  void setDirs(){
    146    FcmdFileCard[] lastFileCards = main.getLastSelectedFileCards();
    147    card1 = lastFileCards[0];
    148    card2 = lastFileCards[1];
    149    if(card1 !=null && card2 !=null){
    150      card1.otherFileCardtoSync = card2;  //cross connect this file cards.
    151      card2.otherFileCardtoSync = card1;
    152      file1 = card1.currentFile();
    153      file2 = card2.currentFile();
    154      card1.sDirSync = file1.getAbsolutePath();
    155      card2.sDirSync = file2.getAbsolutePath();
    156      card1.zDirSync = card1.sDirSync.length();
    157      card2.zDirSync = card2.sDirSync.length();
    158      widgPath1.setText(card1.sDirSync);
    159      widgPath2.setText(card2.sDirSync);
    160    } else {
    161      if(card1 !=null){ card1.otherFileCardtoSync = null; }
    162      if(card2 !=null){ card2.otherFileCardtoSync = null; }
    163      card1 = card2 = null;
    164      widgPath1.setText("");
    165      widgPath2.setText("");
    166    }
    167    widgCompare.setText("compare");
    168    widgCompare.sCmd = "cp";
    169
    170  }
    171
    172
    173
    174
    175  GralUserAction actionConfirmCp = new GralUserAction("actionConfirmCp") {
    176    @Override public boolean userActionGui(int key, GralWidget infos, Object... params)
    177    {
    178      if(KeyCode.isControlFunctionMouseUpOrMenu(key)){
    179        setDirs();
    180        windConfirmCompare.setFocus(); //setWindowVisible(true);
    181      }
    182      return true;
    183  } };
    184
    185
    186  GralUserAction actionFilesCp = new GralUserAction("actionFilesCp") {
    187    @Override public boolean userActionGui(int key, GralWidget infos, Object... params)
    188    {
    189      if(KeyCode.isControlFunctionMouseUpOrMenu(key)){
    190        if(infos.sCmd.equals("get")){
    191          setDirs();
    192        } else
    193        if(infos.sCmd.equals("cp")){
    194          //filesCp();
    195        } else if(infos.sCmd.equals("stop")){
    196          widgCompare.setText("stopped");
    197          widgCompare.sCmd = "stop";
    198            //TODO
    199        } else if(infos.sCmd.equals("esc")){
    200          windConfirmCompare.setFocus(); //setWindowVisible(false);
    201        }
    202      }
    203      return true;
    204  } };
    205
    206
    207}