diff --git a/bookmark/Demo-Sakila/CUSTOMER - FILM.dbl b/bookmark/Demo-Sakila/CUSTOMER - FILM.dbl index 9dd04a28d..788859350 100644 --- a/bookmark/Demo-Sakila/CUSTOMER - FILM.dbl +++ b/bookmark/Demo-Sakila/CUSTOMER - FILM.dbl @@ -1,6 +1,6 @@ Layout; MEDIUM -1; ; ; 0; 240; 476; 460; 500; true; T; CUSTOMER; ; false; -2; 1; ; 586; 240; 476; 460; 500; true; T; RENTAL; inverse-FK_RENTAL_CUSTOMER; false; +1; ; ; 0; 6; 476; 460; 500; true; T; CUSTOMER; ; false; +2; 1; ; 586; 6; 476; 460; 500; true; T; RENTAL; inverse-FK_RENTAL_CUSTOMER; false; 3; 2; ; 1172; 6; 476; 460; 500; true; T; INVENTORY; FK_RENTAL_INVENTORY; true; -4; 3; ; 1172; 6; 476; 460; 500; true; T; FILM; FK_INVENTORY_FILM; false; 5; 2; ; 1172; 474; 476; 460; 500; true; T; PAYMENT; inverse-FK_PAYMENT_RENTAL; false; +4; 3; ; 1172; 6; 476; 460; 500; true; T; FILM; FK_INVENTORY_FILM; false; diff --git a/bookmark/Demo-Scott/PROJECTS of JAMES.dbl b/bookmark/Demo-Scott/PROJECTS of JAMES.dbl new file mode 100644 index 000000000..f8165bb74 --- /dev/null +++ b/bookmark/Demo-Scott/PROJECTS of JAMES.dbl @@ -0,0 +1,5 @@ +Layout; MEDIUM +1; ; A.EMPNO=7900; 0; 6; 476; 460; 500; true; T; EMPLOYEE; ; false; +2; 1; ; 586; 6; 476; 460; 500; true; T; PROJECT_PARTICIPATION; inverse-EMPLOYEE; false; +3; 2; ; 1172; 6; 476; 460; 500; false; T; PROJECT; PROJECT; false; +4; 2; ; 1172; 474; 476; 460; 500; false; T; ROLE; ROLE; false; diff --git a/src/main/engine/net/sf/jailer/util/Pair.java b/src/main/engine/net/sf/jailer/util/Pair.java index 3047c25a9..b28d39334 100644 --- a/src/main/engine/net/sf/jailer/util/Pair.java +++ b/src/main/engine/net/sf/jailer/util/Pair.java @@ -15,6 +15,7 @@ */ package net.sf.jailer.util; +import java.io.Serializable; /** * An ordered pair of objects (a, b). @@ -27,7 +28,7 @@ package net.sf.jailer.util; * * @author Ralf Wisser */ -public class Pair { +public class Pair implements Serializable { /** * The a object. @@ -102,4 +103,6 @@ public class Pair { return "Pair(" + a + ", " + b + ")"; } + private static final long serialVersionUID = -4954459907998487933L; + } diff --git a/src/main/gui/net/sf/jailer/ui/DataModelManagerDialog.java b/src/main/gui/net/sf/jailer/ui/DataModelManagerDialog.java index 47e8684bd..a9355f63a 100644 --- a/src/main/gui/net/sf/jailer/ui/DataModelManagerDialog.java +++ b/src/main/gui/net/sf/jailer/ui/DataModelManagerDialog.java @@ -34,7 +34,6 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; -import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -116,6 +115,7 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { private InfoBar infoBarBookmark; private InfoBar infoBarRecUsedBookmark; private final String tabPropertyName; + private final String module; // TODO define module enum private Font font = new JLabel("normal").getFont(); private Font normal = new Font(font.getName(), font.getStyle() & ~Font.BOLD, font.getSize()); @@ -127,6 +127,7 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { public DataModelManagerDialog(String applicationName, boolean withLoadJMButton, String module) { this.applicationName = applicationName; this.tabPropertyName = "DMMDPropTab" + module; + this.module = module; initComponents(); InfoBar infoBar = new InfoBar("Data Model Configuration", @@ -167,7 +168,6 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { } else { jTabbedPane1.remove(bookmarkPanel); jTabbedPane1.remove(recentlyUsedBookmarkPanel); - restoreLastSessionButton.setVisible(false); } try { @@ -341,13 +341,11 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { setLocation(70, 130); pack(); - setSize(Math.max(740, getWidth()), 490); + setSize(Math.max(840, getWidth()), 490); refresh(); UIUtil.initPeer(); - if (!withLoadJMButton) { - initRestoreLastSessionButton(); - } + initRestoreLastSessionButton(); try { Object tab = UISettings.restore(tabPropertyName); @@ -384,12 +382,13 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { } private void initRestoreLastSessionButton() { - final BookmarkId lastSession = UISettings.restoreLastSession(); + final boolean forEMEditor = "S".equals(module); + final BookmarkId lastSession = UISettings.restoreLastSession(module); if (lastSession == null) { restoreLastSessionButton.setEnabled(false); return; } - Date date = DataBrowser.getLastSessionDate(); + Date date = forEMEditor? lastSession.date : DataBrowser.getLastSessionDate(); if (date == null || !modelList.contains(lastSession.datamodelFolder)) { restoreLastSessionButton.setEnabled(false); return; @@ -401,21 +400,21 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { break; } } - if (connectionInfo == null) { + if (connectionInfo == null && !forEMEditor) { restoreLastSessionButton.setEnabled(false); return; } Pair details = modelDetails.get(lastSession.datamodelFolder); restoreLastSessionButton.setToolTipText( UIUtil.toHTML( - (details != null? details.a : lastSession.datamodelFolder) + "\n" + - connectionInfo.alias + " (" + connectionInfo.user + "@" + connectionInfo.url + ")\n" + - toDateAsString(date.getTime()), 0)); + (lastSession.bookmark != null? (new File(lastSession.bookmark).getName()) : ((details != null? details.a : lastSession.datamodelFolder))) + "\n" + + (connectionInfo == null? "offline\n" : (connectionInfo.alias + " (" + connectionInfo.user + "@" + connectionInfo.url + ")\n")) + + UIUtil.toDateAsString(date.getTime()), 0)); final ConnectionInfo finalConnectionInfo = connectionInfo; restoreLastSessionButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - openBookmark(new BookmarkId("", lastSession.datamodelFolder, lastSession.connectionAlias, lastSession.rawSchemaMapping), finalConnectionInfo); + openBookmark(new BookmarkId(forEMEditor? lastSession.bookmark : "", lastSession.datamodelFolder, lastSession.connectionAlias, lastSession.rawSchemaMapping), finalConnectionInfo); setVisible(false); dispose(); } @@ -473,15 +472,28 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { BookmarkId bookmark = bookmarksListModel.get(i); Pair details = modelDetails.get(bookmark.datamodelFolder); ConnectionInfo ci = ciOfBookmark.get(bookmark); - data[i] = new Object[] { - bookmark.bookmark, - details.a, - bookmark.connectionAlias, - ci.user, - ci.url }; + data[i] = onlyRecentlyUsed? + new Object[] { + bookmark.bookmark, + details.a, + bookmark.connectionAlias, + ci.user, + ci.url, + UIUtil.toDateAsString(bookmark.date) + } : + new Object[] { + bookmark.bookmark, + details.a, + bookmark.connectionAlias, + ci.user, + ci.url + }; } - DefaultTableModel tableModel = new DefaultTableModel(data, new String[] { "Bookmark", "Data Model", "Connection", "User", "URL" }) { + DefaultTableModel tableModel = new DefaultTableModel(data, + onlyRecentlyUsed? + new String[] {"Bookmark", "Data Model", "Connection", "User", "URL", "Time"} + : new String[] { "Bookmark", "Data Model", "Connection", "User", "URL" }) { @Override public boolean isCellEditable(int row, int column) { return false; @@ -536,7 +548,7 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { if (i >= 0 && i < bookmarksListModel.size()) { BookmarkId bookmark = bookmarksListModel.get(i); ConnectionInfo ci = ciOfBookmark.get(bookmark); - openBookmark(bookmark, ci); + openBookmark(new BookmarkId(bookmark.bookmark, bookmark.datamodelFolder, bookmark.connectionAlias, bookmark.rawSchemaMapping), ci); setVisible(false); dispose(); } @@ -559,14 +571,17 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { for (int i = 0; i < jTable.getColumnCount(); i++) { TableColumn column = jTable.getColumnModel().getColumn(i); - int width = i == 0? 200 : 1; + int width = i == 0? 100 : 1; Component comp = jTable.getDefaultRenderer(String.class).getTableCellRendererComponent(jTable, column.getHeaderValue(), false, false, 0, i); width = Math.max(width, comp.getPreferredSize().width); for (int line = 0; line < data.length; ++line) { comp = jTable.getDefaultRenderer(String.class).getTableCellRendererComponent(jTable, data[line][i],false, false, line, i); - width = Math.max(width, Math.min(150, comp.getPreferredSize().width)); + width = Math.max(width, Math.min(250, comp.getPreferredSize().width)); + } + if (onlyRecentlyUsed && i == jTable.getColumnCount() - 1) { + width = Math.max(width, 150); } column.setPreferredWidth(width); } @@ -577,8 +592,12 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { private final List fileList = new ArrayList(); private void initJMTable() { + Map timestamps = new HashMap(); try { - fileList.addAll(UISettings.loadRecentFiles()); + for (Pair file: UISettings.loadRecentFiles()) { + fileList.add(file.a); + timestamps.put(file.a, file.b); + } } catch (Exception e) { // ignore } @@ -587,13 +606,13 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { for (File file: fileList) { try { if (file.exists()) { - data[i++] = new Object[] { file.getName(), file.getAbsoluteFile().getParent() }; + data[i++] = new Object[] { file.getName(), file.getAbsoluteFile().getParent(), UIUtil.toDateAsString(timestamps.get(file)) }; } } catch (Exception e) { // ignore } } - DefaultTableModel tableModel = new DefaultTableModel(data, new String[] { "Name", "Path" }) { + DefaultTableModel tableModel = new DefaultTableModel(data, new String[] { "Name", "Path", "Time" }) { @Override public boolean isCellEditable(int row, int column) { return false; @@ -638,6 +657,19 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { jmOkButton.setEnabled(jmFilesTable.getSelectedRow() >= 0); } }); + for (i = 0; i < jmFilesTable.getColumnCount(); i++) { + TableColumn column = jmFilesTable.getColumnModel().getColumn(i); + int width = i == 0? 200 : 1; + Component comp = jmFilesTable.getDefaultRenderer(String.class).getTableCellRendererComponent(jmFilesTable, column.getHeaderValue(), false, false, 0, i); + width = Math.max(width, comp.getPreferredSize().width); + + for (int line = 0; line < data.length; ++line) { + comp = jmFilesTable.getDefaultRenderer(String.class).getTableCellRendererComponent(jmFilesTable, + data[line][i],false, false, line, i); + width = Math.max(width, Math.min(150, comp.getPreferredSize().width)); + } + column.setPreferredWidth(width); + } jmFilesTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent me) { @@ -666,7 +698,9 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { } else { DataModelManager.setCurrentModelSubfolder(currentConnection.dataModelFolder, executionContext); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - onSelect(this, executionContext); + dbConnectionDialog.currentConnection = currentConnection; + dbConnectionDialog.isConnected = true; + onSelect(dbConnectionDialog, executionContext); UISettings.store(tabPropertyName, jTabbedPane1.getSelectedIndex()); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); DataModelManagerDialog.this.setVisible(false); @@ -727,7 +761,7 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { int i = 0; for (String model: modelList) { Pair details = modelDetails.get(model); - data[i++] = new Object[] { details == null? "" : details.a, model == null || model.length() == 0? "." : model, details == null? "" : toDateAsString(details.b) }; + data[i++] = new Object[] { details == null? "" : details.a, model == null || model.length() == 0? "." : model, details == null? "" : UIUtil.toDateAsString(details.b) }; } DefaultTableModel tableModel = new DefaultTableModel(data, new String[] { "Data Model", "Subfolder", "Last Modified" }) { @Override @@ -740,13 +774,6 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { return data; } - private String toDateAsString(Long time) { - if (time == null) { - return ""; - } - return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Environment.initialLocal).format(new Date(time)); - } - private boolean inRefresh = false; /** @@ -1642,19 +1669,25 @@ public abstract class DataModelManagerDialog extends javax.swing.JFrame { try { CommandLineInstance.getInstance().bookmark = bookmark.bookmark; CommandLineInstance.getInstance().rawschemamapping = bookmark.rawSchemaMapping; - CommandLineInstance.getInstance().alias = ci.alias; - CommandLineInstance.getInstance().driver = ci.driverClass; - CommandLineInstance.getInstance().jdbcjar = ci.jar1; - CommandLineInstance.getInstance().jdbcjar2 = ci.jar2; - CommandLineInstance.getInstance().jdbcjar3 = ci.jar3; - CommandLineInstance.getInstance().jdbcjar4 = ci.jar4; - CommandLineInstance.getInstance().password = ci.password; - CommandLineInstance.getInstance().url = ci.url; - CommandLineInstance.getInstance().user = ci.user; + if (ci != null) { + CommandLineInstance.getInstance().alias = ci.alias; + CommandLineInstance.getInstance().driver = ci.driverClass; + CommandLineInstance.getInstance().jdbcjar = ci.jar1; + CommandLineInstance.getInstance().jdbcjar2 = ci.jar2; + CommandLineInstance.getInstance().jdbcjar3 = ci.jar3; + CommandLineInstance.getInstance().jdbcjar4 = ci.jar4; + CommandLineInstance.getInstance().password = ci.password; + CommandLineInstance.getInstance().url = ci.url; + CommandLineInstance.getInstance().user = ci.user; + } onSelect(null, executionContext); UISettings.store(tabPropertyName, jTabbedPane1.getSelectedIndex()); - UISettings.addRecentConnectionAliases(ci.alias); - UISettings.addRecentBookmarks(bookmark); + if (ci != null) { + UISettings.addRecentConnectionAliases(ci.alias); + } + if ("B".equals(module)) { + UISettings.addRecentBookmarks(bookmark); + } } catch (Throwable t) { CommandLineInstance.getInstance().bookmark = oldBookmark; CommandLineInstance.getInstance().rawschemamapping = oldRawSchemaMapping; diff --git a/src/main/gui/net/sf/jailer/ui/DbConnectionDialog.java b/src/main/gui/net/sf/jailer/ui/DbConnectionDialog.java index bfd912a19..0672564e0 100644 --- a/src/main/gui/net/sf/jailer/ui/DbConnectionDialog.java +++ b/src/main/gui/net/sf/jailer/ui/DbConnectionDialog.java @@ -35,6 +35,8 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -157,7 +159,8 @@ public class DbConnectionDialog extends javax.swing.JDialog { private Font font = new JLabel("normal").getFont(); private Font normal = new Font(font.getName(), font.getStyle() & ~Font.BOLD, font.getSize()); private Font bold = new Font(font.getName(), font.getStyle() | Font.BOLD, font.getSize()); - + private Map aliasTimestamp = new HashMap(); + /** * Gets connection to DB. * @@ -368,9 +371,13 @@ public class DbConnectionDialog extends javax.swing.JDialog { int i = 0; for (ConnectionInfo ci: connectionList) { Pair modelDetails = DataModelManager.getModelDetails(ci.dataModelFolder, executionContext); - data[i++] = new Object[] { ci.alias, ci.user, ci.url, ci.dataModelFolder == null? "Default" : modelDetails == null? "" : modelDetails.a }; + if (showOnlyRecentyUsedConnections) { + data[i++] = new Object[] { ci.alias, ci.user, ci.url, ci.dataModelFolder == null? "Default" : modelDetails == null? "" : modelDetails.a, UIUtil.toDateAsString(aliasTimestamp.get(ci.alias)) }; + } else { + data[i++] = new Object[] { ci.alias, ci.user, ci.url, ci.dataModelFolder == null? "Default" : modelDetails == null? "" : modelDetails.a }; + } } - DefaultTableModel tableModel = new DefaultTableModel(data, new String[] { "Alias", "User", "URL", "Data Model" }) { + DefaultTableModel tableModel = new DefaultTableModel(data, !showOnlyRecentyUsedConnections? new String[] { "Alias", "User", "URL", "Data Model" } : new String[] { "Alias", "User", "URL", "Data Model", "Time" }) { @Override public boolean isCellEditable(int row, int column) { return false; @@ -588,10 +595,11 @@ public class DbConnectionDialog extends javax.swing.JDialog { if (showOnlyRecentyUsedConnections) { List recUsedConnectionList = new ArrayList(); - for (String alias: UISettings.loadRecentConnectionAliases()) { + for (Pair alias: UISettings.loadRecentConnectionAliases()) { for (ConnectionInfo ci: connectionList) { - if (ci.alias != null && ci.alias.equals(alias)) { + if (ci.alias != null && ci.alias.equals(alias.a)) { recUsedConnectionList.add(ci); + aliasTimestamp.put(alias.a, alias.b); break; } } diff --git a/src/main/gui/net/sf/jailer/ui/Environment.java b/src/main/gui/net/sf/jailer/ui/Environment.java index cbba9a6ca..632b8262f 100644 --- a/src/main/gui/net/sf/jailer/ui/Environment.java +++ b/src/main/gui/net/sf/jailer/ui/Environment.java @@ -112,7 +112,7 @@ public class Environment { } catch (Throwable t) { if (active) { active = false; - UIUtil.showException(null, "Error", t); + UIUtil.showException(null, "Error", t, "AWT"); } else { throw t; } diff --git a/src/main/gui/net/sf/jailer/ui/ExtractionModelFrame.java b/src/main/gui/net/sf/jailer/ui/ExtractionModelFrame.java index e2164297f..c00c858d1 100644 --- a/src/main/gui/net/sf/jailer/ui/ExtractionModelFrame.java +++ b/src/main/gui/net/sf/jailer/ui/ExtractionModelFrame.java @@ -79,6 +79,7 @@ import net.sf.jailer.subsetting.ScriptFormat; import net.sf.jailer.ui.associationproposer.AssociationProposerView; import net.sf.jailer.ui.commandline.CommandLineInstance; import net.sf.jailer.ui.commandline.UICommandLine; +import net.sf.jailer.ui.databrowser.BookmarksPanel.BookmarkId; import net.sf.jailer.ui.databrowser.DataBrowser; import net.sf.jailer.ui.progress.ExportAndDeleteStageProgressListener; import net.sf.jailer.ui.util.AnimationController; @@ -133,6 +134,12 @@ public class ExtractionModelFrame extends javax.swing.JFrame { this(extractionModelFile, isHorizonal, null, executionContext); } + private void storeLastSession() { + BookmarkId bookmark; + bookmark = new BookmarkId(extractionModelEditor.extractionModelFile, ExtractionModelFrame.this.executionContext.getCurrentModelSubfolder(), ExtractionModelFrame.this.executionContext.getCurrentConnectionAlias(), null); + UISettings.storeLastSession(bookmark, "S"); + } + /** * Creates new form ExtractionModelFrame. * @@ -198,6 +205,17 @@ public class ExtractionModelFrame extends javax.swing.JFrame { } dbConnectionDialog.autoConnect(); + final String bmFile = CommandLineInstance.getInstance().bookmark; + if (bmFile != null && !"".equals(bmFile) && new File(bmFile).exists()) { + showWizzard = false; + UIUtil.invokeLater(4, new Runnable() { + @Override + public void run() { + load(bmFile); + } + }); + }; + updateMenuItems(); cycleViewDialog = new CyclesView(this); @@ -209,6 +227,8 @@ public class ExtractionModelFrame extends javax.swing.JFrame { }, executionContext); } + private boolean showWizzard = true; + private void initMenu() { int mask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); if (mask != InputEvent.CTRL_MASK) { @@ -1683,10 +1703,12 @@ public class ExtractionModelFrame extends javax.swing.JFrame { "", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)) { + storeLastSession(); dispose(); UIUtil.checkTermination(); } } else { + storeLastSession(); dispose(); UIUtil.checkTermination(); } @@ -2137,7 +2159,7 @@ public class ExtractionModelFrame extends javax.swing.JFrame { } catch (Exception e) { UIUtil.showException(finalExtractionModelFrame, "Error", e); } - if (withStartupWizzard) { + if (withStartupWizzard && finalExtractionModelFrame.showWizzard) { new StartupWizzardDialog(finalExtractionModelFrame) { @Override protected void onClose() { diff --git a/src/main/gui/net/sf/jailer/ui/UIUtil.java b/src/main/gui/net/sf/jailer/ui/UIUtil.java index cae7d4c3e..97ab445aa 100644 --- a/src/main/gui/net/sf/jailer/ui/UIUtil.java +++ b/src/main/gui/net/sf/jailer/ui/UIUtil.java @@ -54,6 +54,7 @@ import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLEncoder; +import java.text.DateFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Date; @@ -769,7 +770,8 @@ public class UIUtil { contextDesc += "\nMail: rwisser@users.sourceforge.net\n"; contextDesc += "\n" + JailerVersion.APPLICATION_NAME + " " + JailerVersion.VERSION + "\n\n" + sw.toString(); - String iMsg = msg.toString() + "\n" + JailerVersion.APPLICATION_NAME + " " + JailerVersion.VERSION + "\n\n" + sw.toString(); + String iMsg = (context != null && "AWT".equals(context)? context : "") + + msg.toString() + "\n" + JailerVersion.APPLICATION_NAME + " " + JailerVersion.VERSION + "\n\n" + sw.toString(); iMsg = iMsg .replaceAll("\\bat [^\\n]*/", "at ") .replaceAll("\\bat java.", "atj..") @@ -1258,6 +1260,21 @@ public class UIUtil { } } + public static String toDateAsString(Long time) { + if (time == null) { + return ""; + } + return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Environment.initialLocal).format(new Date(time)); + } + + public static Object toDateAsString(Date date) { + if (date != null) { + return toDateAsString(date.getTime()); + } else { + return null; + } + } + private static Font defaultFont = null; public static Font defaultTitleFont() { diff --git a/src/main/gui/net/sf/jailer/ui/databrowser/BookmarksPanel.java b/src/main/gui/net/sf/jailer/ui/databrowser/BookmarksPanel.java index 0fcff3a58..5e2bd8479 100644 --- a/src/main/gui/net/sf/jailer/ui/databrowser/BookmarksPanel.java +++ b/src/main/gui/net/sf/jailer/ui/databrowser/BookmarksPanel.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -460,12 +461,14 @@ public class BookmarksPanel extends javax.swing.JPanel { public final String datamodelFolder; public final String connectionAlias; public final String rawSchemaMapping; + public final Date date; public BookmarkId(String bookmark, String datamodelFolder, String connectionAlias, String rawSchemaMapping) { this.bookmark = bookmark; this.datamodelFolder = datamodelFolder; this.connectionAlias = connectionAlias; this.rawSchemaMapping = rawSchemaMapping; + this.date = new Date(); } @Override 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 8bac84cbe..382b942ac 100644 --- a/src/main/gui/net/sf/jailer/ui/databrowser/DataBrowser.java +++ b/src/main/gui/net/sf/jailer/ui/databrowser/DataBrowser.java @@ -2549,6 +2549,8 @@ public class DataBrowser extends javax.swing.JFrame { } else if (bmFile != null) { dataBrowser.desktop.restoreSession(null, bmFile); BookmarksPanel.setLastUsedBookmark(bmFile.getName(), dataBrowser.executionContext); + bmFile.setLastModified(System.currentTimeMillis()); + new BookmarksPanel(dataBrowser, dataBrowser.bookmarkMenu, dataBrowser.desktop, dataBrowser.executionContext).updateBookmarksMenu(); } } }); @@ -4138,7 +4140,7 @@ public class DataBrowser extends javax.swing.JFrame { } catch (IOException e) { bookmark = null; } - UISettings.storeLastSession(bookmark); + UISettings.storeLastSession(bookmark, "B"); } } diff --git a/src/main/gui/net/sf/jailer/ui/util/UISettings.java b/src/main/gui/net/sf/jailer/ui/util/UISettings.java index 7f9e3a6b7..eade3b9f1 100644 --- a/src/main/gui/net/sf/jailer/ui/util/UISettings.java +++ b/src/main/gui/net/sf/jailer/ui/util/UISettings.java @@ -22,7 +22,9 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -32,6 +34,7 @@ import net.sf.jailer.datamodel.Table; import net.sf.jailer.ui.Environment; import net.sf.jailer.ui.databrowser.BookmarksPanel; import net.sf.jailer.ui.databrowser.BookmarksPanel.BookmarkId; +import net.sf.jailer.util.Pair; /** * Persists UI settings. @@ -190,14 +193,25 @@ public class UISettings { } } - @SuppressWarnings("unchecked") - public static List loadRecentFiles() { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static List> loadRecentFiles() { Object files = restore(RECENT_FILES); - List result = new ArrayList(); + List> result = new ArrayList>(); if (files instanceof List) { - for (File file: (List) files) { - if (!isSbeModel(file) && !Configuration.getInstance().isTempFile(file)) { - result.add(file); + for (Object file: (List) files) { + Pair p; + if (file instanceof Pair) { + p = (Pair) file; + if (!(p.a instanceof File && p.b instanceof Date)) { + continue; + } + } else if (file instanceof File) { + p = new Pair((File) file, null); + } else { + continue; + } + if (!isSbeModel(p.a) && !Configuration.getInstance().isTempFile(p.a)) { + result.add(p); } } } @@ -206,9 +220,13 @@ public class UISettings { public static void addRecentFile(File file) { if (!isSbeModel(file) && !Configuration.getInstance().isTempFile(file)) { - List files = loadRecentFiles(); - files.remove(file); - files.add(0, file); + List> files = loadRecentFiles(); + for (Iterator> i = files.iterator(); i.hasNext(); ) { + if (i.next().a.equals(file)); { + i.remove(); + } + } + files.add(0, new Pair(file, new Date())); if (MAX_RECENT_LIST_SIZE < files.size()) { files.remove(files.size() - 1); } @@ -216,36 +234,49 @@ public class UISettings { } } - @SuppressWarnings("unchecked") - public static List loadRecentConnectionAliases() { - Object files = restore(RECENT_ALIASES); - List result = new ArrayList(); - if (files instanceof List) { - for (String alias: (List) files) { - result.add(alias); + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static List> loadRecentConnectionAliases() { + Object aliases = restore(RECENT_ALIASES); + List> result = new ArrayList>(); + if (aliases instanceof List) { + for (Object alias: (List) aliases) { + if (alias instanceof String) { + result.add(new Pair((String) alias, null)); + } else if (alias instanceof Pair) { + Pair p = (Pair) alias; + if (p.a instanceof String && p.b instanceof Date) { + result.add(p); + } + } } } return result; } public static void addRecentConnectionAliases(String alias) { - List aliases = loadRecentConnectionAliases(); - aliases.remove(alias); - aliases.add(0, alias); + List> aliases = loadRecentConnectionAliases(); + for (Iterator> i = aliases.iterator(); i.hasNext(); ) { + Pair next = i.next(); + if (next.a.equals(alias)) { + i.remove(); + } + } + aliases.add(0, new Pair(alias, new Date())); if (MAX_RECENT_LIST_SIZE < aliases.size()) { aliases.remove(aliases.size() - 1); } store(RECENT_ALIASES, aliases); } - - @SuppressWarnings("unchecked") + @SuppressWarnings({ "rawtypes" }) public static List loadRecentBookmarks() { Object bookmarks = restore(RECENT_BOOKMARKS); List result = new ArrayList(); if (bookmarks instanceof List) { - for (BookmarkId bm: (List) bookmarks) { - result.add(bm); + for (Object bm: (List) bookmarks) { + if (bm instanceof BookmarkId) { + result.add((BookmarkId) bm); + } } } return result; @@ -263,12 +294,12 @@ public class UISettings { } } - public static void storeLastSession(BookmarkId bookmark) { - store(LAST_SESSION, bookmark); + public static void storeLastSession(BookmarkId bookmark, String module) { + store(LAST_SESSION + module, bookmark); } - public static BookmarkId restoreLastSession() { - Object lastSession = restore(LAST_SESSION); + public static BookmarkId restoreLastSession(String module) { + Object lastSession = restore(LAST_SESSION + module); if (lastSession instanceof BookmarkId) { return (BookmarkId) lastSession; } else {