diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/MainLayout.java b/AccreteGB-src/src/main/java/org/accretegb/modules/MainLayout.java index d7eb643..905825b 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/MainLayout.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/MainLayout.java @@ -25,6 +25,7 @@ import org.accretegb.modules.projectexplorer.ProjectExplorerTabbedPane; import org.accretegb.modules.projectexplorer.ProjectTreeNode; import org.accretegb.modules.tab.TabManager; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.projectexplorer.ProjectExplorerPanel; import org.accretegb.modules.projectmanager.ProjectManager; @@ -37,6 +38,7 @@ import java.awt.event.WindowEvent; import java.io.IOException; import java.util.ArrayList; +import java.util.Map.Entry; /** * @author nkumar @@ -49,7 +51,7 @@ public class MainLayout { private static String TITLE = "AccreteGB - The Breeder's ToolBox"; private static String EXIT_MESSAGE = "Exit MaizeAtlas Application"; private static String CONFIRM_MESSAGE = "Are you sure you want to exit ?"; - private static String SAVE_PROJECTS_MESSAGE = "You may have modified the following projects :\n"; + private static String SAVE_PROJECTS_MESSAGE = "Changes to the following projects have been detected:\n"; private static String SAVE_BEFORE_EXIT = "Save all before exit, click yes\nExit without saving, click no"; @@ -95,28 +97,20 @@ public void initialize() throws IOException { getFrame().addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - JFrame frame = (JFrame) e.getSource(); ArrayList modifiedProjects = new ArrayList(); - JTree projectTrees = AccreteGBBeanFactory.getContext().getBean("projectExplorerTabbedPane", ProjectExplorerTabbedPane.class) - .getExplorerPanel().getProjectsTree(); - DefaultMutableTreeNode projectsRoot = (DefaultMutableTreeNode) projectTrees.getModel().getRoot(); - for(int index = 0;index < projectsRoot.getChildCount(); ++index){ - ProjectTreeNode projectNode = (ProjectTreeNode) projectsRoot.getChildAt(index); - if(projectNode.isModified()){ - modifiedProjects.add(projectNode.getNodeName()); - } - } + for (Entry entry : ChangeMonitor.changedProject.entrySet()) { + if(entry.getValue()) { + modifiedProjects.add(ChangeMonitor.projectIdName.get(entry.getKey())); + } + } if(modifiedProjects.size() > 0){ - int result = JOptionPane.showConfirmDialog(frame, SAVE_PROJECTS_MESSAGE + modifiedProjects + "\n" + SAVE_BEFORE_EXIT, EXIT_MESSAGE, + int result = JOptionPane.showConfirmDialog(null, SAVE_PROJECTS_MESSAGE + modifiedProjects + "\n" + SAVE_BEFORE_EXIT, EXIT_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION); if (result == JOptionPane.YES_OPTION) { - for(int index = 0;index < projectsRoot.getChildCount(); ++index){ - ProjectTreeNode projectNode = (ProjectTreeNode) projectsRoot.getChildAt(index); - if(projectNode.isModified()){ - projectNode.setModified(false); - String projectName = projectNode.getNodeName(); - int projectId = PMProjectDAO.getInstance().findProjectId(projectName); + for(Entry entry : ChangeMonitor.changedProject.entrySet()){ + if(entry.getValue()) { + int projectId = entry.getKey(); ProjectManager.saveOrDeleteProject(projectId,"save"); System.exit(0); } @@ -126,14 +120,12 @@ public void windowClosing(WindowEvent e) { } }else{ - int result = JOptionPane.showConfirmDialog(frame, CONFIRM_MESSAGE, EXIT_MESSAGE, + int result = JOptionPane.showConfirmDialog(null, CONFIRM_MESSAGE, EXIT_MESSAGE, JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { System.exit(0); } } - - } private JTabbedPane getProjectsTree() { diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/experimentaldesign/ExperimentSelectionPanel.java b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/experimentaldesign/ExperimentSelectionPanel.java index dc3be90..ba6f27d 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/experimentaldesign/ExperimentSelectionPanel.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/experimentaldesign/ExperimentSelectionPanel.java @@ -23,6 +23,7 @@ import org.accretegb.modules.hibernate.dao.MeasurementUnitDAO; import org.accretegb.modules.hibernate.dao.StockDAO; import org.accretegb.modules.tab.TabComponentPanel; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegbR.experimental.AlphaDesign; import org.accretegbR.experimental.CompleteRandomizedDesign; import org.accretegbR.experimental.ExperimentDesign; @@ -105,6 +106,8 @@ public class ExperimentSelectionPanel extends TabComponentPanel { public JProgressBar progress = new JProgressBar(); private JLabel reminderMsg; private String currentComm = ""; + private int projectID = -1; + public void initialize() { setDesignSelectionComboBoxActionListener(); setSyncButtonListener(); @@ -467,7 +470,8 @@ public JPanel getDesignSelectionPanel() { JButton randomizeButton = new JButton("Randomize"); randomizeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - submitDesignSelectionButton(); + submitDesignSelectionButton(); + ChangeMonitor.markAsChanged(projectID); } }); randomizeButton.setName("Button"); @@ -1592,4 +1596,10 @@ public String getCurrentComm() { public void setCurrentComm(String currentComm) { this.currentComm = currentComm; } + public int getProjectID() { + return projectID; + } + public void setProjectID(int projectID) { + this.projectID = projectID; + } } \ No newline at end of file diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/Bulk.java b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/Bulk.java index e8e4784..8abc78a 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/Bulk.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/Bulk.java @@ -52,6 +52,7 @@ import org.accretegb.modules.hibernate.dao.MeasurementUnitDAO; import org.accretegb.modules.hibernate.dao.StockDAO; import org.accretegb.modules.tab.TabComponentPanel; +import org.accretegb.modules.util.ChangeMonitor; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.context.support.GenericXmlApplicationContext; @@ -72,8 +73,16 @@ public class Bulk extends JPanel { private List unitsList; private FieldGenerated fieldGenerated; private StickerGenerator stickerGenerator; + private int projectID = -1; public boolean modified; + public int getProjectID() { + return projectID; + } + + public void setProjectID(int projectID) { + this.projectID = projectID; + } public TableToolBoxPanel getBulkTablePanel() { return bulkTablePanel; } @@ -117,11 +126,16 @@ private void addListeners() { Utils.removeAllRowsFromTable((DefaultTableModel)table.getModel()); table.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { - getBulkTablePanel().getNumberOfRows().setText(String.valueOf(getBulkTablePanel().getTable().getRowCount())); + if (e.getType() == TableModelEvent.DELETE || e.getType() == TableModelEvent.INSERT) { + getBulkTablePanel().getNumberOfRows().setText(String.valueOf(getBulkTablePanel().getTable().getRowCount())); + ChangeMonitor.markAsChanged(projectID); + } + }}); importStocks.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showPopup(); + ChangeMonitor.markAsChanged(projectID); } }); mixButton.addActionListener(new ActionListener() { @@ -201,7 +215,7 @@ public void actionPerformed(ActionEvent e) { }else{ nextLink++; } - + ChangeMonitor.markAsChanged(projectID); } }); @@ -221,7 +235,7 @@ public void actionPerformed(ActionEvent e) { table.setValueAt(null, i, table.getIndexOf(ColumnConstants.FINAL_STOCK_NAME)); } } - + ChangeMonitor.markAsChanged(projectID); } }); @@ -234,7 +248,7 @@ public void actionPerformed(ActionEvent e) { table.setValueAt(quantity, row, table.getIndexOf(ColumnConstants.QUANTITY)); } } - + ChangeMonitor.markAsChanged(projectID); } }); setUnit.addActionListener(new ActionListener() { @@ -253,7 +267,7 @@ public void actionPerformed(ActionEvent e) { table.setValueAt(unit, row, table.getIndexOf(ColumnConstants.UNIT)); table.setValueAt(unitId, row, table.getIndexOf(ColumnConstants.UNIT_ID)); } - + ChangeMonitor.markAsChanged(projectID); } }); mixUnit.addActionListener(new ActionListener() { @@ -278,7 +292,7 @@ public void actionPerformed(ActionEvent e) { } else break; }//while - + ChangeMonitor.markAsChanged(projectID); }//if last element } }); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/FieldGenerated.java b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/FieldGenerated.java index e39f168..5bba0bf 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/FieldGenerated.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/FieldGenerated.java @@ -50,6 +50,7 @@ import org.accretegb.modules.hibernate.dao.ObservationUnitDAO; import org.accretegb.modules.hibernate.dao.StockDAO; import org.accretegb.modules.tab.TabComponentPanel; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.constants.ColumnConstants; public class FieldGenerated extends TabComponentPanel { @@ -64,15 +65,17 @@ public class FieldGenerated extends TabComponentPanel { private JButton multiFemaleButton; private JButton clearMatingtypeButton; private JButton setUnsetSelectionButton; - int rowNum; - public int nextLink; private JProgressBar progressBar; private JComboBox matingMethod; private JButton setMatingMethod; private JButton unsetMatingMethod; private List stockList; - public HashMap mateMethodtoID = new HashMap(); private HashSet tagsCreatedinHarvest = new HashSet(); + private int projectID = -1; + public HashMap mateMethodtoID = new HashMap(); + public int rowNum; + public int nextLink; + public boolean modified = false; public TableToolBoxPanel getCrossingTablePanel() { @@ -82,6 +85,14 @@ public TableToolBoxPanel getCrossingTablePanel() { public void setCrossingTablePanel(TableToolBoxPanel crossingTablePanel) { this.crossingTablePanel = crossingTablePanel; } + + public int getProjectID() { + return projectID; + } + + public void setProjectID(int projectID) { + this.projectID = projectID; + } public void initialize() { setLayout(new MigLayout("insets 10, gap 10")); @@ -132,6 +143,7 @@ public void actionPerformed(ActionEvent e) { if(matingMethod.getSelectedIndex() == matingMethod.getItemCount()-1) { matingMethod.setSelectedIndex(0); new MateMethodPanel(FieldGenerated.this); + ChangeMonitor.markAsChanged(projectID); } } }); @@ -160,6 +172,7 @@ public void actionPerformed(ActionEvent e) { table.setValueAt(selectedMethod, i, table.getIndexOf(ColumnConstants.MATE_METHOD)); } } + ChangeMonitor.markAsChanged(projectID); } }); unsetMatingMethod.addActionListener(new ActionListener() { @@ -178,6 +191,7 @@ public void actionPerformed(ActionEvent e) { table.setValueAt(null, i, table.getIndexOf(ColumnConstants.MATE_METHOD)); } } + ChangeMonitor.markAsChanged(projectID); } }); } @@ -363,6 +377,7 @@ public void actionPerformed(ActionEvent e) { setButtonsUsability(); table.getRowSorter().toggleSortOrder(table.getIndexOf(ColumnConstants.MATE_LINK)); table.getRowSorter().toggleSortOrder(table.getIndexOf(ColumnConstants.MATE_LINK)); + ChangeMonitor.markAsChanged(projectID); } }); } @@ -380,11 +395,13 @@ private void generateButtons() { selfButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SFOrSB("SF"); + ChangeMonitor.markAsChanged(projectID); } }); sbButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SFOrSB("SB"); + ChangeMonitor.markAsChanged(projectID); } }); addMatingButtonListener(crButton, "CR"); @@ -502,6 +519,7 @@ public void actionPerformed(ActionEvent e) { table.getRowSorter().toggleSortOrder(table.getIndexOf(ColumnConstants.MATE_LINK)); } + ChangeMonitor.markAsChanged(projectID); } }); @@ -528,6 +546,7 @@ public void actionPerformed(ActionEvent e) { table.clearSelection(); setButtonsUsability(); + ChangeMonitor.markAsChanged(projectID); } }); @@ -552,6 +571,7 @@ public void actionPerformed(ActionEvent e) { table.clearSelection(); setButtonsUsability(); + ChangeMonitor.markAsChanged(projectID); } }); @@ -703,7 +723,11 @@ private void addListeners() { Utils.removeAllRowsFromTable((DefaultTableModel)table.getModel()); table.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { - getCrossingTablePanel().getNumberOfRows().setText(String.valueOf(getCrossingTablePanel().getTable().getRowCount())); + if (e.getType() == TableModelEvent.DELETE || e.getType() == TableModelEvent.INSERT) { + getCrossingTablePanel().getNumberOfRows().setText(String.valueOf(getCrossingTablePanel().getTable().getRowCount())); + ChangeMonitor.markAsChanged(projectID); + } + }}); getCrossingTablePanel().getDeleteButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -842,6 +866,7 @@ public void actionPerformed(ActionEvent e) { progressBar.setVisible(true); new HarvestingImportWorker(FieldGenerated.this, fc).execute(); updateTableStatus(); + ChangeMonitor.markAsChanged(projectID); } }); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/StickerGenerator.java b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/StickerGenerator.java index 96d047d..e3e5b76 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/StickerGenerator.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/harvesting/StickerGenerator.java @@ -62,6 +62,7 @@ import org.accretegb.modules.hibernate.dao.PassportDAO; import org.accretegb.modules.main.StringEncrypter; import org.accretegb.modules.util.AdjustTableColumnSize; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.util.LoggerUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -95,7 +96,14 @@ public class StickerGenerator extends JPanel { private List deletedPakcets; private TreeMap>> stockCompositionByMate = new TreeMap>>(); private TreeMap>> stockCompositionByBulk = new TreeMap>>(); + private int projectID = -1; + public int getProjectID() { + return projectID; + } + public void setProjectID(int projectID) { + this.projectID = projectID; + } public TableToolBoxPanel getStickerTablePanel() { return stickerTablePanel; @@ -271,7 +279,8 @@ public void actionPerformed(ActionEvent actionEvent) { for(int row: table.getSelectedRows()) { table.setValueAt(date, row, column); table.setValueAt(true, row, table.getIndexOf(ColumnConstants.MODIFIED)); - } + } + ChangeMonitor.markAsChanged(projectID); } }); setQuantity.addActionListener(new ActionListener() { @@ -281,7 +290,8 @@ public void actionPerformed(ActionEvent actionEvent) { for(int row: table.getSelectedRows()) { table.setValueAt(count, row, column); table.setValueAt(true, row, table.getIndexOf(ColumnConstants.MODIFIED)); - } + } + ChangeMonitor.markAsChanged(projectID); } }); setUnit.addActionListener(new ActionListener() { @@ -301,6 +311,7 @@ public void actionPerformed(ActionEvent e) { table.setValueAt(unitId, row, table.getIndexOf(ColumnConstants.UNIT_ID)); table.setValueAt(true, row, table.getIndexOf(ColumnConstants.MODIFIED)); } + ChangeMonitor.markAsChanged(projectID); } }); @@ -359,11 +370,13 @@ else if (packetRows.size() < newCount){ autoUpdate = false; } table.clearSelection(); + ChangeMonitor.markAsChanged(projectID); } }); importButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { showPopup(); + ChangeMonitor.markAsChanged(projectID); } }); table.getModel().addTableModelListener(new TableModelListener() { @@ -376,7 +389,11 @@ public void tableChanged(TableModelEvent event) { table.setValueAt(true, row, table.getIndexOf(ColumnConstants.MODIFIED)); } autoUpdate = false; - stickerTablePanel.getNumberOfRows().setText(String.valueOf(stickerTablePanel.getTable().getRowCount())); + if (event.getType() == TableModelEvent.DELETE || event.getType() == TableModelEvent.INSERT) { + stickerTablePanel.getNumberOfRows().setText(String.valueOf(stickerTablePanel.getTable().getRowCount())); + ChangeMonitor.markAsChanged(projectID); + } + } }); getStickerTablePanel().getRefreshButton().setToolTipText("sync with database"); @@ -864,7 +881,7 @@ public void actionPerformed(ActionEvent e) { } else break; }//while - + ChangeMonitor.markAsChanged(projectID); }//if last element } diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/planting/TableView.java b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/planting/TableView.java index fa81c8e..f82e5ce 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/planting/TableView.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/planting/TableView.java @@ -11,6 +11,7 @@ import org.accretegb.modules.hibernate.MateMethodConnect; import org.accretegb.modules.hibernate.dao.ObservationUnitDAO; import org.accretegb.modules.hibernate.dao.StockDAO; +import org.accretegb.modules.util.ChangeMonitor; import org.apache.commons.lang.StringUtils; import javax.swing.*; import javax.swing.event.TableModelEvent; @@ -48,12 +49,13 @@ public class TableView extends JPanel { private boolean tableChanged = false; private Map> tag_plants = new HashMap>(); private Map tag_Color = new HashMap(); - public boolean synced = false; private Date plantingDate = null; private int currentStartRow = 0; + private int projectID = -1; public String prefix = null; public boolean prefixIsFixed = false; public String plantingIndex = null; + public boolean synced = false; final CustomCalendar costomizedCalendar = new CustomCalendar(); public void initialize() { setLayout(new MigLayout("insets 10, gap 10")); @@ -119,7 +121,7 @@ public void actionPerformed(ActionEvent e) { changeTagsByStartRow(Integer.parseInt(startRow.getText())); updateWhenRowDataChanged(); // System.out.println(stockList.get(0).getTag()); - synced = false; + setSyncedFalse(); } } }); @@ -127,7 +129,7 @@ public void actionPerformed(ActionEvent e) { reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { populateTableBasedonDatabase(stockList); - synced = false; + setSyncedFalse(); } }); @@ -158,7 +160,7 @@ public void actionPerformed(ActionEvent e) { { plantingIndex = index.getText(); updateWhenRowCountChanged(); - synced = false; + setSyncedFalse(); } } } @@ -328,7 +330,7 @@ public void actionPerformed(ActionEvent actionEvent) { } updateWhenRowDataChanged(); - synced = false; + setSyncedFalse(); } @@ -384,7 +386,7 @@ private void updatePlantTagsWhenRowDataChange(int row, int updatedColumnIndex){ } } } - tableChanged = true; + setTableChanged(true); table.setValueAt(true,row, table.getIndexOf(ColumnConstants.MODIFIED)); } private void updatePlantTagsWhenRowCountChange(int row) { @@ -477,7 +479,7 @@ public void actionPerformed(ActionEvent e) { updatePlantTagsWhenRowDataChange(row,table.getIndexOf(ColumnConstants.MATING_PLAN)); } updateWhenRowDataChanged(); - synced = false; + setSyncedFalse(); } } }); @@ -505,7 +507,7 @@ private void addImport(JPanel parametersPanel){ public void actionPerformed(ActionEvent e) { importButtonActionPerformed(); - synced = false; + setSyncedFalse(); } @@ -620,7 +622,7 @@ public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "Only one year is allowed in one planting group.
You have synced the planting group.
" + "Changing planting date is not going to change the prefix of the tag names"); } - synced = false; + setSyncedFalse(); } }else{ JOptionPane.showMessageDialog(null, "Only one year allowed in one planting group", "Invalid Date", JOptionPane.ERROR_MESSAGE); @@ -654,7 +656,7 @@ public void actionPerformed(ActionEvent e) { }else{ JOptionPane.showMessageDialog(null, "Invalid Integer", "", JOptionPane.ERROR_MESSAGE); } - synced = false; + setSyncedFalse(); } }); subpanel.add(kernels, "h 24:24:24, w MIN(100%, 150)"); @@ -679,7 +681,7 @@ public void actionPerformed(ActionEvent e) { updatePlantTagsWhenRowDataChange(row,column); } updateWhenRowDataChanged(); - synced = false; + setSyncedFalse(); } }); subpanel.add(delay, "h 24:24:24, w MIN(100%, 150)"); @@ -703,7 +705,7 @@ public void actionPerformed(ActionEvent e) { updatePlantTagsWhenRowDataChange(row,column); } updateWhenRowDataChanged(); - synced = false; + setSyncedFalse(); } }); subpanel.add(purpose, "h 24:24:24, w MIN(100%, 150)"); @@ -727,7 +729,7 @@ public void actionPerformed(ActionEvent e) { updatePlantTagsWhenRowDataChange(row,column); } updateWhenRowDataChanged(); - synced = false; + setSyncedFalse(); } }); subpanel.add(comment, "h 24:24:24, w MIN(100%, 150)"); @@ -809,8 +811,8 @@ public void actionPerformed(ActionEvent e) { ((DefaultTableModel)table.getModel()).addRow(rowData); stockList.add(new PlantingRow(rowData, table)); updateWhenRowCountChanged(); - tableChanged = true; - synced = false; + setTableChanged(true); + setSyncedFalse(); autoDelete = false; } }); @@ -843,7 +845,7 @@ public void tableChanged(TableModelEvent e) { updateEndFromStart(row); updatePlantTagsWhenRowCountChange(row); table.setValueAt(true, e.getFirstRow(), table.getIndexOf(ColumnConstants.MODIFIED)); - tableChanged = true; + setTableChanged(true); } // not need to update for every single value change in table - very slow for large amount of rows. autoDelete = false; @@ -865,7 +867,7 @@ private void updateButtons(MouseEvent mouseEvent) { public void actionPerformed(ActionEvent e) { showPopup(); updateWhenRowDataChanged(); - synced = false; + setSyncedFalse(); } }); popup.add(change); @@ -964,7 +966,7 @@ public void populateTableBasedonDatabase(List stockList) { ((DefaultTableModel) getStocksOrderPanel().getTable().getModel()).addRow(rowData); } updateWhenRowCountChanged(); - tableChanged = true; + setTableChanged(true); autoDelete = false; } @@ -1171,7 +1173,7 @@ public void actionPerformed(ActionEvent e) { getStocksOrderPanel().getMoveDownButton().setEnabled(true); } updateWhenRowCountChanged(); - synced = false; + setSyncedFalse(); } }); @@ -1246,7 +1248,7 @@ public void actionPerformed(ActionEvent e) { getStocksOrderPanel().getMoveDownButton().setEnabled(true); } updateWhenRowCountChanged(); - synced = false; + setSyncedFalse(); } }); @@ -1401,8 +1403,8 @@ public void actionPerformed(ActionEvent e) { } } updateWhenRowCountChanged(); - tableChanged = true; - synced = false; + setTableChanged(true); + setSyncedFalse(); getStocksOrderPanel().getDeleteButton().setEnabled( false); if (getStocksOrderPanel().getMoveDownButton() != null) @@ -1610,6 +1612,10 @@ public boolean isTableChanged() { public void setTableChanged(boolean tableChanged) { this.tableChanged = tableChanged; } + public void setSyncedFalse() { + ChangeMonitor.markAsChanged(projectID); + this.synced = false; + } public Map> getPlantTags() { return tag_plants; } @@ -1620,5 +1626,10 @@ public void setPlantTags(Map> plantTags) { public Map getTag_Color() { return tag_Color; } - + public int getProjectID() { + return projectID; + } + public void setProjectID(int projectID) { + this.projectID = projectID; + } } \ No newline at end of file diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/stocksinfo/StocksInfoPanel.java b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/stocksinfo/StocksInfoPanel.java index 082a956..08e9161 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/stocksinfo/StocksInfoPanel.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/germplasm/stocksinfo/StocksInfoPanel.java @@ -32,6 +32,7 @@ import org.accretegb.modules.projectexplorer.ProjectTree; import org.accretegb.modules.projectexplorer.ProjectTreeNode; import org.accretegb.modules.tab.TabComponentPanel; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.customswingcomponent.TextField; import javax.swing.*; import javax.swing.event.ListSelectionEvent; @@ -93,7 +94,7 @@ public class StocksInfoPanel extends TabComponentPanel { private JLabel matchNotFound; private JPanel exportPanel; private JCheckBox showAllPackets; - + private int projectID = -1; /** * does layout of inputs from user @@ -237,7 +238,8 @@ private void importButtonActionPerformed(){ index++; } - br.close(); + br.close(); + ChangeMonitor.markAsChanged(projectID); } } @@ -597,7 +599,8 @@ public void tableChanged(TableModelEvent e) { } private void updateNumberofItemsCart(){ - getSaveTablePanel().getNumberOfRows().setText(String.valueOf(getSaveTablePanel().getTable().getRowCount())); + ChangeMonitor.markAsChanged(projectID); + getSaveTablePanel().getNumberOfRows().setText(String.valueOf(getSaveTablePanel().getTable().getRowCount())); } private void addSaveTablePanelListeners(final CheckBoxIndexColumnTable table,final TableToolBoxPanel tableToolBoxPanel) { @@ -974,4 +977,11 @@ public JCheckBox getShowAllPackets() { public void setShowAllPackets(JCheckBox showAllPackets) { this.showAllPackets = showAllPackets; } + + public int getProjectID() { + return projectID; + } + public void setProjectID(int projectID) { + this.projectID = projectID; + } } \ No newline at end of file diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/hibernate/dao/PMProjectDAO.java b/AccreteGB-src/src/main/java/org/accretegb/modules/hibernate/dao/PMProjectDAO.java index 92ca395..5c8b3cb 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/hibernate/dao/PMProjectDAO.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/hibernate/dao/PMProjectDAO.java @@ -52,7 +52,7 @@ public Integer findProjectId(String projectName) { } @SuppressWarnings({ "-access", "unchecked" }) - public PMProject findProjectName(Integer projectId) { + public PMProject findProjectObj(Integer projectId) { Session session = hibernateSessionFactory.getPmSessionFactory().openSession(); Query query = session.createSQLQuery("Select * from project where project_id = '"+projectId+"'") .addEntity(PMProject.class); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/menu/ExitMenuItem.java b/AccreteGB-src/src/main/java/org/accretegb/modules/menu/ExitMenuItem.java index cafd0fd..7e6f983 100644 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/menu/ExitMenuItem.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/menu/ExitMenuItem.java @@ -22,6 +22,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; +import java.util.Map.Entry; import javax.swing.JOptionPane; import javax.swing.JTree; @@ -32,6 +33,7 @@ import org.accretegb.modules.projectexplorer.ProjectExplorerTabbedPane; import org.accretegb.modules.projectexplorer.ProjectTreeNode; import org.accretegb.modules.projectmanager.ProjectManager; +import org.accretegb.modules.util.ChangeMonitor; /** * @author nkumar @@ -42,7 +44,7 @@ public class ExitMenuItem extends MenuItem { private static final long serialVersionUID = 1L; private static String EXIT_MESSAGE = "Exit MaizeAtlas Application"; private static String CONFIRM_MESSAGE = "Are you sure you want to exit ?"; - private static String SAVE_PROJECTS_MESSAGE = "You may have modified the following projects :\n"; + private static String SAVE_PROJECTS_MESSAGE = "Changes to the following projects have been detected:\n"; private static String SAVE_BEFORE_EXIT = "Save all before exit, click yes\nExit without saving, click no"; @@ -62,24 +64,19 @@ private class ExitButtonActionListener implements ActionListener { */ public void actionPerformed(ActionEvent e) { ArrayList modifiedProjects = new ArrayList(); - JTree projectTrees = AccreteGBBeanFactory.getContext().getBean("projectExplorerTabbedPane", ProjectExplorerTabbedPane.class) - .getExplorerPanel().getProjectsTree(); - DefaultMutableTreeNode projectsRoot = (DefaultMutableTreeNode) projectTrees.getModel().getRoot(); - for(int index = 0;index < projectsRoot.getChildCount(); ++index){ - ProjectTreeNode projectNode = (ProjectTreeNode) projectsRoot.getChildAt(index); - modifiedProjects.add(projectNode.getNodeName()); - } + for (Entry entry : ChangeMonitor.changedProject.entrySet()) { + if(entry.getValue()) { + modifiedProjects.add(ChangeMonitor.projectIdName.get(entry.getKey())); + } + } if(modifiedProjects.size() > 0){ int result = JOptionPane.showConfirmDialog(null, SAVE_PROJECTS_MESSAGE + modifiedProjects + "\n" + SAVE_BEFORE_EXIT, EXIT_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION); if (result == JOptionPane.YES_OPTION) { - for(int index = 0;index < projectsRoot.getChildCount(); ++index){ - ProjectTreeNode projectNode = (ProjectTreeNode) projectsRoot.getChildAt(index); - if(projectNode.isModified()){ - projectNode.setModified(false); - String projectName = projectNode.getNodeName(); - int projectId = PMProjectDAO.getInstance().findProjectId(projectName); + for(Entry entry : ChangeMonitor.changedProject.entrySet()){ + if(entry.getValue()) { + int projectId = entry.getKey(); ProjectManager.saveOrDeleteProject(projectId,"save"); System.exit(0); } diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/menu/SaveProjectSubMenuItem.java b/AccreteGB-src/src/main/java/org/accretegb/modules/menu/SaveProjectSubMenuItem.java index ba0fc9f..82fdbdc 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/menu/SaveProjectSubMenuItem.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/menu/SaveProjectSubMenuItem.java @@ -37,7 +37,6 @@ public void actionPerformed(ActionEvent e) { String projectName = projectNode.getNodeName(); int projectId = PMProjectDAO.getInstance().findProjectId(projectName); ProjectManager.saveProject(projectId); - projectNode.setModified(false); } } } diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/phenotype/PhenotypeExportPanel.java b/AccreteGB-src/src/main/java/org/accretegb/modules/phenotype/PhenotypeExportPanel.java index 33cf71f..3c92e11 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/phenotype/PhenotypeExportPanel.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/phenotype/PhenotypeExportPanel.java @@ -73,6 +73,7 @@ import org.accretegb.modules.hibernate.dao.MeasurementParameterDAO; import org.accretegb.modules.hibernate.dao.ObservationUnitDAO; import org.accretegb.modules.sampling.SampleSelectionPanel; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.hibernate.dao.MeasurementUnitDAO; import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; @@ -103,7 +104,7 @@ public class PhenotypeExportPanel extends JPanel { private LinkedHashMap subsetCommentMap = new LinkedHashMap(); private LinkedHashMap>> subsetJlistMap = new LinkedHashMap>>(); private LinkedHashMap> parameterInfoMap; - + private int projectID = -1; public void initialize() { initializeOptionsForDescriptors(); @@ -262,6 +263,7 @@ private void updateSubsetJlistMap(){ subsetJlist.add(deslist); subsetJlist.add(paralist); getSubsetJlistMap().put(getCurrentSubsetName(), subsetJlist); + ChangeMonitor.markAsChanged(projectID); } private void initializeOptionsForDescriptors(){ @@ -804,6 +806,7 @@ public void actionPerformed(ActionEvent e) { { sampleSelectionPanel.getSampleSelectionTablePanel().getTableSubset().addItem(str); } + ChangeMonitor.markAsChanged(projectID); }else{ JOptionPane.showConfirmDialog(null, "Please select subset from the table", "", @@ -1330,6 +1333,14 @@ public void setSampleSelectionPanel(SampleSelectionPanel sampleSelectionPanel) { this.sampleSelectionPanel = sampleSelectionPanel; } + public int getProjectID() { + return projectID; + } + + public void setProjectID(int projectID) { + this.projectID = projectID; + } + diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeActionListener.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeActionListener.java index 5a055d5..8665e66 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeActionListener.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeActionListener.java @@ -110,7 +110,6 @@ private void maybeShowPopup(MouseEvent evt) { } else if (level == 3) { ProjectTreeNode parentNode = ((ProjectTreeNode) selectedNode.getParent()); String parentNodeName = parentNode.getUserObject().toString(); - System.out.print("Parent Node Name "+parentNodeName); if (parentNodeName.equals(ProjectConstants.STOCK_SELECTION)) { getStockSelectionChildListener().setTreeNode(selectedNode); //project name is root node. @@ -156,20 +155,17 @@ private void maybeShowPopup(MouseEvent evt) { ProjectTreeNode selectedNode = ((ProjectTreeNode) path.getLastPathComponent()); int level = selectedNode.getLevel(); - selectedNode.setModified(true); if(level != 1){ int levelFlag = level; while(levelFlag >=1) { ProjectTreeNode modifiedNode = selectedNode.getParentNodes().get(0); - modifiedNode.setModified(true); levelFlag --; } } if(level == 1){ getSaveProjectItem().setEnabled(true); - selectedNode.setModified(true); }else{ getSaveProjectItem().setEnabled(false); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeNode.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeNode.java index 90f4aa9..a2bda7d 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeNode.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectexplorer/ProjectTreeNode.java @@ -36,7 +36,6 @@ public class ProjectTreeNode extends DefaultMutableTreeNode { private NodeType type; private String nodeName; private TabComponent tabComponent; - private boolean modified = false; public ProjectTreeNode(String nodeName) { super(nodeName); @@ -101,16 +100,7 @@ public NodeType getType() { public void setType(NodeType type) { this.type = type; } - - - public boolean isModified() { - return modified; - } - - public void setModified(boolean modified) { - this.modified = modified; - } - + } diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateExperimentGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateExperimentGroup.java index fd728bb..6aa51fe 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateExperimentGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateExperimentGroup.java @@ -236,6 +236,7 @@ public static TabComponent createExperimentPanel(int projectId, String groupPath BeanDefinitionBuilder experimentalDesignDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(ExperimentSelectionPanel.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("experimentalSelectedStocksPanel", getContext().getBean("experimentalDesignSelectedStocksPanel" + groupPath)) .addPropertyValue("designPanel", getContext().getBean("rcbdDesignPanel" + groupPath)) diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateHarvestGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateHarvestGroup.java index f4eae12..2f8a598 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateHarvestGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateHarvestGroup.java @@ -130,6 +130,7 @@ public static TabComponent createHarvestPanel(int projectId, String groupPath, S //field generated group BeanDefinitionBuilder fieldGeneratedHarvestingDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(FieldGenerated.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("crossingTablePanel",getContext().getBean("crossingTablePanel"+groupPath)) .setInitMethodName("initialize"); ((GenericXmlApplicationContext) getContext()).registerBeanDefinition("fieldGenerated" @@ -185,6 +186,7 @@ public static TabComponent createHarvestPanel(int projectId, String groupPath, S // bulk bean definition BeanDefinitionBuilder bulkHarvestingDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Bulk.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("bulkTablePanel",getContext().getBean("bulkTablePanel"+groupPath)) .addPropertyValue("fieldGenerated", getContext().getBean("fieldGenerated"+groupPath)) .setInitMethodName("initialize"); @@ -247,6 +249,7 @@ public static TabComponent createHarvestPanel(int projectId, String groupPath, S //stickerGenerator beans BeanDefinitionBuilder stickerGeneratorHarvestingDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(StickerGenerator.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("stickerTablePanel", getContext().getBean("stickerTablePanel" + groupPath)) .addPropertyValue("fieldGenerated",getContext().getBean("fieldGenerated" + groupPath)) .addPropertyValue("bulk", getContext().getBean("bulk" + groupPath)) diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePhenotypeGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePhenotypeGroup.java index cfae02f..7adf727 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePhenotypeGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePhenotypeGroup.java @@ -174,6 +174,7 @@ public static TabComponent createphenotypePanel(int projectId, String groupPath, BeanDefinitionBuilder exportPanelDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(PhenotypeExportPanel.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("phenotypeTagsTablePanel", getContext().getBean("phenotypeTagsPanel" + groupPath)) .addPropertyValue("exportButton", new JButton("Export")) .addPropertyValue("descriptorsOptions", new JList()) diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePlantingGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePlantingGroup.java index 919090b..0e99643 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePlantingGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreatePlantingGroup.java @@ -195,6 +195,7 @@ public static TabComponent createPlantingPanel(int projectId, String groupPath, BeanDefinitionBuilder tableViewPlantingDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(TableView.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("stocksOrderPanel",getContext().getBean("plantingStocksOrderPanel" + groupPath)) .setInitMethodName("initialize"); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateSamplingGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateSamplingGroup.java index 0879523..3e4f88e 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateSamplingGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateSamplingGroup.java @@ -173,6 +173,7 @@ public static TabComponent createsamplingPanel(int projectId, String groupPath, BeanDefinitionBuilder sampleSelectionPanelDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(SampleSelectionPanel.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("sampleSelectionTablePanel", getContext().getBean("sampleSelectionTablePanel" + groupPath)) .setInitMethodName("initialize"); ((GenericXmlApplicationContext) getContext()).registerBeanDefinition("sampleSelectionPanel" + groupPath, @@ -255,6 +256,7 @@ public static TabComponent createsamplingPanel(int projectId, String groupPath, BeanDefinitionBuilder samplingSettingPanelDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(SampleSettingPanel.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("sampleSettingTablePanel", getContext().getBean("sampleSettingTablePanel" + groupPath)) .setInitMethodName("initialize"); ((GenericXmlApplicationContext) getContext()).registerBeanDefinition("sampleSettingPanel" + groupPath, diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateStockSelectionGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateStockSelectionGroup.java index d823a66..a9c93e0 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateStockSelectionGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/CreateStockSelectionGroup.java @@ -140,6 +140,7 @@ public static TabComponent createStockInfoPanel(int projectId, String groupPath, BeanDefinitionBuilder stocksInfoDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(StocksInfoPanel.class) + .addPropertyValue("projectID", projectId) .addPropertyValue("stockname", new JTextField(23)) .addPropertyValue("accession", new JTextField(23)) .addPropertyValue("pedigree", new JTextField(23)) diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ParsePhenotypeGroup.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ParsePhenotypeGroup.java index 3ec607b..c1fe9d1 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ParsePhenotypeGroup.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ParsePhenotypeGroup.java @@ -91,7 +91,7 @@ public List getExportTagsTable(String exportTableJson, String groupNam tagnames.add(String.valueOf(oneRow[8])); } - String boxItem = PMProjectDAO.getInstance().findProjectName(projectId).getProjectName()+"-"+groupName+"-"+"all"; + String boxItem = PMProjectDAO.getInstance().findProjectObj(projectId).getProjectName()+"-"+groupName+"-"+"all"; phenotyInfoPanel.subsets.put(boxItem, tagnames); phenotyInfoPanel.subsetListComboBox.addItem(boxItem); @@ -143,7 +143,7 @@ public List getExportTagsTable(String exportTableJson, String groupNam } phenotypePanel.getPhenotypeExportPanel().getPhenotypeTagsTablePanel().getTableSubset().addItem(subsetName); phenotypePanel.getPhenotypeExportPanel().getSubsetTableMap().put(subsetName, subsetTable); - boxItem = PMProjectDAO.getInstance().findProjectName(projectId).getProjectName()+"-"+groupName+"-"+subsetName; + boxItem = PMProjectDAO.getInstance().findProjectObj(projectId).getProjectName()+"-"+groupName+"-"+subsetName; phenotyInfoPanel.subsets.put(boxItem, subsetTagnames); phenotyInfoPanel.subsetListComboBox.addItem(boxItem); phenotypePanel.getPhenotypeExportPanel().setSubsetCommentMap(subsetCommentMap); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/PopulateProjectTree.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/PopulateProjectTree.java index fbf11c3..d777b57 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/PopulateProjectTree.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/PopulateProjectTree.java @@ -25,6 +25,7 @@ import org.accretegb.modules.main.LoginScreen; import org.accretegb.modules.projectexplorer.ProjectExplorerTabbedPane; import org.accretegb.modules.projectexplorer.ProjectTree; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.util.ThreadPool; /** @@ -86,7 +87,7 @@ protected Object doInBackground() throws Exception { ArrayList projectIds = TokenRelationDAO.getInstance().findProjects(userId); if(projectIds.size() > 0){ for(Integer projectId :projectIds ){ - PMProject project = PMProjectDAO.getInstance().findProjectName(projectId); + PMProject project = PMProjectDAO.getInstance().findProjectObj(projectId); ProjectTree projectTree = new ProjectTree(project.getProjectName()); getProjectExplorerTabbedPane().getExplorerPanel().addProject(projectTree); new CreateStockSelectionGroup(projectTree,projectId); @@ -95,7 +96,8 @@ protected Object doInBackground() throws Exception { new CreateSamplingGroup(projectTree,projectId); new CreateExperimentGroup(projectTree,projectId); new CreateHarvestGroup(projectTree,projectId); - + ChangeMonitor.changedProject.put(projectId, false); + ChangeMonitor.projectIdName.put(projectId, project.getProjectName()); } } return null; diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManager.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManager.java index 984b819..43c6922 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManager.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManager.java @@ -55,7 +55,7 @@ public static void saveOrDeleteProject(int projectId, String operation){ int projectsCount = projectTree.getModel().getChildCount(projectTree.getModel().getRoot()); for(int index = 0; index < projectsCount; ++ index){ String projectName = projectTree.getModel().getChild(projectTree.getModel().getRoot(), index).toString(); - if(projectName.equals(PMProjectDAO.getInstance().findProjectName(projectId).getProjectName())){ + if(projectName.equals(PMProjectDAO.getInstance().findProjectObj(projectId).getProjectName())){ ProjectTreeNode projectRootNode = (ProjectTreeNode) projectTree.getModel().getChild(projectTree.getModel().getRoot(), index); stockSelectionNode = (ProjectTreeNode) projectTree.getModel().getChild(projectRootNode,0); experimentNode = (ProjectTreeNode) projectTree.getModel().getChild(projectRootNode,1); @@ -203,7 +203,7 @@ public static void saveProject(int projectId){ int projectsCount = projectTree.getModel().getChildCount(projectTree.getModel().getRoot()); for(int index = 0; index < projectsCount; ++ index){ String projectName = projectTree.getModel().getChild(projectTree.getModel().getRoot(), index).toString(); - if(projectName.equals(PMProjectDAO.getInstance().findProjectName(projectId).getProjectName())){ + if(projectName.equals(PMProjectDAO.getInstance().findProjectObj(projectId).getProjectName())){ ProjectTreeNode projectRootNode = (ProjectTreeNode) projectTree.getModel().getChild(projectTree.getModel().getRoot(), index); stockSelectionNode = (ProjectTreeNode) projectTree.getModel().getChild(projectRootNode,0); experimentNode = (ProjectTreeNode) projectTree.getModel().getChild(projectRootNode,1); diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManagerAllPanel.java b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManagerAllPanel.java index dec0bc4..723355e 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManagerAllPanel.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/projectmanager/ProjectManagerAllPanel.java @@ -47,6 +47,7 @@ import org.accretegb.modules.projectexplorer.ProjectExplorerPanel; import org.accretegb.modules.projectexplorer.ProjectExplorerTabbedPane; import org.accretegb.modules.projectexplorer.ProjectTree; +import org.accretegb.modules.util.ChangeMonitor; import net.miginfocom.swing.MigLayout; @@ -282,24 +283,33 @@ public void actionPerformed(ActionEvent e) { int projectId = PMProjectDAO.getInstance().findProjectId(projectName); if (token != null && token.equals(userName)) { if(CollaborateRelationDAO.getInstance().isCollaborator(projectId,userId)){ - int option = JOptionPane.showConfirmDialog(null, "Do you want to save the project groups?", "", JOptionPane.OK_OPTION); - if(option ==JOptionPane.OK_OPTION ) - { - ProjectManager.saveOrDeleteProject(projectId, "save"); - Date lastModified = PMProjectDAO.getInstance().updateLastModifiedDate(projectId); - getAllTablePanel().getTable().setValueAt(lastModified, row, getAllTablePanel().getTable().getIndexOf("Last Modified")); + if (ChangeMonitor.changedProject.get(projectId)) { + int option = JOptionPane.showConfirmDialog(null, "Changes to this project have been detected. Click Yes to save them or No to discard them", "", JOptionPane.OK_OPTION); + if(option ==JOptionPane.OK_OPTION ) + { + ProjectManager.saveOrDeleteProject(projectId, "save"); + Date lastModified = PMProjectDAO.getInstance().updateLastModifiedDate(projectId); + getAllTablePanel().getTable().setValueAt(lastModified, row, getAllTablePanel().getTable().getIndexOf("Last Modified")); + } + if(option != JOptionPane.CLOSED_OPTION) { + TokenRelationDAO.getInstance().delete(projectId, userId); + getAllTablePanel().getTable().setValueAt(null, row, getAllTablePanel().getTable().getIndexOf("Token Holder")); + getAllTablePanel().getTable().setValueAt(null, row, getAllTablePanel().getTable().getIndexOf("Expiration Date")); + ProjectManager.removeProjectFromExploer(projectName); + ChangeMonitor.changedProject.remove(projectId); + } + }else { + TokenRelationDAO.getInstance().delete(projectId, userId); + getAllTablePanel().getTable().setValueAt(null, row, getAllTablePanel().getTable().getIndexOf("Token Holder")); + getAllTablePanel().getTable().setValueAt(null, row, getAllTablePanel().getTable().getIndexOf("Expiration Date")); + ProjectManager.removeProjectFromExploer(projectName); + ChangeMonitor.changedProject.remove(projectId); } }else{ ProjectManagerErrorConstants.promptCollaboratorRemovedError(projectName); DefaultTableModel model =(DefaultTableModel)getAllTablePanel().getTable().getModel(); model.removeRow(getAllTablePanel().getTable().convertRowIndexToModel(row)); } - TokenRelationDAO.getInstance().delete(projectId, userId); - getAllTablePanel().getTable().setValueAt(null, row, getAllTablePanel().getTable().getIndexOf("Token Holder")); - getAllTablePanel().getTable().setValueAt(null, row, getAllTablePanel().getTable().getIndexOf("Expiration Date")); - ProjectManager.removeProjectFromExploer(projectName); - - } else { if (token == null) { ProjectManagerErrorConstants.promptNoTokenToReturnError(projectName); @@ -398,7 +408,9 @@ protected Object doInBackground() throws Exception { new CreatePhenotypeGroup(projectTree,projectId); new CreateSamplingGroup(projectTree,projectId); new CreateExperimentGroup(projectTree,projectId); - new CreateHarvestGroup(projectTree,projectId); + new CreateHarvestGroup(projectTree,projectId); + ChangeMonitor.changedProject.put(projectId,false); + ChangeMonitor.projectIdName.put(projectId, projectName); } else { ProjectManagerErrorConstants.promptProjectAlreadyCheckedOutError(projectName); getAllTablePanel().getTable().setValueAt(UserDAO.getInstance().findUserName(token.getUserId()), row, getAllTablePanel().getTable().getIndexOf("Token Holder")); @@ -487,7 +499,7 @@ public static void populateTable() { List projectIds = CollaborateRelationDAO.getInstance().findByUserId(userId); if(projectIds.size()>0){ for (Integer projectId : projectIds) { - PMProject project = PMProjectDAO.getInstance().findProjectName(projectId); + PMProject project = PMProjectDAO.getInstance().findProjectObj(projectId); TokenRelation tokenRelation = TokenRelationDAO.getInstance().findTokenHolder(projectId); ProjectRow newRow = new ProjectRow(project.getProjectName(), UserDAO.getInstance().findUserName(project.getUserId()), tokenRelation == null? null : UserDAO.getInstance().findUserName(tokenRelation.getUserId()), diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSelectionPanel.java b/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSelectionPanel.java index 853823d..0ea967a 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSelectionPanel.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSelectionPanel.java @@ -71,6 +71,7 @@ import org.accretegb.modules.hibernate.dao.MeasurementParameterDAO; import org.accretegb.modules.hibernate.dao.ObservationUnitDAO; import org.accretegb.modules.phenotype.PhenotypeExportPanel; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.hibernate.dao.MeasurementUnitDAO; import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; @@ -93,6 +94,7 @@ public class SampleSelectionPanel extends JPanel { private LinkedHashMap subsetTableMap = new LinkedHashMap(); private LinkedHashMap subsetCommentMap = new LinkedHashMap(); private LinkedHashMap> parameterInfoMap; + private int projectID = -1; public ArrayList options = new ArrayList(); @@ -230,6 +232,7 @@ public void actionPerformed(ActionEvent e) { options.add(str); } subset.setSelectedItem(str); + ChangeMonitor.markAsChanged(projectID); }else{ JOptionPane.showConfirmDialog(null, "Please select subset from the table", "", @@ -425,4 +428,12 @@ public PhenotypeExportPanel getPhenotypeExportPanel() { public void setPhenotypeExportPanel(PhenotypeExportPanel phenotypeExportPanel) { this.phenotypeExportPanel = phenotypeExportPanel; } + public int getProjectID() { + return projectID; + } + + public void setProjectID(int projectID) { + this.projectID = projectID; + } + } diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSettingPanel.java b/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSettingPanel.java index 8fecf52..b0abab5 100755 --- a/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSettingPanel.java +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/sampling/SampleSettingPanel.java @@ -61,6 +61,7 @@ import org.accretegb.modules.hibernate.dao.ObservationUnitSampleDAO; import org.accretegb.modules.hibernate.dao.SourceDAO; import org.accretegb.modules.hibernate.dao.StockDAO; +import org.accretegb.modules.util.ChangeMonitor; import org.accretegb.modules.util.LoggerUtils; import org.hibernate.HibernateException; @@ -82,6 +83,8 @@ public class SampleSettingPanel extends JPanel { public String location = null; public String currentSubset = null; private JProgressBar progress ; + private int projectID = -1; + public void initialize() { setLayout(new MigLayout("insets 10, gap 10")); @@ -150,7 +153,9 @@ public void populateSettingSubset(String subsetName){ table.setModel(model); } updateNumofItems(); - table.setHasSynced((Boolean) this.subsetInfo.get(subsetName).get("syncstatus")); + if (this.subsetInfo != null && this.subsetInfo.get(subsetName)!= null) { + table.setHasSynced((Boolean) this.subsetInfo.get(subsetName).get("syncstatus")); + } } @@ -259,7 +264,7 @@ public void actionPerformed(ActionEvent e) { subsetInfo.get(currentSubset).put("prefix", value); updateSampleNames(value); updateSettingTableSubset(currentSubset); - + ChangeMonitor.markAsChanged(projectID); } }); @@ -274,6 +279,7 @@ public void actionPerformed(ActionEvent e) { ignoreRows.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { subsetInfo.get(currentSubset).put("ignorerows",ignoreRows.isSelected() ); + ChangeMonitor.markAsChanged(projectID); } }); @@ -352,6 +358,7 @@ public void actionPerformed(ActionEvent e) { updateSampleNames(prefix); //updateAllSamplaNamesSubsets(); updateSettingTableSubset(currentSubset); + ChangeMonitor.markAsChanged(projectID); } }); @@ -510,6 +517,7 @@ public void actionPerformed(ActionEvent e) { } } updateSettingTableSubset(currentSubset); + ChangeMonitor.markAsChanged(projectID); } }); @@ -679,6 +687,7 @@ private void addImportToSaveTablePanel(JPanel samplesSetterPanel){ public void actionPerformed(ActionEvent e) { importButtonActionPerformed(); + ChangeMonitor.markAsChanged(projectID); } }); @@ -808,6 +817,12 @@ public void setNameSourceid(HashMap nameSourceid) { this.nameSourceid = nameSourceid; } - + public int getProjectID() { + return projectID; + } + + public void setProjectID(int projectID) { + this.projectID = projectID; + } } diff --git a/AccreteGB-src/src/main/java/org/accretegb/modules/util/ChangeMonitor.java b/AccreteGB-src/src/main/java/org/accretegb/modules/util/ChangeMonitor.java new file mode 100644 index 0000000..6da778c --- /dev/null +++ b/AccreteGB-src/src/main/java/org/accretegb/modules/util/ChangeMonitor.java @@ -0,0 +1,17 @@ +package org.accretegb.modules.util; + +import java.util.HashMap; + +public class ChangeMonitor { + public static HashMap changedProject = new HashMap(); + public static HashMap projectIdName = new HashMap(); + + public static void markAsChanged(int projectID){ + if (changedProject.containsKey(projectID)) { + if (!ChangeMonitor.changedProject.get(projectID)) { + ChangeMonitor.changedProject.put(projectID, true); + } + } + } + +} diff --git a/AccreteGB/Excutable/AccreteGB_v1.2.0.jar b/AccreteGB/Excutable/AccreteGB_v1.2.0.jar index 8c76b13..83f2f57 100644 Binary files a/AccreteGB/Excutable/AccreteGB_v1.2.0.jar and b/AccreteGB/Excutable/AccreteGB_v1.2.0.jar differ diff --git a/AccreteGB/Excutable/AccreteGB_v1.2.0_demo.jar b/AccreteGB/Excutable/AccreteGB_v1.2.0_demo.jar index 4cb63db..93d77dc 100644 Binary files a/AccreteGB/Excutable/AccreteGB_v1.2.0_demo.jar and b/AccreteGB/Excutable/AccreteGB_v1.2.0_demo.jar differ