Commit a645bb6e authored by Christian Reuschling's avatar Christian Reuschling
Browse files

some performance changes

parent c12d75a0
......@@ -98,7 +98,7 @@
<dependency>
<groupId>de.dfki.sds</groupId>
<artifactId>leechcrawler</artifactId>
<version>1.26.1</version>
<version>1.26.2</version>
<exclusions>
<exclusion>
<artifactId>asm-debug-all</artifactId>
......@@ -115,7 +115,7 @@
<dependency>
<groupId>de.dfki.sds</groupId>
<artifactId>leechprojects</artifactId>
<version>0.3-SNAPSHOT</version>
<version>0.4-SNAPSHOT</version>
</dependency>
<!-- leechcrawler-->
......
......@@ -6,6 +6,9 @@ import org.carrot2.clustering.Document;
import org.dynaq.config.AttributeConfig;
import org.dynaq.core.DynaQDocument;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;
......@@ -13,8 +16,14 @@ import java.util.function.BiConsumer;
class ClusterDocument implements Document
{
protected boolean m_bUseBody = false;
protected boolean m_bUseTitle = true;
protected DynaQDocument m_dynaQDocument;
protected List<String> m_lBlackListTerms = Collections.EMPTY_LIST;
public ClusterDocument(DynaQDocument scoredDynaQDocument)
......@@ -24,9 +33,11 @@ class ClusterDocument implements Document
public String getId()
public void contentFields4Clustering(boolean bTitle, boolean bBody)
{
return m_dynaQDocument.getDocId();
m_bUseTitle = bTitle;
m_bUseBody = bBody;
}
......@@ -38,17 +49,45 @@ class ClusterDocument implements Document
public String getId()
{
return m_dynaQDocument.getDocId();
}
public String getTitle()
{
return m_dynaQDocument.getAttributeValue(AttributeConfig.IndexAttributes.TITLE);
}
public ClusterDocument setTermBlackList(List<String> lTermBlackList)
{
m_lBlackListTerms = lTermBlackList;
return this;
}
public String removeBlackListTerms(String strText)
{
if(strText == null) strText = "";
for (String strBlackListTerm : m_lBlackListTerms)
{
strText = strText.replace(strBlackListTerm.trim(), "");
strText = strText.replace(strBlackListTerm.trim().toLowerCase(), "");
}
return strText;
}
@Override
public void visitFields(BiConsumer<String, String> fieldConsumer)
{
fieldConsumer.accept(AttributeConfig.IndexAttributes.TITLE, m_dynaQDocument.getAttributeValue(AttributeConfig.IndexAttributes.TITLE));
// fieldConsumer.accept(AttributeConfig.IndexAttributes.BODY, m_dynaQDocument.getAttributeValue(AttributeConfig.IndexAttributes.BODY));
if(m_bUseTitle)
fieldConsumer.accept(AttributeConfig.IndexAttributes.TITLE, removeBlackListTerms(m_dynaQDocument.getAttributeValue(AttributeConfig.IndexAttributes.TITLE)));
if(m_bUseBody)
fieldConsumer.accept(AttributeConfig.IndexAttributes.BODY, removeBlackListTerms(m_dynaQDocument.getAttributeValue(AttributeConfig.IndexAttributes.BODY)));
}
}
......@@ -2,8 +2,10 @@ package org.dynaq.documents.clustering;
import com.mchange.io.impl.SuffixFilenameFilter;
import de.dfki.inquisitor.collections.CollectionUtilz;
import de.dfki.inquisitor.collections.ThreeValuesBox;
import de.dfki.inquisitor.file.FileUtilz;
import de.dfki.inquisitor.text.StringUtils;
import de.dfki.inquisitor.ui.SwingUtils;
import de.dfki.inquisitor.ui.color.ColorFactory;
......@@ -76,7 +78,7 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
static final public String uiStyleDefault = "ui.style.default";
}
protected int m_iCurrentlySelectedDocCount = 0;
private class ClusterMapMouseManager extends DefaultMouseManager
......@@ -186,13 +188,19 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
if(!bNodeWasSelected)
{
HashMap<String, ClusterDocument> hsIntersectionDocs;
String strLabel = "";
if(elementClicked instanceof GraphicNode)
{
hsIntersectionDocs = elementClicked.getAttribute(GraphNodeAttsOwn.nodeObj, ClusterNode.class).m_hsId2Doc;
strLabel = elementClicked.getAttribute(GraphNodeAttsOwn.nodeObj, ClusterNode.class).m_strLabel;
}
else // Sprite
hsIntersectionDocs = elementClicked.getAttribute(GraphNodeAttsOwn.intersecDocs, HashMap.class);
m_iCurrentlySelectedDocCount = hsIntersectionDocs.values().size();
hsIntersectionDocs.values().stream().limit(200).map(ClusterDocument::getDynaQDocument).forEach(m_documentList::addDocument);
m_selectedClusterLabelsTextField.setText(strLabel == null ? "" : strLabel);
}
// wir müssen das leider noch für die docAnzahl im Border komplett neu zeichnen
m_docListScrollPane.repaint();
......@@ -244,6 +252,9 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
}
}
static protected String PERSISTENCE_DIRPATH = "./config/pluginStates/clusterMaps";
static final private int m_iMinDocNo4Edge = 2;
......@@ -274,6 +285,16 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
protected JTextArea m_blackListTextArea = new JTextArea();
protected JCheckBox m_bodiesCheckBox = new JCheckBox("Bodies");
protected JButton m_cluster2BlackListButton = new JButton("To blacklist");
protected SpinnerModel m_clusterCountSpinnerModel = new SpinnerNumberModel(7, 2, 42, 5);
private TitledBorder m_clusterPaneBorder = BorderFactory.createTitledBorder("Document clusters (0)");
protected JScrollPane m_clusterPanelScrollPane = new JScrollPane();
......@@ -286,11 +307,28 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
protected JButton m_getAllFromResultListButton = new JButton("Cluster results");
protected int m_iCurrentlySelectedDocCount = 0;
protected JButton m_loadBlackListButton = new JButton("Load");
// der InternalFrame, in welchen die KafkaRCP das Panel eingebettet hat
protected JInternalFrame m_myFrame;
protected JButton m_saveBlackListButton = new JButton("Save");
protected JTextField m_selectedClusterLabelsTextField = new JTextField();
protected String m_strTitle;
protected JCheckBox m_titlesCheckBox = new JCheckBox("Titles");
// protected Stream<ClusterDocument> dynaQDocs2clusterDocs(DynaQResultList dynaQResultList)
// {
// Stream<ScoredDynaQDocument> dynaQDocStream = StreamSupport.stream(dynaQResultList.spliterator(), false);
//
// return dynaQDocStream.map(ClusterDocument::new);
// }
public DynaQClusterMapPanel()
......@@ -319,6 +357,32 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
{
this.getAllFromResultList();
}
if(strCommand.equals("cluster2BlackListButton"))
{
m_blackListTextArea.append("\n" + m_selectedClusterLabelsTextField.getText());
}
if(strCommand.equals("loadBlackListButton"))
{
FileDialog dialog = new FileDialog((Frame) null, "Load blacklist text file");
dialog.setMode(FileDialog.LOAD);
dialog.setFilenameFilter(new SuffixFilenameFilter("", 0));
dialog.setVisible(true);
if(dialog.getFile() != null)
m_blackListTextArea.setText(FileUtilz.file2String(dialog.getDirectory() + '/' + dialog.getFile()));
}
if(strCommand.equals("saveBlackListButton"))
{
FileDialog dialog = new FileDialog((Frame) null, "Save blacklist text file");
dialog.setMode(FileDialog.SAVE);
dialog.setFilenameFilter(new SuffixFilenameFilter("", 0));
dialog.setVisible(true);
if(dialog.getFile() != null)
FileUtilz.string2File(m_blackListTextArea.getText(), dialog.getDirectory() + '/' + dialog.getFile());
}
}
catch (Exception exception)
{
......@@ -488,8 +552,8 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
algorithm.preprocessing.phraseDfThreshold
.set((int) Math.max(1, docCount2Cluster * 0.005)); // default min1 max100 default1. Ich hatte 2, das war gut für kleine Dokumentenmengen ~500docs.
// der Rest ist von mir
// TODO die Anzahl der Cluster in die Oberfläche setzen. Das scheint ein relevanter Parameter zu sein
algorithm.desiredClusterCount.set(7); // default min2 max100 default30 (ich habe nicht herausgekriegt wie ich das setzen kann, die haben den Schuß nicht gehört)
algorithm.desiredClusterCount.set((Integer) m_clusterCountSpinnerModel
.getValue()); // default min2 max100 default30 (ich habe nicht herausgekriegt wie ich das setzen kann, die haben den Schuß nicht gehört)
// ich setze mal für größere Dokumentenmengen andere Parameter
......@@ -510,8 +574,15 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
algorithm.matrixReducer.factorizationFactory = factorizationFactory;
List<String> lTermBlackList = Arrays.asList(m_blackListTextArea.getText().split("\\n"));
List<ClusterDocument> lDocs = clusterDocuments.collect(Collectors.toList());
for (ClusterDocument doc : lDocs)
{
doc.contentFields4Clustering(m_titlesCheckBox.isSelected(), m_bodiesCheckBox.isSelected());
doc.setTermBlackList(lTermBlackList);
}
List<Cluster<ClusterDocument>> clusters = algorithm.cluster(clusterDocuments, languageComponents);
List<Cluster<ClusterDocument>> clusters = algorithm.cluster(lDocs.stream(), languageComponents);
return clusters;
......@@ -539,13 +610,6 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
SwingUtils.updateComponentTreeUILater(m_clusterPanelScrollPane);
}
// protected Stream<ClusterDocument> dynaQDocs2clusterDocs(DynaQResultList dynaQResultList)
// {
// Stream<ScoredDynaQDocument> dynaQDocStream = StreamSupport.stream(dynaQResultList.spliterator(), false);
//
// return dynaQDocStream.map(ClusterDocument::new);
// }
@NotNull
......@@ -750,23 +814,16 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
// TODO: finales OCR mit selektierten Zellen (laut Dirk gibt es 4 templates, darin innerhalb eines templates +-10% Abweichung) => Stevan
// TODO: Selektionsbug cluster bubble. Probiert: https://github.com/graphstream/gs-core/issues/301
// TODO !!!auf jeden Fall noch eine Auswahl der Attribute implementieren, ob nur titel oder auch body geclustert werden soll. Dazu die Anzahl der cluster.
// TODO Stuttgart-Dirk hätte gerne noch eine Auswahl des KursJahrgangs (siehe Mail)
// TODO Datum generell: nochmal abchecken ob das so funzt, ich hatte den ein schlechtes Bauchgefühl...auch was das sortieren in der Ergebnisliste anbelangt^^
// TODO: Triggern Clustering + TimeLine über den QueryKontext Dialog, vielleicht umbenennen in Topics, Button zu 'set topic as context'
// TODO: Timeline: ich brauche den zeitlichen Verlauf eines Trends als Kurve. Mit dem GraphStream kann man auch Kurven zeichnen, vielleicht ist das ja was. Triggern gerne über den
// QueryKontext Dialog, vielleicht nennt man das ja auch mal zum besseren Verständnis um?
// TODO Ich brauche noch die Möglichkeit die Clusterlabels + die Clusterdocs in eine Themenbeschreibung zu überführen
// TODO die Anzahl der docs in der Autoverfollständigung stimmt ned. In den Auswahlmenüse hab ich es so gemacht:
// m_query4FacetCounting = new MatchAllDocsQuery(); (das ist für die Eingrenzung in die aktuelle Ergebnisliste noch besser NULL!!!)
// Map<Query, Integer> facetHitCount = FacetHitCounter.getFacetHitCounts(null, hsSubQueries, searcher);
// das dann für alle Terme mit dem ermittelten prefix, das geht im org.dynaq.search.pull.attrepresentation.AutoCompleteKeyListener
// TODO MosbachDirk: result view: sort by prio
// TODO MosbachDirk: Sprachdetektion in die Gui 'language_detected'
// TODO der Graph ist zwar in eine Scrollpane eingebettet, ich sehe aber keine scrollLeisten...verändern der Window-Größe verändert auch die Größe des Canvas..besser
// wäre es das Panel immer so groß zu haben wie viel Platz es halt braucht, und dann scrollen zu können
SwingViewer clusterPanelViewer = new SwingViewer(graph, SwingViewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD);
......@@ -818,7 +875,6 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
@SuppressWarnings("ConstantConditions")
protected void getAllFromResultList() throws Exception
{
......@@ -911,7 +967,7 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
public void init() throws Throwable
{
// List<Cluster<ClusterDocument>> clusters = clusterExampleDocs();
// List<Cluster<ClusterDocument>> clusters = clusterExampleDocs();
List<Cluster<ClusterDocument>> clusters = Collections.emptyList();
......@@ -961,6 +1017,23 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
m_getAllFromResultListButton.setActionCommand("getAllFromResultListButton");
m_getAllFromResultListButton.addActionListener(this);
m_cluster2BlackListButton.setActionCommand("cluster2BlackListButton");
m_cluster2BlackListButton.addActionListener(this);
m_loadBlackListButton.setActionCommand("loadBlackListButton");
m_loadBlackListButton.addActionListener(this);
m_saveBlackListButton.setActionCommand("saveBlackListButton");
m_saveBlackListButton.addActionListener(this);
m_selectedClusterLabelsTextField.setBorder(new TitledBorder("Selected cluster terms"));
m_selectedClusterLabelsTextField.setEditable(false);
m_blackListTextArea.setBorder(new TitledBorder("Term blacklist for clustering"));
// * das Layout
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
......@@ -968,12 +1041,31 @@ public class DynaQClusterMapPanel extends JPanel implements ActionListener, RCPP
TableLayoutUtil.addTableLayout(this, "f", 3, 5);
TableLayoutUtil.addCompo(this, m_clusterPanelScrollPane, "re,f", "f");
TableLayoutUtil.addCompo(this, m_docListScrollPane, "re,f", "400");
JPanel subPanelRight = TableLayoutUtil.appendSubPanelColumn(this, "0.25", "0.7", 3, 3);
TableLayoutUtil.addCompo(subPanelRight, m_docListScrollPane, "re,f", "f");
JPanel subPanel4BlackList = TableLayoutUtil.appendSubPanelRow(subPanelRight, "f", "p", 3, 3);
TableLayoutUtil.addCompo(subPanel4BlackList, m_selectedClusterLabelsTextField, "re,f", "f");
TableLayoutUtil.addCompo(subPanel4BlackList, m_cluster2BlackListButton, "re,f", "p");
TableLayoutUtil.appendRows(subPanel4BlackList, "f");
TableLayoutUtil.addCompo(subPanel4BlackList, new JScrollPane(m_blackListTextArea), "re,f", "f");
JPanel subPanel4BlacklistButtons = TableLayoutUtil.appendSubPanelRow(subPanel4BlackList, "p", "p", 3, 3);
TableLayoutUtil.addCompo(subPanel4BlacklistButtons, m_loadBlackListButton, "l,c", "p");
TableLayoutUtil.addCompo(subPanel4BlacklistButtons, m_saveBlackListButton, "l,c", "p");
JPanel subPanel = TableLayoutUtil.appendSubPanelRow(this, "p", "p", 3, 3);
TableLayoutUtil.addCompo(subPanel, m_getAllFromResultListButton, "l,c", "p");
TableLayoutUtil.addCompo(subPanel, new JLabel("Desired cluster count:"), "l,c", "p");
TableLayoutUtil.addCompo(subPanel, new JSpinner(m_clusterCountSpinnerModel), "l,c", "p");
m_titlesCheckBox.setSelected(true);
TableLayoutUtil.addCompo(subPanel, m_titlesCheckBox, "l,c", "p");
TableLayoutUtil.addCompo(subPanel, m_bodiesCheckBox, "l,c", "p");
TableLayoutUtil.addCompo(subPanel, new JPanel(), 23, 3, "c,c", "f");
}
......
......@@ -249,7 +249,7 @@ public class PostProcessingRunnable implements Runnable, RCPGlobalMessageListene
}
log.info("Creating thumbnails.");
log.info("Creating thumbnails in the background.");
KafkaRCP.fireGlobalPlatformMessage(DynaQMessages.POSTPROCESSING_RUNNABLE_STARTING, new Hashtable<Object, Object>(0));
m_bPostProcessingInProgress = true;
......@@ -311,7 +311,7 @@ public class PostProcessingRunnable implements Runnable, RCPGlobalMessageListene
continue;
}
log.info("Create thumbnail for " + dynaQDoc.getAttributeValue(IndexAttributes.SOURCE));
log.fine("Create thumbnail for " + dynaQDoc.getAttributeValue(IndexAttributes.SOURCE));
Indexer.generateThumbNail(dynaQDoc.asLuceneDoc(), luceneIndexSet);
......
......@@ -441,7 +441,9 @@ public class ConfigurableSearchingView extends JPanel implements RCPPersistentPl
// der HauptQueryString - der wird aus Teilen der Sections oben und dem HaupteingabeFeld zusammengesetzt
String strUserQueryString = strbUserQueryString.toString();
if (StringUtils.nullOrWhitespace(strUserQueryString))
strUserQueryString = "+(*)";
{
strUserQueryString = "";
}
else
{
// wenn wir ausschließlich negationen drin haben möchten wir auch ein Ergebnis - ohne selbst noch ein '*' dran zu pappen
......@@ -458,6 +460,7 @@ public class ConfigurableSearchingView extends JPanel implements RCPPersistentPl
DynaQQuery dynaQQuery = new DynaQQuery(llSubQueries, llContextQueries4Sorting, fContextQueryWeight, alInitialSelectedAtts, m_luceneIndexSet);
dynaQQuery.enableTermRelevanceExplanations(true).enableEmptyQueryMatchesAll(true);
// die Gewichtungen der Terme werden auch gesetzt, sofern es denn welche gibt
dynaQQuery.changeTermBoosts(m_sectionsContainerPanel.getTermSliderzPanel().getDynamicQuerySliderzValues());
......
......@@ -42,6 +42,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
class TextAncestorListener implements AncestorListener
{
......@@ -71,6 +72,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
class TextFocusAdapter extends FocusAdapter
{
@Override
......@@ -80,12 +82,22 @@ public class AutoCompleteKeyListener extends KeyAdapter
AutoCompleteKeyListener.this.hidePopup();
}
}
protected boolean m_alignToTag;
protected boolean m_bDisableAutoCompletion4NextEvent = false;
protected JList m_jlTermList;
protected List<String> m_lIndexAttNames4TermCompletion;
protected LuceneIndexSet m_luceneIndexSet;
protected Popup m_termListPopup;
protected JTextComponent m_textComponent4Listening;
......@@ -115,7 +127,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
this.hidePopup();
// wenn nichts selektiert ist, dann machen wir nix
if (m_jlTermList.isSelectionEmpty())
if(m_jlTermList.isSelectionEmpty())
return false;
......@@ -130,7 +142,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
// XXX: NGram-Markierung rausschneiden
MatchResult result4NGrams = StringUtils.findFirstMatch("<b>.*</b>", strSelectedValue);
if (result4NGrams != null)
if(result4NGrams != null)
{
strSelectedValue = strSelectedValue.replaceAll("<.?b>", "");
m_textComponent4Listening.setText(strSelectedValue);
......@@ -147,7 +159,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
Field field4CompletionFieldVal = FieldFactory.createField(m_lIndexAttNames4TermCompletion.get(0), "bla");
if (field4CompletionFieldVal.fieldType().tokenized() && !(m_luceneIndexSet
if(field4CompletionFieldVal.fieldType().tokenized() && !(m_luceneIndexSet
.getAttributeAnalyzer4Searching(m_lIndexAttNames4TermCompletion.get(0)) instanceof KeywordAnalyzer))
{
// wenn wir ein tokenisiertes String-Field haben
......@@ -165,7 +177,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
// wenn wir nur ein Token haben, dann nehmen wir einfach das selektierte Teil
if (result == null)
if(result == null)
{
m_textComponent4Listening.setText(strSelectedValue);
}
......@@ -198,7 +210,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
*/
protected void hidePopup()
{
if (m_termListPopup == null)
if(m_termListPopup == null)
return;
m_termListPopup.hide();
......@@ -212,43 +224,43 @@ public class AutoCompleteKeyListener extends KeyAdapter
{
// wenn wir nicht sichtbar sind, dann sollten wir gar nix machen
if (m_termListPopup == null)
if(m_termListPopup == null)
return;
if (e.getKeyCode() == KeyEvent.VK_DOWN)
if(e.getKeyCode() == KeyEvent.VK_DOWN)
{
int iSelectedIndex = m_jlTermList.getSelectedIndex();
if (iSelectedIndex == -1)
if(iSelectedIndex == -1)
m_jlTermList.setSelectedIndex(0);
else if (iSelectedIndex == m_jlTermList.getModel().getSize() - 1)
else if(iSelectedIndex == m_jlTermList.getModel().getSize() - 1)
return;
else
m_jlTermList.setSelectedIndex(iSelectedIndex + 1);
}
else if (e.getKeyCode() == KeyEvent.VK_UP)
else if(e.getKeyCode() == KeyEvent.VK_UP)
{
int iSelectedIndex = m_jlTermList.getSelectedIndex();
if (iSelectedIndex == -1)
if(iSelectedIndex == -1)
m_jlTermList.setSelectedIndex(m_jlTermList.getModel().getSize() - 1);
else if (iSelectedIndex == 0)
else if(iSelectedIndex == 0)
return;
else
m_jlTermList.setSelectedIndex(iSelectedIndex - 1);
}
else if (e.getKeyCode() == KeyEvent.VK_ENTER)
else if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
boolean bWasSelected = enterAction();
// müssen wir hier das Teil essen? - ja, funzt wunderbar :)...aber nur, wenn wir auch was selektiert hatten!
if (bWasSelected)
if(bWasSelected)
e.consume();
}
else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
else if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
{
this.hidePopup();
}
......@@ -261,7 +273,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
{
try
{
if (m_bDisableAutoCompletion4NextEvent)
if(m_bDisableAutoCompletion4NextEvent)
{
m_bDisableAutoCompletion4NextEvent = false;
......@@ -269,10 +281,10 @@ public class AutoCompleteKeyListener extends KeyAdapter
}
if (m_termListPopup != null)
if(m_termListPopup != null)
this.hidePopup();
if (e.getKeyChar() == '\n' || e.getKeyChar() == KeyEvent.VK_ESCAPE)
if(e.getKeyChar() == '\n' || e.getKeyChar() == KeyEvent.VK_ESCAPE)
return;
FontMetrics fontMetrics = m_textComponent4Listening.getFontMetrics(m_textComponent4Listening.getFont());
......@@ -280,7 +292,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
int iCaretPosition = m_textComponent4Listening.getCaretPosition();
Rectangle caretCoordinates = m_textComponent4Listening.modelToView(iCaretPosition);
if (strTextField == null)
if(strTextField == null)
strTextField = "";
// wenn Text selektiert ist, dann wird das selektierte durch das Eingegebene erstetzt
int iSelectionLeft = Math.min(m_textComponent4Listening.getSelectionStart(), m_textComponent4Listening.getSelectionEnd());
......@@ -288,7 +300,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
String strUserText = strTextField.substring(0, iSelectionLeft);
// wenn wir dieses Event kriegen, dann haben ist der Text noch gar nicht aktualisiert - das char muß noch hin
if (e.getKeyChar() != '\b' && e.getKeyChar() != KeyEvent.VK_DELETE)
if(e.getKeyChar() != '\b' && e.getKeyChar() != KeyEvent.VK_DELETE)
{
strUserText = strUserText + String.valueOf(e.getKeyChar());
iCaretPosition++;
......@@ -298,7 +310,7 @@ public class AutoCompleteKeyListener extends KeyAdapter
strUserText = strUserText + strTextField.substring(iSelectionRight);
// wenn überhaupt nix verwertbares übrig bleibt, dann machen wir gar nix
if (strUserText.trim().equals(""))
if(strUserText.trim().equals(""))