/* * Get Organized - Organize your schedule, course assignments, and grades * Copyright © 2012 Alex Laird * getorganized@alexlaird.com * alexlaird.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package adl.go.gui; import adl.go.gui.ColoredComponent.GradientStyle; import adl.go.types.Course; import adl.go.types.Term; import ca.ansir.swing.tristate.TriState; import ca.ansir.swing.tristate.TriStateTreeCellRenderer; import ca.ansir.swing.tristate.TriStateTreeHandler; import ca.ansir.swing.tristate.TriStateTreeNode; import java.awt.Color; import java.awt.Cursor; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.ResourceBundle; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; /** * The Import from Backup dialog. * * @author Alex Laird */ public class ImportFromBackupDialog extends EscapeDialog { /** * The root node of the import tree. */ DefaultMutableTreeNode root = new TriStateTreeNode ("root"); /** * The list of terms to import. */ ArrayList<Term> terms = new ArrayList<Term> (); /** * The list of courses to import. */ ArrayList<Course> courses = new ArrayList<Course> (); /** * The file to import from. */ private File file; /** * The buffered reader to read from the file. */ private BufferedReader in; /** * True if success, false otherwise. */ private boolean success = false; /** * True if a fatal error occurred, false otherwise. */ private boolean fatal = false; /** * True if cancel was pressed, false otherwise. */ protected boolean cancel = false; /** * Construct the Import dialog. * * @param viewPanel A reference to the view panel. */ public ImportFromBackupDialog(ViewPanel viewPanel) { super (viewPanel.mainFrame); setMainPanel (viewPanel); initComponents (); } /** * Initialize the Import dialog. */ public void init() { setTitle (viewPanel.domain.language.getString ("importFromBackup")); importFromBackupPanel.setBackground (viewPanel.domain.utility.currentTheme.colorSingleWindowBackground1); importButton.setBackground (viewPanel.domain.utility.currentTheme.colorButtonBackground); importCloseButton.setBackground (viewPanel.domain.utility.currentTheme.colorButtonBackground); importBottomJPanel.setBackground (viewPanel.domain.utility.currentTheme.colorDoubleWindowBottomBackground1); importTopJPanel.setBackground (viewPanel.domain.utility.currentTheme.colorDoubleWindowTopBackground1); importCloseButton.setBackground (viewPanel.domain.utility.currentTheme.colorButtonBackground); importCloseButton.setFont (viewPanel.domain.utility.currentTheme.fontPlain12); importButton.setBackground (viewPanel.domain.utility.currentTheme.colorButtonBackground); importButton.setFont (viewPanel.domain.utility.currentTheme.fontPlain12); importFromBackupLabel.setFont (viewPanel.domain.utility.currentTheme.fontBold14); importSummaryLabel.setFont (viewPanel.domain.utility.currentTheme.fontBold12); availableImportTree.setFont (viewPanel.domain.utility.currentTheme.fontBold14); // Construct the tree so it can have tri-state checkboxes availableImportScrollPane.getViewport ().setOpaque (false); TriStateTreeHandler triStateTreeHandler = new TriStateTreeHandler (availableImportTree); availableImportTree.setShowsRootHandles (true); availableImportTree.addTreeExpansionListener (new TreeExpansionListener () { @Override public void treeExpanded(TreeExpansionEvent evt) { } @Override public void treeCollapsed(TreeExpansionEvent evt) { expandImportTree (evt); } }); } /** * Expands all possible nodes in the term tree. * * @param e The firing event. */ private void expandImportTree(TreeExpansionEvent e) { for (int row = 0; row < availableImportTree.getRowCount (); ++row) { availableImportTree.expandRow (row); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings ("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { importFromBackupPanel = new adl.go.gui.ColoredJPanel(GradientStyle.VERTICAL_GRADIENT_DOWN, Color.WHITE); importBottomJPanel = new adl.go.gui.ColoredJPanel(GradientStyle.NO_GRADIENT, Color.WHITE); importSummaryLabel = new javax.swing.JLabel(); availableImportScrollPane = new javax.swing.JScrollPane(); availableImportTree = new javax.swing.JTree(root); importTopJPanel = new adl.go.gui.ColoredJPanel(GradientStyle.VERTICAL_GRADIENT_DOWN, Color.WHITE); importCloseButton = new javax.swing.JButton(); importButton = new javax.swing.JButton(); importFromBackupLabel = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setModal(true); setResizable(false); importSummaryLabel.setText(viewPanel.domain.language.getString ("nothingToImportText")); availableImportScrollPane.setOpaque(false); availableImportTree.setCellRenderer(new TriStateTreeCellRenderer () { @Override public Color getBackground() { return null; } @Override public Color getBackgroundNonSelectionColor() { return null; } }); availableImportTree.setOpaque(false); availableImportTree.setRootVisible(false); availableImportScrollPane.setViewportView(availableImportTree); javax.swing.GroupLayout importBottomJPanelLayout = new javax.swing.GroupLayout(importBottomJPanel); importBottomJPanel.setLayout(importBottomJPanelLayout); importBottomJPanelLayout.setHorizontalGroup( importBottomJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, importBottomJPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(importBottomJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(availableImportScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) .addComponent(importSummaryLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)) .addContainerGap()) ); importBottomJPanelLayout.setVerticalGroup( importBottomJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, importBottomJPanelLayout.createSequentialGroup() .addGap(11, 11, 11) .addComponent(importSummaryLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 46, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(availableImportScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE) .addGap(12, 12, 12)) ); importTopJPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); importCloseButton.setText(viewPanel.domain.language.getString ("close")); importCloseButton.setToolTipText(viewPanel.domain.language.getString ("closeToolTip")); importCloseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { importCloseButtonActionPerformed(evt); } }); importButton.setText(viewPanel.domain.language.getString ("import")); importButton.setToolTipText(viewPanel.domain.language.getString ("importButtonToolTip")); importButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { importButtonActionPerformed(evt); } }); importFromBackupLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource(Domain.IMAGES_FOLDER + "go.png"))); // NOI18N importFromBackupLabel.setText(viewPanel.domain.language.getString ("importFromBackup")); javax.swing.GroupLayout importTopJPanelLayout = new javax.swing.GroupLayout(importTopJPanel); importTopJPanel.setLayout(importTopJPanelLayout); importTopJPanelLayout.setHorizontalGroup( importTopJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(importTopJPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(importFromBackupLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(importButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(importCloseButton) .addContainerGap()) ); importTopJPanelLayout.setVerticalGroup( importTopJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(importTopJPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(importTopJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(importFromBackupLabel) .addComponent(importButton) .addComponent(importCloseButton)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); javax.swing.GroupLayout importFromBackupPanelLayout = new javax.swing.GroupLayout(importFromBackupPanel); importFromBackupPanel.setLayout(importFromBackupPanelLayout); importFromBackupPanelLayout.setHorizontalGroup( importFromBackupPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(importTopJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(importBottomJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); importFromBackupPanelLayout.setVerticalGroup( importFromBackupPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(importFromBackupPanelLayout.createSequentialGroup() .addComponent(importTopJPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(importBottomJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(importFromBackupPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(importFromBackupPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); pack(); }// </editor-fold>//GEN-END:initComponents private void importCloseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importCloseButtonActionPerformed cancel = true; try { in.close (); } catch (IOException ex) { } dispose (); viewPanel.requestFocus (); }//GEN-LAST:event_importCloseButtonActionPerformed private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importButtonActionPerformed cancel = false; try { viewPanel.loadingPanel.setVisible (true); viewPanel.contentPanel.setVisible (false); setCursor (Cursor.getPredefinedCursor (Cursor.WAIT_CURSOR)); viewPanel.domain.setProgressState (viewPanel.progressBar, true, viewPanel.domain.language.getString ("importingToGetOrganized"), true, -1); viewPanel.loadingLabel.setText (viewPanel.domain.language.getString ("importingToGetOrganized") + " ..."); viewPanel.initLoading = true; viewPanel.ignoreTableSelection = true; viewPanel.assignmentsTable.setSelectedRow (-1); viewPanel.assignmentsTableRowSelected (null); viewPanel.termsAndCoursesDialog.settingsTermsTable.setSelectedRow (-1); viewPanel.termsAndCoursesDialog.settingsTermsTableRowSelected (null); viewPanel.termsAndCoursesDialog.settingsCoursesTable.setSelectedRow (-1); viewPanel.termsAndCoursesDialog.settingsCoursesTableRowSelected (null); viewPanel.domain.currentCourseIndex = -1; viewPanel.domain.currentTermIndex = -1; viewPanel.domain.currentTextbookIndex = -1; viewPanel.domain.currentTypeIndex = -1; viewPanel.domain.currentInstructorIndex = -1; viewPanel.eventChanges.clear (); viewPanel.repeatEventChanges = false; viewPanel.settingsDialog.settingsTabbedPane.setSelectedIndex (0); viewPanel.termsAndCoursesDialog.termsAndCoursesTabbedPane.setSelectedIndex (0); viewPanel.domain.workerThread.setAllowSave (false); int courseIndex = 0; int termIndex = 0; for (int i = 0; i < root.getChildCount (); ++i) { TriStateTreeNode termNode = (TriStateTreeNode) root.getChildAt (i); if (termNode.getState () == TriState.UNSELECTED) { terms.remove (termIndex); for (int j = 0; j < termNode.getChildCount (); ++j) { courses.remove (courseIndex); } } else if (termNode.getState () == TriState.MIXED) { ++termIndex; for (int j = 0; j < termNode.getChildCount (); ++j) { TriStateTreeNode courseNode = (TriStateTreeNode) termNode.getChildAt (j); if (courseNode.getState () == TriState.SELECTED) { ++courseIndex; } else { courses.remove (courseIndex); } } } else { ++termIndex; courseIndex += termNode.getChildCount (); } } // remove duplicates (if the term or course already exists in the user's schedule) for (int i = 0; i < courses.size (); ++i) { if (viewPanel.domain.utility.getByID (courses.get (i).getUniqueID ()) != null) { courses.remove (i); --i; } } for (int i = 0; i < terms.size (); ++i) { if (viewPanel.domain.utility.getByID (terms.get (i).getUniqueID ()) != null) { if (courses.indexOf (terms.get (i)) != -1) { terms.remove (i); --i; } } } if (terms.size () > 0 && courses.size () > 0) { success = viewPanel.domain.utility.importFromBackup (in, terms, courses); if (success) { } } else { cancel = true; } } catch (Exception ex) { success = false; fatal = true; } finally { setCursor (Cursor.getDefaultCursor ()); try { in.close (); } catch (IOException ex) { } } dispose (); viewPanel.requestFocus (); }//GEN-LAST:event_importButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JScrollPane availableImportScrollPane; private javax.swing.JTree availableImportTree; protected adl.go.gui.ColoredJPanel importBottomJPanel; private javax.swing.JButton importButton; private javax.swing.JButton importCloseButton; private javax.swing.JLabel importFromBackupLabel; protected adl.go.gui.ColoredJPanel importFromBackupPanel; private javax.swing.JLabel importSummaryLabel; protected adl.go.gui.ColoredJPanel importTopJPanel; // End of variables declaration//GEN-END:variables /** * Parse the input file and add terms and courses to the import dialog. * * @param file The input file to parse. */ private void parseInputFile(File file) throws FileNotFoundException, IOException { // clear out old terms and courses root.removeAllChildren (); in = new BufferedReader (new FileReader (file)); // throw out title line in.readLine (); // throw out preferences line in.readLine (); // throw out title line in.readLine (); // throw out categories line in.readLine (); // throw out blank line in.readLine (); // throw out title line in.readLine (); // read all terms String line = in.readLine (); terms.clear (); while (!line.equals ("")) { Term term = new Term (line, viewPanel.domain.utility); terms.add (term); TriStateTreeNode termNode = new TriStateTreeNode (term.getTypeName ()); root.add (termNode); line = in.readLine (); } // throw out title line in.readLine (); // read all courses line = in.readLine (); courses.clear (); while (!line.equals ("")) { Course course = new Course (line, viewPanel.domain.utility); courses.add (course); // retrieve the index of the node to add this to int index = -1; for (int i = 0; i < terms.size (); ++i) { if (terms.get (i).getUniqueID () == course.getTermID ()) { index = i; } } //int index = viewPanel.domain.utility.getTermIndex (terms, course.getTermID()); TriStateTreeNode courseNode = new TriStateTreeNode (course.getTypeName ()); TriStateTreeNode termNode = (TriStateTreeNode) root.getChildAt (index); termNode.add (courseNode); line = in.readLine (); } // refresh the shown elements ((DefaultTreeModel) availableImportTree.getModel ()).reload (); expandImportTree (new TreeExpansionEvent (this, null)); availableImportTree.setCellRenderer (new TriStateTreeCellRenderer () { @Override public Color getBackground() { return null; } @Override public Color getBackgroundNonSelectionColor() { return null; } }); } /** * Launch the dialog. */ protected void goViewImportFromBackup() { viewPanel.closeOpenWindows (); viewPanel.checkAssignmentOrEventChanges (viewPanel.domain.currentIndexFromVector); viewPanel.checkRepeatEventChanges (viewPanel.domain.currentIndexFromVector); cancel = false; viewPanel.fileChooser.setDialogType (JFileChooser.OPEN_DIALOG); viewPanel.fileChooser.setApproveButtonText (viewPanel.domain.language.getString ("import")); viewPanel.fileChooser.setApproveButtonToolTipText (viewPanel.domain.language.getString ("importFromBackupToolip")); viewPanel.fileChooser.setDialogTitle (viewPanel.domain.language.getString ("importFromBackup")); File selectedFile = new File (viewPanel.lastGoodFile); viewPanel.fileChooser.setSelectedFile (selectedFile); int response = viewPanel.fileChooser.showOpenDialog (viewPanel); // prompt the user to select a backup file to import from while (response == JFileChooser.APPROVE_OPTION) { file = viewPanel.fileChooser.getSelectedFile (); if (!file.isFile () || !selectedFile.toString ().endsWith (".gbak")) { ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE); ViewPanel.OPTION_PANE.setMessage (viewPanel.domain.language.getString ("mustBeValidExtension") + " (.gbak)."); ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE); JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (this, viewPanel.domain.language.getString ("invalidExtension")); optionDialog.setVisible (true); viewPanel.fileChooser.setSelectedFile (new File (viewPanel.fileChooser.getSelectedFile ().toString ().substring (0, viewPanel.fileChooser.getSelectedFile ().toString ().lastIndexOf (".")) + ".gbak")); response = viewPanel.fileChooser.showOpenDialog (this); continue; } try { viewPanel.lastGoodFile = file.getCanonicalPath (); } catch (IOException ex) { } try { parseInputFile (file); } catch (FileNotFoundException ex) { } catch (IOException ex) { cancel = true; } if (root.getChildCount () == 0) { ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE); ViewPanel.OPTION_PANE.setMessage (viewPanel.domain.language.getString ("nothingToImportText")); ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE); JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel, viewPanel.domain.language.getString ("nothingToImportTitle")); optionDialog.setVisible (true); return; } else { importSummaryLabel.setText ("<html>" + viewPanel.domain.language.getString ("importSummaryText") + "</html>"); importButton.setEnabled (true); } pack (); setLocationRelativeTo (viewPanel); setVisible (true); viewPanel.domain.setProgressState (viewPanel.progressBar, false, "", false, -1); viewPanel.loadingLabel.setText (viewPanel.domain.language.getString ("loading") + "..."); if (cancel) { setCursor (Cursor.getDefaultCursor ()); viewPanel.contentPanel.setVisible (true); viewPanel.loadingPanel.setVisible (false); viewPanel.initLoading = false; viewPanel.domain.workerThread.setAllowSave (true); } else if (!success && !fatal) { setCursor (Cursor.getDefaultCursor ()); viewPanel.contentPanel.setVisible (true); viewPanel.loadingPanel.setVisible (false); ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE); ViewPanel.OPTION_PANE.setMessage (viewPanel.domain.language.getString ("invalidRestoreFile")); ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE); JDialog innerOptionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel, viewPanel.domain.language.getString ("noChangesMade")); innerOptionDialog.setVisible (true); viewPanel.initLoading = false; viewPanel.domain.workerThread.setAllowSave (true); } else if (success && !fatal) { viewPanel.termTree.getSelectionModel ().setSelectionPath (null); viewPanel.domain.utility.loadTermTree (); viewPanel.domain.utility.loadAssignmentsTable (true); viewPanel.findTermWithin (); viewPanel.filter (true); viewPanel.expandTermTree (new TreeExpansionEvent (this, null)); viewPanel.refreshBusyDays (); viewPanel.initButtons (); viewPanel.scrollToItemOrToday (null); viewPanel.contentPanel.setVisible (true); viewPanel.loadingPanel.setVisible (false); setCursor (Cursor.getDefaultCursor ()); viewPanel.initLoading = false; viewPanel.ignoreTableSelection = false; for (int i = 0; i < viewPanel.domain.utility.courses.size (); ++i) { viewPanel.domain.utility.courses.get (i).markChanged (); } for (int i = 0; i < viewPanel.domain.utility.eventYears.size (); ++i) { viewPanel.domain.utility.eventYears.get (i).markChanged (); } viewPanel.domain.needsCoursesAndTermsSave = true; viewPanel.domain.needsPreferencesSave = true; viewPanel.domain.needsSettingsSaveBool = true; viewPanel.domain.workerThread.setAllowSave (true); } else { setCursor (Cursor.getDefaultCursor ()); viewPanel.contentPanel.setVisible (true); viewPanel.loadingPanel.setVisible (false); viewPanel.initLoading = false; viewPanel.ignoreTableSelection = false; viewPanel.domain.setProgressState (viewPanel.progressBar, false, "", false, -1); viewPanel.domain.workerThread.setAllowSave (true); ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE); ViewPanel.OPTION_PANE.setMessage (viewPanel.domain.language.getString ("aFatalErrorHasOccurred")); ViewPanel.OPTION_PANE.setMessageType (JOptionPane.ERROR_MESSAGE); JDialog innerOptionDialog = ViewPanel.OPTION_PANE.createDialog (this, viewPanel.domain.language.getString ("fatalError")); innerOptionDialog.setVisible (true); viewPanel.quit (true); } break; } } /** * Apply the language for this dialog. * * @param language The language resource to be applied. */ public void applyLanguage(ResourceBundle language) { } }