package nota.oxygen.common.pagenumber; import java.util.ArrayList; import javax.swing.text.BadLocationException; import ro.sync.ecss.extensions.api.ArgumentDescriptor; import ro.sync.ecss.extensions.api.ArgumentsMap; import ro.sync.ecss.extensions.api.AuthorDocumentController; import ro.sync.ecss.extensions.api.AuthorOperationException; import ro.sync.ecss.extensions.api.access.AuthorEditorAccess; import ro.sync.ecss.extensions.api.access.AuthorWorkspaceAccess; import ro.sync.ecss.extensions.api.node.AuthorElement; import ro.sync.ecss.extensions.api.node.AuthorNode; import nota.oxygen.common.BaseAuthorOperation; /** * Marks page number fully or semi-automatic * @author OHA * */ public class MarkupPageNumbersOperation extends BaseAuthorOperation { private static String ARG_PAGENUMBER_FRAGMENT = "pagenumber fragment"; private String pagenumberFragment; private static String ARG_CANDIDATE_XPATH = "candidate xpath"; private String candidateXPath = "candidate xpath"; private static String ARG_MARKUP_MODE = "Markup mode"; private static String[] MARKUP_MODES = new String[] {"Fully automatic", "Confirm when out-of-sequence", "Confirm all"}; private String markupMode; private static String ARG_ID_PREFIX = "id prefix"; private String idPrefix = "page_"; @Override public ArgumentDescriptor[] getArguments() { return new ArgumentDescriptor[]{ new ArgumentDescriptor(ARG_PAGENUMBER_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Pagenumber xml fragment - $pagenum is placeholder for the pagenumber, $id for pagenumber id"), new ArgumentDescriptor(ARG_CANDIDATE_XPATH, ArgumentDescriptor.TYPE_XPATH_EXPRESSION, "Candidate XPath"), new ArgumentDescriptor(ARG_MARKUP_MODE, ArgumentDescriptor.TYPE_CONSTANT_LIST, "Markup mode", MARKUP_MODES, MARKUP_MODES[0]), new ArgumentDescriptor(ARG_ID_PREFIX, ArgumentDescriptor.TYPE_STRING, "id prefix") }; } @Override public String getDescription() { return "Find and markup pagenumbers"; } private void doOperation(boolean automatic, boolean confirmOnlyOutOfSequence) throws AuthorOperationException { AuthorDocumentController docCtrl = getAuthorAccess().getDocumentController(); AuthorEditorAccess edtAcc = getAuthorAccess().getEditorAccess(); AuthorWorkspaceAccess wa = getAuthorAccess().getWorkspaceAccess(); AuthorElement[] candidates = findCandidates(); int nextExpected = 1; for (int i=0; i<candidates.length; i++) { int pagenumber = parseCandidate(candidates[i]); if (pagenumber==-1) continue; edtAcc.select(candidates[i].getStartOffset(), candidates[i].getEndOffset()); // try { // Thread.sleep(10); // } catch (InterruptedException e) { // throw new AuthorOperationException("Unexpected InterruptException occured", e); // } boolean confirmed = false; if (automatic || (pagenumber==nextExpected && confirmOnlyOutOfSequence)) { confirmed = true; } else { int answer = showYesNoCancelMessage(getDescription(), "Do you wish to markup page "+pagenumber+"?", 1); if (answer==-1) break; if (answer==1) confirmed = true; } if (confirmed) { wa.showStatusMessage("Page "+pagenumber); String pnXml = pagenumberFragment.replace("$pagenum", String.format("%1$d", pagenumber)); pnXml = pnXml.replace("$id", String.format("%1$s%2$d", idPrefix, pagenumber)); docCtrl.insertXMLFragment(pnXml, candidates[i].getEndOffset()+1); docCtrl.deleteNode(candidates[i]); nextExpected = pagenumber+1; } } } private int parseCandidate(AuthorElement candidate) { try { return Integer.parseInt(candidate.getTextContent()); } catch (NumberFormatException e) { return -1; } catch (BadLocationException e) { return -1; } } private AuthorElement[] findCandidates() throws AuthorOperationException { AuthorNode[] nRes = getAuthorAccess().getDocumentController().findNodesByXPath(candidateXPath, true, true, true); ArrayList<AuthorElement> res = new ArrayList<AuthorElement>(); for (int i=0; i<nRes.length; i++) { if (nRes[i] instanceof AuthorElement) { res.add((AuthorElement)nRes[i]); } } return res.toArray(new AuthorElement[0]); } @Override protected void doOperation() throws AuthorOperationException { if (markupMode.equals(MARKUP_MODES[0])) {//Fully automatic doOperation(true, false); } else if (markupMode.equals(MARKUP_MODES[1])) {//Confirm when out-of-sequence doOperation(false, true); } else if (markupMode.equals(MARKUP_MODES[2])) {//Confirm always doOperation(false, false); } else { throw new AuthorOperationException("Unknown markup mode "+markupMode); } } @Override protected void parseArguments(ArgumentsMap args) throws IllegalArgumentException { pagenumberFragment = (String)args.getArgumentValue(ARG_PAGENUMBER_FRAGMENT); candidateXPath = (String)args.getArgumentValue(ARG_CANDIDATE_XPATH); markupMode = (String)args.getArgumentValue(ARG_MARKUP_MODE); idPrefix = (String)args.getArgumentValue(ARG_ID_PREFIX); } }