From 2aa41604008b5e05e182bdb3ac1e788c3f99d43f Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 29 Mar 2020 15:14:02 +0200 Subject: [PATCH 1/5] Initial version of custom file selection dialog --- .../icons/page_white.png | Bin 0 -> 294 bytes .../e4/application/handlers/OpenHandler.java | 23 +- .../e4/application/messages.properties | 2 +- .../application/parts/FileBrowserDialog.java | 410 ++++++++++++++++++ 4 files changed, 419 insertions(+), 16 deletions(-) create mode 100644 com.minres.scviewer.e4.application/icons/page_white.png create mode 100644 com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java diff --git a/com.minres.scviewer.e4.application/icons/page_white.png b/com.minres.scviewer.e4.application/icons/page_white.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8b1ca0000bc8fa8d0379926736029f8fabe364 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 literal 0 HcmV?d00001 diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java index 48dbb7b..b064f05 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java @@ -11,7 +11,7 @@ package com.minres.scviewer.e4.application.handlers; import java.io.File; -import java.util.ArrayList; +import java.util.List; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Execute; @@ -21,27 +21,20 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPartStack; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Shell; import com.minres.scviewer.e4.application.Messages; +import com.minres.scviewer.e4.application.parts.FileBrowserDialog; public class OpenHandler { @Execute public void execute(Shell shell, MApplication app, EModelService modelService, EPartService partService){ - FileDialog dialog = new FileDialog(shell, SWT.OPEN | SWT.MULTI); - dialog.setFilterExtensions (new String []{Messages.OpenHandler_0}); - String ret = dialog.open(); - if(ret==null) - return; - String path = dialog.getFilterPath(); - ArrayList files = new ArrayList(); - for(String fileName: dialog.getFileNames()){ - File file = new File(path+File.separator+fileName); - if(file.exists()) - files.add(file); - } + FileBrowserDialog dlg = new FileBrowserDialog(shell); + dlg.create(); + dlg.setFilterExtensions (new String []{Messages.OpenHandler_0}); + if (dlg.open() != Window.OK) return; + List files = dlg.getSelectedFiles(); MPart part = partService .createPart("com.minres.scviewer.e4.application.partdescriptor.waveformviewer"); //$NON-NLS-1$ part.setLabel(files.get(0).getName()); MPartStack partStack = (MPartStack)modelService.find("org.eclipse.editorss", app); //$NON-NLS-1$ diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties index 264be16..654ac95 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties @@ -9,7 +9,7 @@ DesignBrowser_8=Insert before LoadingWaveformDb_0=Database loading... LoadStoreSettingsHandler_2=*.scview LoadStoreSettingsHandler_3=SCViewer.scview -OpenHandler_0=*.vcd;*.txdb;*.txlog;CURRENT +OpenHandler_0=*.vcd;*.txdb;*.txlog;*.fbrdb QuitHandler_0=Confirmation QuitHandler_1=Do you want to exit? RelationTypeToolControl_0=------------ diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java new file mode 100644 index 0000000..68531c2 --- /dev/null +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java @@ -0,0 +1,410 @@ +package com.minres.scviewer.e4.application.parts; + +import java.io.File; +import java.nio.file.FileSystems; +import java.nio.file.PathMatcher; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.TrayDialog; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.wb.swt.ResourceManager; + +public class FileBrowserDialog extends TrayDialog { + + private Image folderImage; + + private Image fileImage; + + private Image dbImage; + + File currentDirFile; + + TreeViewer dirTreeViewer; + + TableViewer tableViewer; + + FileTableComparator fileTableComparator; + + private FileGlobber globber = new FileGlobber(); + + private List selectedFiles; + + String[] filterStrings = new String[] {"*"}; + + public FileBrowserDialog(Shell parentShell) { + super(parentShell); + folderImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/folder.png"); //$NON-NLS-1$ //$NON-NLS-2$ + dbImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database.png"); //$NON-NLS-1$ //$NON-NLS-2$ + fileImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/page_white.png"); //$NON-NLS-1$ //$NON-NLS-2$ + currentDirFile = new File("."); + } + + public void setFilterExtensions(String[] filterStrings) { + if(filterStrings.length==0){ + globber = new FileGlobber(); + } else + globber= new FileGlobber(filterStrings[0]); + this.filterStrings=filterStrings; + } + + public List getSelectedFiles(){ + return selectedFiles; + } + + @Override + public int open() { + dirTreeViewer.setInput("root"); + dirTreeViewer.refresh(); + setDirSelection(currentDirFile.getAbsoluteFile().getParentFile()); + getButton(IDialogConstants.OK_ID).setEnabled(!tableViewer.getSelection().isEmpty()); + return super.open(); + } + + @Override + protected Control createContents(Composite parent) { + Control ret = super.createContents(parent); + if(parent instanceof Shell) { + ((Shell)parent).setSize(800, 400); + ((Shell)parent).setText("Select database"); + } + return ret; + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite area = (Composite) super.createDialogArea(parent); + final SashForm sashForm = new SashForm(area, SWT.HORIZONTAL); + sashForm.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL)); + + dirTreeViewer = new TreeViewer(sashForm); + dirTreeViewer.setContentProvider(new FileTreeContentProvider()); + dirTreeViewer.setLabelProvider(new FileTreeLabelProvider()); + dirTreeViewer.addSelectionChangedListener(event -> { + IStructuredSelection sel = event.getStructuredSelection(); + File entry = (File) sel.getFirstElement(); + if(entry.isDirectory()) { + tableViewer.setInput(entry.listFiles()); + } + }); + + final Composite tableViewerParent = new Composite(sashForm, SWT.BORDER); + tableViewerParent.setLayout(new GridLayout(1, true)); + tableViewer = new TableViewer(tableViewerParent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI); + tableViewer.getTable().setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); + tableViewer.addSelectionChangedListener(event -> { + getButton(IDialogConstants.OK_ID).setEnabled(!event.getStructuredSelection().isEmpty()); + }); + tableViewer.addDoubleClickListener(event -> { + IStructuredSelection sel = tableViewer.getStructuredSelection(); + if(sel.isEmpty()) return; + if(sel.size()==1) { + File elem = (File) sel.getFirstElement(); + if(globber.matches(elem)) + buttonPressed(IDialogConstants.OK_ID); + else if(elem.isDirectory()) + setDirSelection(elem); + } else + buttonPressed(IDialogConstants.OK_ID); + }); + tableViewer.setContentProvider(ArrayContentProvider.getInstance()); + tableViewer.getTable().setHeaderVisible(true); + tableViewer.getTable().setLinesVisible(true); + tableViewer.getTable().addMouseListener(new MouseAdapter() { + @Override + public void mouseDown(MouseEvent e) { mouseUp(e); } + @Override + public void mouseUp(MouseEvent e) { + TableItem element = (TableItem)tableViewer.getTable().getItem(new Point(e.x, e.y)); + final Table table = tableViewer.getTable(); + if (element == null )//&& (e.stateMask&SWT.MODIFIER_MASK)!=0) + table.deselectAll(); + else { + int[] indices = table.getSelectionIndices(); + if(indices.length==1) { + TableItem ti = table.getItem(indices[0]); + if(!globber.matches(ti.getData()) && !((File)ti.getData()).isDirectory()) + table.deselect(indices[0]); + } else { + for (int idx : indices) { + TableItem ti = table.getItem(idx); + if(!globber.matches(ti.getData())) + table.deselect(idx); + } + } + } + } + }); + TableViewerColumn colName = new TableViewerColumn(tableViewer, SWT.NONE); + colName.setLabelProvider(new FileTableLabelProvider() { + @Override public String getText(Object element) { return ((File) element).getName(); } + @Override public Image getImage(Object element){ + if(globber.matches(element)) return dbImage; + return ((File) element).isDirectory()?folderImage:fileImage; + } + }); + colName.getColumn().setWidth(300); + colName.getColumn().setText("Name"); + colName.getColumn().addSelectionListener(getSelectionAdapter(colName.getColumn(), 0)); + + TableViewerColumn colSize = new TableViewerColumn(tableViewer, SWT.RIGHT); + colSize.setLabelProvider(new FileTableLabelProvider() { + @Override public String getText(Object element) { return String.format("%d", ((File) element).length()); } + }); + colSize.getColumn().setWidth(100); + colSize.getColumn().setText("Size"); + colSize.getColumn().addSelectionListener(getSelectionAdapter(colSize.getColumn(), 1)); + + TableViewerColumn colEmpty = new TableViewerColumn(tableViewer, SWT.CENTER); + colEmpty.setLabelProvider(new FileTableLabelProvider() { + @Override public String getText(Object element) { return ""; } + }); + //colEmpty.getColumn().setWidth(200); + colEmpty.getColumn().setText(""); + + fileTableComparator = new FileTableComparator(); + tableViewer.setComparator(fileTableComparator); + sashForm.setWeights(new int[]{2, 3}); + return area; + } + + private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) { + SelectionAdapter selectionAdapter = new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + fileTableComparator.setColumn(index); + int dir = fileTableComparator.getDirection(); + tableViewer.getTable().setSortDirection(dir); + tableViewer.getTable().setSortColumn(column); + tableViewer.refresh(); + } + }; + return selectionAdapter; + } + + private void setDirSelection(File f) { + ArrayList fileTree = getParentDirList(f); + TreeSelection selection = new TreeSelection(new TreePath(fileTree.toArray())); + dirTreeViewer.setSelection(selection); + } + + private ArrayList getParentDirList(File actual){ + if(actual==null) + return new ArrayList<>(); + else { + ArrayList l = getParentDirList(actual.getParentFile()); + l.add(actual); + return l; + } + } + + @Override + protected boolean isResizable() { + return true; + } + + // save content of the Text fields because they get disposed + // as soon as the Dialog closes + @SuppressWarnings("unchecked") + private void saveInput() { + selectedFiles= tableViewer.getStructuredSelection().toList(); + } + + @Override + protected void okPressed() { + saveInput(); + super.okPressed(); + } + + class FileGlobber { + + List matchers; + + public FileGlobber() { + matchers = new ArrayList<>(); } + + public FileGlobber(String expr) { + ArrayList m = new ArrayList<>(); + if(expr.length()>0) { + String[] tok = expr.split(";"); + for (String string : tok) { + m.add(FileSystems.getDefault().getPathMatcher("glob:**/"+string)); + } + } + matchers = m; + } + + public boolean matches(Object f) { + assert(f instanceof File); + if(matchers.size()==0) return true; + for (PathMatcher m : matchers) { + if(m.matches(((File)f).toPath())) return true; + } + return false; + } + } + + class FileTreeContentProvider implements ITreeContentProvider { + public Object[] getChildren(Object arg0) { + File[] entries = ((File) arg0).listFiles(); + if(entries != null) { + List res = Arrays.stream(entries) + .filter(file -> !(file.isFile()||file.getName().startsWith(".") ||globber.matches(file))) + .sorted(new Comparator(){ + public int compare(File f1, File f2){return f1.getName().compareTo(f2.getName());} + }) + .collect(Collectors.toList()); ; + return res.toArray(); + } else + return new Object[0]; + } + + public Object getParent(Object arg0) { + return ((File) arg0).getParentFile(); + } + + public boolean hasChildren(Object arg0) { + Object[] obj = getChildren(arg0); + return obj == null ? false : obj.length > 0; + } + + public Object[] getElements(Object arg0) { + return File.listRoots(); + } + + public void dispose() { + } + + public void inputChanged(Viewer arg0, Object arg1, Object arg2) { + } + } + + class FileTreeLabelProvider implements ILabelProvider { + private List listeners; + + private Image file; + + private Image dir; + + public FileTreeLabelProvider() { + listeners = new ArrayList(); + } + + public Image getImage(Object arg0) { + return ((File) arg0).isDirectory() ? folderImage : file; + } + + public String getText(Object arg0) { + File f = (File)arg0; + return f.getName().length() == 0? f.getPath() : f.getName(); + } + + public void addListener(ILabelProviderListener arg0) { + listeners.add(arg0); + } + + public void dispose() { + // Dispose the images + if (dir != null) + dir.dispose(); + if (file != null) + file.dispose(); + } + + public boolean isLabelProperty(Object arg0, String arg1) { + return false; + } + + public void removeListener(ILabelProviderListener arg0) { + listeners.remove(arg0); + } + + } + + public class FileTableComparator extends ViewerComparator { + private int propertyIndex = 0; + private boolean descending = false; + + public FileTableComparator() { + } + + public int getDirection() { + return descending ? SWT.DOWN : SWT.UP; + } + + public void setColumn(int column) { + descending = column == this.propertyIndex?!descending : false; + this.propertyIndex = column; + } + + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + File p1 = (File) e1; + File p2 = (File) e2; + int rc = 0; + switch (propertyIndex) { + case 0: + rc = p1.getName().compareTo(p2.getName()); + break; + case 1: + rc = Long.valueOf(p1.length()).compareTo(p2.length()); + break; + default: + rc = 0; + } + // If descending order, flip the direction + return descending? -rc : rc; + } + + } + + public class FileTableLabelProvider extends ColumnLabelProvider { + @Override + public Color getBackground(Object element) { + return null; + } + + @Override + public Color getForeground(Object element) { + return globber.matches(element) || ((File)element).isDirectory()? null: ResourceManager.getColor(SWT.COLOR_GRAY); + } + + } +} + From 270a00403740ca41fb83fe4ecf7b9ff97916c5b9 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 29 Mar 2020 16:10:36 +0200 Subject: [PATCH 2/5] fix file detection --- .../src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java | 1 + .../src/com/minres/scviewer/database/text/TextDbLoader.groovy | 1 + .../src/com/minres/scviewer/database/vcd/VCDDbLoader.java | 1 + .../minres/scviewer/e4/application/parts/WaveformViewer.java | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java index d677b73..d90f686 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java @@ -81,6 +81,7 @@ public class SQLiteDbLoader implements IWaveformDbLoader { @Override public boolean load(IWaveformDb db, File file) throws Exception { + if(file.isDirectory() || !file.exists()) return false; this.db=db; try { FileInputStream fis = new FileInputStream(file); diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy index 3979c91..2ae1676 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy @@ -64,6 +64,7 @@ public class TextDbLoader implements IWaveformDbLoader{ @Override boolean load(IWaveformDb db, File file) throws Exception { + if(file.isDirectory() || !file.exists()) return false; this.db=db this.streams=[] try { diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java index bde1c9b..a0f12db 100644 --- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java +++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java @@ -79,6 +79,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { @SuppressWarnings("unchecked") @Override public boolean load(IWaveformDb db, File file) throws Exception { + if(file.isDirectory() || !file.exists()) return false; this.db=db; this.maxTime=0; String name = file.getCanonicalFile().getName(); diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index 9952cdb..aea6b89 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -669,7 +669,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis } if (filesToLoad.size() > 0) loadDatabase(persistedState); - if(partConfig instanceof String) { + if(partConfig instanceof String && ((String)partConfig).length()>0) { loadState((String) partConfig); } } From 80115851131b9e125aa652764ec035be0b7790fd Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 29 Mar 2020 17:15:41 +0200 Subject: [PATCH 3/5] add globbing selection and tool bar to file dialog --- .../icons/arrow_up.png | Bin 0 -> 372 bytes .../e4/application/handlers/OpenHandler.java | 2 +- .../application/parts/FileBrowserDialog.java | 95 ++++++++++++++++-- 3 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 com.minres.scviewer.e4.application/icons/arrow_up.png diff --git a/com.minres.scviewer.e4.application/icons/arrow_up.png b/com.minres.scviewer.e4.application/icons/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebb193243780b8eb1919a51ef27c2a0d36ccec2 GIT binary patch literal 372 zcmV-)0gL{LP)6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000 files = dlg.getSelectedFiles(); MPart part = partService .createPart("com.minres.scviewer.e4.application.partdescriptor.waveformviewer"); //$NON-NLS-1$ diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java index 68531c2..7ba9924 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; -import java.util.regex.Pattern; import java.util.stream.Collectors; import org.eclipse.jface.dialogs.IDialogConstants; @@ -25,6 +24,7 @@ import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; +import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.MouseAdapter; @@ -34,16 +34,18 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; import org.eclipse.wb.swt.ResourceManager; public class FileBrowserDialog extends TrayDialog { @@ -60,10 +62,18 @@ public class FileBrowserDialog extends TrayDialog { TableViewer tableViewer; + Text fileNameEntry; + + Combo filterCombo; + FileTableComparator fileTableComparator; private FileGlobber globber = new FileGlobber(); + private FileGlobber imageGlobber = new FileGlobber(); + + private File selectedDir; + private List selectedFiles; String[] filterStrings = new String[] {"*"}; @@ -79,8 +89,12 @@ public class FileBrowserDialog extends TrayDialog { public void setFilterExtensions(String[] filterStrings) { if(filterStrings.length==0){ globber = new FileGlobber(); - } else + } else { globber= new FileGlobber(filterStrings[0]); + imageGlobber = new FileGlobber(filterStrings[0]); + filterCombo.setItems(filterStrings); + filterCombo.select(0); + } this.filterStrings=filterStrings; } @@ -119,17 +133,41 @@ public class FileBrowserDialog extends TrayDialog { dirTreeViewer.addSelectionChangedListener(event -> { IStructuredSelection sel = event.getStructuredSelection(); File entry = (File) sel.getFirstElement(); - if(entry.isDirectory()) { - tableViewer.setInput(entry.listFiles()); + if(entry!=null && entry.isDirectory()) { + selectedDir = entry; + tableViewer.setInput(selectedDir.listFiles()); } }); - final Composite tableViewerParent = new Composite(sashForm, SWT.BORDER); - tableViewerParent.setLayout(new GridLayout(1, true)); - tableViewer = new TableViewer(tableViewerParent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI); + final Composite tableViewerParent = new Composite(sashForm, SWT.NONE); + GridLayout gridLayout = new GridLayout(1, true); + gridLayout.horizontalSpacing=0; + gridLayout.verticalSpacing=5; + gridLayout.marginHeight=0; + gridLayout.marginHeight=0; + tableViewerParent.setLayout(gridLayout); + final ToolBar toolBar = new ToolBar(tableViewerParent, SWT.HORIZONTAL |SWT.SHADOW_OUT); + toolBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); + final ToolItem toolbarItemUp = new ToolItem(toolBar, SWT.PUSH); + toolbarItemUp.setToolTipText("up one level"); + toolbarItemUp.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/arrow_up.png")); //$NON-NLS-1$ //$NON-NLS-2$); + toolbarItemUp.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if(selectedDir.getParentFile()!=null) { + selectedDir=selectedDir.getParentFile(); + tableViewer.setInput(selectedDir.listFiles()); + } + } + }); + tableViewer = new TableViewer(tableViewerParent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI); tableViewer.getTable().setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); tableViewer.addSelectionChangedListener(event -> { - getButton(IDialogConstants.OK_ID).setEnabled(!event.getStructuredSelection().isEmpty()); + IStructuredSelection sel = event.getStructuredSelection(); + getButton(IDialogConstants.OK_ID).setEnabled(!sel.isEmpty()); + @SuppressWarnings("unchecked") + Object text = sel.toList().stream().map(e -> ((File)e).getName()).collect(Collectors.joining(";")); + fileNameEntry.setText(text.toString()); }); tableViewer.addDoubleClickListener(event -> { IStructuredSelection sel = tableViewer.getStructuredSelection(); @@ -175,7 +213,7 @@ public class FileBrowserDialog extends TrayDialog { colName.setLabelProvider(new FileTableLabelProvider() { @Override public String getText(Object element) { return ((File) element).getName(); } @Override public Image getImage(Object element){ - if(globber.matches(element)) return dbImage; + if(imageGlobber.matches(element)) return dbImage; return ((File) element).isDirectory()?folderImage:fileImage; } }); @@ -200,6 +238,32 @@ public class FileBrowserDialog extends TrayDialog { fileTableComparator = new FileTableComparator(); tableViewer.setComparator(fileTableComparator); + tableViewer.addFilter(new FileTableFilter()); + + Composite bottomBar = new Composite(tableViewerParent, SWT.NONE); + bottomBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); + GridLayout gridLayoutBottom = new GridLayout(2, false); + gridLayoutBottom.horizontalSpacing=0; + gridLayoutBottom.verticalSpacing=0; + gridLayoutBottom.marginHeight=0; + gridLayoutBottom.marginWidth=0; + bottomBar.setLayout(gridLayoutBottom); + + fileNameEntry = new Text(bottomBar, SWT.BORDER); + fileNameEntry.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); + fileNameEntry.setEditable(false); //TODO: temporary disabled + + filterCombo = new Combo(bottomBar, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); + filterCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END)); + filterCombo.setItems(filterStrings); + filterCombo.select(0); + filterCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + globber= new FileGlobber(filterCombo.getText()); + tableViewer.setInput(selectedDir.listFiles()); + } + }); sashForm.setWeights(new int[]{2, 3}); return area; } @@ -357,6 +421,15 @@ public class FileBrowserDialog extends TrayDialog { } + public class FileTableFilter extends ViewerFilter { + + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + File p = (File) element; + return !p.getName().startsWith("."); + } + } + public class FileTableComparator extends ViewerComparator { private int propertyIndex = 0; private boolean descending = false; From 414030cbd205c7f659b068f7e715ddc34c73ecb7 Mon Sep 17 00:00:00 2001 From: eyck Date: Mon, 30 Mar 2020 11:31:51 +0200 Subject: [PATCH 4/5] fix behavior of FileBrowserDialog --- .../e4/application/handlers/OpenHandler.java | 2 +- .../e4/application/messages.properties | 2 +- .../application/parts/FileBrowserDialog.java | 25 +++++++++---------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java index fdc91bd..9d6f034 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java @@ -31,7 +31,7 @@ public class OpenHandler { @Execute public void execute(Shell shell, MApplication app, EModelService modelService, EPartService partService){ FileBrowserDialog dlg = new FileBrowserDialog(shell); - dlg.create(); + //dlg.create(); dlg.setFilterExtensions (new String []{Messages.OpenHandler_0, "*"}); if (dlg.open() != Window.OK) return; List files = dlg.getSelectedFiles(); diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties index 654ac95..bde69ab 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties @@ -45,7 +45,7 @@ WaveformViewer_18=Would you like to reload the database? WaveformViewer_19=vcd WaveformViewer_20=txdb WaveformViewer_21=txlog -WaveformViewer_22=txldb +WaveformViewer_22=fbrdb WaveformViewer_37=Database open WaveformViewer_38=Would you like to open the adjacent database WaveformViewer_39=\ as well? diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java index 7ba9924..49ee835 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java @@ -92,8 +92,11 @@ public class FileBrowserDialog extends TrayDialog { } else { globber= new FileGlobber(filterStrings[0]); imageGlobber = new FileGlobber(filterStrings[0]); + if(filterCombo!=null) { filterCombo.setItems(filterStrings); filterCombo.select(0); + filterCombo.computeSize(SWT.DEFAULT, SWT.DEFAULT); + } } this.filterStrings=filterStrings; } @@ -102,20 +105,14 @@ public class FileBrowserDialog extends TrayDialog { return selectedFiles; } - @Override - public int open() { - dirTreeViewer.setInput("root"); - dirTreeViewer.refresh(); - setDirSelection(currentDirFile.getAbsoluteFile().getParentFile()); - getButton(IDialogConstants.OK_ID).setEnabled(!tableViewer.getSelection().isEmpty()); - return super.open(); - } - @Override protected Control createContents(Composite parent) { Control ret = super.createContents(parent); + setDirSelection(currentDirFile.getAbsoluteFile().getParentFile()); + getButton(IDialogConstants.OK_ID).setEnabled(!tableViewer.getSelection().isEmpty()); if(parent instanceof Shell) { - ((Shell)parent).setSize(800, 400); + Point size = ((Shell)parent).computeSize(SWT.DEFAULT, SWT.DEFAULT); + ((Shell)parent).setSize(size.x, 400); ((Shell)parent).setText("Select database"); } return ret; @@ -138,7 +135,8 @@ public class FileBrowserDialog extends TrayDialog { tableViewer.setInput(selectedDir.listFiles()); } }); - + dirTreeViewer.setInput("root"); + final Composite tableViewerParent = new Composite(sashForm, SWT.NONE); GridLayout gridLayout = new GridLayout(1, true); gridLayout.horizontalSpacing=0; @@ -252,6 +250,7 @@ public class FileBrowserDialog extends TrayDialog { fileNameEntry = new Text(bottomBar, SWT.BORDER); fileNameEntry.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); fileNameEntry.setEditable(false); //TODO: temporary disabled + fileNameEntry.setEnabled(false); filterCombo = new Combo(bottomBar, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); filterCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END)); @@ -264,7 +263,7 @@ public class FileBrowserDialog extends TrayDialog { tableViewer.setInput(selectedDir.listFiles()); } }); - sashForm.setWeights(new int[]{2, 3}); + sashForm.setWeights(new int[]{3, 3}); return area; } @@ -285,7 +284,7 @@ public class FileBrowserDialog extends TrayDialog { private void setDirSelection(File f) { ArrayList fileTree = getParentDirList(f); TreeSelection selection = new TreeSelection(new TreePath(fileTree.toArray())); - dirTreeViewer.setSelection(selection); + dirTreeViewer.setSelection(selection, true); } private ArrayList getParentDirList(File actual){ From 1cebc2da0a3efd4b00e58caef2a5b4245cff0108 Mon Sep 17 00:00:00 2001 From: eyck Date: Mon, 30 Mar 2020 11:34:26 +0200 Subject: [PATCH 5/5] update version numbers --- com.minres.scviewer.e4.application/META-INF/MANIFEST.MF | 2 +- com.minres.scviewer.e4.application/pom.xml | 2 +- com.minres.scviewer.e4.product/pom.xml | 2 +- com.minres.scviewer.e4.product/scviewer.product | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index 1b8c1ec..21b1443 100644 --- a/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true -Bundle-Version: 2.4.2.qualifier +Bundle-Version: 2.5.0.qualifier Bundle-Vendor: %Bundle-Vendor Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.core.runtime;bundle-version="3.11.1", diff --git a/com.minres.scviewer.e4.application/pom.xml b/com.minres.scviewer.e4.application/pom.xml index 5173019..e94b70a 100644 --- a/com.minres.scviewer.e4.application/pom.xml +++ b/com.minres.scviewer.e4.application/pom.xml @@ -1,7 +1,7 @@ 4.0.0 com.minres.scviewer.e4.application - 2.4.2-SNAPSHOT + 2.5.0-SNAPSHOT com.minres.scviewer com.minres.scviewer.parent diff --git a/com.minres.scviewer.e4.product/pom.xml b/com.minres.scviewer.e4.product/pom.xml index c1187b6..edb91a5 100644 --- a/com.minres.scviewer.e4.product/pom.xml +++ b/com.minres.scviewer.e4.product/pom.xml @@ -10,7 +10,7 @@ ../com.minres.scviewer.parent com.minres.scviewer.e4.product - 2.4.2-SNAPSHOT + 2.5.0-SNAPSHOT eclipse-repository com.minres.scviewer diff --git a/com.minres.scviewer.e4.product/scviewer.product b/com.minres.scviewer.e4.product/scviewer.product index 209a4f1..2d7cfdd 100644 --- a/com.minres.scviewer.e4.product/scviewer.product +++ b/com.minres.scviewer.e4.product/scviewer.product @@ -1,7 +1,7 @@ - +