diff --git a/src/main/gui/net/sf/jailer/ui/databrowser/DBClosureView.java b/src/main/gui/net/sf/jailer/ui/databrowser/DBClosureView.java index 02d97a3b9..e8199930c 100644 --- a/src/main/gui/net/sf/jailer/ui/databrowser/DBClosureView.java +++ b/src/main/gui/net/sf/jailer/ui/databrowser/DBClosureView.java @@ -279,6 +279,10 @@ public abstract class DBClosureView extends javax.swing.JDialog { selectTableCell(column, row); } } + int tableLevel = -1; + if (cellInfo.containsKey(value)) { + tableLevel = cellInfo.get(value).level; + } JCheckBoxMenuItem exclude = new JCheckBoxMenuItem("Exclude " + getDataModel().getDisplayName(table) + " from Path"); exclude.setSelected(excludedFromPath.contains(table)); exclude.setEnabled(mainPath.contains(cellInfo.get(value)) || excludedFromPath.contains(table)); @@ -301,6 +305,34 @@ public abstract class DBClosureView extends javax.swing.JDialog { } } }); + + final Set toExclude = new HashSet
(); + for (Entry ciE: cellInfo.entrySet()) { + if (ciE.getValue().selected && ciE.getValue().level == tableLevel) { + Table tableByDisplayName = getDataModel().getTableByDisplayName(ciE.getKey()); + if (tableByDisplayName != null) { + toExclude.add(tableByDisplayName); + } + } + } + JCheckBoxMenuItem excludeAll = new JCheckBoxMenuItem("Exclude all with Distance " + (tableLevel + 1) + " from Path"); + excludeAll.setEnabled(toExclude.size() > 1); + excludeAll.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + excludedFromPath.addAll(toExclude); + mainPath.clear(); + mainPathAsSet.clear(); + refresh(); + CellInfo ci = cellInfo.get(selectedTable); + if (ci != null) { + String st = selectedTable; + selectedTable = null; + select(st, ci); + } + } + }); + JMenuItem deselect = new JMenuItem("Deselect Path"); deselect.addActionListener(new ActionListener() { @Override @@ -336,6 +368,8 @@ public abstract class DBClosureView extends javax.swing.JDialog { menu.add(openAndSelect); menu.add(new JSeparator()); menu.add(exclude); + menu.add(excludeAll); + menu.add(new JSeparator()); menu.add(deselect); UIUtil.showPopup(e.getComponent(), e.getX(), e.getY(), menu); } @@ -351,6 +385,7 @@ public abstract class DBClosureView extends javax.swing.JDialog { menu.add(select); menu.addSeparator(); menu.add(exclude); + menu.add(excludeAll); menu.addSeparator(); JPopupMenu popup = rb.browserContentPane.createPopupMenu(null, -1, 0, 0, false); JPopupMenu popup2 = rb.browserContentPane.createSqlPopupMenu(null, -1, 0, 0, true, closureTable); diff --git a/src/main/gui/net/sf/jailer/ui/databrowser/DataBrowser.java b/src/main/gui/net/sf/jailer/ui/databrowser/DataBrowser.java index 5d008c765..6950bf3e1 100644 --- a/src/main/gui/net/sf/jailer/ui/databrowser/DataBrowser.java +++ b/src/main/gui/net/sf/jailer/ui/databrowser/DataBrowser.java @@ -2154,7 +2154,7 @@ public class DataBrowser extends javax.swing.JFrame { navigationTree.setSelectionRow(row); JPopupMenu popup = rowBrowser.browserContentPane.createPopupMenu(null, -1, 0, 0, false); if (popup != null) { - JPopupMenu popup2 = rowBrowser.browserContentPane.createSqlPopupMenu(null, -1, 0, 0, true, navigationTree); + JPopupMenu popup2 = rowBrowser.browserContentPane.createSqlPopupMenu(null, -1, 0, 0, true, navigationTreeScrollPane); if (popup2.getComponentCount() > 0 && popup.getComponentCount() > 0) { popup.add(new JSeparator()); }