package jav.gui.token.actions;
import jav.correctionBackend.MyIterator;
import jav.correctionBackend.Token;
import jav.gui.events.MessageCenter;
import jav.gui.events.cancel.CancelEvent;
import jav.gui.events.cancel.CancelEventSlot;
import jav.gui.events.concordance.ConcordanceEvent;
import jav.gui.events.concordance.ConcordanceType;
import jav.gui.events.pageChanged.PageChangedEvent;
import jav.gui.events.pageChanged.PageChangedEventSlot;
import jav.gui.events.tokenDeselection.TokenDeselectionEvent;
import jav.gui.events.tokenDeselection.TokenDeselectionEventSlot;
import jav.gui.events.tokenMultiDeselection.TokenMultiDeselectionEvent;
import jav.gui.events.tokenMultiDeselection.TokenMultiDeselectionEventSlot;
import jav.gui.events.tokenMultiSelection.TokenMultiSelectionEvent;
import jav.gui.events.tokenMultiSelection.TokenMultiSelectionEventSlot;
import jav.gui.events.tokenSelection.TokenSelectionEvent;
import jav.gui.events.tokenSelection.TokenSelectionEventSlot;
import jav.gui.filter.DoppelgangerFilter;
import jav.gui.main.MainController;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import javax.swing.SwingWorker;
import javax.swing.SwingWorker.StateValue;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
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)
*/
@ConvertAsProperties(dtd = "-//jav.gui.token.actions//TokenActions//EN",
autostore = false)
@TopComponent.Description(preferredID = "TokenActionsTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE",
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "explorer", openAtStartup = true)
@ActionID(category = "Window", id = "jav.gui.token.actions.TokenActionsTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)
@TopComponent.OpenActionRegistration(displayName = "#CTL_TokenActionsAction",
preferredID = "TokenActionsTopComponent")
public final class TokenActionsTopComponent extends TopComponent implements CancelEventSlot, TokenSelectionEventSlot, TokenDeselectionEventSlot, PageChangedEventSlot, TokenMultiSelectionEventSlot, TokenMultiDeselectionEventSlot {
private SwingWorker<Boolean, Object> worker;
private ArrayList<Integer> multiToken;
private ArrayList<Token> result;
private int resultSize;
private int currentTokenID;
private MyIterator<Token> tokenit;
public TokenActionsTopComponent() {
initComponents();
this.setBackground(Color.gray);
setName(NbBundle.getMessage(TokenActionsTopComponent.class, "CTL_TokenActionsTopComponent"));
setToolTipText(NbBundle.getMessage(TokenActionsTopComponent.class, "HINT_TokenActionsTopComponent"));
//putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
jButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MessageCenter.getInstance().fireConcordanceEvent(new ConcordanceEvent(this, ConcordanceType.CLONE, result, MainController.findInstance().getDocument().getTokenByID(currentTokenID).getWDisplay()));
}
});
jButton2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MainController.findInstance().mergeRightward( multiToken.get(0), multiToken.size() - 1 );
}
});
jButton3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
int begin = multiToken.get(0);
Token prev = MainController.findInstance().getDocument().getPreviousToken(multiToken.get(0));
Token next = MainController.findInstance().getDocument().getPreviousToken(multiToken.get(multiToken.size()-1));
if( prev.getWDisplay().equals(" ") && next.getWDisplay().equals(" ") && prev.getPageIndex() == next.getPageIndex()) {
multiToken.add(next.getID());
}
// if( MainController.findInstance().getDocument().getTokenByID(multiToken.get(0)-1).getWDisplay().equals(" ") && MainController.findInstance().getDocument().getTokenByID(multiToken.get(multiToken.size()-1)+1).getWDisplay().equals(" ")) {
// multiToken.add(MainController.findInstance().getDocument().getTokenByID(multiToken.get(multiToken.size()-1) +1).getIndexInDocument());
// }
MainController.findInstance().deleteToken(begin, multiToken.get(multiToken.size()-1));
}
});
jButton1.setEnabled(false);
jButton2.setEnabled(false);
jButton3.setEnabled(false);
jXTaskPane1.setTitle(org.openide.util.NbBundle.getMessage(TokenActionsTopComponent.class, "TokenActionsTopComponent.jXTaskPane1.text"));
jXTaskPane1.add(jPanel1);
jXTaskPane2.setTitle(org.openide.util.NbBundle.getMessage(TokenActionsTopComponent.class, "TokenActionsTopComponent.jXTaskPane2.text"));
jXTaskPane2.add(jPanel2);
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jXBusyLabel1 = new org.jdesktop.swingx.JXBusyLabel();
jPanel2 = new javax.swing.JPanel();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jXTaskPaneContainer1 = new org.jdesktop.swingx.JXTaskPaneContainer();
jXTaskPane1 = new org.jdesktop.swingx.JXTaskPane();
jXTaskPane2 = new org.jdesktop.swingx.JXTaskPane();
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(TokenActionsTopComponent.class, "TokenActionsTopComponent.jButton1.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jXBusyLabel1, org.openide.util.NbBundle.getMessage(TokenActionsTopComponent.class, "TokenActionsTopComponent.jXBusyLabel1.text")); // NOI18N
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 170, Short.MAX_VALUE)
.addComponent(jXBusyLabel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 170, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jXBusyLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton1))
);
org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(TokenActionsTopComponent.class, "TokenActionsTopComponent.jButton2.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(TokenActionsTopComponent.class, "TokenActionsTopComponent.jButton3.text")); // NOI18N
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)
.addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(jButton2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton3))
);
jXTaskPaneContainer1.add(jXTaskPane1);
jXTaskPaneContainer1.add(jXTaskPane2);
jScrollPane1.setViewportView(jXTaskPaneContainer1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private org.jdesktop.swingx.JXBusyLabel jXBusyLabel1;
private org.jdesktop.swingx.JXTaskPane jXTaskPane1;
private org.jdesktop.swingx.JXTaskPane jXTaskPane2;
private org.jdesktop.swingx.JXTaskPaneContainer jXTaskPaneContainer1;
// End of variables declaration//GEN-END:variables
@Override
public void componentOpened() {
MessageCenter.getInstance().addTokenSelectionEventListener(this);
MessageCenter.getInstance().addTokenDeselectionEventListener(this);
MessageCenter.getInstance().addPageChangedEventListener(this);
MessageCenter.getInstance().addTokenMultiDeselectionEventListener(this);
MessageCenter.getInstance().addTokenMultiSelectionEventListener(this);
MessageCenter.getInstance().addCancelEventListener(this);
}
@Override
public void componentClosed() {
MessageCenter.getInstance().removeTokenSelectionEventListener(this);
MessageCenter.getInstance().removeTokenDeselectionEventListener(this);
MessageCenter.getInstance().removePageChangedEventListener(this);
MessageCenter.getInstance().removeTokenMultiDeselectionEventListener(this);
MessageCenter.getInstance().removeTokenMultiSelectionEventListener(this);
MessageCenter.getInstance().removeCancelEventListener(this);
}
void writeProperties(java.util.Properties p) {
// better to version settings since initial version as advocated at
// http://wiki.apidesign.org/wiki/PropertyFiles
p.setProperty("version", "1.0");
// TODO store your settings
}
void readProperties(java.util.Properties p) {
String version = p.getProperty("version");
// TODO read your settings according to their version
}
@Override
public void dispatchEvent(TokenSelectionEvent e) {
currentTokenID = e.getTokenID();
if (worker != null && worker.getState().equals(StateValue.STARTED)) {
worker.cancel(true);
try {
Thread.sleep(1L);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
}
worker = new SwingWorker<Boolean, Object>() {
@Override
protected Boolean doInBackground() {
boolean retval = false;
try {
DoppelgangerFilter f = new DoppelgangerFilter( MainController.findInstance().getDocument().getTokenByID(currentTokenID), "");
tokenit = MainController.findInstance().getDocument().tokenIterator();
result = f.applyFilter( tokenit );
if( result != null ) {
resultSize = result.size();
retval = true;
} else {
retval = false;
}
} catch (Exception e) {
retval = false;
} catch (Error e) {
retval = false;
}
return retval;
}
@Override
protected void done() {
try {
boolean retval = get();
if (retval) {
jXBusyLabel1.setText((resultSize + java.util.ResourceBundle.getBundle("jav/gui/token/actions/Bundle").getString("occ")));
if (resultSize > 1) {
jButton1.setEnabled(true);
} else {
jButton1.setEnabled(false);
}
jXBusyLabel1.setBusy(false);
} else {
}
} catch (ExecutionException ex) {
Exceptions.printStackTrace(ex);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
} catch (CancellationException ex) {
}
}
};
jXBusyLabel1.setText(java.util.ResourceBundle.getBundle("jav/gui/token/actions/Bundle").getString("calc"));
jXBusyLabel1.setBusy(true);
worker.execute();
}
@Override
public void dispatchEvent(TokenDeselectionEvent e) {
if (worker != null && worker.getState().equals(StateValue.STARTED)) {
worker.cancel(true);
tokenit.cancel();
}
this.currentTokenID = -1;
jXBusyLabel1.setBusy(false);
jXBusyLabel1.setText(java.util.ResourceBundle.getBundle("jav/gui/token/actions/Bundle").getString("occ"));
jButton1.setEnabled(false);
}
@Override
public void dispatchEvent(PageChangedEvent e) {
jXBusyLabel1.setText(java.util.ResourceBundle.getBundle("jav/gui/token/actions/Bundle").getString("occ"));
jButton1.setEnabled(false);
}
@Override
public void dispatchEvent(TokenMultiSelectionEvent e) {
this.multiToken = e.getTokenIDs();
this.jButton2.setEnabled(true);
this.jButton3.setEnabled(true);
}
@Override
public void dispatchEvent(TokenMultiDeselectionEvent e) {
this.jButton2.setEnabled(false);
this.jButton3.setEnabled(false);
}
@Override
public void dispatchEvent(CancelEvent e) {
if (worker != null && worker.getState().equals(StateValue.STARTED)) {
worker.cancel(true);
tokenit.cancel();
try {
Thread.sleep(1L);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
}
jXBusyLabel1.setBusy(false);
jXBusyLabel1.setText(java.util.ResourceBundle.getBundle("jav/gui/token/actions/Bundle").getString("occ"));
jButton1.setEnabled(false);
}
}