Révision 653
| tmp/org.txm.concordance.rcp/plugin.xml (revision 653) | ||
|---|---|---|
| 67 | 67 |
</menuContribution> |
| 68 | 68 |
<menuContribution |
| 69 | 69 |
allPopups="false" |
| 70 |
locationURI="toolbar:org.txm.rcp.toolbartools"> |
|
| 70 |
locationURI="toolbar:org.txm.rcp.toolbartools?after=org.txm.index.rcp.handlers.ComputeIndex">
|
|
| 71 | 71 |
<command |
| 72 | 72 |
commandId="org.txm.concordance.rcp.handlers.ComputeConcordance" |
| 73 | 73 |
icon="icons/concordance.png" |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/handlers/BackToText.java (revision 653) | ||
|---|---|---|
| 1 |
// Copyright © 2010-2013 ENS de Lyon. |
|
| 2 |
// Copyright © 2007-2010 ENS de Lyon, CNRS, INRP, University of |
|
| 3 |
// Lyon 2, University of Franche-Comté, University of Nice |
|
| 4 |
// Sophia Antipolis, University of Paris 3. |
|
| 5 |
// |
|
| 6 |
// The TXM platform is free software: you can redistribute it |
|
| 7 |
// and/or modify it under the terms of the GNU General Public |
|
| 8 |
// License as published by the Free Software Foundation, |
|
| 9 |
// either version 2 of the License, or (at your option) any |
|
| 10 |
// later version. |
|
| 11 |
// |
|
| 12 |
// The TXM platform is distributed in the hope that it will be |
|
| 13 |
// useful, but WITHOUT ANY WARRANTY; without even the implied |
|
| 14 |
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
|
| 15 |
// PURPOSE. See the GNU General Public License for more |
|
| 16 |
// details. |
|
| 17 |
// |
|
| 18 |
// You should have received a copy of the GNU General |
|
| 19 |
// Public License along with the TXM platform. If not, see |
|
| 20 |
// http://www.gnu.org/licenses. |
|
| 21 |
// |
|
| 22 |
// |
|
| 23 |
// |
|
| 24 |
// $LastChangedDate:$ |
|
| 25 |
// $LastChangedRevision:$ |
|
| 26 |
// $LastChangedBy:$ |
|
| 27 |
// |
|
| 28 |
package org.txm.synopticedition.rcp.handlers; |
|
| 29 |
|
|
| 30 |
|
|
| 31 |
import java.util.ArrayList; |
|
| 32 |
import java.util.HashMap; |
|
| 33 |
import java.util.HashSet; |
|
| 34 |
import java.util.List; |
|
| 35 |
|
|
| 36 |
import javax.sound.sampled.Line; |
|
| 37 |
|
|
| 38 |
import org.eclipse.core.commands.ExecutionEvent; |
|
| 39 |
import org.eclipse.core.commands.ExecutionException; |
|
| 40 |
import org.eclipse.e4.ui.workbench.modeling.EModelService; |
|
| 41 |
import org.eclipse.jface.viewers.ISelection; |
|
| 42 |
import org.eclipse.jface.viewers.IStructuredSelection; |
|
| 43 |
import org.eclipse.osgi.util.NLS; |
|
| 44 |
import org.eclipse.ui.IEditorPart; |
|
| 45 |
import org.eclipse.ui.IWorkbenchPage; |
|
| 46 |
import org.eclipse.ui.IWorkbenchWindow; |
|
| 47 |
import org.eclipse.ui.handlers.HandlerUtil; |
|
| 48 |
import org.txm.concordance.core.functions.Concordance; |
|
| 49 |
import org.txm.concordance.rcp.editors.ConcordanceEditor; |
|
| 50 |
import org.txm.concordance.rcp.handlers.BackToTextCommand; |
|
| 51 |
import org.txm.objects.Text; |
|
| 52 |
import org.txm.rcp.StatusLine; |
|
| 53 |
import org.txm.rcp.utils.SWTEditorsUtils; |
|
| 54 |
import org.txm.searchengine.cqp.AbstractCqiClient; |
|
| 55 |
import org.txm.searchengine.cqp.CQPEngine; |
|
| 56 |
import org.txm.searchengine.cqp.corpus.Corpus; |
|
| 57 |
import org.txm.searchengine.cqp.corpus.Property; |
|
| 58 |
import org.txm.searchengine.cqp.corpus.StructuralUnit; |
|
| 59 |
import org.txm.searchengine.cqp.corpus.query.Match; |
|
| 60 |
import org.txm.synopticedition.rcp.editors.SynopticEditionEditor; |
|
| 61 |
import org.txm.synopticedition.rcp.editors.EditionPanel.RGBA; |
|
| 62 |
import org.txm.synopticedition.rcp.messages.SynopticEditionUIMessages; |
|
| 63 |
import org.txm.utils.logger.Log; |
|
| 64 |
|
|
| 65 |
import cern.colt.Arrays; |
|
| 66 |
|
|
| 67 |
/** |
|
| 68 |
* Open a text edition from: a concordance Line |
|
| 69 |
* @author mdecorde. |
|
| 70 |
*/ |
|
| 71 |
public class BackToText extends BackToTextCommand {
|
|
| 72 |
|
|
| 73 |
/** The Constant ID. */ |
|
| 74 |
public final static String ID = "org.txm.synopticedition.rcp.handlers.BackToText"; //$NON-NLS-1$ |
|
| 75 |
public final static RGBA lightred = new RGBA(249,208,208); |
|
| 76 |
public final static RGBA red = new RGBA(249, 160, 160); |
|
| 77 |
//TODO: this kind of link associations must be transfered to a TXMEditor class |
|
| 78 |
private static HashMap<ConcordanceEditor, SynopticEditionEditor> associatedEditors = new HashMap<ConcordanceEditor, SynopticEditionEditor>(); |
|
| 79 |
private static HashMap<ConcordanceEditor, List<String>> associatedEditorsPreviousOtherWordIDs = new HashMap<ConcordanceEditor, List<String>>(); |
|
| 80 |
private static HashMap<ConcordanceEditor, List<String>> associatedEditorsPreviousLineids = new HashMap<ConcordanceEditor, List<String>>(); |
|
| 81 |
|
|
| 82 |
/* (non-Javadoc) |
|
| 83 |
* @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent) |
|
| 84 |
*/ |
|
| 85 |
@Override |
|
| 86 |
public Object execute(ExecutionEvent event) throws ExecutionException {
|
|
| 87 |
IWorkbenchWindow wb = HandlerUtil.getActiveWorkbenchWindow(event); |
|
| 88 |
IEditorPart ieditor = wb.getActivePage().getActiveEditor(); |
|
| 89 |
if (!(ieditor instanceof ConcordanceEditor)) {
|
|
| 90 |
return null; |
|
| 91 |
} |
|
| 92 |
ConcordanceEditor concordanceEditor = (ConcordanceEditor)ieditor; |
|
| 93 |
ISelection sel = wb.getSelectionService().getSelection(); |
|
| 94 |
if (sel instanceof IStructuredSelection) {
|
|
| 95 |
IStructuredSelection selection = (IStructuredSelection) sel; |
|
| 96 |
if (selection.getFirstElement() instanceof Match) {
|
|
| 97 |
backToText(concordanceEditor, (Match)(selection.getFirstElement())); |
|
| 98 |
} else {
|
|
| 99 |
System.out.println(SynopticEditionUIMessages.BackToText_1+selection); |
|
| 100 |
} |
|
| 101 |
} else {
|
|
| 102 |
System.out.println(SynopticEditionUIMessages.BackToText_2); |
|
| 103 |
} |
|
| 104 |
return null; |
|
| 105 |
} |
|
| 106 |
|
|
| 107 |
/** |
|
| 108 |
* Open edition. |
|
| 109 |
* |
|
| 110 |
* @param corpus the corpus |
|
| 111 |
* @return the object |
|
| 112 |
*/ |
|
| 113 |
@Override |
|
| 114 |
public boolean backToText(ConcordanceEditor editor, Match match) {
|
|
| 115 |
Concordance conc = editor.getConcordance(); |
|
| 116 |
Corpus corpus = editor.getCorpus(); |
|
| 117 |
|
|
| 118 |
try {
|
|
| 119 |
if (match == null) return false; |
|
| 120 |
|
|
| 121 |
StructuralUnit textS = null; |
|
| 122 |
String textid = ""; //$NON-NLS-1$ |
|
| 123 |
String baseid = ""; //$NON-NLS-1$ |
|
| 124 |
|
|
| 125 |
Property xProperty = corpus.getProperty("x"), yProperty, wProperty, hProperty;
|
|
| 126 |
String x="0",y="0",w="0",h="0"; |
|
| 127 |
int[] pos = null; |
|
| 128 |
if (xProperty != null) {
|
|
| 129 |
yProperty = corpus.getProperty("y");
|
|
| 130 |
if (yProperty != null) {
|
|
| 131 |
wProperty = corpus.getProperty("w");
|
|
| 132 |
if (wProperty != null) {
|
|
| 133 |
AbstractCqiClient CQI = CQPEngine.getCqiClient(); |
|
| 134 |
int[] cpos = {match.getStart()};
|
|
| 135 |
hProperty = corpus.getProperty("h");
|
|
| 136 |
if (hProperty != null) {
|
|
| 137 |
x = CQI.cpos2Str(xProperty.getQualifiedName(), cpos)[0]; |
|
| 138 |
y = CQI.cpos2Str(yProperty.getQualifiedName(), cpos)[0]; |
|
| 139 |
w = CQI.cpos2Str(wProperty.getQualifiedName(), cpos)[0]; |
|
| 140 |
h = CQI.cpos2Str(hProperty.getQualifiedName(), cpos)[0]; |
|
| 141 |
|
|
| 142 |
pos = new int[4]; |
|
| 143 |
pos[0] = Integer.parseInt(x); |
|
| 144 |
pos[1] = Integer.parseInt(y); |
|
| 145 |
pos[2] = Integer.parseInt(w); |
|
| 146 |
pos[3] = Integer.parseInt(h); |
|
| 147 |
} |
|
| 148 |
} |
|
| 149 |
} |
|
| 150 |
} |
|
| 151 |
|
|
| 152 |
|
|
| 153 |
String projectid = ""; //$NON-NLS-1$ |
|
| 154 |
try {
|
|
| 155 |
textS = corpus.getStructuralUnit("text"); //$NON-NLS-1$
|
|
| 156 |
Property textP = textS.getProperty("id"); //$NON-NLS-1$
|
|
| 157 |
textid = match.getValueForProperty(textP);// get text via text struct property id |
|
| 158 |
} catch (Exception e2) {
|
|
| 159 |
System.out.println("The corpus has no text_id property" + e2); //$NON-NLS-1$
|
|
| 160 |
org.txm.rcp.utils.Logger.printStackTrace(e2); |
|
| 161 |
return false; |
|
| 162 |
} |
|
| 163 |
|
|
| 164 |
Log.info("Loading line informations..."); //$NON-NLS-1$
|
|
| 165 |
|
|
| 166 |
SynopticEditionEditor attachedBrowserEditor = associatedEditors.get(editor); |
|
| 167 |
if (attachedBrowserEditor!= null && attachedBrowserEditor.isDisposed()) {
|
|
| 168 |
associatedEditorsPreviousOtherWordIDs.put(editor, new ArrayList<String>()); |
|
| 169 |
associatedEditorsPreviousLineids.put(editor, new ArrayList<String>()); |
|
| 170 |
} |
|
| 171 |
List<String> previousOtherWordIDs = associatedEditorsPreviousOtherWordIDs.get(editor); |
|
| 172 |
List<String> previousLineids = associatedEditorsPreviousLineids.get(editor); |
|
| 173 |
|
|
| 174 |
if (attachedBrowserEditor == null || attachedBrowserEditor.isDisposed()) {
|
|
| 175 |
String[] editionsToOpen = OpenEdition.getDefaultEditions(corpus); |
|
| 176 |
|
|
| 177 |
if (editionsToOpen.length == 0) { // the defaultEdition parameter is not set
|
|
| 178 |
ArrayList<String> editionNames = corpus.getEditionNames(); |
|
| 179 |
if (editionNames.size() > 0) { // use the first edition declared
|
|
| 180 |
editionsToOpen = new String[1]; |
|
| 181 |
editionsToOpen[0] = editionNames.get(0); |
|
| 182 |
Log.info(SynopticEditionUIMessages.BackToText_0+editionNames.get(0)); |
|
| 183 |
} else { // no edition in the corpus
|
|
| 184 |
Log.info(SynopticEditionUIMessages.BackToText_4); |
|
| 185 |
editionsToOpen = new String[0]; |
|
| 186 |
return false; |
|
| 187 |
} |
|
| 188 |
} else {
|
|
| 189 |
Log.info(SynopticEditionUIMessages.BackToText_5+Arrays.toString(editionsToOpen)); |
|
| 190 |
} |
|
| 191 |
|
|
| 192 |
attachedBrowserEditor = OpenEdition.openEdition(corpus, editionsToOpen); |
|
| 193 |
associatedEditors.put(editor, attachedBrowserEditor); |
|
| 194 |
SWTEditorsUtils.addEditor(editor, attachedBrowserEditor, EModelService.ABOVE); |
|
| 195 |
} |
|
| 196 |
|
|
| 197 |
// remove previous highlighted words |
|
| 198 |
if (previousOtherWordIDs != null) {
|
|
| 199 |
//System.out.println("remove previousOtherWordIDs="+previousOtherWordIDs);
|
|
| 200 |
attachedBrowserEditor.removeHighlightWordsById(lightred, previousOtherWordIDs); |
|
| 201 |
associatedEditorsPreviousOtherWordIDs.remove(editor); // free mem |
|
| 202 |
} |
|
| 203 |
if (previousLineids != null) {
|
|
| 204 |
//System.out.println("remove previousLineids="+previousLineids);
|
|
| 205 |
attachedBrowserEditor.removeHighlightWordsById(red, previousLineids); |
|
| 206 |
associatedEditorsPreviousLineids.remove(editor); // free mem |
|
| 207 |
} |
|
| 208 |
|
|
| 209 |
//System.out.println("getKeywordsId from "+editor.getTopLine()+" to "+editor.getBottomLine() + 1);
|
|
| 210 |
List<String> otherWordIDs = conc.getKeywordsId(textid, editor.getTopLine(), editor.getBottomLine() + 1); |
|
| 211 |
//System.out.println("getKeywordsId="+otherWordIDs);
|
|
| 212 |
List<String> lineids = null; |
|
| 213 |
try {
|
|
| 214 |
lineids = match.getValuesForProperty(corpus.getProperty("id")); //$NON-NLS-1$
|
|
| 215 |
} catch (Exception e1) {
|
|
| 216 |
org.txm.rcp.utils.Logger.printStackTrace(e1); |
|
| 217 |
return false; |
|
| 218 |
} |
|
| 219 |
Log.info(NLS.bind("Project id {0} Corpus (Base) id {1} Text id {2}", //$NON-NLS-1$
|
|
| 220 |
new Object[]{projectid, baseid, textid}));
|
|
| 221 |
|
|
| 222 |
otherWordIDs.removeAll(lineids); // remove the pivot from others words |
|
| 223 |
|
|
| 224 |
Text text = corpus.getMainCorpus().getText(textid); |
|
| 225 |
if (text == null) {
|
|
| 226 |
System.out.println(NLS.bind("BackToText: Text {0} is missing", textid)); //$NON-NLS-1$
|
|
| 227 |
StatusLine.setMessage(NLS.bind("BackToText: Text {0} is missing", textid)); //$NON-NLS-1$
|
|
| 228 |
Log.severe(NLS.bind("BackToText: Text {0} is missing", textid)); //$NON-NLS-1$
|
|
| 229 |
return false; |
|
| 230 |
} |
|
| 231 |
|
|
| 232 |
String line_wordid = lineids.get(0); |
|
| 233 |
if (line_wordid == null) {
|
|
| 234 |
System.out.println(SynopticEditionUIMessages.BackToText_3); |
|
| 235 |
return false; |
|
| 236 |
} |
|
| 237 |
|
|
| 238 |
|
|
| 239 |
String focusid = null; |
|
| 240 |
if (lineids.size() > 0) focusid = lineids.get(0); |
|
| 241 |
|
|
| 242 |
//System.out.println("add otherWordIDs="+otherWordIDs);
|
|
| 243 |
attachedBrowserEditor.addHighlightWordsById(lightred, otherWordIDs); |
|
| 244 |
|
|
| 245 |
//System.out.println("add linesids="+lineids);
|
|
| 246 |
attachedBrowserEditor.addHighlightWordsById(red, lineids); |
|
| 247 |
|
|
| 248 |
associatedEditorsPreviousOtherWordIDs.put(editor, otherWordIDs); |
|
| 249 |
associatedEditorsPreviousLineids.put(editor, lineids); |
|
| 250 |
|
|
| 251 |
HashSet<int[]> posses = new HashSet<int[]>(); |
|
| 252 |
posses.add(pos); |
|
| 253 |
attachedBrowserEditor.setHighlightedArea(posses); |
|
| 254 |
|
|
| 255 |
attachedBrowserEditor.setFocusedWordID(focusid); |
|
| 256 |
|
|
| 257 |
// reload the page and styles |
|
| 258 |
attachedBrowserEditor.backToText(text, line_wordid);// open the page(S) containing the word with id=line_wordid |
|
| 259 |
|
|
| 260 |
IWorkbenchPage attachedPage = attachedBrowserEditor.getEditorSite().getPage(); |
|
| 261 |
attachedPage.activate(attachedBrowserEditor); |
|
| 262 |
|
|
| 263 |
return true; |
|
| 264 |
|
|
| 265 |
} catch (Exception err) {
|
|
| 266 |
Log.severe(NLS.bind("Full text display failed: {0}", err)); //$NON-NLS-1$
|
|
| 267 |
Log.printStackTrace(err); |
|
| 268 |
} |
|
| 269 |
return false; |
|
| 270 |
} |
|
| 271 |
} |
|
| 0 | 272 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/handlers/OpenEdition.java (revision 653) | ||
|---|---|---|
| 1 |
// Copyright © 2010-2013 ENS de Lyon. |
|
| 2 |
// Copyright © 2007-2010 ENS de Lyon, CNRS, INRP, University of |
|
| 3 |
// Lyon 2, University of Franche-Comté, University of Nice |
|
| 4 |
// Sophia Antipolis, University of Paris 3. |
|
| 5 |
// |
|
| 6 |
// The TXM platform is free software: you can redistribute it |
|
| 7 |
// and/or modify it under the terms of the GNU General Public |
|
| 8 |
// License as published by the Free Software Foundation, |
|
| 9 |
// either version 2 of the License, or (at your option) any |
|
| 10 |
// later version. |
|
| 11 |
// |
|
| 12 |
// The TXM platform is distributed in the hope that it will be |
|
| 13 |
// useful, but WITHOUT ANY WARRANTY; without even the implied |
|
| 14 |
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
|
| 15 |
// PURPOSE. See the GNU General Public License for more |
|
| 16 |
// details. |
|
| 17 |
// |
|
| 18 |
// You should have received a copy of the GNU General |
|
| 19 |
// Public License along with the TXM platform. If not, see |
|
| 20 |
// http://www.gnu.org/licenses. |
|
| 21 |
// |
|
| 22 |
// |
|
| 23 |
// |
|
| 24 |
// $LastChangedDate:$ |
|
| 25 |
// $LastChangedRevision:$ |
|
| 26 |
// $LastChangedBy:$ |
|
| 27 |
// |
|
| 28 |
package org.txm.synopticedition.rcp.handlers; |
|
| 29 |
|
|
| 30 |
import java.util.ArrayList; |
|
| 31 |
import java.util.List; |
|
| 32 |
|
|
| 33 |
import org.eclipse.core.commands.AbstractHandler; |
|
| 34 |
import org.eclipse.core.commands.ExecutionEvent; |
|
| 35 |
import org.eclipse.core.commands.ExecutionException; |
|
| 36 |
import org.eclipse.jface.viewers.IStructuredSelection; |
|
| 37 |
import org.eclipse.jface.window.Window; |
|
| 38 |
import org.eclipse.swt.widgets.Shell; |
|
| 39 |
import org.eclipse.ui.IWorkbenchPage; |
|
| 40 |
import org.eclipse.ui.IWorkbenchWindow; |
|
| 41 |
import org.eclipse.ui.PlatformUI; |
|
| 42 |
import org.eclipse.ui.handlers.HandlerUtil; |
|
| 43 |
import org.txm.objects.BaseParameters; |
|
| 44 |
import org.txm.objects.Text; |
|
| 45 |
import org.txm.rcp.RCPMessages; |
|
| 46 |
import org.txm.searchengine.cqp.corpus.Corpus; |
|
| 47 |
import org.txm.searchengine.cqp.corpus.MainCorpus; |
|
| 48 |
import org.txm.searchengine.cqp.corpus.Property; |
|
| 49 |
import org.txm.searchengine.cqp.corpus.StructuralUnit; |
|
| 50 |
import org.txm.searchengine.cqp.corpus.Subcorpus; |
|
| 51 |
import org.txm.searchengine.cqp.corpus.query.Match; |
|
| 52 |
import org.txm.synopticedition.rcp.editors.EditionSelectorDialog; |
|
| 53 |
import org.txm.synopticedition.rcp.editors.SynopticEditionEditor; |
|
| 54 |
import org.txm.synopticedition.rcp.editors.SynopticEditorInput; |
|
| 55 |
import org.txm.synopticedition.rcp.messages.SynopticEditionUIMessages; |
|
| 56 |
import org.txm.utils.logger.Log; |
|
| 57 |
import org.w3c.dom.Element; |
|
| 58 |
import org.w3c.dom.NodeList; |
|
| 59 |
|
|
| 60 |
import cern.colt.Arrays; |
|
| 61 |
// TODO: Auto-generated Javadoc |
|
| 62 |
/** |
|
| 63 |
* Open a text edition from: a main corpus : the first text of the maincorpus a |
|
| 64 |
* sub-corpus : the first text of the subcorpus a partition : the user must |
|
| 65 |
* choose one of the text used in the partition @ author mdecorde. |
|
| 66 |
*/ |
|
| 67 |
public class OpenEdition extends AbstractHandler {
|
|
| 68 |
|
|
| 69 |
/** The Constant ID. */ |
|
| 70 |
public final static String ID = "org.txm.synopticedition.rcp.handlers.OpenEdition"; //$NON-NLS-1$ |
|
| 71 |
|
|
| 72 |
/** The lastopenedfile. */ |
|
| 73 |
public static String lastopenedfile; |
|
| 74 |
|
|
| 75 |
/* (non-Javadoc) |
|
| 76 |
* @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent) |
|
| 77 |
*/ |
|
| 78 |
@Override |
|
| 79 |
public Object execute(ExecutionEvent event) throws ExecutionException {
|
|
| 80 |
|
|
| 81 |
IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelection(event); |
|
| 82 |
if (selection.getFirstElement() instanceof Corpus) {
|
|
| 83 |
try {
|
|
| 84 |
Corpus c = (Corpus) selection.getFirstElement(); |
|
| 85 |
Shell shell = HandlerUtil.getActiveWorkbenchWindowChecked(event).getShell(); |
|
| 86 |
|
|
| 87 |
EditionSelectorDialog d = new EditionSelectorDialog(shell, c, null); |
|
| 88 |
SynopticEditionEditor editor = null; |
|
| 89 |
// if (c.getEditionNames().size() > 1 && d.open() == Window.OK) {
|
|
| 90 |
// Object[] rez = d.getResult(); |
|
| 91 |
// String[] rezS = new String[rez.length]; |
|
| 92 |
// for (int i =0 ; i < rez.length ; i++) rezS[i] = rez[i].toString(); |
|
| 93 |
// editor = openEdition(c, rezS); |
|
| 94 |
// } else |
|
| 95 |
String[] editionsToOpen = getDefaultEditions(c); |
|
| 96 |
|
|
| 97 |
if (editionsToOpen.length == 0) { // the defaultEdition parameter is not set
|
|
| 98 |
ArrayList<String> editionNames = c.getEditionNames(); |
|
| 99 |
if (editionNames.size() > 0) { // use the first edition declared
|
|
| 100 |
editionsToOpen = new String[1]; |
|
| 101 |
editionsToOpen[0] = editionNames.get(0); |
|
| 102 |
Log.info(SynopticEditionUIMessages.OpenEdition_0+editionNames.get(0)); |
|
| 103 |
} else { // no edition in the corpus
|
|
| 104 |
Log.info(SynopticEditionUIMessages.OpenEdition_1); |
|
| 105 |
editionsToOpen = new String[0]; |
|
| 106 |
return false; |
|
| 107 |
} |
|
| 108 |
} else {
|
|
| 109 |
Log.info(SynopticEditionUIMessages.OpenEdition_3+Arrays.toString(editionsToOpen)); |
|
| 110 |
} |
|
| 111 |
|
|
| 112 |
editor = openEdition(c, editionsToOpen); |
|
| 113 |
|
|
| 114 |
if (editor != null) |
|
| 115 |
editor.firstPage(); |
|
| 116 |
|
|
| 117 |
} catch (Exception e) {
|
|
| 118 |
System.out.println(SynopticEditionUIMessages.OpenEdition_4+e); |
|
| 119 |
org.txm.rcp.utils.Logger.printStackTrace(e); |
|
| 120 |
} |
|
| 121 |
} else {
|
|
| 122 |
System.out.println(SynopticEditionUIMessages.OpenEdition_9); |
|
| 123 |
} |
|
| 124 |
return null; |
|
| 125 |
} |
|
| 126 |
public static String[] getDefaultEditions(Corpus c) {
|
|
| 127 |
BaseParameters params = c.getBase().getBaseParameters(); |
|
| 128 |
Element editionsElement = params.getEditionsElement(params.getCorpusElement()); |
|
| 129 |
return editionsElement.getAttribute("default").split(","); //$NON-NLS-1$ //$NON-NLS-2$
|
|
| 130 |
} |
|
| 131 |
|
|
| 132 |
/** |
|
| 133 |
* Open edition, but don't show a page |
|
| 134 |
* |
|
| 135 |
* @param corpus the corpus |
|
| 136 |
* @return the object |
|
| 137 |
*/ |
|
| 138 |
public static SynopticEditionEditor openEdition(Corpus corpus, String[] editions) {
|
|
| 139 |
String textid = null; |
|
| 140 |
|
|
| 141 |
System.out.println("Opening edition of "+corpus); //$NON-NLS-1$
|
|
| 142 |
try {
|
|
| 143 |
Text text = null; |
|
| 144 |
if (corpus instanceof Subcorpus) {
|
|
| 145 |
Subcorpus sub = (Subcorpus)corpus; |
|
| 146 |
List<Match> matches = sub.getMatches(); |
|
| 147 |
if (matches.size() > 0) {
|
|
| 148 |
StructuralUnit text_su = corpus.getStructuralUnit("text"); //$NON-NLS-1$
|
|
| 149 |
Property text_id = text_su.getProperty("id"); //$NON-NLS-1$
|
|
| 150 |
|
|
| 151 |
textid = matches.get(0).getValueForProperty(text_id); |
|
| 152 |
if (textid != null) text = corpus.getMainCorpus().getText(textid); |
|
| 153 |
} |
|
| 154 |
} |
|
| 155 |
// QueryResult result = corpus.query(new Query("<text> []"), "get_edition", false); //$NON-NLS-1$ //$NON-NLS-2$
|
|
| 156 |
// StructuralUnit text_su = corpus.getStructuralUnit("text"); //$NON-NLS-1$
|
|
| 157 |
// Property text_id = text_su.getProperty("id"); //$NON-NLS-1$
|
|
| 158 |
|
|
| 159 |
// if (result.getNMatch() > 0) textid = result.getMatches(0, 1).get(0).getValueForProperty(text_id); |
|
| 160 |
MainCorpus maincorpus = corpus.getMainCorpus(); |
|
| 161 |
|
|
| 162 |
// if (textid != null) text = maincorpus.getText(textid); |
|
| 163 |
|
|
| 164 |
if (text == null) {
|
|
| 165 |
text = maincorpus.getFirstText(); |
|
| 166 |
|
|
| 167 |
if (text == null) {
|
|
| 168 |
System.out.println("** Could not find first text of ID "+textid+SynopticEditionUIMessages.OpenEdition_7); //$NON-NLS-1$ //$NON-NLS-1$
|
|
| 169 |
return null; |
|
| 170 |
} |
|
| 171 |
|
|
| 172 |
textid = text.getName(); |
|
| 173 |
} |
|
| 174 |
|
|
| 175 |
//String[] editions = {maincorpus.getDefaultEdition()};
|
|
| 176 |
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
|
| 177 |
IWorkbenchPage page = window.getActivePage(); |
|
| 178 |
|
|
| 179 |
SynopticEditorInput editorInput = new SynopticEditorInput(corpus, text.getName(), editions); |
|
| 180 |
SynopticEditionEditor editor = (SynopticEditionEditor) page.openEditor(editorInput, |
|
| 181 |
SynopticEditionEditor.ID, true); |
|
| 182 |
|
|
| 183 |
return editor; |
|
| 184 |
|
|
| 185 |
} catch (Exception e) {
|
|
| 186 |
Log.printStackTrace(e); |
|
| 187 |
System.out.println(SynopticEditionUIMessages.OpenEdition_10+e); |
|
| 188 |
return null; |
|
| 189 |
} |
|
| 190 |
} |
|
| 191 |
} |
|
| 0 | 192 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/preferences/SynopticEditionPreferencePage.java (revision 653) | ||
|---|---|---|
| 1 |
package org.txm.synopticedition.rcp.preferences; |
|
| 2 |
|
|
| 3 |
import org.eclipse.jface.preference.BooleanFieldEditor; |
|
| 4 |
import org.eclipse.jface.preference.FieldEditorPreferencePage; |
|
| 5 |
import org.eclipse.ui.IWorkbench; |
|
| 6 |
import org.eclipse.ui.IWorkbenchPreferencePage; |
|
| 7 |
import org.eclipse.ui.preferences.ScopedPreferenceStore; |
|
| 8 |
import org.txm.rcp.Application; |
|
| 9 |
|
|
| 10 |
public class SynopticEditionPreferencePage extends FieldEditorPreferencePage |
|
| 11 |
implements IWorkbenchPreferencePage {
|
|
| 12 |
ScopedPreferenceStore preferences; |
|
| 13 |
|
|
| 14 |
private BooleanFieldEditor slow_highlight; |
|
| 15 |
|
|
| 16 |
|
|
| 17 |
public SynopticEditionPreferencePage() {
|
|
| 18 |
super(); |
|
| 19 |
preferences = new ScopedPreferenceStore(org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE, |
|
| 20 |
Application.PLUGIN_ID); |
|
| 21 |
setPreferenceStore(preferences); |
|
| 22 |
setTitle("Analec");
|
|
| 23 |
} |
|
| 24 |
|
|
| 25 |
@Override |
|
| 26 |
public void init(IWorkbench workbench) { }
|
|
| 27 |
|
|
| 28 |
@Override |
|
| 29 |
protected void createFieldEditors() {
|
|
| 30 |
slow_highlight = new BooleanFieldEditor(SynopticEditionPreferences.FAST_HIGHLIGHT, |
|
| 31 |
"Enable fast word highlight", getFieldEditorParent()); |
|
| 32 |
addField(slow_highlight); |
|
| 33 |
} |
|
| 34 |
} |
|
| 0 | 35 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/preferences/SynopticEditionPreferences.java (revision 653) | ||
|---|---|---|
| 1 |
package org.txm.synopticedition.rcp.preferences; |
|
| 2 |
|
|
| 3 |
import org.eclipse.core.runtime.preferences.DefaultScope; |
|
| 4 |
import org.osgi.service.prefs.Preferences; |
|
| 5 |
import org.txm.core.preferences.TXMPreferences; |
|
| 6 |
|
|
| 7 |
public class SynopticEditionPreferences extends TXMPreferences {
|
|
| 8 |
|
|
| 9 |
public static String PREFERENCES_NODE = "org.txm.synopticedition.rcp.synoptic"; |
|
| 10 |
|
|
| 11 |
public static String FAST_HIGHLIGHT = "org.txm.synopticedition.rcp.synoptic.slow_highlight"; |
|
| 12 |
|
|
| 13 |
@Override |
|
| 14 |
public void initializeDefaultPreferences() {
|
|
| 15 |
Preferences preferences = DefaultScope.INSTANCE.getNode(PREFERENCES_NODE); |
|
| 16 |
preferences.putBoolean(FAST_HIGHLIGHT, false); |
|
| 17 |
} |
|
| 18 |
} |
|
| 0 | 19 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/messages/messages.properties (revision 653) | ||
|---|---|---|
| 1 |
BackToText_0=Opening with first edition (no default edition set): |
|
| 2 |
BackToText_1=Aborting: selection is not a concordance line: |
|
| 3 |
BackToText_2=Aborting: error during selection. |
|
| 4 |
BackToText_3=Error: could not retrieve line word ids. Aborting back to text. |
|
| 5 |
BackToText_4=No edition to open. |
|
| 6 |
BackToText_5=Opening default editions: |
|
| 7 |
EditionPanel_0=No edition found for text= |
|
| 8 |
EditionPanel_1=Fail to retrieve first page of edition |
|
| 9 |
EditionPanel_2=\ and text |
|
| 10 |
EditionPanel_5=\ edition= |
|
| 11 |
EditionPanel_6=No edition with name |
|
| 12 |
EditionPanel_7=\ available for text |
|
| 13 |
EditionSelectorDialog_0=Editions |
|
| 14 |
EditionSelectorDialog_1=Select one or more editions |
|
| 15 |
OpenEdition_0=Opening with first edition (no default edition set): |
|
| 16 |
OpenEdition_1=No edition to open. |
|
| 17 |
OpenEdition_10=Error while opening editor: |
|
| 18 |
OpenEdition_2=No edition found |
|
| 19 |
OpenEdition_3=Opening default editions: |
|
| 20 |
OpenEdition_4=Error while opening edition: |
|
| 21 |
OpenEdition_7=\ in the corpus |
|
| 22 |
OpenEdition_9=Aborting: selection is not a corpus |
|
| 23 |
SynopticEditionEditor_0=First text of the corpus |
|
| 24 |
SynopticEditionEditor_1=Previous text |
|
| 25 |
SynopticEditionEditor_10=Next text |
|
| 26 |
SynopticEditionEditor_11=Last text of the corpus |
|
| 27 |
SynopticEditionEditor_2=Editions... |
|
| 28 |
SynopticEditionEditor_3=First page of the text |
|
| 29 |
SynopticEditionEditor_4=Previous page |
|
| 30 |
SynopticEditionEditor_5=No edition found |
|
| 31 |
SynopticEditionEditor_6=Error while getting available editions: |
|
| 32 |
SynopticEditionEditor_7=Next page |
|
| 33 |
SynopticEditionEditor_8=Last page of the text |
|
| 34 |
SynopticEditionEditor_9=Warning: could not find edition for name: |
|
| 0 | 35 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/messages/messages_fr.properties (revision 653) | ||
|---|---|---|
| 1 |
BackToText_0=Ouverture avec la premi?re ?dition (pas de d?faut) : |
|
| 2 |
BackToText_1=Abandon : la s?lection courante n''est pas une ligne de concordance : |
|
| 3 |
BackToText_2=Abandon : erreur de s?lection |
|
| 4 |
BackToText_3=Abandon : erreur pendant la r?cup?ration des identifiants de mot. |
|
| 5 |
BackToText_4=Pas d'?dition disponible. |
|
| 6 |
BackToText_5=Ouverture de l'?dition par d?faut : |
|
| 7 |
EditionPanel_0=Pas d''?dition trouv?e pour le texte : |
|
| 8 |
EditionPanel_1=?chec de la r?cup?ration de la premi?re page d'?dition |
|
| 9 |
EditionPanel_2=\ pour le texte |
|
| 10 |
EditionPanel_5=\ ?dition= |
|
| 11 |
EditionPanel_6=Pas d''?dition nomm?e |
|
| 12 |
EditionPanel_7=\ disponible pour le texte |
|
| 13 |
EditionSelectorDialog_0=?ditions |
|
| 14 |
EditionSelectorDialog_1=S?lectionner une ou plusieurs ?ditions. |
|
| 15 |
OpenEdition_0=Ouverture avec la premi?re ?dition (pas de d?faut) : |
|
| 16 |
OpenEdition_1=Pas d'?dition disponible. |
|
| 17 |
OpenEdition_10=Erreur lors de l''ouverture de l''?diteur : |
|
| 18 |
OpenEdition_2=Pas d''?dition trouv?e |
|
| 19 |
OpenEdition_3=Ouverture de l'?dition par d?faut : |
|
| 20 |
OpenEdition_4=Erreur lors de l''ouverture de l''?dition : |
|
| 21 |
OpenEdition_7=\ dans le corpus |
|
| 22 |
OpenEdition_9=Abandon : la s?lection n''est pas un corpus |
|
| 23 |
SynopticEditionEditor_0=Premier texte du corpus |
|
| 24 |
SynopticEditionEditor_1=Texte pr?c?dent |
|
| 25 |
SynopticEditionEditor_10=Texte suivant |
|
| 26 |
SynopticEditionEditor_11=Dernier texte du corpus |
|
| 27 |
SynopticEditionEditor_2=?ditions... |
|
| 28 |
SynopticEditionEditor_3=Premi?re page du texte |
|
| 29 |
SynopticEditionEditor_4=Page pr?c?dente |
|
| 30 |
SynopticEditionEditor_5=Pas d''?dition trouv?e |
|
| 31 |
SynopticEditionEditor_6=Erreur lors de la r?cup?ration des ?ditions disponibles : |
|
| 32 |
SynopticEditionEditor_7=Page suivante |
|
| 33 |
SynopticEditionEditor_8=Derni?re page du texte |
|
| 34 |
SynopticEditionEditor_9=Attention: ?chec de la r?cup?ration de l''?dition |
|
| 0 | 35 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/messages/SynopticEditionUIMessages.java (revision 653) | ||
|---|---|---|
| 1 |
package org.txm.synopticedition.rcp.messages; |
|
| 2 |
|
|
| 3 |
import org.eclipse.osgi.util.NLS; |
|
| 4 |
import org.txm.utils.messages.Utf8NLS; |
|
| 5 |
|
|
| 6 |
public class SynopticEditionUIMessages extends NLS {
|
|
| 7 |
|
|
| 8 |
private static final String BUNDLE_NAME = "org.txm.synopticedition.rcp.messages.messages"; //$NON-NLS-1$ |
|
| 9 |
|
|
| 10 |
public static String BackToText_0; |
|
| 11 |
public static String BackToText_1; |
|
| 12 |
public static String BackToText_2; |
|
| 13 |
public static String BackToText_3; |
|
| 14 |
public static String BackToText_4; |
|
| 15 |
public static String BackToText_5; |
|
| 16 |
public static String EditionPanel_0; |
|
| 17 |
public static String EditionPanel_1; |
|
| 18 |
public static String EditionPanel_2; |
|
| 19 |
public static String EditionPanel_5; |
|
| 20 |
public static String EditionPanel_6; |
|
| 21 |
public static String EditionPanel_7; |
|
| 22 |
public static String EditionSelectorDialog_0; |
|
| 23 |
public static String EditionSelectorDialog_1; |
|
| 24 |
public static String OpenEdition_0; |
|
| 25 |
public static String OpenEdition_1; |
|
| 26 |
public static String OpenEdition_10; |
|
| 27 |
public static String OpenEdition_2; |
|
| 28 |
public static String OpenEdition_3; |
|
| 29 |
public static String OpenEdition_4; |
|
| 30 |
public static String OpenEdition_7; |
|
| 31 |
public static String OpenEdition_9; |
|
| 32 |
public static String SynopticEditionEditor_0; |
|
| 33 |
public static String SynopticEditionEditor_1; |
|
| 34 |
public static String SynopticEditionEditor_10; |
|
| 35 |
public static String SynopticEditionEditor_11; |
|
| 36 |
public static String SynopticEditionEditor_2; |
|
| 37 |
public static String SynopticEditionEditor_3; |
|
| 38 |
public static String SynopticEditionEditor_4; |
|
| 39 |
public static String SynopticEditionEditor_5; |
|
| 40 |
public static String SynopticEditionEditor_6; |
|
| 41 |
public static String SynopticEditionEditor_7; |
|
| 42 |
public static String SynopticEditionEditor_8; |
|
| 43 |
public static String SynopticEditionEditor_9; |
|
| 44 |
|
|
| 45 |
|
|
| 46 |
static {
|
|
| 47 |
// initialize resource bundle |
|
| 48 |
Utf8NLS.initializeMessages(BUNDLE_NAME, SynopticEditionUIMessages.class); |
|
| 49 |
} |
|
| 50 |
|
|
| 51 |
private SynopticEditionUIMessages() {
|
|
| 52 |
} |
|
| 53 |
} |
|
| 0 | 54 | |
| tmp/org.txm.synopticeditor.rcp/src/org/txm/synopticedition/rcp/editors/EditionPanel.java (revision 653) | ||
|---|---|---|
| 1 |
package org.txm.synopticedition.rcp.editors; |
|
| 2 |
|
|
| 3 |
import java.io.File; |
|
| 4 |
import java.net.URL; |
|
| 5 |
import java.util.ArrayList; |
|
| 6 |
import java.util.Arrays; |
|
| 7 |
import java.util.Collection; |
|
| 8 |
import java.util.HashMap; |
|
| 9 |
import java.util.HashSet; |
|
| 10 |
import java.util.List; |
|
| 11 |
import java.util.Set; |
|
| 12 |
import java.util.logging.Level; |
|
| 13 |
|
|
| 14 |
import org.eclipse.core.commands.Command; |
|
| 15 |
import org.eclipse.core.commands.ExecutionException; |
|
| 16 |
import org.eclipse.core.commands.IParameter; |
|
| 17 |
import org.eclipse.core.commands.NotEnabledException; |
|
| 18 |
import org.eclipse.core.commands.NotHandledException; |
|
| 19 |
import org.eclipse.core.commands.Parameterization; |
|
| 20 |
import org.eclipse.core.commands.ParameterizedCommand; |
|
| 21 |
import org.eclipse.core.commands.common.NotDefinedException; |
|
| 22 |
import org.eclipse.core.runtime.FileLocator; |
|
| 23 |
import org.eclipse.core.runtime.Platform; |
|
| 24 |
import org.eclipse.jface.action.MenuManager; |
|
| 25 |
import org.eclipse.jface.text.ITextSelection; |
|
| 26 |
import org.eclipse.jface.viewers.ISelection; |
|
| 27 |
import org.eclipse.jface.viewers.ISelectionChangedListener; |
|
| 28 |
import org.eclipse.jface.viewers.ISelectionProvider; |
|
| 29 |
import org.eclipse.swt.SWT; |
|
| 30 |
import org.eclipse.swt.browser.Browser; |
|
| 31 |
import org.eclipse.swt.browser.BrowserFunction; |
|
| 32 |
import org.eclipse.swt.browser.ProgressEvent; |
|
| 33 |
import org.eclipse.swt.browser.ProgressListener; |
|
| 34 |
import org.eclipse.swt.events.MenuEvent; |
|
| 35 |
import org.eclipse.swt.events.MenuListener; |
|
| 36 |
import org.eclipse.swt.events.SelectionEvent; |
|
| 37 |
import org.eclipse.swt.events.SelectionListener; |
|
| 38 |
import org.eclipse.swt.widgets.Composite; |
|
| 39 |
import org.eclipse.swt.widgets.Menu; |
|
| 40 |
import org.eclipse.swt.widgets.MenuItem; |
|
| 41 |
import org.eclipse.ui.IWorkbenchWindow; |
|
| 42 |
import org.eclipse.ui.PlatformUI; |
|
| 43 |
import org.eclipse.ui.commands.ICommandService; |
|
| 44 |
import org.eclipse.ui.handlers.IHandlerService; |
|
| 45 |
import org.eclipse.ui.internal.browser.BrowserViewer; |
|
| 46 |
import org.osgi.framework.Bundle; |
|
| 47 |
import org.txm.core.preferences.TXMPreferences; |
|
| 48 |
import org.txm.objects.Corpus; |
|
| 49 |
import org.txm.objects.Edition; |
|
| 50 |
import org.txm.objects.Page; |
|
| 51 |
import org.txm.objects.Text; |
|
| 52 |
import org.txm.rcp.StatusLine; |
|
| 53 |
import org.txm.rcp.utils.IOClipboard; |
|
| 54 |
import org.txm.synopticedition.rcp.messages.SynopticEditionUIMessages; |
|
| 55 |
import org.txm.synopticedition.rcp.preferences.SynopticEditionPreferencePage; |
|
| 56 |
import org.txm.synopticedition.rcp.preferences.SynopticEditionPreferences; |
|
| 57 |
import org.txm.utils.io.IOUtils; |
|
| 58 |
import org.txm.utils.logger.Log; |
|
| 59 |
|
|
| 60 |
public class EditionPanel extends BrowserViewer implements ISelectionProvider {
|
|
| 61 |
|
|
| 62 |
public static class RGBA {
|
|
| 63 |
public int r=0, g=0, b=0; |
|
| 64 |
public float a = 1f; |
|
| 65 |
public RGBA(int r, int g, int b) {
|
|
| 66 |
this.r =r;this.g=g; this.b =b; |
|
| 67 |
} |
|
| 68 |
public RGBA(String rgb) {
|
|
| 69 |
String[] split = rgb.split(",");
|
|
| 70 |
try{this.r =Integer.parseInt(split[0]);}catch(Exception e){}
|
|
| 71 |
try{this.g =Integer.parseInt(split[1]);}catch(Exception e){}
|
|
| 72 |
try{this.b =Integer.parseInt(split[2]);}catch(Exception e){}
|
|
| 73 |
} |
|
| 74 |
public RGBA(String rgb, float a) {
|
|
| 75 |
String[] split = rgb.split(",");
|
|
| 76 |
try{this.r =Integer.parseInt(split[0]);}catch(Exception e){}
|
|
| 77 |
try{this.g =Integer.parseInt(split[1]);}catch(Exception e){}
|
|
| 78 |
try{this.b =Integer.parseInt(split[2]);}catch(Exception e){}
|
|
| 79 |
this.a = a; |
|
| 80 |
} |
|
| 81 |
public RGBA(int r, int g, int b, float a) {
|
|
| 82 |
this.r =r;this.g=g; this.b =b;this.a =a; |
|
| 83 |
} |
|
| 84 |
|
|
| 85 |
public String toString() {return "{"+r+", "+g+","+b+", "+a+"}";}
|
|
| 86 |
} |
|
| 87 |
|
|
| 88 |
private ProgressListener progresslistener; |
|
| 89 |
// private List<String> wordids; |
|
| 90 |
// private List<String> lineids; |
|
| 91 |
/** The edition. */ |
|
| 92 |
Text currentText; |
|
| 93 |
Edition currentEdition; |
|
| 94 |
Page currentPage; |
|
| 95 |
protected SynopticEditionEditor synopticEditionEditor; |
|
| 96 |
private ISelectionProvider selProvider; |
|
| 97 |
private MenuManager menuManager; |
|
| 98 |
|
|
| 99 |
private HashSet<int[]> highlightedAreas = null; |
|
| 100 |
|
|
| 101 |
//HashMap<String, ArrayList<RGBA>> highlightedColorSpans = new HashMap<String, ArrayList<RGBA>>(); // background color |
|
| 102 |
|
|
| 103 |
HashMap<String, ArrayList<RGBA>> highlightedColorPerWordIDS = new HashMap<String, ArrayList<RGBA>>(); // background color |
|
| 104 |
public static final String STYLE_NORMAL = "normal"; |
|
| 105 |
public static final String STYLE_ITALIC = "italic"; |
|
| 106 |
public static final String STYLE_OBLIQUE = "oblique"; |
|
| 107 |
HashMap<String, String> fontStylePerWordIDS = new HashMap<String, String>(); |
|
| 108 |
public static final String WEIGHT_NORMAL = "normal"; |
|
| 109 |
public static final String WEIGHT_BOLD = "bold"; |
|
| 110 |
HashMap<String, String> fontWeightPerWordIDS = new HashMap<String, String>(); |
|
| 111 |
HashMap<String, ArrayList<RGBA>> fontColorPerWordIDS = new HashMap<String, ArrayList<RGBA>>(); |
|
| 112 |
public static final String SIZE_SMALL = "small"; |
|
| 113 |
public static final String SIZE_MEDIUM = "medium"; |
|
| 114 |
public static final String SIZE_LARGE = "larger"; |
|
| 115 |
public static final String SIZE_SMALLER = "smaller"; |
|
| 116 |
public static final String SIZE_LARGER = "larger"; |
|
| 117 |
HashMap<String, String> fontSizePerWordIDS = new HashMap<String, String>(); |
|
| 118 |
public static final String FAMILLY_TIMES = "\"Times New Roman\", Times"; |
|
| 119 |
public static final String FAMILLY_ARIAL = "Arial"; |
|
| 120 |
public static final String FAMILLY_COURIER = "\"Courier New\", Courier"; |
|
| 121 |
HashMap<String, String> fontFamillyPerWordIDS = new HashMap<String, String>(); |
|
| 122 |
public static final String VARIANT_NORMAL = "normal"; |
|
| 123 |
public static final String VARIANT_SMALLCAPS = "small-caps"; |
|
| 124 |
HashMap<String, String> fontVariantPerWordIDS = new HashMap<String, String>(); |
|
| 125 |
String focusedWordID = null; |
|
| 126 |
|
|
| 127 |
public static final String highlightscript = "try { var elt = document.getElementById(\"%s\");" + //$NON-NLS-1$ //$NON-NLS-2$
|
|
| 128 |
"elt.style.backgroundColor=\"rgb(%s,%s,%s)\";" + //$NON-NLS-1$ |
|
| 129 |
//"elt.style.paddingLeft=\"3px\";" + //$NON-NLS-1$ |
|
| 130 |
//"elt.style.paddingRight=\"3px\";" + //$NON-NLS-1$ |
|
| 131 |
//"elt.style.paddingTop=\"1px\";" + //$NON-NLS-1$ |
|
| 132 |
//"elt.style.paddingBottom=\"1px\";" + //$NON-NLS-1$ |
|
| 133 |
"} catch (e) { };"; //$NON-NLS-1$
|
|
| 134 |
public static final String highlightscriptRuleFast = "sheet.insertRule(\"#%s {background-color:rgba(%s,%s,%s,%s);}\", 0);";
|
|
| 135 |
public static final String colorscriptRuleFast = "sheet.insertRule(\"#%s {color:rgba(%s,%s,%s,%s);}\", 0);";
|
|
| 136 |
public static final String sizescriptRuleFast = "sheet.insertRule(\"#%s {font-size:%s;}\", 0);";
|
|
| 137 |
public static final String stylescriptRuleFast = "sheet.insertRule(\"#%s {font-style:%s;}\", 0);";
|
|
| 138 |
public static final String variantscriptRuleFast = "sheet.insertRule(\"#%s {font-variant:%s;}\", 0);";
|
|
| 139 |
public static final String famillyscriptRuleFast = "sheet.insertRule(\"#%s {font-familly:%s;}\", 0);";
|
|
| 140 |
public static final String weightscriptRuleFast = "sheet.insertRule(\"#%s {font-weight:%s;}\", 0);";
|
|
| 141 |
|
|
| 142 |
public static final String highlightscriptRule = "sheet.insertRule(\"span[id=\\\"%s\\\"] {background-color:rgba(%s,%s,%s,%s); }\", 0);";
|
|
| 143 |
|
|
| 144 |
public static final String clearhighlightscript = "try { var elt = document.getElementById(\"%s\"); elt.style.backgroundColor=\"white\";elt.style.fontWeight=\"\";" + //$NON-NLS-1$
|
|
| 145 |
"} catch (e) { };"; //$NON-NLS-1$
|
|
| 146 |
|
|
| 147 |
public String functions = |
|
| 148 |
""//"alert(\"loading functions\");" |
|
| 149 |
+"\nfunction getNodeText(node) {"
|
|
| 150 |
+"\n if (typeof node == 'string') return node;" |
|
| 151 |
+"\n else if (typeof node.innerText != 'undefined') return node.innerText;" |
|
| 152 |
+"\n else if (typeof node.InnerText != 'undefined') return node.InnerText;" |
|
| 153 |
+"\n else if (typeof node.textContent != 'undefined') return node.textContent;" |
|
| 154 |
+"\n else return null;" |
|
| 155 |
+"\n}" |
|
| 156 |
+"\nfunction txmGetParent(node) {"
|
|
| 157 |
+"\n if (typeof node.parentNode != 'undefined') return node.parentNode;" |
|
| 158 |
+"\n else return null;" |
|
| 159 |
+"\n}" |
|
| 160 |
+"\nfunction txmGetChildren(node) {"
|
|
| 161 |
+"\n if (typeof node == 'string') return 'STRING HTML';" |
|
| 162 |
+"\n else if (typeof node.children != 'undefined') return node.children;" |
|
| 163 |
+"\n else if (typeof node.ChildNodes != 'undefined') return node.ChildNodes;" |
|
| 164 |
+"\n else if (typeof node.childNodes != 'undefined') return node.childNodes;" |
|
| 165 |
+"\n else return null;" |
|
| 166 |
+"\n}" |
|
| 167 |
+"\nfunction txmGetSelection() {"
|
|
| 168 |
+"\n if (typeof window.getSelection != 'undefined') {return window.getSelection();}"
|
|
| 169 |
+"\n else if (typeof document.selection != 'undefined') { return document.selection;}"
|
|
| 170 |
+"\n else return 'NO SELECTION';" |
|
| 171 |
+"\n}" |
|
| 172 |
+"\nfunction txmGetRangeSize(selection) {"
|
|
| 173 |
+"\n if (typeof selection.rangeCount != 'undefined') {return selection.rangeCount;}"
|
|
| 174 |
+"\n else if (typeof selection.createRangeCollection != 'undefined') { return selection.createRangeCollection().length();} // IE5 has no multiple selection"
|
|
| 175 |
+"\n}" |
|
| 176 |
+"\nfunction txmGetRange(selection, i) {"
|
|
| 177 |
+"\n if (typeof selection.getRangeAt != 'undefined') {return selection.getRangeAt(i);}"
|
|
| 178 |
+"\n else if (typeof selection.createRangeCollection != 'undefined') {return selection.createRangeCollection().item(i);}" // IE > IE5
|
|
| 179 |
+"\n else if (typeof selection.createRange != 'undefined') { return selection.createRange();} // IE5 has no multiple selection"
|
|
| 180 |
+"\n else return 'NO RANGE';" |
|
| 181 |
+"\n}" |
|
| 182 |
+"\nfunction txmGetParentElementRange(range) {"
|
|
| 183 |
+"\n if (typeof range.parentElement != 'undefined') {return range.parentElement();}"
|
|
| 184 |
+"\n else if (typeof range.startContainer != 'undefined') { return range.startContainer.parentNode;}"
|
|
| 185 |
+"\n else return 'NO PARENT';" |
|
| 186 |
+"\n}" |
|
| 187 |
+"\nfunction txmGetFragment(range) {"
|
|
| 188 |
+"\n if (typeof range.cloneContents != 'undefined') { return range.cloneContents();}"
|
|
| 189 |
+"\n else if (typeof range.htmlText != 'undefined') {var node = document.createElement('sel'); node.innerHTML = range.htmlText; return node;"
|
|
| 190 |
+"\n } else return 'NO FRAG';" |
|
| 191 |
+"\n}" |
|
| 192 |
+"\nfunction txmGetTagName(node) {"
|
|
| 193 |
+"\n if (typeof node.tagName != 'undefined') {return node.tagName;}"
|
|
| 194 |
+"\n else if (typeof node.nodeName != 'undefined') { return node.nodeName;}"
|
|
| 195 |
+"\n else if (typeof node.name != 'undefined') { return node.name;}"
|
|
| 196 |
+"\n else return 'NO TAGNAME';" |
|
| 197 |
+"\n}" |
|
| 198 |
+"\nfunction findSpans(children, all) {"
|
|
| 199 |
+"\n for (var i = 0 ; i < children.length ; i++) {"
|
|
| 200 |
+"\n var node = children.item(i);" |
|
| 201 |
+"\n if (node.nodeType == 1) {"
|
|
| 202 |
+"\n var id = node.getAttribute('id');"
|
|
| 203 |
+"\n if (node.tagName == 'SPAN' && id != null && id.indexOf('w_') == 0 && getNodeText(node).length > 0) {"
|
|
| 204 |
+"\n if (id != null) all.push(id);" |
|
| 205 |
+"\n } else {"
|
|
| 206 |
+"\n findSpans(txmGetChildren(node), all)" |
|
| 207 |
+"\n }" |
|
| 208 |
+"\n }" |
|
| 209 |
+"\n }" |
|
| 210 |
+"\n}" |
|
| 211 |
+"\nfunction findIdsInString(str, all) {"
|
|
| 212 |
+"\n for (var i = 0 ; i < children.length ; i++) {"
|
|
| 213 |
+"\n var node = children.item(i);" |
|
| 214 |
+"\n if (node.nodeType == 1) {"
|
|
| 215 |
+"\n var id = node.getAttribute('id');"
|
|
| 216 |
+"\n if (node.tagName == 'SPAN' && id != null && id.indexOf('w_') == 0 && getNodeText(node).length > 0) {"
|
|
| 217 |
+"\n if (id != null) all.push(id);" |
|
| 218 |
+"\n } else {"
|
|
| 219 |
+"\n findSpans(txmGetChildren(node), all)" |
|
| 220 |
+"\n }" |
|
| 221 |
+"\n }" |
|
| 222 |
+"\n }" |
|
| 223 |
+"\n}" |
|
| 224 |
+"\nfunction get_type(thing){if(thing===null)return \"[object Null]\"; return Object.prototype.toString.call(thing);}\n"
|
|
| 225 |
+"\nfunction getDetailedObject(inputObject) { var detailedObject = {}; var properties; \n do { properties = Object.getOwnPropertyNames( inputObject ); for (var o in properties) {detailedObject[properties[o]] = inputObject[properties[o]];}} while ( inputObject = Object.getPrototypeOf(inputObject) );return detailedObject;}\n"
|
|
| 226 |
+"\nvar sheet = null;" |
|
| 227 |
+"\ntry{"
|
|
| 228 |
+"\n var style = document.createElement(\"style\");" |
|
| 229 |
+"\n style.appendChild(document.createTextNode(\"\"));"//webkit hack |
|
| 230 |
+"\n document.head.appendChild(style);" |
|
| 231 |
+"\n sheet = style.sheet;" |
|
| 232 |
+"\n} catch(e) {sheet='error'}"
|
|
| 233 |
+"\ntry{"
|
|
| 234 |
+"\n" // define scrollIntoViewIfNeeded if absent |
|
| 235 |
+"\nif (!Element.prototype.scrollIntoViewIfNeeded) {"
|
|
| 236 |
+"\n Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) {"
|
|
| 237 |
+"\n centerIfNeeded = arguments.length === 0 ? true : !!centerIfNeeded;" |
|
| 238 |
+"\n var parent = this.parentNode," |
|
| 239 |
+"\n parentComputedStyle = window.getComputedStyle(parent, null)," |
|
| 240 |
+"\n parentBorderTopWidth = parseInt(parentComputedStyle.getPropertyValue('border-top-width')),"
|
|
| 241 |
+"\n parentBorderLeftWidth = parseInt(parentComputedStyle.getPropertyValue('border-left-width')),"
|
|
| 242 |
+"\n overTop = this.offsetTop - parent.offsetTop < parent.scrollTop," |
|
| 243 |
+"\n overBottom = (this.offsetTop - parent.offsetTop + this.clientHeight - parentBorderTopWidth) > (parent.scrollTop + parent.clientHeight)," |
|
| 244 |
+"\n overLeft = this.offsetLeft - parent.offsetLeft < parent.scrollLeft," |
|
| 245 |
+"\n overRight = (this.offsetLeft - parent.offsetLeft + this.clientWidth - parentBorderLeftWidth) > (parent.scrollLeft + parent.clientWidth)," |
|
| 246 |
+"\n alignWithTop = overTop && !overBottom;" |
|
| 247 |
+"\n if ((overTop || overBottom) && centerIfNeeded) {"
|
|
| 248 |
+"\n parent.scrollTop = this.offsetTop - parent.offsetTop - parent.clientHeight / 2 - parentBorderTopWidth + this.clientHeight / 2;" |
|
| 249 |
+"\n }" |
|
| 250 |
+"\n if ((overLeft || overRight) && centerIfNeeded) {"
|
|
| 251 |
+"\n parent.scrollLeft = this.offsetLeft - parent.offsetLeft - parent.clientWidth / 2 - parentBorderLeftWidth + this.clientWidth / 2;" |
|
| 252 |
+"\n }" |
|
| 253 |
+"\n if ((overTop || overBottom || overLeft || overRight) && !centerIfNeeded) {"
|
|
| 254 |
+"\n this.scrollIntoView(alignWithTop);" |
|
| 255 |
+"\n }" |
|
| 256 |
+"\n };" |
|
| 257 |
+"\n}" |
|
| 258 |
+"\n} catch(e) {Element.prototype.scrollIntoViewIfNeeded = Element.prototype.scrollIntoView}";
|
|
| 259 |
protected boolean fastWordHighLight = TXMPreferences.getBoolean(SynopticEditionPreferences.FAST_HIGHLIGHT, SynopticEditionPreferences.PREFERENCES_NODE); |
|
| 260 |
|
|
| 261 |
public Object evaluate(String code) {
|
|
| 262 |
if (Log.getLevel().intValue() <= Level.FINEST.intValue()) System.out.println(code); |
|
| 263 |
return getBrowser().evaluate(code); |
|
| 264 |
} |
|
| 265 |
public Object execute(String code) {
|
|
| 266 |
if (Log.getLevel().intValue() <= Level.FINEST.intValue()) System.out.println(code); |
|
| 267 |
return getBrowser().execute(code); |
|
| 268 |
} |
|
| 269 |
public EditionPanel(SynopticEditionEditor synopticEditionEditor, Composite parent, int style, Edition edition) {
|
|
| 270 |
super(parent, style); |
|
| 271 |
this.synopticEditionEditor = synopticEditionEditor; |
|
| 272 |
this.currentEdition = edition; |
|
| 273 |
this.currentText = currentEdition.getText(); |
|
| 274 |
|
|
| 275 |
File functionsFile = null; |
|
| 276 |
try {
|
|
| 277 |
|
|
| 278 |
Bundle bundle = Platform.getBundle("SynopticEditorRCP");
|
|
| 279 |
URL fileURL = bundle.getEntry("res/js/functions.js");
|
|
| 280 |
URL r = FileLocator.resolve(fileURL); |
|
| 281 |
Log.info("Load JS functions from: "+r);
|
|
| 282 |
functions = IOUtils.getText(r, "UTF-8"); |
|
| 283 |
|
|
| 284 |
} catch (Exception e) {
|
|
| 285 |
System.out.println("Error while reading "+functionsFile+": "+e.getLocalizedMessage());
|
|
| 286 |
Log.printStackTrace(e); |
|
| 287 |
} |
|
| 288 |
|
|
| 289 |
progresslistener = new ProgressListener() {
|
|
| 290 |
|
|
| 291 |
@Override |
|
| 292 |
public void changed(ProgressEvent event) { }
|
|
| 293 |
|
|
| 294 |
@Override |
|
| 295 |
public void completed(ProgressEvent event) {
|
|
| 296 |
// System.out.println("EditionPanel "+currentEdition.getName()+" reload "+getCurrentPage().getName());
|
|
| 297 |
Object rez = evaluate("return typeof sheet");
|
|
| 298 |
if ("undefined".equals(rez)) execute(functions); // build the sheet if not present in the HTML DOM
|
|
| 299 |
|
|
| 300 |
//System.out.println("highlight: "+highlightedColorPerWordIDS);
|
|
| 301 |
StringBuilder buffer = new StringBuilder(); |
|
| 302 |
//buffer.append("alert(\"\"+sheet);\n");
|
|
| 303 |
if (!fastWordHighLight) {
|
|
| 304 |
// for (String wordid : highlightedColorPerWordIDS.keySet()) {
|
|
| 305 |
// buffer.append(String.format(clearhighlightscript, wordid)+"\n"); |
|
| 306 |
// } |
|
| 307 |
} else {
|
|
| 308 |
buffer.append("try { while(sheet.cssRules.length > 0) sheet.deleteRule(0); } catch (e) {};\n"); // empty style
|
|
| 309 |
} |
|
| 310 |
|
|
| 311 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 312 |
buffer = new StringBuilder(); |
|
| 313 |
|
|
| 314 |
String firstWord = currentPage.getWordId(); |
|
| 315 |
Page nextPage = currentEdition.getNextPage(currentPage); |
|
| 316 |
String lastWord = "w_999999999"; |
|
| 317 |
if (nextPage != null && currentPage != nextPage) lastWord = nextPage.getWordId(); |
|
| 318 |
//System.out.println("firstWord="+firstWord+" lastWord="+lastWord);
|
|
| 319 |
//int n = 0; |
|
| 320 |
//long start = System.currentTimeMillis(); |
|
| 321 |
//System.out.println(highlightedColorPerWordIDS); |
|
| 322 |
for (String wordid : highlightedColorPerWordIDS.keySet()) {
|
|
| 323 |
if (highlightedColorPerWordIDS.get(wordid).size() == 0) continue; // error |
|
| 324 |
|
|
| 325 |
//if (!slowWordHighLight) { //TODO: this code must be replaced with word position instead of word id comparaison
|
|
| 326 |
if (Edition.isFirstGTthanSecond(wordid, firstWord) < 0) continue; // skip the word to highlight |
|
| 327 |
if (Edition.isFirstGTthanSecond(lastWord, wordid) < 0) continue; // skip the word to highlight |
|
| 328 |
//} |
|
| 329 |
//n++; |
|
| 330 |
RGBA composite = new RGBA(0,0,0,0f); |
|
| 331 |
int size = highlightedColorPerWordIDS.get(wordid).size(); |
|
| 332 |
|
|
| 333 |
for (RGBA color : highlightedColorPerWordIDS.get(wordid)) {
|
|
| 334 |
composite.r += color.r; |
|
| 335 |
composite.g += color.g; |
|
| 336 |
composite.b += color.b; |
|
| 337 |
composite.a += color.a; |
|
| 338 |
} |
|
| 339 |
|
|
| 340 |
composite.r /= size; |
|
| 341 |
composite.g /= size; |
|
| 342 |
composite.b /= size; |
|
| 343 |
|
|
| 344 |
String s = null; |
|
| 345 |
if (!fastWordHighLight) {
|
|
| 346 |
//s = String.format(highlightscriptRule, wordid, composite.r, composite.g, composite.b, composite.a); |
|
| 347 |
s = "try { document.getElementById(\"" + wordid + "\").style.backgroundColor=\"rgba("+composite.r+","+composite.g+","+composite.b+","+composite.a+")\";" //$NON-NLS-1$
|
|
| 348 |
+ |
|
| 349 |
// "elt.style.paddingLeft=\"3px\";" + //$NON-NLS-1$ |
|
| 350 |
// "elt.style.paddingRight=\"3px\";" + //$NON-NLS-1$ |
|
| 351 |
// "elt.style.paddingTop=\"1px\";" + //$NON-NLS-1$ |
|
| 352 |
// "elt.style.paddingBottom=\"1px\";" + //$NON-NLS-1$ |
|
| 353 |
"} catch (e) { };"; //$NON-NLS-1$
|
|
| 354 |
} else {
|
|
| 355 |
//TODO: replace this line with the next one for TXM 0.7.9 |
|
| 356 |
s = String.format(highlightscriptRuleFast, wordid.replace(" ", "\\ "), composite.r, composite.g, composite.b, composite.a);
|
|
| 357 |
// s = String.format(highlightscriptRuleFast, wordid, composite.r, composite.g, composite.b, composite.a); |
|
| 358 |
} |
|
| 359 |
|
|
| 360 |
buffer.append(s+"\n"); |
|
| 361 |
} |
|
| 362 |
|
|
| 363 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 364 |
buffer = new StringBuilder(); |
|
| 365 |
|
|
| 366 |
// for (String wordidslist : highlightedColorSpans.keySet()) {
|
|
| 367 |
// RGBA composite = new RGBA(0,0,0,0f); |
|
| 368 |
// int size = highlightedColorSpans.get(wordidslist).size(); |
|
| 369 |
// |
|
| 370 |
// for (RGBA color : highlightedColorSpans.get(wordidslist)) {
|
|
| 371 |
// composite.r += color.r; |
|
| 372 |
// composite.g += color.g; |
|
| 373 |
// composite.b += color.b; |
|
| 374 |
// composite.a += color.a; |
|
| 375 |
// } |
|
| 376 |
// |
|
| 377 |
// composite.r /= size; |
|
| 378 |
// composite.g /= size; |
|
| 379 |
// composite.b /= size; |
|
| 380 |
// |
|
| 381 |
// String cmd = "var l = "+wordidslist+";\n"; |
|
| 382 |
// cmd += "wrap(l, \""+wordidslist+"\";\n"; |
|
| 383 |
// buffer.append(cmd+"\n"); |
|
| 384 |
// } |
|
| 385 |
|
|
| 386 |
for (String wordid : fontColorPerWordIDS.keySet()) {
|
|
| 387 |
RGBA composite = new RGBA(0,0,0,0f); |
|
| 388 |
int size = fontColorPerWordIDS.get(wordid).size(); |
|
| 389 |
|
|
| 390 |
for (RGBA color : fontColorPerWordIDS.get(wordid)) {
|
|
| 391 |
composite.r += color.r; |
|
| 392 |
composite.g += color.g; |
|
| 393 |
composite.b += color.b; |
|
| 394 |
composite.a += color.a; |
|
| 395 |
} |
|
| 396 |
|
|
| 397 |
composite.r /= size; |
|
| 398 |
composite.g /= size; |
|
| 399 |
composite.b /= size; |
|
| 400 |
|
|
| 401 |
String s = String.format(colorscriptRuleFast, wordid, composite.r, composite.g, composite.b, composite.a); |
|
| 402 |
buffer.append(s+"\n"); |
|
| 403 |
} |
|
| 404 |
|
|
| 405 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 406 |
buffer = new StringBuilder(); |
|
| 407 |
|
|
| 408 |
for (String wordid : fontSizePerWordIDS.keySet()) {
|
|
| 409 |
String s = String.format(sizescriptRuleFast, wordid, fontSizePerWordIDS.get(wordid)); |
|
| 410 |
buffer.append(s+"\n"); |
|
| 411 |
} |
|
| 412 |
|
|
| 413 |
for (String wordid : fontWeightPerWordIDS.keySet()) {
|
|
| 414 |
String s = null; |
|
| 415 |
if (!fastWordHighLight) {
|
|
| 416 |
//s = String.format(highlightscriptRule, wordid, composite.r, composite.g, composite.b, composite.a); |
|
| 417 |
s = "try { document.getElementById(\"" + wordid + "\").style.fontWeight=\""+fontWeightPerWordIDS.get(wordid)+"\";" //$NON-NLS-1$
|
|
| 418 |
+ |
|
| 419 |
// "elt.style.paddingLeft=\"3px\";" + //$NON-NLS-1$ |
|
| 420 |
// "elt.style.paddingRight=\"3px\";" + //$NON-NLS-1$ |
|
| 421 |
// "elt.style.paddingTop=\"1px\";" + //$NON-NLS-1$ |
|
| 422 |
// "elt.style.paddingBottom=\"1px\";" + //$NON-NLS-1$ |
|
| 423 |
"} catch (e) { };"; //$NON-NLS-1$
|
|
| 424 |
//s = String.format(highlightscriptRule, wordid, composite.r, composite.g, composite.b, composite.a); |
|
| 425 |
// s = "try { var elt = document.getElementById(\"" + wordid + "\");" + //$NON-NLS-1$ //$NON-NLS-2$
|
|
| 426 |
// "elt.style.fontWeight=\""+fontWeightPerWordIDS.get(wordid)+"\";" + //$NON-NLS-1$ |
|
| 427 |
//// "elt.style.paddingLeft=\"3px\";" + //$NON-NLS-1$ |
|
| 428 |
//// "elt.style.paddingRight=\"3px\";" + //$NON-NLS-1$ |
|
| 429 |
//// "elt.style.paddingTop=\"1px\";" + //$NON-NLS-1$ |
|
| 430 |
//// "elt.style.paddingBottom=\"1px\";" + //$NON-NLS-1$ |
|
| 431 |
// "} catch (e) { };"; //$NON-NLS-1$
|
|
| 432 |
} else {
|
|
| 433 |
s = String.format(weightscriptRuleFast, wordid, fontWeightPerWordIDS.get(wordid)); |
|
| 434 |
} |
|
| 435 |
buffer.append(s+"\n"); |
|
| 436 |
} |
|
| 437 |
|
|
| 438 |
for (String wordid : fontFamillyPerWordIDS.keySet()) {
|
|
| 439 |
String s = String.format(famillyscriptRuleFast, wordid, fontFamillyPerWordIDS.get(wordid)); |
|
| 440 |
buffer.append(s+"\n"); |
|
| 441 |
} |
|
| 442 |
|
|
| 443 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 444 |
buffer = new StringBuilder(); |
|
| 445 |
|
|
| 446 |
if (focusedWordID != null) {
|
|
| 447 |
//System.out.println("Focus on: "+focusedWordID);
|
|
| 448 |
String s = "try { showElementIfNeeded(document.getElementById(\"" + focusedWordID + "\")); } catch (e) {document.getElementById(\"" + focusedWordID + "\").scrollIntoView();};"; //$NON-NLS-1$ //$NON-NLS-2$
|
|
| 449 |
buffer.append(s+"\n"); |
|
| 450 |
focusedWordID = null; // focus one time |
|
| 451 |
} |
|
| 452 |
|
|
| 453 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 454 |
buffer = new StringBuilder(); |
|
| 455 |
|
|
| 456 |
if (highlightedAreas != null) {
|
|
| 457 |
for (int[] pos : highlightedAreas ) {
|
|
| 458 |
if (pos == null || pos.length != 4) continue; |
|
| 459 |
String s = "try {v.setFocusOn("+pos[0]+", "+pos[1]+", "+pos[2]+", "+pos[3]+");} catch (e) { };"; //$NON-NLS-1$
|
|
| 460 |
buffer.append(s+"\n"); |
|
| 461 |
break;// one word only for now |
|
| 462 |
} |
|
| 463 |
} |
|
| 464 |
|
|
| 465 |
//System.out.println(buffer); |
|
| 466 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 467 |
//System.out.println("n="+n+" time="+(System.currentTimeMillis()-start));
|
|
| 468 |
} |
|
| 469 |
}; |
|
| 470 |
getBrowser().addProgressListener(progresslistener); |
|
| 471 |
new CommandLink (getBrowser()); |
|
| 472 |
} |
|
| 473 |
|
|
| 474 |
/** |
|
| 475 |
* Bypass BrowserViewer restriction on the getBrowser method |
|
| 476 |
*/ |
|
| 477 |
public Browser getBrowser() {
|
|
| 478 |
return super.getBrowser(); |
|
| 479 |
} |
|
| 480 |
|
|
| 481 |
/** |
|
| 482 |
* Bypass BrowserViewer restriction on the getBrowser method |
|
| 483 |
*/ |
|
| 484 |
public String getDOM() {
|
|
| 485 |
return "";//execute("return document.innerHTML";
|
|
| 486 |
} |
|
| 487 |
|
|
| 488 |
public ISelectionProvider getSelectionProvider() {
|
|
| 489 |
return selProvider; |
|
| 490 |
} |
|
| 491 |
|
|
| 492 |
public void setHighlightWordsById(RGBA color, HashSet<String> wordids) {
|
|
| 493 |
for (String wordid : wordids) {
|
|
| 494 |
if (this.highlightedColorPerWordIDS.get(wordid) != null) {
|
|
| 495 |
removeHighlightWordsById(color, wordid); |
|
| 496 |
} |
|
| 497 |
ArrayList<RGBA> hs = new ArrayList<RGBA>(); |
|
| 498 |
this.highlightedColorPerWordIDS.put(wordid, hs); |
|
| 499 |
hs.add(color); |
|
| 500 |
} |
|
| 501 |
} |
|
| 502 |
|
|
| 503 |
public void addHighlightWordsById(RGBA color, String wordid) {
|
|
| 504 |
if (!this.highlightedColorPerWordIDS.containsKey(wordid)) {
|
|
| 505 |
this.highlightedColorPerWordIDS.put(wordid, new ArrayList<RGBA>()); |
|
| 506 |
} |
|
| 507 |
this.highlightedColorPerWordIDS.get(wordid).add(color); |
|
| 508 |
} |
|
| 509 |
|
|
| 510 |
/** |
|
| 511 |
* Can be called to refresh the page word styles but only when the page is loaded |
|
| 512 |
*/ |
|
| 513 |
public void updateWordStyles() {
|
|
| 514 |
progresslistener.completed(null); |
|
| 515 |
} |
|
| 516 |
|
|
| 517 |
public void addHighlightWordsById(RGBA color, Collection<String> wordids) {
|
|
| 518 |
for (String wordid : wordids) {
|
|
| 519 |
addHighlightWordsById(color, wordid); |
|
| 520 |
} |
|
| 521 |
} |
|
| 522 |
|
|
| 523 |
public void removeHighlightWordsById(RGBA color, Collection<String> wordids) {
|
|
| 524 |
//System.out.println("Call removeHighlightWordsById: "+wordids+" color="+color);
|
|
| 525 |
StringBuffer buffer = new StringBuffer(); |
|
| 526 |
for (String wordid : wordids) {
|
|
| 527 |
removeHighlightWordsById(color, wordid); |
|
| 528 |
if (!fastWordHighLight) {
|
|
| 529 |
buffer.append(String.format(clearhighlightscript, wordid)+"\n"); |
|
| 530 |
} |
|
| 531 |
} |
|
| 532 |
|
|
| 533 |
if (buffer.length() > 0) execute(buffer.toString()); |
|
| 534 |
} |
|
| 535 |
|
|
| 536 |
public void removeHighlightWordsById(RGBA color, String wordid) {
|
|
| 537 |
if (highlightedColorPerWordIDS.get(wordid) == null) return; // nothing to do |
|
| 538 |
|
|
| 539 |
//System.out.println("remove color="+color+" from id="+wordid);
|
|
| 540 |
this.highlightedColorPerWordIDS.get(wordid).remove(color); |
|
| 541 |
|
|
| 542 |
if (this.highlightedColorPerWordIDS.get(wordid).size() == 0) {
|
|
| 543 |
this.highlightedColorPerWordIDS.remove(wordid); |
|
| 544 |
} |
|
| 545 |
} |
|
| 546 |
|
|
| 547 |
/** |
|
| 548 |
* Open the page containing the word with ID=$line_wordid |
|
| 549 |
* @param line_wordid |
|
| 550 |
* @return true if the page changed |
|
| 551 |
*/ |
|
| 552 |
public boolean backToText(Text text, String line_wordid) {
|
|
| 553 |
|
|
| 554 |
String name = currentEdition.getName(); |
|
| 555 |
Edition edition = text.getEdition(name); |
|
| 556 |
|
|
| 557 |
if (edition == null) {
|
|
| 558 |
String s = SynopticEditionUIMessages.EditionPanel_0+text+SynopticEditionUIMessages.EditionPanel_5+name; |
|
| 559 |
System.out.println(s); |
|
| 560 |
StatusLine.setMessage(s); |
|
| 561 |
Log.severe(s); |
|
| 562 |
} else {
|
|
| 563 |
Page openedPage = edition.getPageForWordId(line_wordid); |
|
| 564 |
if (openedPage != null && openedPage != currentPage) {
|
|
| 565 |
this.showPage(openedPage); |
|
| 566 |
return true; |
|
| 567 |
} |
|
| 568 |
} |
|
| 569 |
updateWordStyles(); // update styles if any new one |
|
| 570 |
return false; |
|
| 571 |
} |
|
| 572 |
|
|
| 573 |
/** |
|
| 574 |
* First page. |
|
| 575 |
*/ |
|
| 576 |
public void firstPage() {
|
|
| 577 |
// System.out.println(Messages.TxmBrowser_1+currentPage); |
|
| 578 |
currentPage = currentEdition.getFirstPage(); |
|
| 579 |
currentText = currentEdition.getText(); |
|
| 580 |
if (currentPage == null) {
|
|
| 581 |
System.out.println(SynopticEditionUIMessages.EditionPanel_1+currentEdition.getName()+SynopticEditionUIMessages.EditionPanel_2+currentText.getName()); |
|
| 582 |
} |
|
| 583 |
|
|
| 584 |
this.setURL(currentPage.toURL()); |
|
| 585 |
|
|
| 586 |
//page_label.setText(makePageLabel()); |
|
| 587 |
} |
|
| 588 |
|
|
| 589 |
public void setURL(String url) {
|
|
| 590 |
super.setURL(url); |
|
| 591 |
} |
|
| 592 |
|
|
| 593 |
/** |
|
| 594 |
* Last page. |
|
| 595 |
*/ |
|
| 596 |
public void lastPage() {
|
|
| 597 |
// System.out.println(Messages.TxmBrowser_2+currentPage); |
|
| 598 |
|
|
| 599 |
if (currentPage != null && currentPage.getFile().equals(currentEdition.getLastPage())) |
|
| 600 |
return; |
|
| 601 |
currentPage = currentEdition.getLastPage(); |
|
| 602 |
currentText = currentEdition.getText(); |
|
| 603 |
this.setURL(currentPage.toURL()); |
|
| 604 |
} |
|
| 605 |
|
|
| 606 |
/** |
|
| 607 |
* Previous page. |
|
| 608 |
*/ |
|
| 609 |
public void previousPage() {
|
|
| 610 |
// System.out.println(Messages.TxmBrowser_3+currentPage); |
|
| 611 |
if (currentPage != null) {
|
|
| 612 |
Page previous = currentEdition.getPreviousPage(currentPage); |
|
| 613 |
|
|
| 614 |
if (previous == currentPage) {
|
|
| 615 |
previousText(true); |
|
| 616 |
} else {
|
|
| 617 |
currentPage = previous; |
|
| 618 |
this.setURL(currentPage.toURL()); |
|
| 619 |
} |
|
| 620 |
currentText = currentEdition.getText(); |
|
| 621 |
} else |
|
| 622 |
firstPage(); |
|
| 623 |
//page_label.setText(makePageLabel()); |
|
| 624 |
} |
|
| 625 |
|
|
| 626 |
|
|
| 627 |
|
|
| 628 |
/** |
|
| 629 |
* Next page. |
|
| 630 |
*/ |
|
| 631 |
public void nextPage() {
|
|
| 632 |
// System.out.println(Messages.TxmBrowser_4+currentPage); |
|
| 633 |
if (currentPage != null) {
|
|
| 634 |
Page next = currentEdition.getNextPage(currentPage); |
|
| 635 |
if (next == currentPage) {
|
|
| 636 |
nextText(); |
|
| 637 |
} else {
|
|
| 638 |
currentPage = next; |
|
| 639 |
this.setURL(currentPage.toURL()); |
|
| 640 |
} |
|
| 641 |
currentText = currentEdition.getText(); |
|
| 642 |
} else |
|
| 643 |
firstPage(); |
|
| 644 |
//page_label.setText(makePageLabel()); |
|
| 645 |
} |
|
| 646 |
|
|
| 647 |
|
|
| 648 |
public void firstText() {
|
|
| 649 |
//Text current = this.currentPage.getEdition().getText(); |
|
| 650 |
Corpus corpus = currentText.getCorpus(); |
|
| 651 |
Text firstText = corpus.getFirstText(); |
|
| 652 |
|
|
| 653 |
if (firstText != null) {
|
|
| 654 |
String editionName = currentEdition.getName(); |
|
| 655 |
Edition tmp = firstText.getEdition(editionName); |
|
| 656 |
if (tmp == null) {
|
|
| 657 |
System.out.println(SynopticEditionUIMessages.EditionPanel_6+editionName+SynopticEditionUIMessages.EditionPanel_7+firstText.getName()); |
|
| 658 |
return; |
|
| 659 |
} |
|
| 660 |
currentEdition = tmp; |
|
| 661 |
currentPage = currentEdition.getFirstPage(); |
|
| 662 |
currentText = firstText; |
|
| 663 |
if (currentPage == null) {
|
|
| 664 |
StatusLine.setMessage("No previous text"); //$NON-NLS-1$
|
|
| 665 |
return; |
|
| 666 |
} |
|
| 667 |
this.setURL(currentPage.toURL()); |
|
| 668 |
} |
|
| 669 |
} |
|
| 670 |
|
|
| 671 |
/** |
|
| 672 |
* Next text. |
|
| 673 |
*/ |
|
| 674 |
public void lastText() {
|
|
| 675 |
//Text current = this.currentPage.getEdition().getText(); |
|
| 676 |
Corpus b = currentText.getCorpus(); |
|
| 677 |
Text lastText = b.getLastText(); |
|
| 678 |
|
|
| 679 |
if (lastText != null) {
|
|
| 680 |
String editionName = currentEdition.getName(); |
|
| 681 |
Edition tmp = lastText.getEdition(editionName); |
|
| 682 |
if (tmp == null) {
|
|
| 683 |
System.out.println(SynopticEditionUIMessages.EditionPanel_6+editionName+SynopticEditionUIMessages.EditionPanel_7+lastText.getName()); |
|
| 684 |
return; |
|
| 685 |
} |
|
| 686 |
|
|
| 687 |
currentEdition = tmp; |
|
| 688 |
currentPage = currentEdition.getFirstPage(); |
|
| 689 |
currentText = lastText; |
|
| 690 |
if (currentPage == null) {
|
|
| 691 |
StatusLine.setMessage("No text next"); //$NON-NLS-1$
|
|
| 692 |
return; |
|
| 693 |
} |
|
| 694 |
|
|
| 695 |
this.setURL(currentPage.toURL()); |
|
| 696 |
//page_label.setText(makePageLabel()); |
|
| 697 |
} |
|
| 698 |
// System.out.println("Next texts "+nextText);
|
|
| 699 |
} |
|
| 700 |
|
|
| 701 |
/** |
|
| 702 |
* Previous text. |
|
| 703 |
* @param fromNextText if true it means the user was reading the next text and then we show the last page of the previous text |
|
| 704 |
*/ |
|
| 705 |
public void previousText(boolean fromNextText) {
|
|
| 706 |
|
|
| 707 |
//Text current = this.currentPage.getEdition().getText(); |
|
| 708 |
Corpus corpus = currentText.getCorpus(); |
|
| 709 |
Text previousText = corpus.getPreviousText(currentText); |
|
| 710 |
|
|
| 711 |
if (previousText != null) {
|
|
| 712 |
String editionName = currentEdition.getName(); |
|
| 713 |
|
|
| 714 |
Edition tmp = previousText.getEdition(editionName); |
|
| 715 |
if (tmp == null) {
|
|
| 716 |
System.out.println(SynopticEditionUIMessages.EditionPanel_6+editionName+SynopticEditionUIMessages.EditionPanel_7+previousText.getName()); |
|
| 717 |
} |
|
| 718 |
currentEdition = tmp; |
|
| 719 |
currentText = previousText; |
|
| 720 |
if (fromNextText) {
|
|
| 721 |
currentPage = currentEdition.getLastPage(); |
|
| 722 |
} else {
|
|
| 723 |
currentPage = currentEdition.getFirstPage(); |
|
| 724 |
} |
|
| 725 |
|
|
| 726 |
if (currentPage == null) {
|
|
| 727 |
StatusLine.setMessage("No previous text"); //$NON-NLS-1$
|
|
| 728 |
return; |
|
| 729 |
} |
|
| 730 |
this.setURL(currentPage.toURL()); |
|
| 731 |
} |
|
| 732 |
// System.out.println("Previous texts "+previousText);
|
|
| 733 |
} |
|
| 734 |
|
|
| 735 |
/** |
|
| 736 |
* Next text. |
|
| 737 |
*/ |
|
| 738 |
public void nextText() {
|
|
| 739 |
//Text current = this.currentPage.getEdition().getText(); |
|
| 740 |
Corpus b = currentText.getCorpus(); |
|
| 741 |
Text nextText = b.getNextText(currentText); |
|
| 742 |
|
|
| 743 |
if (nextText != null) {
|
|
| 744 |
String editionName = currentEdition.getName(); |
|
| 745 |
Edition tmp = nextText.getEdition(editionName); |
|
| 746 |
if (tmp == null) {
|
|
| 747 |
System.out.println(SynopticEditionUIMessages.EditionPanel_6+editionName+SynopticEditionUIMessages.EditionPanel_7+nextText.getName()); |
|
| 748 |
return; |
|
| 749 |
} |
|
| 750 |
currentEdition = tmp; |
|
| 751 |
|
|
| 752 |
currentPage = currentEdition.getFirstPage(); |
|
| 753 |
currentText = nextText; |
|
| 754 |
if (currentPage == null) {
|
|
| 755 |
StatusLine.setMessage("No text next"); //$NON-NLS-1$
|
|
| 756 |
return; |
|
| 757 |
} |
|
| 758 |
|
|
| 759 |
this.setURL(currentPage.toURL()); |
|
| 760 |
//page_label.setText(makePageLabel()); |
|
| 761 |
} |
|
| 762 |
// System.out.println("Next texts "+nextText);
|
|
| 763 |
} |
|
| 764 |
|
|
| 765 |
|
|
| 766 |
public void setText(Text text, boolean refresh) {
|
|
| 767 |
String editionName = currentEdition.getName(); |
|
| 768 |
Edition tmp = text.getEdition(editionName); |
|
| 769 |
if (tmp == null) {
|
|
Formats disponibles : Unified diff