001package org.vishia.gral.widget;
002
003import java.io.File;
004
005import org.vishia.fileRemote.FileRemote;
006import org.vishia.gral.base.GralButton;
007import org.vishia.gral.base.GralPos;
008import org.vishia.gral.base.GralTextField;
009import org.vishia.gral.base.GralWindow;
010import org.vishia.gral.ifc.GralFileDialog_ifc;
011import org.vishia.gral.ifc.GralMngBuild_ifc;
012import org.vishia.gral.ifc.GralTableLine_ifc;
013import org.vishia.gral.ifc.GralUserAction;
014import org.vishia.gral.ifc.GralWidget_ifc;
015import org.vishia.gral.ifc.GralWindow_ifc;
016import org.vishia.util.KeyCode;
017
018
019/**A window for search-in-file dialogue.
020 * It is instantiated calling {@link GralFileSelector#createWindowConfirmSearchGthread(GralMngBuild_ifc)}.
021 * The user can invoke {@link #confirmSearchInFiles(GralFileSelector, Appendable)} to open that window. 
022 *
023 */
024public class GralFileSelectWindow implements GralFileDialog_ifc
025{
026  /**Version, history and license. The version number is a date written as yyyymmdd as decimal number.
027   * Changes:
028   * <ul>
029   * <li>2013-03-28 Hartmut implements {@link GralFileDialog_ifc} because it should be so. TODO tuning with the
030   *   other possibility {@link org.vishia.gral.swt.SwtFileDialog} which uses the standard file dialog of windows or linux
031   * <li>2013-03-28 Hartmut creating, it was a static inner class of {@link GralFileSelector}
032   * </ul>
033   * <br><br> 
034   * 
035   * <b>Copyright/Copyleft</b>:
036   * For this source the LGPL Lesser General Public License,
037   * published by the Free Software Foundation is valid.
038   * It means:
039   * <ol>
040   * <li> You can use this source without any restriction for any desired purpose.
041   * <li> You can redistribute copies of this source to everybody.
042   * <li> Every user of this source, also the user of redistribute copies
043   *    with or without payment, must accept this license for further using.
044   * <li> But the LPGL ist not appropriate for a whole software product,
045   *    if this source is only a part of them. It means, the user
046   *    must publish this part of source,
047   *    but don't need to publish the whole source of the own product.
048   * <li> You can study and modify (improve) this source
049   *    for own using or for redistribution, but you have to license the
050   *    modified sources likewise under this LGPL Lesser General Public License.
051   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
052   * </ol>
053   * If you are intent to use this sources without publishing its usage, you can get
054   * a second license subscribing a special contract with the author. 
055   * 
056   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
057   */
058  //@SuppressWarnings("hiding")
059  public final static int version = 20130328;
060
061  
062  private final GralWindow_ifc wind;
063
064  private final GralFileSelector fileSelector;
065  
066  private final GralTextField widgFilename;
067      
068  private final GralButton widgButtonOk;
069  
070  
071  GralUserAction actionOkForUser;
072  
073  private File dir;
074  
075  /**Creates the window to confirm search in files. This window can be created only one time
076   * for all file panels, if the application has more as one. On activating the directory
077   * and the file panel to show results should be given. But only one search process can be run
078   * simultaneously.
079   * @return The created window.
080   */
081   public GralFileSelectWindow(String name, GralMngBuild_ifc mng){
082     mng.selectPanel("primaryWindow");
083     mng.setPosition(-24, 0, -67, 0, 1, 'r'); //right buttom, about half less display width and hight.
084     wind = mng.createWindow("windSelectFile", "select file", GralWindow.windExclusive | GralWindow.windResizeable );
085     mng.setPosition(0, -3, 0, 0, 0, 'd', 0.0f);
086     fileSelector = new GralFileSelector(name + "-selectFile", 100, new int[]{2,0,-6,-12}, null);
087     fileSelector.setToPanel(mng);
088     fileSelector.specifyActionOnFileSelected(actionSelectFile);
089     fileSelector.setActionOnEnterFile(actionOk);
090     mng.setPosition(-2, 0, 0, -7, 0, 'r',1);
091     widgFilename = mng.addTextField(name+"-name", true, null, null);
092     mng.setPosition(-3, 0, -8, GralPos.size + 7, 0, 'r',1);
093     widgButtonOk = mng.addButton(name+"-ok", null, "Ok");
094     widgButtonOk.setActionChange(actionOk);
095     
096   }
097   
098   
099  
100  
101  /**Prepares the action and appearance and shows the window.
102   * The param actionSelect is called if the user presses the Button on right bottom. The button is marked with
103   * "select" or "write" depending on the param bForWrite. For actionSelect the method 
104   * {@link GralUserAction#exec(int, GralWidget_ifc, Object...)} is called with null for the widget (a widget should not
105   *   necessary for the user) but with the selected File(s) as Object parameter. 
106   *   If one file is selected the first Object is instanceof File. If more as one files are selected
107   *   a List<File> or File[] is provided. The user should check this type.
108   *    
109   * @param startDir
110   * @param sTitle shown in title bar of the window
111   * @param bForWrite true then the name field is editable and "Save" is shown on button. False then the name Field
112   *   is readonly and "select" is shown on button
113   * @param actionSelect Action which is called on Button ok. The first Object of exec(...,object) is the selected File
114   *   or a File[] or List<File> if more as one file is selected. 
115   */
116  public void openDialog(FileRemote startDir, String sTitle, boolean bForWrite, GralUserAction actionSelect){
117    wind.setTitle(sTitle);
118    actionOkForUser = actionSelect;
119    if(bForWrite){
120      widgButtonOk.setText("write");
121    } else {
122      widgButtonOk.setText("select");
123    }
124    fileSelector.fillIn(startDir, false);
125    wind.setWindowVisible(true);
126    fileSelector.setFocus();
127  }
128  
129  
130  @Override
131  public boolean open(String sTitle, int mode)
132  {
133    // TODO Auto-generated method stub
134    return false;
135  }
136
137
138
139
140  @Override
141  public String show(String sBaseDir, String sLocalDir, String sMask, String sTitle)
142  {
143    // TODO Auto-generated method stub
144    return null;
145  }
146  
147  
148  @Override
149  public String[] getMultiSelection()
150  {
151    // TODO Auto-generated method stub
152    return null;
153  }
154
155
156
157
158  @Override
159  public String getSelection()
160  {
161    // TODO Auto-generated method stub
162    return null;
163  }
164
165
166  
167  public void closeWindow(){ 
168    wind.closeWindow();
169  }
170  
171  
172  /**Action of OK button or enter button. It returns the file in the shown directory
173   * with the name written in the widgFilename-textfield.
174   * It is not the selected file. But the textfield is filled with the name of the selected file 
175   * if a file was selected in the table.
176   * 
177   */
178  GralUserAction actionOk = new GralUserAction("GralFileSelector-actionOk"){
179    @Override public boolean exec(int actionCode, GralWidget_ifc widgd, Object... params){
180      if(KeyCode.isControlFunctionMouseUpOrMenu(actionCode)){  //supress both mouse up and down reaction
181        FileRemote dir = fileSelector.getCurrentDir();
182        String sFilename = widgFilename.getText();
183        FileRemote file;
184        if(sFilename.length()==0 || sFilename.equals("..")){
185          file = dir;
186        } else {
187          file = dir.child(sFilename);
188        }
189        actionOkForUser.exec(KeyCode.menuEntered, null, file); 
190      }
191      return true;
192    }
193  };
194
195
196
197  GralUserAction actionSelectFile = new GralUserAction("GralFileSelector-actionSelectFile"){
198    /**The action called from {@link GralTable}.
199     * @param params [0] is the Table line. The content of table cells are known here,
200     *   because it is the file table itself. The {@link GralTableLine_ifc#getUserData()}
201     *   returns the {@link FileRemote} file Object.
202     * @see org.vishia.gral.ifc.GralUserAction#userActionGui(int, org.vishia.gral.base.GralWidget, java.lang.Object[])
203     */
204    @Override public boolean exec(int actionCode, GralWidget_ifc widgd, Object... params){
205      GralTableLine_ifc line = (GralTableLine_ifc) params[0];
206      String sFileCell = line.getCellText(GralFileSelector.kColFilename);
207      Object oData = line.getUserData();
208      if(false && oData instanceof File){
209        String sName = ((File)oData).getName();
210        widgFilename.setText(sName);
211      } else {
212        widgFilename.setText(sFileCell);
213      }
214      return true;
215    }
216  };
217
218
219
220
221}