Index: tmp/org.txm.querycooccurrences.rcp/src/listcooccurrences/Activator.java
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/listcooccurrences/Activator.java	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/listcooccurrences/Activator.java	(revision 478)
@@ -0,0 +1,50 @@
+package listcooccurrences;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "QueryCooccurrences"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/listcooccurrences/Activator.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/src/org/txm/links/coocmatrix/toCA.java
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/org/txm/links/coocmatrix/toCA.java	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/org/txm/links/coocmatrix/toCA.java	(revision 478)
@@ -0,0 +1,40 @@
+package org.txm.links.coocmatrix;
+
+import org.txm.ca.core.functions.CA;
+import org.txm.functions.coocmatrix.QueryCooccurrence;
+import org.txm.lexicaltable.core.functions.LexicalTable;
+import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.Corpus;
+import org.txm.searchengine.cqp.corpus.Property;
+import org.txm.statsengine.core.StatException;
+
+public class toCA {
+	/**
+	 * Instantiates a new cA.
+	 *
+	 * @param lexicaltable the lexicaltable
+	 * @throws StatException the stat exception
+	 * @throws CqiClientException 
+	 */
+	public static CA link(QueryCooccurrence coocs) throws StatException, CqiClientException {
+		Corpus corpus = coocs.getCorpus();
+		Property analysisProperty = null;
+		try {
+			analysisProperty = coocs.getCorpus().getProperty("word"); //$NON-NLS-1$
+		} catch (CqiClientException e) {
+			// TODO Auto-generated catch block
+			org.txm.utils.logger.Log.printStackTrace(e);
+		}
+		LexicalTable table = coocs.toLexicalTable();
+		int fmin = table.getFmin();
+		
+		CA ca = new CA(table);
+		ca.setPartition(null);
+		ca.setCorpus(corpus);
+		ca.setFMin(fmin);
+		ca.setAnalysisProperty(analysisProperty);
+		
+		return ca;
+	}
+}
+

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/org/txm/links/coocmatrix/toCA.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryAutoCooccurrence.java
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryAutoCooccurrence.java	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryAutoCooccurrence.java	(revision 478)
@@ -0,0 +1,305 @@
+package org.txm.functions.coocmatrix;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.txm.ca.core.functions.CA;
+import org.txm.ca.core.functions.ICAComputable;
+import org.txm.core.results.TXMResult;
+import org.txm.functions.ProgressWatcher;
+import org.txm.lexicaltable.core.functions.LexicalTable;
+import org.txm.lexicaltable.core.statsengine.r.data.LexicalTableImpl;
+import org.txm.rcp.IImageKeys;
+import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.Corpus;
+import org.txm.searchengine.cqp.corpus.Partition;
+import org.txm.searchengine.cqp.corpus.Property;
+import org.txm.searchengine.cqp.corpus.QueryResult;
+import org.txm.searchengine.cqp.corpus.query.Query;
+import org.txm.statsengine.core.StatException;
+import org.txm.statsengine.r.core.RWorkspace;
+import org.txm.statsengine.r.core.exceptions.RWorkspaceException;
+import org.txm.utils.logger.Log;
+
+public class QueryAutoCooccurrence extends TXMResult implements ICAComputable, IAdaptable {
+	
+	protected Corpus corpus;
+	protected int[][] coocs;
+	protected ArrayList<Query> queries;
+	protected ArrayList<String> names;
+
+	protected int dist;
+	protected String struct = "";
+	protected String symbol;
+	protected static int noCoocMatrix = 1;
+
+	protected static String prefixR = "CoocMatrix";
+
+	protected int nNodes = 0;
+	protected int nEdges = 0;
+	protected int minCooc;
+	protected boolean oriented = false;
+
+	public QueryAutoCooccurrence(Corpus corpus, ArrayList<Query> queries, 
+			ArrayList<String> names, int dist, int minCooc, String struct, boolean oriented, ProgressWatcher monitor) throws CqiClientException, RWorkspaceException {
+		this.queries = queries;
+		this.names = names;
+		this.corpus = corpus;
+		this.dist = dist;
+		this.minCooc = minCooc;
+		this.oriented = oriented;
+		if (struct != null)
+			this.struct = "within "+struct; 
+		else
+			this.struct = "within text";
+
+		nNodes = queries.size();
+
+		coocs = new int[queries.size()][queries.size()];
+		if (monitor != null) monitor.beginTask("Querying cooccurrences...", nNodes);
+		for (int i = 0 ; i < queries.size() ; i++) {
+			int j = i;
+			if (oriented) j = 0; // if the graph is not oriented, we don't need to evaluate all queries
+			for (; j < queries.size() ; j++) {
+				if (monitor != null) monitor.worked(1);
+				String query = null;
+				if (oriented)
+					query = "("+queries.get(i)+"[]{0,"+dist+"}"+queries.get(j)+") "+this.struct;
+				else
+					query = "("+queries.get(i)+"[]{0,"+dist+"}"+queries.get(j)+")|("+queries.get(j)+"[]{0,"+dist+"}"+queries.get(i)+") "+this.struct;
+
+
+				Log.info("ListCooc: query "+query);
+				QueryResult result = corpus.query(new Query(query), "tmp", false);
+				coocs[i][j] = result.getNMatch();
+				if (coocs[i][j] >= minCooc) {
+					nEdges++;
+				} else {
+					coocs[i][j] = 0;
+				}
+				result.drop();
+			}
+		}
+
+		if (!oriented) //// if the graph is not oriented, copy upper triangle values to lower triangle values
+			for (int i = 0 ; i < queries.size() ; i++) {
+				for (int j = i ; j < queries.size() ; j++) {
+					coocs[j][i] = coocs[i][j];
+				}
+			}
+		if (monitor != null) monitor.done();
+	}
+
+	public String getName() {
+		return corpus.getName()+ " d="+dist+ " min="+minCooc;
+	}
+
+	public Corpus getParent() {
+		return corpus;
+	}
+
+	public String getSymbol() {
+		return symbol;
+	}
+
+	public int getNNodes() {
+		return nNodes;
+	}
+
+	public int getNEdges() {
+		return nEdges;
+	}
+
+	private void sendToR() throws RWorkspaceException {
+		if (symbol != null) return;
+
+		this.symbol = prefixR+(QueryCooccurrence.noCoocMatrix ++);
+		RWorkspace rw = RWorkspace.getRWorkspaceInstance();
+		rw.eval("rm("+symbol+")");
+		rw.addMatrixToWorkspace(symbol, coocs);
+		rw.addVectorToWorkspace("cooclabels", names.toArray(new String[names.size()]));
+		rw.eval("rownames("+symbol+") <- cooclabels");
+		rw.eval("colnames("+symbol+") <- cooclabels");
+	}
+
+
+	public LexicalTable toLexicalTable() throws RWorkspaceException, CqiClientException {
+		sendToR();
+		RWorkspace rw = RWorkspace.getRWorkspaceInstance();
+		rw.eval("LT<-"+this.getSymbol());
+		rw.eval("LT<-LT[rowSums(LT) != 0, ]");
+		rw.eval("LT<-LT[, colSums(LT) != 0]");
+		rw.eval(this.getSymbol()+"LT<-LT");
+		rw.eval("rm(LT)");
+		LexicalTable table = new LexicalTable(corpus, corpus.getProperty("word"), new LexicalTableImpl(this.getSymbol()+"LT"));
+		return table;
+	}
+
+	public boolean toGraphml(File outfile) throws RWorkspaceException {
+
+		RWorkspace rw = null;
+		try {
+			rw = RWorkspace.getRWorkspaceInstance();
+			rw.eval("library(\"igraph\")");
+			Log.info("Package 'igraph' installed. Now running CoocMatrix");
+		} catch (Exception e) {
+			Log.printStackTrace(e);
+			Log.warning("The 'igraph' package is not installed: "+e);
+			boolean install = true;
+			if (install) {
+				Log.warning("Installing 'igraph'");
+				try {
+					rw.eval("install.packages(\"igraph\", dependencies=TRUE, repos=\"http://cran.rstudio.com\");");
+				} catch(Exception e2) {
+					Log.severe("Could not install the 'igraph' package");
+					Log.printStackTrace(e2);
+					return false;
+				}
+			} else {
+				System.out.println("Operation canceled by user");
+				return false;
+			}
+		}
+
+		sendToR();
+
+		outfile.delete();
+
+		String orientationMode = "undirected";
+		//if (oriented) orientationMode = "directed";
+
+		rw.eval("library(igraph)");
+		rw.eval("g <- graph.adjacency("+symbol+", weighted=T, mode = \""+orientationMode+"\", diag=FALSE)"); // create graph from matrix
+		rw.eval("V(g)$label <- V(g)$name"); // copy names in labels
+		//rw.eval("g <- set.vertex.attribute(g, \"label\", colnames("+symbol+"))");
+		//rw.eval("g <- set.vertex.attribute(g, \"color\", value=colors)");
+
+		String path = outfile.getAbsolutePath();//.replaceAll("\\\\", "\\\\")
+		path = path.replace('\\', '/');
+		rw.eval("write.graph(g, \""+path+"\", format = 'graphml')");
+
+		return outfile.exists();
+	}
+
+	public Corpus getCorpus() {
+		return corpus;
+	}
+
+	public int[][] getCoocs() {
+		return coocs;
+	}
+
+	public ArrayList<Query> getQueries() {
+		return queries;
+	}
+
+	public java.util.ArrayList<String> getNames() {
+		return names;
+	}
+
+	public int getDist() {
+		return dist;
+	}
+
+	public void printCoocs() {
+		for (int i = 0 ; i < queries.size() ; i++) {
+			System.out.print(names.get(i));
+			for (int j = 0 ; j < queries.size() ; j++) {
+				System.out.print("\t"+coocs[i][j]);
+			}
+			System.out.println();
+		}
+	}
+
+	@Override
+	public void clean() {
+		// TODO Auto-generated method stub
+	}
+
+	public boolean toTxt(File outfile, String encoding, String colseparator,
+			String txtseparator) throws Exception {
+		return toGraphml(outfile);
+	}
+
+	public String toString() {
+		return getName();
+	}
+
+	@Override
+	public CA toCA() throws StatException, CqiClientException {
+		Corpus corpus = this.getCorpus();
+		Property analysisProperty = null;
+		try {
+			analysisProperty = this.getCorpus().getProperty("word"); //$NON-NLS-1$
+		} catch (CqiClientException e) {
+			// TODO Auto-generated catch block
+			org.txm.utils.logger.Log.printStackTrace(e);
+		}
+		LexicalTable table = this.toLexicalTable();
+		int fmin = table.getFmin();
+
+		CA ca = new CA(table);
+		ca.setPartition(null);
+		ca.setCorpus(corpus);
+		ca.setFMin(fmin);
+		ca.setAnalysisProperty(analysisProperty);
+
+		return ca;
+	}
+
+	@Override
+	public Partition getPartition() {
+		return null;
+	}
+
+	@Override
+	public boolean delete() {
+		return corpus.removeResult(this);
+	}
+
+	/** The WordCloud adapter. */
+	private static IWorkbenchAdapter coocMatrixAdapter = new IWorkbenchAdapter() {
+
+		@Override
+		public Object[] getChildren(Object o) {
+			return new Object[0];
+		}
+
+		@Override
+		public ImageDescriptor getImageDescriptor(Object object) {
+			return IImageKeys.getImageDescriptor(IImageKeys.COOCMATRIX);
+		}
+
+		@Override
+		public String getLabel(Object o) {
+			return ((QueryAutoCooccurrence) o).getName();
+		}
+
+		@Override
+		public Object getParent(Object o) {
+			if (((QueryAutoCooccurrence) o).getPartition() != null) {
+				return ((QueryAutoCooccurrence) o).getPartition();
+			} else {
+				return ((QueryAutoCooccurrence) o).getCorpus();
+			}
+		}
+	};
+
+	@Override
+	public Object getAdapter(Class adapter) {
+		return coocMatrixAdapter;
+	}
+
+	@Override
+	public String getSimpleName() {
+		return "QueryCooccurrence";
+	}
+
+	@Override
+	public String getDetails() {
+		return queries.toString();
+	}
+}

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryAutoCooccurrence.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/package.html
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/package.html	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/package.html	(revision 478)
@@ -0,0 +1,5 @@
+<html>
+<body>
+<p>Cooccurrence Matrix</p>
+</body>
+</html>
\ No newline at end of file

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/package.html
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryCooccurrence.java
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryCooccurrence.java	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryCooccurrence.java	(revision 478)
@@ -0,0 +1,250 @@
+package org.txm.functions.coocmatrix;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.txm.ca.core.functions.CA;
+import org.txm.ca.core.functions.ICAComputable;
+import org.txm.core.results.TXMResult;
+import org.txm.lexicaltable.core.functions.LexicalTable;
+import org.txm.lexicaltable.core.statsengine.r.data.LexicalTableImpl;
+import org.txm.rcp.IImageKeys;
+import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.Corpus;
+import org.txm.searchengine.cqp.corpus.Partition;
+import org.txm.searchengine.cqp.corpus.Property;
+import org.txm.searchengine.cqp.corpus.QueryResult;
+import org.txm.searchengine.cqp.corpus.query.Query;
+import org.txm.statsengine.core.StatException;
+import org.txm.statsengine.r.core.RWorkspace;
+import org.txm.statsengine.r.core.exceptions.RWorkspaceException;
+import org.txm.utils.logger.Log;
+
+public class QueryCooccurrence extends TXMResult implements ICAComputable, IAdaptable {
+	protected Corpus corpus;
+	protected int[][] coocs;
+	protected ArrayList<Query> queries1;
+	protected ArrayList<String> names1;
+	protected ArrayList<Query> queries2;
+	protected ArrayList<String> names2;
+	
+	protected int dist;
+	protected String struct = "";
+	protected String symbol;
+	protected static int noCoocMatrix = 1;
+	
+	protected static String prefixR = "CoocMatrix";
+	
+	protected int nNodes = 0;
+	protected int nEdges = 0;
+	protected int minCooc;
+	
+	public QueryCooccurrence(Corpus corpus, 
+			ArrayList<Query> queries1, ArrayList<String> names1, 
+			ArrayList<Query> queries2, ArrayList<String> names2, 
+			int dist, int minCooc, String struct) throws CqiClientException, RWorkspaceException {
+		this.queries1 = queries1;
+		this.names1 = names1;
+		this.queries2 = queries2;
+		this.names2 = names2;
+		this.corpus = corpus;
+		this.dist = dist;
+		this.minCooc = minCooc;
+		if (struct != null)
+			this.struct = "within "+struct; 
+		else
+			this.struct = "within text";
+	
+		nNodes = queries1.size();
+				
+		coocs = new int[queries1.size()][queries2.size()];
+		for (int i = 0 ; i < queries1.size() ; i++) {
+
+			//if (oriented) j = 0; // if the graph is not oriented, we don't need to evaluate all queries
+			for (int j = 0 ; j < queries2.size() ; j++) {
+				String query = "("+queries1.get(i)+"[]{0,"+dist+"}"+queries2.get(j)+")|("+queries2.get(j)+"[]{0,"+dist+"}"+queries1.get(i)+") "+this.struct;
+					
+				Log.info("ListCooc: query "+query);
+				QueryResult result = corpus.query(new Query(query), "tmp", false);
+				coocs[i][j] = result.getNMatch();
+				if (coocs[i][j] >= minCooc) {
+					nEdges++;
+				} else {
+					coocs[i][j] = 0;
+				}
+				result.drop();
+			}
+		}
+	}
+	
+	public String getName() {
+		return corpus.getName()+ " d="+dist+ " min="+minCooc;
+	}
+	
+	public Corpus getParent() {
+		return corpus;
+	}
+	
+	public String getSymbol() {
+		return symbol;
+	}
+	
+	public int getNNodes() {
+		return nNodes;
+	}
+	
+	public int getNEdges() {
+		return nEdges;
+	}
+	
+	public LexicalTable toLexicalTable() throws RWorkspaceException, CqiClientException {
+		sendToR();
+		RWorkspace rw = RWorkspace.getRWorkspaceInstance();
+		rw.eval("LT<-"+this.getSymbol());
+		rw.eval("LT<-LT[rowSums(LT) != 0, ]");
+		rw.eval("LT<-LT[, colSums(LT) != 0]");
+		rw.eval(this.getSymbol()+"LT<-LT");
+		rw.eval("rm(LT)");
+		LexicalTable table = new LexicalTable(corpus, corpus.getProperty("word"), new LexicalTableImpl(this.getSymbol()+"LT"));
+		return table;
+	}
+	
+	private void sendToR() throws RWorkspaceException {
+		if (symbol != null) return;
+		
+		this.symbol = prefixR+(QueryCooccurrence.noCoocMatrix ++);
+		RWorkspace rw = RWorkspace.getRWorkspaceInstance();
+		rw.eval("rm("+symbol+")");
+		rw.addMatrixToWorkspace(symbol, coocs);
+		rw.addVectorToWorkspace("cooclabels", names1.toArray(new String[names1.size()]));
+		rw.eval("rownames("+symbol+") <- cooclabels");
+		rw.eval("colnames("+symbol+") <- cooclabels");
+	}
+
+	public Corpus getCorpus() {
+		return corpus;
+	}
+	
+	public int[][] getCoocs() {
+		return coocs;
+	}
+	
+	public ArrayList<Query> getQueries() {
+		return queries1;
+	}
+	
+	public java.util.ArrayList<String> getNames() {
+		return names1;
+	}
+	
+	public int getDist() {
+		return dist;
+	}
+	
+	public void printCoocs() {
+		for (int i = 0 ; i < queries1.size() ; i++) {
+			System.out.print(names1.get(i));
+			for (int j = 0 ; j < queries1.size() ; j++) {
+				System.out.print("\t"+coocs[i][j]);
+			}
+			System.out.println();
+		}
+	}
+
+	@Override
+	public void clean() {
+		// TODO Auto-generated method stub
+	}
+
+	public boolean toTxt(File outfile, String encoding, String colseparator,
+			String txtseparator) throws Exception {
+		return false;
+	}
+	
+	public String toString() {
+		return getName();
+	}
+
+	@Override
+	public CA toCA() throws StatException, CqiClientException {
+		Corpus corpus = this.getCorpus();
+		Property analysisProperty = null;
+		try {
+			analysisProperty = this.getCorpus().getProperty("word"); //$NON-NLS-1$
+		} catch (CqiClientException e) {
+			// TODO Auto-generated catch block
+			org.txm.utils.logger.Log.printStackTrace(e);
+		}
+		LexicalTable table = this.toLexicalTable();
+		int fmin = table.getFmin();
+		
+		CA ca = new CA(table);
+		ca.setPartition(null);
+		ca.setCorpus(corpus);
+		ca.setFMin(fmin);
+		ca.setAnalysisProperty(analysisProperty);
+		
+		return ca;
+	}
+
+	@Override
+	public Partition getPartition() {
+		return null;
+	}
+
+	@Override
+	public boolean delete() {
+		return corpus.removeResult(this);
+	}
+
+	public String[] getExportTXTExtensions() {
+		return new String[]{"*.txt"};
+	}
+
+	
+	/** The WordCloud adapter. */
+	private static IWorkbenchAdapter coocMatrixAdapter = new IWorkbenchAdapter() {
+
+		@Override
+		public Object[] getChildren(Object o) {
+			return new Object[0];
+		}
+
+		@Override
+		public ImageDescriptor getImageDescriptor(Object object) {
+			return IImageKeys.getImageDescriptor(IImageKeys.COOCMATRIX);
+		}
+
+		@Override
+		public String getLabel(Object o) {
+			return ((QueryCooccurrence) o).getName();
+		}
+
+		@Override
+		public Object getParent(Object o) {
+			if (((QueryCooccurrence) o).getPartition() != null) {
+				return ((QueryCooccurrence) o).getPartition();
+			} else {
+				return ((QueryCooccurrence) o).getCorpus();
+			}
+		}
+	};
+	
+	@Override
+	public Object getAdapter(Class adapter) {
+		return coocMatrixAdapter;
+	}
+
+	@Override
+	public String getSimpleName() {
+		return "QueryCooccurrence";
+	}
+
+	@Override
+	public String getDetails() {
+		return queries1.toString()+ " "+queries2.toString();
+	}
+}

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/org/txm/functions/coocmatrix/QueryCooccurrence.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence.java
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence.java	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence.java	(revision 478)
@@ -0,0 +1,356 @@
+// Copyright © 2010-2013 ENS de Lyon.
+// Copyright © 2007-2010 ENS de Lyon, CNRS, INRP, University of
+// Lyon 2, University of Franche-Comté, University of Nice
+// Sophia Antipolis, University of Paris 3.
+// 
+// The TXM platform is free software: you can redistribute it
+// and/or modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation,
+// either version 2 of the License, or (at your option) any
+// later version.
+// 
+// The TXM platform is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied
+// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+// PURPOSE. See the GNU General Public License for more
+// details.
+// 
+// You should have received a copy of the GNU General
+// Public License along with the TXM platform. If not, see
+// http://www.gnu.org/licenses.
+// 
+// 
+// 
+// $LastChangedDate:$
+// $LastChangedRevision:$
+// $LastChangedBy:$ 
+//
+package org.txm.rcpapplication.commands.function;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.txm.functions.coocmatrix.QueryAutoCooccurrence;
+import org.txm.functions.queryindex.QueryIndex;
+import org.txm.functions.queryindex.QueryIndexLine;
+import org.txm.rcp.JobsTimer;
+import org.txm.rcp.Messages;
+import org.txm.rcp.utils.JobHandler;
+import org.txm.rcp.views.QueriesView;
+import org.txm.rcp.views.corpora.CorporaView;
+import org.txm.searchengine.cqp.CQPEngine;
+import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.Corpus;
+import org.txm.searchengine.cqp.corpus.StructuralUnit;
+import org.txm.searchengine.cqp.corpus.query.Query;
+import org.txm.stat.utils.ConsoleProgressBar;
+import org.txm.statsengine.r.rcp.views.RVariablesView;
+//import org.txm.functions.queryindex.*;
+import org.txm.utils.logger.Log;
+
+/**
+ * if the selection is a corpus, open an empty Cooc editor if the selection is a
+ * concordance, open a Cooc editor already computed @ author mdecorde.
+ */
+public class ComputeQueryAutoCooccurrence extends AbstractHandler {
+
+	float reqtime = 0.5f;
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelection(event);
+		final Object element = selection.getFirstElement();
+
+		final Shell shell = HandlerUtil.getActiveWorkbenchWindowChecked(event)
+				.getShell();
+
+		JobHandler jobhandler = new JobHandler("Computing cooccurrences matrix") {
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				this.runInit(monitor);
+				try {
+					JobsTimer.start();
+
+					if (!(element instanceof QueryIndex)) {
+						System.out.println(Messages.ComputeCooccurrences_1+ element);
+						return Status.CANCEL_STATUS;
+					}
+					QueryIndex qi = ((QueryIndex)element);
+					Corpus corpus = qi.getCorpus();
+					
+					final CoocMatrixDialog dialog = new ComputeQueryAutoCooccurrence.CoocMatrixDialog(shell, corpus);
+					syncExec(new Runnable() {
+						@Override
+						public void run() {
+							dialog.open();
+						}
+					});
+
+					if (dialog.getReturnCode() != Window.OK) System.out.println("Canceled");
+
+					this.acquireSemaphore();
+					final QueryAutoCooccurrence cooc = computeCooc(shell, corpus, (QueryIndex)element, dialog);
+					this.releaseSemaphore();
+
+					if (cooc == null) return null;
+					
+					corpus.addResult(cooc);
+					System.out.println(Messages.ComputeCoocMatrix_0+cooc.getSymbol());
+
+					syncExec(new Runnable() {
+						@Override
+						public void run() {
+							CorporaView.refresh();
+							CorporaView.expand(cooc.getCorpus());
+							QueriesView.refresh();
+							RVariablesView.refresh();
+						}
+					});
+				} catch (ThreadDeath td) { 
+					return Status.CANCEL_STATUS;
+				} catch (Exception e) {
+					Log.printStackTrace(e);
+					try { System.out.println(Messages.LastCQPError+CQPEngine.getCqiClient().getLastCQPError());
+					} catch (Exception e1) { e1.printStackTrace(); }
+				} finally {
+					monitor.done();
+					JobsTimer.stopAndPrint();
+				}
+				return Status.OK_STATUS;
+			}
+		};
+		jobhandler.startJob();
+		return null;
+	}
+
+
+	private QueryAutoCooccurrence computeCooc(Shell shell, Corpus corpus, QueryIndex element, CoocMatrixDialog dialog) {
+		ArrayList<Query> queries = new ArrayList<Query>();
+		ArrayList<String> names = new ArrayList<String>();
+
+		String struct = dialog.getStruct();
+		int dist = dialog.getDist();
+		int min = dialog.getMin();
+		File outfile = dialog.getOutFile();
+		boolean oriented = dialog.getOriented();
+
+		for (QueryIndexLine line : element.getLines()) {
+			queries.add(line.getQuery());
+			names.add(line.getName());
+		}
+
+		System.out.println(Messages.ProgressionDialog_8+queries);
+		System.out.println(Messages.MergeCols_5+names);
+
+		QueryAutoCooccurrence cooc = null;
+		try {
+
+			int nqueries = (queries.size()*queries.size()/2);
+			System.out.println("Number of queries: "+nqueries);
+			System.out.println("Estimated time: "+(nqueries*reqtime/1000)+" secs");
+			cooc = new QueryAutoCooccurrence(corpus, queries, names, dist, min, struct, oriented, new ConsoleProgressBar(nqueries));
+			System.out.println(Messages.ComputeCoocMatrix_1+cooc.getNNodes());
+			System.out.println(Messages.ComputeCoocMatrix_2+cooc.getNEdges());
+			System.out.println(Messages.ComputeCoocMatrix_3+dist);
+
+			if (outfile != null) {
+				cooc.toGraphml(outfile);
+				System.out.println(Messages.ComputeCoocMatrix_4+outfile);
+			}
+
+		} catch (Exception e) {
+			Log.printStackTrace(e);
+			try { System.out.println(Messages.LastCQPError+CQPEngine.getCqiClient().getLastCQPError());
+			} catch (Exception e1) { e1.printStackTrace(); }
+		}
+		return cooc;
+	}
+
+	public class CoocMatrixDialog extends Dialog {
+		Corpus corpus;
+
+		org.eclipse.swt.widgets.List propsCombo;
+		Spinner distSpinner;
+		Spinner minSpinner;
+		Label outfileLabel;
+
+		File outfile;
+		int dist;
+		int min;
+		String struct;
+		private boolean oriented;
+
+		private Button orientedButton;
+
+		public CoocMatrixDialog(Shell parentShell, Corpus corpus) {
+			super(parentShell);
+			this.setShellStyle(this.getShellStyle() | SWT.RESIZE);
+			this.corpus = corpus;
+		}
+
+
+		public boolean getOriented() {
+			return oriented;
+		}
+
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+		 */
+		@Override
+		protected void configureShell(Shell newShell) {
+			super.configureShell(newShell);
+			newShell.setText(Messages.ComputeCoocMatrix_7);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+		 */
+		@Override
+		protected Control createDialogArea(Composite parent) {
+			Composite composite = parent; //new Composite(parent, SWT.NONE);
+			// TODO : we just put a composite into another composite. Everything
+			// should be directly put into parent
+			GridLayout layout = new GridLayout(2, false);
+			composite.setLayout(layout);
+
+			Label anaPropLabel = new Label(composite, SWT.NONE);
+			anaPropLabel.setText(Messages.ParaBrowserEditor_5);
+			anaPropLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
+
+			propsCombo = new org.eclipse.swt.widgets.List(composite, SWT.READ_ONLY);
+			GridData gdata = new GridData(GridData.FILL, GridData.FILL, true, false);
+			propsCombo.setLayoutData(gdata);
+			GC gc = new GC(propsCombo);
+			gc.setFont(this.propsCombo.getFont());
+			gdata.heightHint = gc.getFontMetrics().getHeight() * 5;
+			gc.dispose();
+			propsCombo.add("");
+			try {
+				for (StructuralUnit p : corpus.getStructuralUnits()) {
+					if (!("text".equals(p.getName()) ||  //$NON-NLS-1$
+							"txmcorpus".equals(p.getName()))) //$NON-NLS-1$
+						propsCombo.add(p.getName());
+				}
+			} catch (CqiClientException e) {
+				Log.printStackTrace(e);
+				return parent;
+			}
+
+			Label distLabel = new Label(composite, SWT.NONE);
+			distLabel.setText(Messages.ComputeCoocMatrix_10);
+			distLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+			distSpinner = new Spinner(composite, SWT.BORDER);
+			distSpinner.setMinimum(0);
+			distSpinner.setMaximum(1000);
+			distSpinner.setSelection(10);
+
+			Label minLabel = new Label(composite, SWT.NONE);
+			minLabel.setText(Messages.ComputeCoocMatrix_11);
+			minLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+			minSpinner = new Spinner(composite, SWT.BORDER);
+			minSpinner.setMinimum(1);
+			minSpinner.setMaximum(1000);
+			minSpinner.setSelection(20);
+			
+			Label orientedLabel = new Label(composite, SWT.NONE);
+			orientedLabel.setText("Oriented");
+			orientedLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+			orientedButton = new Button(composite, SWT.CHECK);
+			orientedButton.setSelection(false);
+
+			outfileLabel = new Label(composite, SWT.NONE);
+			outfileLabel.setText(Messages.ComputeCoocMatrix_12);
+			outfileLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+
+			Button outfileButton = new Button(composite, SWT.PUSH);
+			outfileButton.setText(Messages.ComputeCoocMatrix_13);
+			outfileButton.addSelectionListener(new SelectionListener() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					FileDialog dialog = new FileDialog(e.display.getActiveShell(), SWT.SAVE);
+					String extensions[] = {"*.graphml"}; //$NON-NLS-1$
+					dialog.setFilterExtensions(extensions);
+					String path = dialog.open();
+					if (path != null) {
+						outfile = new File(path);
+						if (!(outfile.getName().toLowerCase().endsWith(".graphml"))) { //$NON-NLS-1$
+							outfile = new File(path+".graphml"); //$NON-NLS-1$
+						}
+						outfileLabel.setText(outfile.getAbsolutePath());
+					}
+				}
+
+				@Override
+				public void widgetDefaultSelected(SelectionEvent e) { }
+			});
+
+			return parent;
+		}
+
+		public File getOutFile() {
+			return outfile;
+		}
+
+		public int getDist() {
+			return dist;
+		}
+
+		public int getMin() {
+			return min;
+		}
+
+		public String getStruct() {
+			return struct;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+		 */
+		@Override
+		protected void okPressed() {
+			dist = distSpinner.getSelection();
+			min = minSpinner.getSelection();
+			struct = null;
+			oriented = orientedButton.getSelection();
+			for (int i : propsCombo.getSelectionIndices()) {
+				String sname = propsCombo.getItem(i);
+				if (sname != null && sname.length() > 0) {
+					struct = sname;
+					break;
+				}
+			}
+			super.okPressed();
+		}
+	}
+}

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence.java
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence.java	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence.java	(revision 478)
@@ -0,0 +1,395 @@
+// Copyright © 2010-2013 ENS de Lyon.
+// Copyright © 2007-2010 ENS de Lyon, CNRS, INRP, University of
+// Lyon 2, University of Franche-Comté, University of Nice
+// Sophia Antipolis, University of Paris 3.
+// 
+// The TXM platform is free software: you can redistribute it
+// and/or modify it under the terms of the GNU General Public
+// License as published by the Free Software Foundation,
+// either version 2 of the License, or (at your option) any
+// later version.
+// 
+// The TXM platform is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied
+// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+// PURPOSE. See the GNU General Public License for more
+// details.
+// 
+// You should have received a copy of the GNU General
+// Public License along with the TXM platform. If not, see
+// http://www.gnu.org/licenses.
+// 
+// 
+// 
+// $LastChangedDate:$
+// $LastChangedRevision:$
+// $LastChangedBy:$ 
+//
+package org.txm.rcpapplication.commands.function;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.txm.functions.coocmatrix.QueryCooccurrence;
+//import org.txm.functions.queryindex.*;
+import org.txm.rcp.JobsTimer;
+import org.txm.rcp.Messages;
+import org.txm.rcp.utils.JobHandler;
+import org.txm.rcp.views.QueriesView;
+import org.txm.rcp.views.corpora.CorporaView;
+import org.txm.searchengine.cqp.CQPEngine;
+import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.Corpus;
+import org.txm.searchengine.cqp.corpus.StructuralUnit;
+import org.txm.searchengine.cqp.corpus.query.Query;
+import org.txm.statsengine.r.rcp.views.RVariablesView;
+import org.txm.utils.logger.Log;
+
+// TODO: Auto-generated Javadoc
+/**
+ * if the selection is a corpus, open an empty Cooc editor if the selection is a
+ * concordance, open a Cooc editor already computed @ author mdecorde.
+ */
+public class ComputeQueryCooccurrence extends AbstractHandler {
+
+	float reqtime = 0.5f;
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelection(event);
+		final Object element = selection.getFirstElement();
+
+		final Shell shell = HandlerUtil.getActiveWorkbenchWindowChecked(event)
+				.getShell();
+
+		JobHandler jobhandler = new JobHandler("Computing cooccurrences matrix") {
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				this.runInit(monitor);
+				try {
+					JobsTimer.start();
+
+					if (!(element instanceof Corpus)) {
+						System.out.println(Messages.ComputeCooccurrences_1+ element);
+						return Status.CANCEL_STATUS;
+					}
+					Corpus corpus = ((Corpus)element);
+
+					final CoocMatrixDialog dialog = new ComputeQueryCooccurrence.CoocMatrixDialog(shell, corpus);
+					syncExec(new Runnable() {
+						@Override
+						public void run() {
+							dialog.open();
+						}
+					});
+
+					if (dialog.getReturnCode() != Window.OK) System.out.println("Canceled");
+
+					this.acquireSemaphore();
+					final QueryCooccurrence cooc = computeCooc(shell, corpus, dialog);
+					this.releaseSemaphore();
+
+					if (cooc == null) return null;
+
+					corpus.addResult(cooc);
+					System.out.println(Messages.ComputeCoocMatrix_0+cooc.getSymbol());
+
+					syncExec(new Runnable() {
+						@Override
+						public void run() {
+							CorporaView.refresh();
+							CorporaView.expand(cooc.getCorpus());
+							QueriesView.refresh();
+							RVariablesView.refresh();
+						}
+					});
+				} catch (ThreadDeath td) { 
+					return Status.CANCEL_STATUS;
+				} catch (Exception e) {
+					Log.printStackTrace(e);
+					try { System.out.println(Messages.LastCQPError+CQPEngine.getCqiClient().getLastCQPError());
+					} catch (Exception e1) { e1.printStackTrace(); }
+				} finally {
+					monitor.done();
+					JobsTimer.stopAndPrint();
+				}
+				return Status.OK_STATUS;
+			}
+		};
+		jobhandler.startJob();
+		return null;
+	}
+
+
+	private QueryCooccurrence computeCooc(Shell shell, Corpus corpus, CoocMatrixDialog dialog) throws IOException {
+		ArrayList<Query> queries1 = new ArrayList<Query>();
+		ArrayList<String> names1 = new ArrayList<String>();
+		ArrayList<Query> queries2 = new ArrayList<Query>();
+		ArrayList<String> names2 = new ArrayList<String>();
+
+		String struct = dialog.getStruct();
+		int dist = dialog.getDist();
+		int min = dialog.getMin();
+		getQueriesAndNames(dialog.getQueryFile1(), queries1, names1);
+		getQueriesAndNames(dialog.getQueryFile2(), queries2, names2);
+
+		System.out.println(Messages.ProgressionDialog_8+queries1);
+		System.out.println(Messages.MergeCols_5+names1);
+
+		QueryCooccurrence cooc = null;
+		try {
+			int nqueries = (queries1.size()*queries2.size());
+			System.out.println("Number of queries: "+nqueries);
+			System.out.println("Estimated time: "+(nqueries*reqtime/1000)+" secs");
+			cooc = new QueryCooccurrence(corpus, queries1, names1, queries2, names2, dist, min, struct);
+			System.out.println(Messages.ComputeCoocMatrix_1+cooc.getNNodes());
+			System.out.println(Messages.ComputeCoocMatrix_2+cooc.getNEdges());
+			System.out.println(Messages.ComputeCoocMatrix_3+dist);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			Log.printStackTrace(e);
+			try { System.out.println(Messages.LastCQPError+CQPEngine.getCqiClient().getLastCQPError());
+			} catch (Exception e1) { e1.printStackTrace(); }
+		}
+		return cooc;
+	}
+
+	private void getQueriesAndNames(File propFile, ArrayList<Query> queries,
+			ArrayList<String> names) throws IOException {
+		BufferedReader reader = new BufferedReader(new InputStreamReader(
+				new FileInputStream(propFile), "UTF-8")); //$NON-NLS-1$
+
+		String line = reader.readLine();
+		while (line != null) {
+			String[] split = line.split("=", 2); //$NON-NLS-1$
+			if (split.length == 2) {
+				queries.add(new Query(split[1]));
+				names.add(split[0]);
+			}
+
+			line = reader.readLine();
+		}
+		reader.close();
+	}
+
+	public class CoocMatrixDialog extends Dialog {
+		Corpus corpus;
+
+		org.eclipse.swt.widgets.List propsCombo;
+		Spinner distSpinner;
+		Spinner minSpinner;
+		Label queriesFile1Label;
+		Label queriesFile2Label;
+
+		File queriesFile1;
+		File queriesFile2;
+		int dist;
+		int min;
+		String struct;
+		private boolean oriented;
+
+		private Button orientedButton;
+
+
+
+		public CoocMatrixDialog(Shell parentShell, Corpus corpus) {
+			super(parentShell);
+			this.setShellStyle(this.getShellStyle() | SWT.RESIZE);
+			this.corpus = corpus;
+		}
+
+
+		public boolean getOriented() {
+			return oriented;
+		}
+
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+		 */
+		@Override
+		protected void configureShell(Shell newShell) {
+			super.configureShell(newShell);
+			newShell.setText(Messages.ComputeCoocMatrix_7);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+		 */
+		@Override
+		protected Control createDialogArea(Composite parent) {
+			Composite composite = parent; //new Composite(parent, SWT.NONE);
+			// TODO : we just put a composite into another composite. Everything
+			// should be directly put into parent
+			GridLayout layout = new GridLayout(2, false);
+			composite.setLayout(layout);
+
+			Label anaPropLabel = new Label(composite, SWT.NONE);
+			anaPropLabel.setText(Messages.ParaBrowserEditor_5);
+			anaPropLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
+
+			propsCombo = new org.eclipse.swt.widgets.List(composite, SWT.READ_ONLY);
+			GridData gdata = new GridData(GridData.FILL, GridData.FILL, true, false);
+			propsCombo.setLayoutData(gdata);
+			GC gc = new GC(propsCombo);
+			gc.setFont(this.propsCombo.getFont());
+			gdata.heightHint = gc.getFontMetrics().getHeight() * 5;
+			gc.dispose();
+			propsCombo.add("");
+			try {
+				for (StructuralUnit p : corpus.getStructuralUnits()) {
+					if (!("text".equals(p.getName()) ||  //$NON-NLS-1$
+							"txmcorpus".equals(p.getName()))) //$NON-NLS-1$
+						propsCombo.add(p.getName());
+				}
+			} catch (CqiClientException e) {
+				Log.printStackTrace(e);
+				return parent;
+			}
+
+			Label distLabel = new Label(composite, SWT.NONE);
+			distLabel.setText(Messages.ComputeCoocMatrix_10);
+			distLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+			distSpinner = new Spinner(composite, SWT.BORDER);
+			distSpinner.setMinimum(0);
+			distSpinner.setMaximum(1000);
+			distSpinner.setSelection(10);
+
+			Label minLabel = new Label(composite, SWT.NONE);
+			minLabel.setText(Messages.ComputeCoocMatrix_11);
+			minLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+			minSpinner = new Spinner(composite, SWT.BORDER);
+			minSpinner.setMinimum(1);
+			minSpinner.setMaximum(1000);
+			minSpinner.setSelection(20);
+
+			Label orientedLabel = new Label(composite, SWT.NONE);
+			orientedLabel.setText("Oriented");
+			orientedLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+			orientedButton = new Button(composite, SWT.CHECK);
+			orientedButton.setSelection(false);
+
+			queriesFile1Label = new Label(composite, SWT.NONE);
+			queriesFile1Label.setText("Query file 1");
+			queriesFile1Label.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+
+			Button queriesFile1Button = new Button(composite, SWT.PUSH);
+			queriesFile1Button.setText("Select...");
+			queriesFile1Button.addSelectionListener(new SelectionListener() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					FileDialog dialog = new FileDialog(e.display.getActiveShell(), SWT.OPEN);
+					String extensions[] = {"*.properties"}; //$NON-NLS-1$
+					dialog.setFilterExtensions(extensions);
+					String path = dialog.open();
+					if (path != null) {
+						queriesFile1 = new File(path);
+						queriesFile1Label.setText(queriesFile1.getAbsolutePath());
+					}
+				}
+
+				@Override
+				public void widgetDefaultSelected(SelectionEvent e) { }
+			});
+
+			queriesFile2Label = new Label(composite, SWT.NONE);
+			queriesFile2Label.setText("Query file 2");
+			queriesFile2Label.setLayoutData(new GridData(GridData.END, GridData.CENTER,
+					false, false));
+
+			Button queriesFile2Button = new Button(composite, SWT.PUSH);
+			queriesFile2Button.setText("Select...");
+			queriesFile2Button.addSelectionListener(new SelectionListener() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					FileDialog dialog = new FileDialog(e.display.getActiveShell(), SWT.OPEN);
+					String extensions[] = {"*.properties"}; //$NON-NLS-1$
+					dialog.setFilterExtensions(extensions);
+					String path = dialog.open();
+					if (path != null) {
+						queriesFile2 = new File(path);
+						queriesFile2Label.setText(queriesFile2.getAbsolutePath());
+					}
+				}
+
+				@Override
+				public void widgetDefaultSelected(SelectionEvent e) { }
+			});
+
+			return parent;
+		}
+
+		public File getQueryFile1() {
+			return queriesFile1;
+		}
+
+		public File getQueryFile2() {
+			return queriesFile2;
+		}
+
+		public int getDist() {
+			return dist;
+		}
+
+		public int getMin() {
+			return min;
+		}
+
+		public String getStruct() {
+			return struct;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+		 */
+		@Override
+		protected void okPressed() {
+			dist = distSpinner.getSelection();
+			min = minSpinner.getSelection();
+			struct = null;
+			oriented = orientedButton.getSelection();
+			for (int i : propsCombo.getSelectionIndices()) {
+				String sname = propsCombo.getItem(i);
+				if (sname != null && sname.length() > 0) {
+					struct = sname;
+					break;
+				}
+			}
+			super.okPressed();
+		}
+	}
+}

