package jav.concordance.view; import jav.concordance.control.ConcordanceEntry; import jav.concordance.control.ConcordanceGraphicsRegistry; import jav.correctionBackend.Token; import jav.gui.dialogs.CustomErrorDialog; import jav.gui.events.MessageCenter; import jav.gui.events.documentChanged.DocumentChangedEvent; import jav.gui.events.pageChanged.PageChangedEvent; import jav.gui.events.special.multiselection.MultiSelectionEvent; import jav.gui.events.tokenDeselection.TokenDeselectionEvent; import jav.gui.events.tokenMultiDeselection.TokenMultiDeselectionEvent; import jav.gui.events.tokenSelection.TokenSelectionEvent; import jav.gui.events.tokenSelection.TokenSelectionType; import jav.gui.events.tokenStatus.CorrectedEvent; import jav.gui.events.tokenStatus.DeleteEvent; import jav.gui.events.tokenStatus.InsertEvent; import jav.gui.events.tokenStatus.MergeEvent; import jav.gui.events.tokenStatus.SetCorrectedEvent; import jav.gui.events.tokenStatus.SplitEvent; import jav.gui.events.tokenStatus.TokenStatusEvent; import jav.gui.events.tokenStatus.TokenStatusType; import jav.gui.main.AbstractEditorViewTopComponent; import jav.gui.main.AbstractTokenVisualization; import jav.gui.main.GlobalActions; import jav.gui.main.MainController; import jav.gui.main.TokenVisualizationMultiRegistry; import jav.gui.token.display.TokenVisualization; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.prefs.Preferences; import javax.swing.JLabel; import javax.swing.JToolBar; import javax.swing.SwingWorker; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressRunnable; import org.netbeans.api.progress.ProgressUtils; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.util.NbPreferences; import org.openide.util.lookup.AbstractLookup; import org.openide.util.lookup.InstanceContent; import org.openide.windows.TopComponent; /** * Copyright (c) 2012, IMPACT working group at the Centrum für Informations- und * Sprachverarbeitung, University of Munich. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. Redistributions in binary * form must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials provided * with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * This file is part of the ocr-postcorrection tool developed by the IMPACT * working group at the Centrum für Informations- und Sprachverarbeitung, * University of Munich. For further information and contacts visit * http://ocr.cis.uni-muenchen.de/ * * @author thorsten (thorsten.vobl@googlemail.com) */ public class ConcordanceTopComponent extends AbstractEditorViewTopComponent { ConcordancePage cp = null; private InstanceContent content = new InstanceContent(); private Preferences node; private boolean isOpen = false; private int leftContextSize; private int rightContextSize; private int tokensPerPage; private String name; int numSelected = 0; private int corrected = 0; private int disabled = 0; int toDo = 0; private int tokensInPage = 0; private int fontSize; private double imgScale; private int actualPage = -1; private int currentTokenID = -1; private boolean showImages; private boolean isActive; private ConcordanceTopComponent instance; private ConcordanceGlobalActions globalActions; private TokenVisualizationMultiRegistry tvRegistry; private ConcordanceGraphicsRegistry concGRegistry; LinkedHashMap<Integer, ConcordanceEntry> tokens; public void init(ArrayList<Token> t, String n) { this.name = n; tvRegistry = new TokenVisualizationMultiRegistry(); concGRegistry = new ConcordanceGraphicsRegistry(); tokens = new LinkedHashMap<>(); for (Token tok : t) { ConcordanceEntry temp = new ConcordanceEntry(tok); if (!tok.getTopSuggestion().equals("")) { temp.setCandidateString(tok.getTopSuggestion()); } else { temp.setCandidateString(""); } tokens.put(tok.getID(), temp); } instance = this; globalActions = new ConcordanceGlobalActions(this); this.setFocusable(true); MessageCenter.getInstance().addDocumentChangedEventListener(this); MessageCenter.getInstance().addTokenDeselectionEventListener(this); MessageCenter.getInstance().addTokenSelectionEventListener(this); MessageCenter.getInstance().addTokenStatusEventListener(this); associateLookup(new AbstractLookup(content)); node = NbPreferences.forModule(this.getClass()); leftContextSize = node.getInt("leftCLen", 7); rightContextSize = node.getInt("rightCLen", 7); tokensPerPage = node.getInt("tokensPerPage", 50); imgScale = Double.parseDouble(MainController.findInstance().getDocumentProperties().getProperty("concImageScale")); fontSize = Integer.parseInt(MainController.findInstance().getDocumentProperties().getProperty("concFontSize")); showImages = node.getBoolean("hasImages", true); initComponents(); MainController.findInstance().customizeScrollPane(jScrollPane1); jScrollPane1.getVerticalScrollBar().setUnitIncrement(60); jScrollPane1.getVerticalScrollBar().setBlockIncrement(180); jButton1.setEnabled(false); jButton1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { NotifyDescriptor d = new NotifyDescriptor.Confirmation(java.util.ResourceBundle.getBundle("jav/concordance/Bundle").getString("WENN SIE FORTFAHREN WERDEN MEHRERE TOKEN KORRIGIERT!"), java.util.ResourceBundle.getBundle("jav/concordance/Bundle").getString("ACHTUNG"), NotifyDescriptor.OK_CANCEL_OPTION, NotifyDescriptor.WARNING_MESSAGE); Object retval = DialogDisplayer.getDefault().notify(d); if (retval.equals(NotifyDescriptor.OK_OPTION)) { correct(); } } }); ProgressRunnable bu = new Builder(); ProgressUtils.showProgressDialogAndRun(bu, "Building", true); this.actualPage = 0; int display = actualPage + 1; setName(name + " " + display + "/" + getMaxPages()); content.add(instance); MainController.findInstance().setLastFocusedTopComponent(instance); } private void initComponents() { jToolBar1 = this.getToolBar(); jScrollPane1 = new javax.swing.JScrollPane(); // jScrollPane1.setDoubleBuffered(true); totalentriesLabel = new JLabel("Entries Total: " + 0 + " "); numSelectedLabel = new JLabel("Entries Selected: " + 0 + " "); numCorrectedLabel = new JLabel("Entries Corrected: " + 0 + " "); numDisabledLabel = new JLabel("Entries Disabled: " + 0 + " "); numToDoLabel = new JLabel("Entries to process: " + 0 + " "); totalentriesLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); numSelectedLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); numCorrectedLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); numDisabledLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); numToDoLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 499, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(totalentriesLabel).addGap(18, 18, 18).addComponent(numSelectedLabel).addGap(18, 18, 18).addComponent(numCorrectedLabel).addGap(18, 18, 18).addComponent(numDisabledLabel).addGap(18, 18, 18).addComponent(numToDoLabel).addContainerGap(165, Short.MAX_VALUE)).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 499, Short.MAX_VALUE)); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(1, 1, 1).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(numSelectedLabel).addComponent(numCorrectedLabel).addComponent(numDisabledLabel).addComponent(numToDoLabel).addComponent(totalentriesLabel)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE))); } javax.swing.JButton jButton1; javax.swing.JScrollPane jScrollPane1; javax.swing.JToolBar.Separator jSeparator1; javax.swing.JToolBar.Separator jSeparator2; javax.swing.JToolBar.Separator jSeparator3; javax.swing.JToggleButton jToggleButton1; javax.swing.JToggleButton jToggleButton2; javax.swing.JToolBar jToolBar1; javax.swing.JLabel totalentriesLabel; javax.swing.JLabel numSelectedLabel; javax.swing.JLabel numCorrectedLabel; javax.swing.JLabel numDisabledLabel; javax.swing.JLabel numToDoLabel; public JToolBar getToolBar() { JToolBar toolb = new JToolBar(); jToggleButton1 = new javax.swing.JToggleButton(); jSeparator1 = new javax.swing.JToolBar.Separator(); jToggleButton2 = new javax.swing.JToggleButton(); jSeparator2 = new javax.swing.JToolBar.Separator(); jButton1 = new javax.swing.JButton(); jSeparator3 = new javax.swing.JToolBar.Separator(); toolb.setRollover(true); toolb.setFloatable(false); jToggleButton1.setText(java.util.ResourceBundle.getBundle("jav/concordance/Bundle").getString("pageSelect")); jToggleButton1.setFocusable(false); jToggleButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); jToggleButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolb.add(jToggleButton1); toolb.add(jSeparator1); jToggleButton2.setText(java.util.ResourceBundle.getBundle("jav/concordance/Bundle").getString("allSelect")); jToggleButton2.setFocusable(false); jToggleButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); jToggleButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolb.add(jToggleButton2); toolb.add(jSeparator2); toolb.add(jSeparator3); jButton1.setText(java.util.ResourceBundle.getBundle("jav/concordance/Bundle").getString("correct")); jButton1.setFocusable(false); jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolb.add(jButton1); /* * select / deselect current Page */ jToggleButton1.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent ie) { if (ie.getStateChange() == ItemEvent.SELECTED) { Object[] o = tokens.keySet().toArray(); for (int i = actualPage * tokensPerPage; i < tokensInPage; i++) { int tok = (Integer) o[i]; ConcordanceEntry cce = tokens.get(tok); if (!cce.isCorrected() && !cce.isDisabled()) { setSelected(tok, true); } } cp.selectAll(); } else { Object[] o = tokens.keySet().toArray(); for (int i = actualPage * tokensPerPage; i < tokensInPage; i++) { int tok = (Integer) o[i]; ConcordanceEntry cce = tokens.get(tok); if (!cce.isCorrected() && !cce.isDisabled()) { setSelected(tok, false); } } cp.deselectAll(); } } }); /* * select / deselect everything */ jToggleButton2.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent ie) { if (ie.getStateChange() == ItemEvent.SELECTED) { jToggleButton1.setSelected(true); Iterator<Integer> i = tokens.keySet().iterator(); while (i.hasNext()) { Integer tokid = i.next(); ConcordanceEntry cce = tokens.get(tokid); if (cce.isSelectable()) { if (!tvRegistry.contains(tokid)) { // if (count < actualPage * tokensPerPage || count >= actualPage * tokensPerPage + tokensInPage) { setSelected(tokid, true); } } } cp.selectAll(); } else { jToggleButton1.setSelected(false); Iterator<Integer> i = tokens.keySet().iterator(); while (i.hasNext()) { Integer tokid = i.next(); ConcordanceEntry cce = tokens.get(tokid); if (cce.isSelected() & !tvRegistry.contains(tokid)) { setSelected(tokid, false); } } cp.deselectAll(); } } }); jButton1.setEnabled(false); return toolb; } @Override public int getPersistenceType() { return TopComponent.PERSISTENCE_NEVER; } @Override public void componentActivated() { this.isActive = true; this.requestFocusInWindow(true); if (MainController.findInstance().getLastFocusedTopComponent() != this) { MainController.findInstance().setLastFocusedTopComponent(this); } if (this.isReady()) { MessageCenter.getInstance().fireTokenMultiDeselectionEvent(new TokenMultiDeselectionEvent(this)); if (currentTokenID != -1) { MessageCenter.getInstance().fireTokenSelectionEvent(new TokenSelectionEvent(this, currentTokenID, TokenSelectionType.NORMAL)); } else { MessageCenter.getInstance().fireTokenDeselectionEvent(new TokenDeselectionEvent(this, currentTokenID)); } } } @Override public void componentDeactivated() { this.isActive = false; } @Override public void dispatchEvent(TokenSelectionEvent e) { if (this.isActive) { this.currentTokenID = e.getTokenID(); } } @Override public GlobalActions getGlobalActions() { return this.globalActions; } @Override public void dispatchMultiSelectionEvent(MultiSelectionEvent e) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void dispatchEvent(DocumentChangedEvent e) { this.close(); } @Override public void dispatchEvent(TokenDeselectionEvent e) { if (this.isActive && this.currentTokenID == e.getTokenID()) { this.currentTokenID = -1; } } @Override public boolean isReady() { return this.isOpen; } @Override public void zoomFont(int i) { content.remove(this); cp.zoomFont(i); this.fontSize = i; MainController.findInstance().getDocumentProperties().setProperty("concFontSize", "" + this.fontSize); content.add(this); this.revalidate(); } @Override public int getMaxFontSize() { return node.getInt("maxFontSize", 40); } @Override public int getMinFontSize() { return node.getInt("minFontSize", 5); } @Override public int getFontSize() { return this.fontSize; } @Override public boolean hasImage() { return true; } @Override public boolean showImage() { return this.showImages; } @Override public void zoomImg(double scale) { content.remove(this); cp.zoomImg(scale); this.imgScale = scale; MainController.findInstance().getDocumentProperties().setProperty("concImageScale", "" + this.imgScale); content.add(this); this.revalidate(); } @Override public double getMaxScale() { return node.getDouble("maxScale", 1.5); } @Override public double getMinScale() { return node.getDouble("minScale", 0.2); } @Override public double getScale() { return this.imgScale; } @Override public int getPageN() { return this.actualPage + 1; } @Override public int getMaxPages() { return (tokens.size() / tokensPerPage) + 1; } public void setShowImages(boolean b) { this.showImages = b; } @Override public void gotoPage(final int p) { SwingWorker<Boolean, Object> worker = new SwingWorker<Boolean, Object>() { @Override protected Boolean doInBackground() { boolean retval = false; try { tvRegistry = new TokenVisualizationMultiRegistry(); concGRegistry = new ConcordanceGraphicsRegistry(); if (p * tokensPerPage + tokensPerPage >= tokens.size()) { tokensInPage = tokensPerPage - ((p * tokensPerPage + tokensPerPage) - tokens.size()); cp = new ConcordancePage(instance, p * tokensPerPage, tokensPerPage - ((p * tokensPerPage + tokensPerPage) - tokens.size())); } else { tokensInPage = tokensPerPage; cp = new ConcordancePage(instance, p * tokensPerPage, tokensPerPage); } retval = true; } catch (Exception e) { retval = false; } return retval; } @Override protected void done() { try { boolean retval = get(); if (retval) { jScrollPane1.setViewportView(cp); actualPage = p; int display = actualPage + 1; setName(name + " " + display + "/" + getMaxPages()); MessageCenter.getInstance().firePageChangedEvent(new PageChangedEvent(instance, actualPage)); content.add(instance); MainController.findInstance().addToLookup(globalActions); } else { new CustomErrorDialog().showDialog("CloneConcordanceView::GotoPage"); } } catch (ExecutionException ex) { } catch (InterruptedException ex) { } catch (CancellationException ex) { } } }; MainController.findInstance().removeFromLookup(globalActions); this.concGRegistry.clear(); content.remove(instance); this.tvRegistry.clear(); worker.execute(); } public int getActualTokenID() { return this.currentTokenID; } void goToNextRow() { throw new UnsupportedOperationException("Not yet implemented"); } void goToPreviousRow() { throw new UnsupportedOperationException("Not yet implemented"); } /** * * @param tokenId * @param b */ public void setSelected(int tokenId, boolean b) { if (b && tokens.get(tokenId).isSelectable()) { this.numSelected++; numSelectedLabel.setText("Entries Selected: " + numSelected); if (this.numSelected > 0 & !tokens.get(tokenId).getCandidateString().equals("")) { jButton1.setEnabled(true); } tokens.get(tokenId).setSelected(b); } else if (!b && tokens.get(tokenId).isSelected()) { this.numSelected--; numSelectedLabel.setText("Entries Selected: " + numSelected); if (this.numSelected == 0) { jToggleButton1.setSelected(false); jToggleButton2.setSelected(false); jButton1.setEnabled(false); } else if (this.numSelected < 0) { new CustomErrorDialog().showDialog("ClassicConcordance::removeSelected < 0"); } tokens.get(tokenId).setSelected(b); } else { // System.out.println( "ELSE " + b + " " + tokenId); } } public TokenVisualizationMultiRegistry getTVRegistry() { return this.tvRegistry; } public LinkedHashMap<Integer, ConcordanceEntry> getEntryRegistry() { return this.tokens; } @Override public boolean isEditing() { return false; } public int getLeftContextSize() { return this.leftContextSize; } public int getRightContextSize() { return this.rightContextSize; } public void addDisabled() { disabled++; toDo--; numToDoLabel.setText("Entries to process: " + toDo); numDisabledLabel.setText("Entries Disabled: " + disabled); } public void removeDisabled() { disabled--; toDo++; numToDoLabel.setText("Entries to process: " + toDo); numDisabledLabel.setText("Entries Disabled: " + disabled); } private void correct() { ProgressRunnable cr = new Corrector(); ProgressUtils.showProgressDialogAndRun(cr, "Correcting", true); this.requestFocusInWindow(true); } void toggleImages(boolean b) { cp.toggleImages(b); } public ConcordanceGraphicsRegistry getConcordanceGraphicsRegistry() { return this.concGRegistry; } @Override public void dispatchEvent(TokenStatusEvent e) { TokenStatusType tst = e.getType(); if (tst == TokenStatusType.SETCORRECTED) { ArrayList<AbstractTokenVisualization> tokvs = this.getTVRegistry().getVisualizations(e.getPOIID()); if (tokvs != null) { Iterator<AbstractTokenVisualization> tokv_it = tokvs.iterator(); while (tokv_it.hasNext()) { TokenVisualization tv = (TokenVisualization) tokv_it.next(); tv.setCorrected(((SetCorrectedEvent) e).getSetTo()); if (tokens.containsKey(tv.getTokenID())) { cp.grayOut(tv, ((SetCorrectedEvent) e).getSetTo()); } } } } else if (tst == TokenStatusType.CORRECTED) { ArrayList<AbstractTokenVisualization> tokvs = this.getTVRegistry().getVisualizations(e.getPOIID()); if (tokvs != null) { CorrectedEvent cor = (CorrectedEvent) e; Iterator<AbstractTokenVisualization> tokv_it = tokvs.iterator(); while (tokv_it.hasNext()) { TokenVisualization tv = (TokenVisualization) tokv_it.next(); if (tokens.containsKey(tv.getTokenID())) { tokens.get(tv.getTokenID()).setCorrected(cor.getSetTo()); if (cor.getSetTo()) { corrected++; toDo--; } else { corrected--; toDo++; } if (corrected == tokens.size()) { jButton1.setEnabled(false); jToggleButton1.setEnabled(false); jToggleButton2.setEnabled(false); } else { jButton1.setEnabled(true); jToggleButton1.setEnabled(true); jToggleButton2.setEnabled(true); } numToDoLabel.setText("Entries to process: " + toDo); numCorrectedLabel.setText("Entries Corrected: " + corrected); tv.update(cor.getNewText(), cor.getSetTo()); cp.grayOut(tv, cor.getSetTo()); } else { tv.update(cor.getNewText(), cor.getSetTo()); } } } } else if (tst == TokenStatusType.MERGED_RIGHT) { cp.update(e.getType(), e.getPOIID(), ((MergeEvent) e).getAffectedTokenIds()); } else if (tst == TokenStatusType.SPLIT) { cp.update(e.getType(), e.getPOIID(), ((SplitEvent) e).getAffectedTokenIds()); } else if (tst == TokenStatusType.DELETE) { cp.update(e.getType(), e.getPOIID(), ((DeleteEvent) e).getAffectedTokenIds()); } else if (tst == TokenStatusType.INSERT) { cp.update(e.getType(), e.getPOIID(), ((InsertEvent) e).getAffectedTokenIds()); // TODO throw unknown tokenstatusType exception } else { } } private class Builder implements ProgressRunnable { @Override public Object run(ProgressHandle ph) { ph.progress("Building Concordance"); ph.setDisplayName("Concordance construction"); if (tokens.size() < tokensPerPage) { tokensInPage = tokens.size(); cp = new ConcordancePage(instance, 0, tokens.size()); } else { tokensInPage = tokensPerPage; cp = new ConcordancePage(instance, 0, tokensPerPage); } ph.progress("Showing Concordance"); jScrollPane1.setViewportView(cp); jScrollPane1.getHorizontalScrollBar().setValue(cp.getPreferredSize().width / 10); totalentriesLabel.setText("Entries Total: " + tokens.size()); toDo = tokens.size(); numToDoLabel.setText("Entries to process: " + toDo); isOpen = true; return 0; } } private class Corrector implements ProgressRunnable { @Override public Object run(ProgressHandle ph) { try { ph.progress("starting correction"); Object[] o = tokens.keySet().toArray(); HashMap<Integer, String> tokensToCorrect = new HashMap<>(); int total = numSelected; int corrcount = 0; for (int i = 0; i < o.length; i++) { int tokenId = (Integer) o[i]; ConcordanceEntry cce = tokens.get(tokenId); if (cce.isSelected() && !cce.isCorrected()) { corrcount++; // if( !tvRegistry.contains(tokenId)) { // setSelected(tokenId, false); // } if (corrcount % 20 == 0) { ph.progress("correcting token " + corrcount + " of " + total); } tokensToCorrect.put(tokenId, cce.getCandidateString()); // MainController.findInstance().addToLog("CloneConcordanceView " + name + " # correct # " + tok.getWOCR() + " # " + cce.getCandidateString()); // cce.setCorrected(true); // corrected++; // toDo--; } else { System.out.println("corrector else " + tokenId); } } MainController.findInstance().correctTokensByString(tokensToCorrect); // if (corrected == tokens.size()) { // jButton1.setEnabled(false); // jToggleButton1.setEnabled(false); // jToggleButton2.setEnabled(false); // } // numToDoLabel.setText("Entries to process: " + toDo); // numCorrectedLabel.setText("Entries Corrected: " + corrected); return 1; } catch (Exception ex) { return 0; } } } }