2012-03-20 3 views
1

Я делаю приложение, которое содержит 2 вида. Первый содержит средство просмотра дерева, которое отображает папки из моей системы, а второе содержит средство просмотра таблицы, которое отображает содержимое каталога, выбранного в первом представлении. Короче говоря: файловый проводник.Как включить/отключить TextCellEditor

//initialization of the table viewer 
    tableViewer = new TableViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);  
    tableViewer.setContentProvider(new FileTableContentProvider()); 
    tableViewer.setLabelProvider(new FileTableLabelProvider());  

    //from within the implementation of any view or editor 
    /* 
    * getSite() - Returns the site for this workbench part (a workbench part can be a view (IViewPart) or an editor (IEditorPart)) 
    * this view is a selection provider; the view sends the event to all the views registered to the selection service 
    */ 
    getSite().setSelectionProvider(tableViewer); 

    //the table column "Name" is added to the table viewer 
    TableColumn columnName = new TableColumn(tableViewer.getTable(), SWT.LEFT); 
    columnName.setText("Name"); 
    columnName.setResizable(true); 
    columnName.setWidth(200); 

    //the table column "Date modified" is added to the table viewer 
    TableColumn columnDateModified = new TableColumn(tableViewer.getTable(), SWT.LEFT); 
    columnDateModified.setText("Date modified"); 
    columnDateModified.setResizable(true); 
    columnDateModified.setWidth(200); 

    //the table column "Type" is added to the table viewer 
    TableColumn columnType = new TableColumn(tableViewer.getTable(), SWT.LEFT); 
    columnType.setText("Type"); 
    columnType.setResizable(true); 
    columnType.setWidth(200);  

    //make the header of the table visible 
    tableViewer.getTable().setHeaderVisible(true);  

    /* 
    * getSite().getPage() - gets the active workbench page. 
    */ 
    getSite().getPage().addSelectionListener("com.awebofcode.fileexplorer.view.filetree",(ISelectionListener)this); 

    /* 
    * add a doubleClickListener for: 
    * 1) if the object selected is a file, then the file will be opened with the associated program 
    * 2) if the object selected is a directory, then enter the folder and update the tree viewer 
    */ 
    tableViewer.addDoubleClickListener(new IDoubleClickListener(){ 

     @Override 
     public void doubleClick(DoubleClickEvent event) { 
      IStructuredSelection selection = (IStructuredSelection) event.getSelection(); 
      File itemSelected = (File) selection.getFirstElement(); 

      //if the selected item is a file a double click will launch the associated program 
      if (itemSelected.isFile() && itemSelected.exists()){ 
       Program.launch(itemSelected.getAbsolutePath()); 
      }else if (itemSelected.isDirectory()){ 
       /* 
       * Update the tree viewer; 
       * PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(FileTreeView.ID) --> returns the view with the specified ID 
       * setSelection() will send an event and the setSelectionChanged will run 
       */ 
       ((FileTreeView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(FileTreeView.ID)).getTreeViewer().setSelection(selection); 
      } 
     } 

    }); 

    //create the cell editor 
    CellEditor[] editors = new CellEditor[1]; 
    editors[0] = new TextCellEditor(tableViewer.getTable()); 
    tableViewer.setColumnProperties(new String[]{"Name", "Date modified", "Type"}); 
    //assign the cell editors to the table viewer 
    tableViewer.setCellEditors(editors); 
    //set the cell modifier to the table viewer 
    tableViewer.setCellModifier(new NameCellModifier(tableViewer)); 

Я создал действие, которое переименует выбранный файл или папку со второго представления.

Когда я нажимаю на имя файла, я не хочу входить в режим редактирования. Я хочу оставаться в режиме выбора и только после того, как я нажму Файл -> Переименовать (действие переименует) редактирование режим должен быть включен.

Проблема в том, что я не могу найти способ включения/выключения TextCellEditor.

+0

Есть ли способы сделать это? У меня такая же проблема ... – Philipp

ответ

1

Я не нашел чистого решения. Я объясню вам, что я сделал до сих пор. Я изменил код, который я опубликовал. Я использую TableViewerColumn вместо TableColumn.

Класс FileTableView:

public class FileTableView extends ViewPart implements ISelectionListener{ 

    private TableViewer tableViewer; 
    private boolean cellEditable = false; 
    private FirstColumnEditingSupport obj; 

    public FileTableView() { 
     super(); 
    } 

    @Override 
    public void createPartControl(Composite parent) { 
     //initialization of the table viewer 
     tableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.MULTI); //SWT.MULTI - for multiple selection; SWT.FULL_SELECTION - for selection of an entire row 
     tableViewer.setContentProvider(new FileTableContentProvider()); 
     //it is not necessary to add a label provider for the table viewer because we will set a label provider for every column of the table 
     //tableViewer.setLabelProvider(new FileTableLabelProvider()); 

     //extract the table widget of the table viewer 
     final Table table = tableViewer.getTable(); 
     //make the header of the table visible 
     table.setHeaderVisible(true); 
     //hide the lines of the table 
     table.setLinesVisible(false); 

     //create the columns of the table 
     createColumns(parent, tableViewer); 

     //set the sorter to the table viewer 
     tableComparator = new TableViewerComparator(); 
     tableViewer.setComparator(tableComparator); 

     //from within the implementation of any view or editor 
     /* 
     * getSite() - Returns the site for this workbench part (a workbench part can be a view (IViewPart) or an editor (IEditorPart)) 
     * this view is a selection provider; the view sends the event to all the views registered to the selection service 
     */ 
     getSite().setSelectionProvider(tableViewer);   


     tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){ 
      public void selectionChanged(SelectionChangedEvent event){ 
       setCellEditable(false); 
      } 
     }); 



    } 

    /* 
    * method used to update the viewer from outside 
    */ 
    public void refresh(){ 
     tableViewer.refresh(); 
    } 

    @Override 
    public void setFocus() { 
     tableViewer.getControl().setFocus(); 
    } 



    //method that returns the table viewer 
    public TableViewer getTableViewer(){ 
     return tableViewer; 
    } 


    /* 
    * get the value of the cellEditable 
    */ 
    public boolean getCellEditable(){ 
     return cellEditable; 
    } 

    /* 
    * set the value of the cellEditable 
    */ 
    public void setCellEditable(boolean cellEditable){ 
     this.cellEditable = cellEditable; 
    } 

    public FirstColumnEditingSupport getEditingSupport(){ 
     return obj; 
    } 

    /* 
    * method that creates columns of the table 
    */ 
    private void createColumns(final Composite parent, final TableViewer viewer){ 
     String[] titles = {"Name", "Date Modified", "Size"}; 
     int[] width = {200, 200, 200}; 

     //first column is for the name of the file 
     TableViewerColumn col = createTableViewerColumn(titles[0], width[0], 0); 
     col.setLabelProvider(new ColumnLabelProvider(){ 
      public String getText(Object element){ 
       return ((File) element).getName(); 
      } 

      public Image getImage(Object element){ 
       return getFirsColumnImage((File) element); 
      } 
     }); 
     obj = new FirstColumnEditingSupport(tableViewer,this); 
     col.setEditingSupport(obj); 

     //second column is for the last date modified 
     col = createTableViewerColumn(titles[1], width[1], 1); 
     col.setLabelProvider(new ColumnLabelProvider(){ 
      public String getText(Object element){ 
       return formatLastModifiedDate((File) element); 
      } 
     }); 

     //third column is for size 
     col = createTableViewerColumn(titles[2], width[2], 2); 
     col.setLabelProvider(new ColumnLabelProvider(){ 
      public String getText(Object element){ 
       return formatLength((File) element); 
      } 
     }); 
    } 

    private TableViewerColumn createTableViewerColumn(String title, int width, final int columnNumber){ 
     final TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); 
     final TableColumn column = viewerColumn.getColumn(); 
     column.setText(title); 
     column.setWidth(width); 
     column.setResizable(true); 
     column.setMoveable(false); 
     column.addSelectionListener(getSelectionAdapter(column, columnNumber)); 
     return viewerColumn; 
    } 

    private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index){ 
     SelectionAdapter selectionAdapter = new SelectionAdapter(){ 
      public void widgetSelected(SelectionEvent e){ 
       tableComparator.setColumn(index); 
       int direction = tableComparator.getDirection(); 
       tableViewer.getTable().setSortDirection(direction); 
       tableViewer.getTable().setSortColumn(column); 
       tableViewer.refresh(); 
      } 
     }; 

     return selectionAdapter; 
    } 

    /* 
    * method used to return the last modified date in "dd-MM-yyyy hh:mm:ss" format 
    */ 
    private String formatLastModifiedDate(File file){ 
     Date d = new Date(file.lastModified()); 
     SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); 
     return sdf.format(d); 
    } 

    /* 
    * method used to return the length of the file in KB 
    */ 
    private String formatLength(File file){ 
     long size = file.length()/1024; 
     NumberFormat f = new DecimalFormat("#,###,### KB"); 

     return f.format(size); 
    } 

} 

