package org.wordcorr.gui; import java.awt.event.ActionEvent; import java.util.*; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.wordcorr.db.DatabaseException; import org.wordcorr.db.Datum; import org.wordcorr.db.Entry; import org.wordcorr.db.Setting; import org.wordcorr.db.Variety; import org.wordcorr.db.View; import org.wordcorr.db.WordCollection; import org.wordcorr.gui.input.SortableList; /** * Pane for entering and editing data. * @author Keith Hamasaki, Jim Shiba **/ class DataPane extends AddEditDeletePanel { DataPane(WordCollection collection) { super(null, true, false, true); // change button labels setDeleteButtonLabel( AppPrefs.getInstance().getMessages().getString("btnDeleteData")); setFindButtonLabel( AppPrefs.getInstance().getMessages().getString("btnFindData")); List list = new ArrayList(); getList().setModel(new BasicListModel(list)); getList().setFont(FontCache.getFont(FontCache.PRIMARY_GLOSS)); _sorter = new SortableList(getList(), list, (Refreshable) getList().getModel()); _collection = collection; addAddEditDeleteListener(new AddEditDeleteListener() { public void doAdd(ActionEvent evt) throws DatabaseException { Entry entry = _collection.makeEntry(); AddDialog dialog = new AddDialog("lblAddEntry", entry); dialog.setVisible(true); if (!dialog.isCancelled()) { entry.setEntryNum(new Integer(getList().getModel().getSize() + 1)); entry.save(); refresh(); getList().setSelectedValue(entry, true); } } public void doDelete(ActionEvent evt) throws DatabaseException { Entry entry = (Entry) getList().getSelectedValue(); // reorder entry numbers after deletion int entryNum = entry.getEntryNum().intValue(); entry.delete(); _collection.reorderEntries(entryNum, entryNum); JSplitPane split = (JSplitPane) getMainComponent(); int loc = split.getDividerLocation(); split.setRightComponent(new JLabel("")); split.setDividerLocation(loc); } public void doValidate(ActionEvent evt) throws DatabaseException { Entry entry = (Entry) getList().getSelectedValue(); Messages messages = AppPrefs.getInstance().getMessages(); // get missing varieties int missing = 0; String missingVarieties = ""; boolean first = true; List datums = entry.getData(); Setting setting = _collection.getDatabase().getCurrentSetting(); View view = _collection.getViewByID(setting.getViewID()); searchVarieties : for (Iterator it = view.getMembers().iterator(); it.hasNext();) { Variety variety = (Variety)it.next(); // search for variety for (Iterator it2 = datums.iterator(); it2.hasNext();) { Datum datum = (Datum)it2.next(); if (datum.isDeleted()) { // skip datum marked for deletion since list is not updated. continue; } if (variety.getID() == datum.getVariety().getID()) { // remove from list datums.remove(datum); continue searchVarieties; } } if (first) { first = false; missingVarieties = variety.getShortName(); } else { missingVarieties += ", " + variety.getShortName(); } ++missing; } if (missingVarieties.equals("")) { // none missing Dialogs.customMsgbox(messages.getString("pgtDataValidateEntryNONE"), messages.getString("pgtDataValidateEntry")); } else { // generate title String title = messages.getString("pgtDataValidateEntry") + " - " + missing + " of " + view.getMembers().size(); // break up missing varieties into lines int len = 50; if (missingVarieties.length() <= len) { // one line Dialogs.customMsgbox(missingVarieties, title); } else { // multiple lines StringBuffer lines = new StringBuffer(); while (missingVarieties.length() > len) { int end = missingVarieties.lastIndexOf(",", len); if (end != -1) { lines.append(missingVarieties.substring(0, end) + "\n"); missingVarieties = missingVarieties.substring(end + 2); } } lines.append(missingVarieties); Dialogs.customMsgbox(lines.toString(), title); } } } public void doMoveUp(ActionEvent evt) { Dialogs.showWaitCursor(MainFrame.getInstance()); try { int index = getList().getSelectedIndex(); if (index <= 0) return; ListModel model = getList().getModel(); Entry e1 = (Entry) model.getElementAt(index); Entry e2 = (Entry) model.getElementAt(index - 1); e1.setEntryNum(new Integer(index)); e1.save(); e2.setEntryNum(new Integer(index + 1)); e2.save(); _sorter.moveUp(); refresh(); } catch (DatabaseException e) { Dialogs.genericError(e); } finally { Dialogs.showDefaultCursor(MainFrame.getInstance()); } } public void doMoveDown(ActionEvent evt) { Dialogs.showWaitCursor(MainFrame.getInstance()); try { int index = getList().getSelectedIndex(); if (index < 0 || index >= getList().getModel().getSize() - 1) return; ListModel model = getList().getModel(); Entry e1 = (Entry) model.getElementAt(index); Entry e2 = (Entry) model.getElementAt(index + 1); e1.setEntryNum(new Integer(index + 2)); e1.save(); e2.setEntryNum(new Integer(index + 1)); e2.save(); _sorter.moveDown(); refresh(); } catch (DatabaseException e) { Dialogs.genericError(e); } finally { Dialogs.showDefaultCursor(MainFrame.getInstance()); } } public void doCopy(ActionEvent evt) { } }); getList() .getSelectionModel() .addListSelectionListener(new ListSelectionListener() { public synchronized void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()) { return; } Entry entry = (Entry) getList().getSelectedValue(); if (entry != null) { try { Setting setting = _collection.getDatabase().getCurrentSetting(); setting.setEntryID(entry.getID()); setting.save(); } catch (DatabaseException e) { e.printStackTrace(); } } } }); } public void refreshExt() throws DatabaseException { ((BasicListModel) getList().getModel()).setData(_collection.getEntries()); Setting setting = _collection.getDatabase().getCurrentSetting(); for (int i = 0; i < getList().getModel().getSize(); i++) { Entry entry = (Entry) getList().getModel().getElementAt(i); if (entry.getID() == setting.getEntryID()) { getList().setSelectedValue(entry, true); break; } } } protected FindDialog createFindDialog() { return new FindDialog("GlossFindDialog"); } private final WordCollection _collection; private final SortableList _sorter; }