Java tutorial
/************************************************************************************************* * Copyright (c) 2013, Lex @ le boxon de Lex: http://le-boxon-de-lex.fr * * This program is free software; you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; * if not, see <http://www.gnu.org/licenses>. * * Additional permission under GNU GPL version 3 section 7 * * If you modify this Program, or any covered work, by linking or combining it with Eclipse (or * a modified version of that library), containing parts covered by the terms of Eclipse Public * License (EPL), the licensors of this Program grant you additional permission to convey the * resulting work. Corresponding Source for a non-source form of such a combination shall include * the source code for the parts of D'Aplomb used as well as that of the covered work. ***************************************************************************************************/ package net.leboxondelex.daplomb.ui.viewers; import java.io.File; import net.leboxondelex.daplomb.managers.ResourceRegistry; import net.leboxondelex.daplomb.translations.Messages; import net.leboxondelex.daplomb.utils.LogUtils; import net.leboxondelex.daplomb.utils.StringUtils; import net.leboxondelex.daplomb.utils.Utils; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TableViewerEditor; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.TableColumn; /** * @author Lex */ public class FileViewer { private TableViewer tableViewer; private String filter = ""; //$NON-NLS-1$ private boolean sortByName = true, sortNameAscending = true, sortSizeAscending = true; /** * Constructor. * @param container * @param verticalIndent */ public FileViewer(final Composite container, int verticalIndent) { this.tableViewer = new TableViewer(container, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); GridData layoutData = new GridData(GridData.FILL_BOTH); layoutData.verticalIndent = verticalIndent; this.tableViewer.getTable().setLayoutData(layoutData); this.tableViewer.getTable().setHeaderVisible(true); // Editing support on double-click TableViewerEditor.create(this.tableViewer, new DoubleClickColumnViewerEditorActivationStrategy(this.tableViewer), ColumnViewerEditor.DEFAULT); // Columns new TableColumn(this.tableViewer.getTable(), SWT.CENTER).setText(""); //$NON-NLS-1$ TableViewerColumn col = new TableViewerColumn(this.tableViewer, SWT.LEFT); col.getColumn().setText(Messages.getString("FileViewer.2")); //$NON-NLS-1$ col.setEditingSupport(new FileNameEditingSupport(this.tableViewer)); col.getColumn().addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (FileViewer.this.sortByName) switchSortingDirection(); else setSortByName(true); } }); col = new TableViewerColumn(this.tableViewer, SWT.CENTER); col.getColumn().setText(Messages.getString("FileViewer.3")); //$NON-NLS-1$ col.getColumn().addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (!FileViewer.this.sortByName) switchSortingDirection(); else setSortByName(false); } }); // Define the layout of the table TableLayout tlayout = new TableLayout(); tlayout.addColumnData(new ColumnPixelData(25, true)); tlayout.addColumnData(new ColumnWeightData(55, 300, true)); tlayout.addColumnData(new ColumnWeightData(40, 100, true)); this.tableViewer.getTable().setLayout(tlayout); // Content provider this.tableViewer.setContentProvider(new ArrayContentProvider()); // Label provider this.tableViewer.setLabelProvider(new ITableLabelProvider() { @Override public void removeListener(ILabelProviderListener arg0) { // nothing } @Override public boolean isLabelProperty(Object arg0, String arg1) { return false; } @Override public void dispose() { // nothing } @Override public void addListener(ILabelProviderListener arg0) { // nothing } @Override public String getColumnText(Object element, int colmnIndex) { String result; if (colmnIndex == 1) result = ((File) element).getName(); else { long size = ((File) element).length(); result = Utils.formatFileSize(size) + Messages.getString("FileViewer.4"); //$NON-NLS-1$ } return result; } @Override public Image getColumnImage(Object element, int colmnIndex) { Image result = null; if (colmnIndex == 0 && element instanceof File) { String ext = StringUtils.getFileExtension((File) element); result = ResourceRegistry.findFileImage(ext); } return result; } }); // Sorter this.tableViewer.setSorter(new ViewerSorter() { @Override public int compare(Viewer viewer, Object e1, Object e2) { int result; boolean f1 = e1 instanceof File; boolean f2 = e2 instanceof File; if (!f1) result = -1; else if (!f2) result = 1; else { if (FileViewer.this.sortByName) { if (FileViewer.this.sortNameAscending) result = ((File) e1).getName().compareTo(((File) e2).getName()); else result = ((File) e2).getName().compareTo(((File) e1).getName()); } else { if (FileViewer.this.sortSizeAscending) result = (int) (((File) e1).length() - ((File) e2).length()); else result = (int) (((File) e2).length() - ((File) e1).length()); } } return result; } }); // Filter this.tableViewer.addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { boolean shown = true; if (!StringUtils.isEmpty(FileViewer.this.filter)) shown = ((File) element).getName().toLowerCase().contains(FileViewer.this.filter); return shown; } }); // Pop-up menu final IAction renameAction = new Action(Messages.getString("FileViewer.5")) { //$NON-NLS-1$ @Override public void run() { Object o = ((IStructuredSelection) FileViewer.this.tableViewer.getSelection()).getFirstElement(); final File imgFile = (File) o; if (Utils.openRenameDialog(imgFile, container.getShell())) FileViewer.this.tableViewer.update(imgFile, null); } }; final IAction deleteAction = new Action(Messages.getString("FileViewer.12")) { //$NON-NLS-1$ @Override public void run() { boolean del = Utils.showQuestion(container.getShell(), Messages.getString("FileViewer.13"), //$NON-NLS-1$ Messages.getString("FileViewer.14")); //$NON-NLS-1$ Object o = ((IStructuredSelection) FileViewer.this.tableViewer.getSelection()).getFirstElement(); final File imgFile = (File) o; if (del && imgFile.exists() && !imgFile.delete()) { StringBuilder sb = new StringBuilder(); sb.append("Could not delete file "); //$NON-NLS-1$ sb.append(imgFile); LogUtils.log(sb.toString()); } } }; MenuManager popupMenu = new MenuManager(); popupMenu.add(renameAction); popupMenu.add(deleteAction); Menu menu = popupMenu.createContextMenu(this.tableViewer.getTable()); this.tableViewer.getTable().setMenu(menu); } /** * @return the tableViewer */ public TableViewer getTableViewer() { return this.tableViewer; } /** * @param directory */ public void setDirectory(File directory) { this.tableViewer.setInput(Utils.findImageFiles(directory)); this.tableViewer.refresh(); } /** * @param filter the filter to set */ public void setFilter(String filter) { this.filter = filter; this.tableViewer.refresh(); } /** * @param sortByName the sortByName to set */ public void setSortByName(boolean sortByName) { this.sortByName = sortByName; this.tableViewer.refresh(); } /** * */ public void switchSortingDirection() { if (this.sortByName) this.sortNameAscending = !this.sortNameAscending; else this.sortSizeAscending = !this.sortSizeAscending; this.tableViewer.refresh(); } /** * Editing support to rename files in the table. */ private static class FileNameEditingSupport extends EditingSupport { private final TableViewer viewer; public FileNameEditingSupport(TableViewer viewer) { super(viewer); this.viewer = viewer; } @Override protected CellEditor getCellEditor(Object element) { return new TextCellEditor(this.viewer.getTable()); } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { return ((File) element).getName(); } @Override protected void setValue(Object element, Object value) { File currentFile = ((File) element); String s = String.valueOf(value); if (!Utils.hasImageExtension(s)) return; File targetFile = new File(currentFile.getParent(), s); if (!targetFile.exists() && currentFile.renameTo(targetFile)) this.viewer.update(element, null); } } /** * Make editing support work on double-click and not a simple one. */ private static class DoubleClickColumnViewerEditorActivationStrategy extends ColumnViewerEditorActivationStrategy { public DoubleClickColumnViewerEditorActivationStrategy(ColumnViewer viewer) { super(viewer); } @Override protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { return ((IStructuredSelection) getViewer().getSelection()).size() == 1 && (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC || event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL); } } }