FirstColumnEditingSupport.java файл:

/* 
* The EditingSupport implementation defines how the content can be changed. 
*/ 
public class FirstColumnEditingSupport extends EditingSupport { 

    private TableViewer tableViewer; 
    private FileTableView view; 
    private TextCellEditor textEditor; 

    public FirstColumnEditingSupport(TableViewer viewer, FileTableView view) { 
     super(viewer); 
     this.tableViewer = viewer; 
     this.view = view; 
     textEditor = new TextCellEditor(tableViewer.getTable()); 
    } 

    @Override 
    /* 
    * (non-Javadoc) 
    * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object) 
    * EditingSupport returns in his getCellEditor() method an object of type CellEditor. This object creates the controls to change the data. 
    */ 
    protected CellEditor getCellEditor(Object element) { 
     return textEditor; 
    } 

    @Override 
    /* 
    * (non-Javadoc) 
    * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object) 
    * The canEdit() method defines, if the cell can be edited. 
    */ 
    protected boolean canEdit(Object element) { 
     return view.getCellEditable(); 
    } 

    @Override 
    /* 
    * (non-Javadoc) 
    * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object) 
    * The getValue() method receives the current object and returns the value which should be displayed. 
    */ 
    protected Object getValue(Object element) { 
     return ((File) element).getName(); 
    } 