Property changes on: tmp/org.txm.querycooccurrences.rcp/src/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/links/coocmatrix/toCA.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/links/coocmatrix/toCA.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryCooccurrence$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryCooccurrence$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryAutoCooccurrence.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryAutoCooccurrence.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/package.html
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/package.html	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/package.html	(revision 478)
@@ -0,0 +1,5 @@
+<html>
+<body>
+<p>Cooccurrence Matrix</p>
+</body>
+</html>
\ No newline at end of file
Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryAutoCooccurrence$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryAutoCooccurrence$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryCooccurrence.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/functions/coocmatrix/QueryCooccurrence.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$CoocMatrixDialog$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$CoocMatrixDialog$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$1$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$1$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$CoocMatrixDialog$2.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$CoocMatrixDialog$2.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$1$2.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$1$2.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$CoocMatrixDialog.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$CoocMatrixDialog.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$1$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$1$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$CoocMatrixDialog$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$CoocMatrixDialog$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$1$2.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$1$2.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$CoocMatrixDialog.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence$CoocMatrixDialog.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$1.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryAutoCooccurrence$1.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/org/txm/rcpapplication/commands/function/ComputeQueryCooccurrence.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/bin/listcooccurrences/Activator.class
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/bin/listcooccurrences/Activator.class
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/build.properties
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/build.properties	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/build.properties	(revision 478)
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml

Property changes on: tmp/org.txm.querycooccurrences.rcp/build.properties
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/icons/functions/QueryCooccurrences.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/icons/functions/QueryCooccurrences.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/icons/functions/CooccurrencesP.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: tmp/org.txm.querycooccurrences.rcp/icons/functions/CooccurrencesP.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: tmp/org.txm.querycooccurrences.rcp/plugin.xml
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/plugin.xml	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/plugin.xml	(revision 478)
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.core.runtime.adapters">
+      <factory
+           adaptableType="org.txm.functions.coocmatrix.QueryAutoCooccurrence"
+           class="org.txm.rcpapplication.AdapterFactory">
+         <adapter
+            type="org.eclipse.ui.model.IWorkbenchAdapter">
+         </adapter>
+      </factory>
+      <factory
+            adaptableType="org.txm.functions.coocmatrix.QueryCooccurrence"
+            class="org.txm.rcpapplication.AdapterFactory">
+         <adapter
+               type="org.eclipse.ui.model.IWorkbenchAdapter">
+         </adapter>
+      </factory>
+   </extension>
+   <extension
+         point="org.eclipse.ui.commands">
+      <command
+            categoryId="org.txm.rcpapplication.category.txm"
+            defaultHandler="org.txm.rcpapplication.commands.function.ComputeQueryAutoCooccurrence"
+            id="org.txm.rcpapplication.commands.function.ComputeQueryAutoCooccurrence"
+            name="AutoCooccurrences">
+      </command>
+      <command
+            categoryId="org.txm.rcpapplication.category.txm"
+            defaultHandler="org.txm.rcpapplication.commands.function.ComputeQueryCooccurrence"
+            id="org.txm.rcpapplication.commands.function.ComputeQueryCooccurrence"
+            name="QueryCooccurrences">
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.core.expressions.definitions">
+      <definition id="OneAutoCooccurrenceSelected">
+               <with variable="selection">
+                  <iterate
+                        ifEmpty="false"
+                        operator="and">
+                     <instanceof
+                           value="org.txm.functions.coocmatrix.QueryAutoCooccurrence">
+                     </instanceof>
+                  </iterate>
+               </with>
+            </definition>
+      <definition
+            id="OneQueryCooccurrenceSelected">
+         <with
+               variable="selection">
+            <iterate
+                  ifEmpty="false"
+                  operator="and">
+               <instanceof
+                     value="org.txm.functions.coocmatrix.QueryCooccurrence">
+               </instanceof>
+            </iterate>
+         </with>
+      </definition>
+   </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            allPopups="true"
+            locationURI="toolbar:org.eclipse.ui.main.toolbar">
+         <toolbar
+               id="org.txm.rcpapplication.toolbartools">
+            <command
+                  commandId="org.txm.rcpapplication.commands.function.ComputeQueryAutoCooccurrence"
+                  icon="icons/functions/CooccurrencesP.png"
+                  style="push">
+               <visibleWhen
+                     checkEnabled="false">
+                  <or>
+                     <reference
+                           definitionId="OneQueryIndexSelected">
+                     </reference>
+                     <reference
+                           definitionId="OneLexiconSelected">
+                     </reference>
+                     <reference
+                           definitionId="OneIndexSelected">
+                     </reference>
+                  </or>
+               </visibleWhen>
+            </command>
+            <command
+                  commandId="org.txm.rcpapplication.commands.function.ComputeQueryCooccurrence"
+                  icon="icons/functions/QueryCooccurrences.png"
+                  style="push">
+               <visibleWhen
+                     checkEnabled="false">
+                  <or>
+                     <reference
+                           definitionId="OneCorpusSelected">
+                     </reference>
+                  </or>
+               </visibleWhen>
+            </command>
+         </toolbar>
+      </menuContribution>
+   </extension>
+</plugin>

