Changeset 8364


Ignore:
Timestamp:
2004-10-18T15:44:09+13:00 (20 years ago)
Author:
mdewsnip
Message:

Much improved algorithm for selecting the best row in the table after adding/replacing/removing metadata, and improved entry speed: can now use up/down keys for controlling table selection when the value field is in focus.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gli/src/org/greenstone/gatherer/gui/EnrichPane.java

    r8359 r8364  
    500500
    501501    // Update the metadata value table (and consequently, the metadata value tree)
    502     metadata_value_table.rebuild();
     502    MetadataValue previously_selected_metadata_value = metadata_value_table.getSelectedMetadataValueTableEntry();
     503    metadata_value_table.rebuildAndSelectRowWithValueClosestTo(previously_selected_metadata_value);
    503504
    504505//  // Update the meta-audit view to show the current selection, if any.
     
    539540        // Update the metadata value table and tree
    540541        metadata_edit_event = true;
    541         metadata_value_table.rebuild();
     542        metadata_value_table.rebuildAndSelectRowWithValueClosestTo(metadata_value);
    542543        metadata_edit_event = false;
    543544    }
     
    568569        // Update the metadata value table and tree
    569570        metadata_edit_event = true;
    570         metadata_value_table.rebuild();
     571        metadata_value_table.rebuildAndSelectRowWithValueClosestTo(metadata_value);
    571572        metadata_edit_event = false;
    572573    }
     
    589590        // Update the metadata value table and tree
    590591        metadata_edit_event = true;
    591         metadata_value_table.rebuild();
     592        metadata_value_table.rebuildAndSelectRowWithValueClosestTo(selected_metadata_value_table_entry);
    592593        metadata_edit_event = false;
    593594    }
     
    673674
    674675
    675     public void rebuild()
    676     {
    677         // Remember the current metadata element selection so we can select it again later
    678         MetadataValueTableEntry previously_selected_metadata_value_table_entry = selected_metadata_value_table_entry;
    679 
     676    public void moveSelectionDown()
     677    {
     678        int new_row_to_select = getSelectedRow() + 1;
     679        if (new_row_to_select < metadata_value_table_model.getRowCount()) {
     680        changeSelection(new_row_to_select, 1, false, false);
     681        }
     682    }
     683
     684
     685    public void moveSelectionUp()
     686    {
     687        int new_row_to_select = getSelectedRow() - 1;
     688        if (new_row_to_select >= 0) {
     689        changeSelection(new_row_to_select, 1, false, false);
     690        }
     691    }
     692
     693
     694    public void rebuildAndSelectRowWithValueClosestTo(MetadataValue optimal_metadata_value_to_select_when_building_complete)
     695    {
    680696        // We don't want a lot of ListSelectionEvents while the table is rebuilding
    681697        clearSelection();
     
    696712        metadata_value_table_card_layout.show(table_card_pane, TABLE_CARD);
    697713
    698         // If there was no previous selection then we're done
    699         if (previously_selected_metadata_value_table_entry == null) {
     714        // If we don't need to select a row in the table after rebuilding, we're done
     715        if (optimal_metadata_value_to_select_when_building_complete == null) {
    700716        return;
    701717        }
    702718
    703         // Look for an exact match
     719        MetadataElement optimal_metadata_element = optimal_metadata_value_to_select_when_building_complete.getMetadataElement();
     720       
     721        // Find the row containing the closest value to the optimal value
     722        int optimal_row_to_select = 0;
    704723        for (int i = 0; i < metadata_value_table_model.getRowCount(); i++) {
    705724        MetadataValueTableEntry metadata_value_table_entry = metadata_value_table_model.getMetadataValueTableEntry(i);
    706         int c = metadata_value_table_entry.compareTo(previously_selected_metadata_value_table_entry);
    707 
    708         if (c == 0) {
    709             // Select this row and we're done
    710             addRowSelectionInterval(i, i);
    711             return;
    712         }
    713 
    714         if (c < 0) {
    715             // Not in the list
    716             break;
    717         }
    718         }
    719 
    720         // Select the first entry with the same metadata element
    721         MetadataElement previously_selected_metadata_element = previously_selected_metadata_value_table_entry.getMetadataElement();
    722         for (int i = 0; i < metadata_value_table_model.getRowCount(); i++) {
    723         MetadataElement metadata_element = metadata_value_table_model.getMetadataValueTableEntry(i).getMetadataElement();
    724         if (metadata_element.equals(previously_selected_metadata_element)) {
    725             // Select this row and we're done
    726             addRowSelectionInterval(i, i);
    727             return;
    728         }
    729         }
    730 
    731         // All else has failed, so just select the first row in the table
    732         addRowSelectionInterval(0, 0);
     725        MetadataElement metadata_element = metadata_value_table_entry.getMetadataElement();
     726        if (metadata_element.equals(optimal_metadata_element)) {
     727            // This row will be the optimal row, unless the next row matches better
     728            optimal_row_to_select = i;
     729        }
     730
     731        int c = metadata_value_table_entry.compareTo(optimal_metadata_value_to_select_when_building_complete);
     732        if (c >= 0) {
     733            // We've either found an exact match, or there is no exact match, so stop here
     734            break;
     735        }
     736        }
     737
     738        changeSelection(optimal_row_to_select, 1, false, false);
    733739    }
    734740
     
    10991105        if (metadata_element == null) {
    11001106        if (metadata_edit_event == false) {
    1101             System.err.println("Clearing selection...");
     1107            // System.err.println("Clearing selection...");
    11021108            selected_metadata_element = null;
    11031109            validateDisplay();
     
    12231229
    12241230        /** Gives notification of key events on the text field */
    1225         public void keyPressed(KeyEvent e) {
     1231        public void keyPressed(KeyEvent e)
     1232        {
     1233        // Tab: Auto-complete
    12261234        if (e.getKeyCode() == KeyEvent.VK_TAB) {
    1227             // Tab: Auto-complete
    12281235            if (tree.getSelectionCount() != 0 && !getSelectedValue().equals("")) {
    12291236            TreePath path = tree.getSelectionPath();
     
    12321239            }
    12331240        }
     1241
     1242        // Enter: Append the metadata value, if we're allowed to
    12341243        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    1235             // Enter: Append the metadata value, if we're allowed to
    12361244            if (add.isEnabled()) {
    12371245            add.doClick();
    12381246            }
     1247        }
     1248
     1249        // Down: Change the metadata value table selection
     1250        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
     1251            metadata_value_table.moveSelectionDown();
     1252        }
     1253
     1254        // Up: Change the metadata value table selection
     1255        if (e.getKeyCode() == KeyEvent.VK_UP) {
     1256            metadata_value_table.moveSelectionUp();
    12391257        }
    12401258        }
Note: See TracChangeset for help on using the changeset viewer.