    @Override 
    /* 
    * (non-Javadoc) 
    * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, java.lang.Object) 
    * The method setValue() in EditingSupport receives the changed value based on the user input. In this method you assign the value to your data object. 
    */ 
    protected void setValue(Object element, Object value) { 
     //value is the user input 
     File oldFile = (File) element; 

     //String path = oldFile.getAbsolutePath().substring(oldFile.getAbsolutePath().lastIndexOf(File.pathSeparatorChar)); 
     //System.out.println(oldFile.getParent()); 
     oldFile.renameTo(new File(oldFile.getParent() + "\\" + (String) value)); 
     tableViewer.refresh(); 
    } 

    public TextCellEditor getTextCellEditor(){ 
     return textEditor; 
    } 

} 

Мой RenameAction файл:

public class RenameAction extends Action implements ISelectionListener, ActionFactory.IWorkbenchAction { 

    private final IWorkbenchWindow window; 
    private IStructuredSelection itemSelected; 

    public final static String ID = PlatformUI.PLUGIN_ID + ".RenameAction"; 

    public RenameAction(IWorkbenchWindow window){ 
     this.window = window; 
     setId(ID); 
     setText("&Rename"); 
     setToolTipText("Rename the file or directory selected"); 
     window.getSelectionService().addSelectionListener(this); 
    } 
    @Override 
    public void selectionChanged(IWorkbenchPart part, ISelection selection) { 
     if(selection.isEmpty() || !(selection instanceof IStructuredSelection)){ 
      return;   
     }else { 
      itemSelected = (IStructuredSelection)selection; 
     } 
    } 

    public void dispose(){ 
     window.getSelectionService().removeSelectionListener(this); 
    } 

    public void run(){ 
     Object firstElement = itemSelected.getFirstElement(); 

     File item = (File) firstElement;  

     if(item != null){ 
      FileTableView myTreeView= (FileTableView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(FileTableView.ID); 
      myTreeView.setCellEditable(true); 
     } 

    } 

} 

Моя идея была:

  • по умолчанию: редактор ячейки первого столбца отключена
  • , когда действие переименования запускается (нажмите кнопку меню), редактор ячейки столбца включен (myTreeView.setCellEditable(true))
  • таблица линия, выбранная в и вы можете изменить имя файла. Эта часть работает не очень хорошо, потому что после нажатия кнопки меню переименования вы не можете видеть, что режим редактирования включен. После нажатия на строку таблицы активируется режим редактирования. Кроме того, режим редактирования включен для всех строк таблицы, и я хотел бы быть включен только для выбранного. Для этой проблемы у меня нет решения.
  • после того, как вы закончите вводить новое имя файла и изменить выбор (нажмите на другой строке таблицы), режим редактирования отключен:

    tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){ 
         public void selectionChanged(SelectionChangedEvent event){ 
          setCellEditable(false); 
         } 
        }); 
    

Я надеюсь, что мое решение может помочь вы.

Смежные вопросы