Property changes on: tmp/org.txm.querycooccurrences.rcp/plugin.xml
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/.settings/org.eclipse.jdt.core.prefs	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/.settings/org.eclipse.jdt.core.prefs	(revision 478)
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6

Property changes on: tmp/org.txm.querycooccurrences.rcp/.settings/org.eclipse.jdt.core.prefs
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/.classpath
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/.classpath	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/.classpath	(revision 478)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="**"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Property changes on: tmp/org.txm.querycooccurrences.rcp/.classpath
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF	(revision 478)
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.txm.querycooccurrence.rcp
+Bundle-SymbolicName: org.txm.querycooccurrence.rcp;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: listcooccurrences.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.expressions;bundle-version="3.4.500",
+ org.txm.rcp;bundle-version="0.7.8",
+ org.txm.core;bundle-version="0.7.0",
+ org.txm.queryindex.rcp;bundle-version="1.0.0",
+ org.txm.ca.core,
+ org.txm.statsengine.r.core,
+ org.txm.lexicaltable.core,
+ org.txm.statsengine.core,
+ org.txm.statsengine.r.rcp
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.txm.functions.coocmatrix
+Bundle-Vendor: Textometrie.org

Property changes on: tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.querycooccurrences.rcp/.project
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/.project	(revision 0)
+++ tmp/org.txm.querycooccurrences.rcp/.project	(revision 478)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>QueryCooccurrencesRCP</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Property changes on: tmp/org.txm.querycooccurrences.rcp/.project
___________________________________________________________________
Added: svn:mime-type
   + text/plain

