Sounds great! These are truly nice features to be added. Best regards from Ohio, Vic From: brailleblaster-bounce@xxxxxxxxxxxxx [mailto:brailleblaster-bounce@xxxxxxxxxxxxx] On Behalf Of Brandon Roller Sent: Thursday, July 31, 2014 4:34 PM To: brailleblaster@xxxxxxxxxxxxx Subject: [brailleblaster] Re: 5 new revisions pushed by sahel.ma...@xxxxxxxxx on 2014-07-31 18:56 GMT Yes, that is next on the agenda alow with removing boxlines. Once implemented if you select multiple elements and slect boxline it will wrap all the elements inside boxlines as a group, not individually. On Thu, Jul 31, 2014 at 4:25 PM, Vic Beckley <vic.beckley3@xxxxxxxxx> wrote: Brandon, Thanks for the help. I assumed that was what it would do. It seems to work very well so far. It is really a nice feature. Do boxlines work with multiple elements selected? It seems to put each element in a separate box. I would like to be able to select several paragraphs and apply a boxline style to the group of elements. What I mean is have only one box surrounding the group of paragraphs. Is this possible? Is it possible or planned? Best regards from Ohio, Vic From: brailleblaster-bounce@xxxxxxxxxxxxx [mailto:brailleblaster-bounce@xxxxxxxxxxxxx] On Behalf Of Brandon Roller Sent: Thursday, July 31, 2014 3:30 PM To: brailleblaster@xxxxxxxxxxxxx Subject: [brailleblaster] Re: 5 new revisions pushed by sahel.ma...@xxxxxxxxx on 2014-07-31 18:56 GMT Let's say you highlighted three paragraphs and selected heading 2 in the style panel. It would apply heading 2 styles to all three. On Thu, Jul 31, 2014 at 3:02 PM, Vic Beckley <vic.beckley3@xxxxxxxxx> wrote: What exactly is "multi select styles?" How do you use it? Best regards from Ohio, Vic -----Original Message----- From: brailleblaster-bounce@xxxxxxxxxxxxx [mailto:brailleblaster-bounce@xxxxxxxxxxxxx] On Behalf Of brailleblaster@xxxxxxxxxxxxxx Sent: Thursday, July 31, 2014 2:57 PM To: brailleblaster@xxxxxxxxxxxxx Subject: [brailleblaster] 5 new revisions pushed by sahel.ma...@xxxxxxxxx on 2014-07-31 18:56 GMT 5 new revisions: Revision: 9b58e3b359cf Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 24 20:04:42 2014 UTC Log: Reverting some of files second time http://code.google.com/p/brailleblaster/source/detail?r=9b58e3b359cf Revision: d5bb11f3fb3b Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 15:34:17 2014 UTC Log: Adding multi select style http://code.google.com/p/brailleblaster/source/detail?r=d5bb11f3fb3b Revision: b1edff6fec3e Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 15:38:44 2014 UTC Log: commited before mereging http://code.google.com/p/brailleblaster/source/detail?r=b1edff6fec3e Revision: 30910e3d2f45 Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 18:51:41 2014 UTC Log: Fixed merge conflicts http://code.google.com/p/brailleblaster/source/detail?r=30910e3d2f45 Revision: 1e17b7a92010 Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 18:54:23 2014 UTC Log: Fixed merge conflicts second http://code.google.com/p/brailleblaster/source/detail?r=1e17b7a92010 ============================================================================ == Revision: 9b58e3b359cf Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 24 20:04:42 2014 UTC Log: Reverting some of files second time http://code.google.com/p/brailleblaster/source/detail?r=9b58e3b359cf Modified: /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java ======================================= --- /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 24 19:01:54 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 24 20:04:42 2014 UTC @@ -103,8 +103,6 @@ private PaintObjectListener paintObjListener; private int originalStart, originalEnd; private TextMapElement currentElement; - int startSelection; - int endSelection; public TextView (Manager manager, Group documentWindow, BBSemanticsTable table) { super (manager, documentWindow, LEFT_MARGIN, RIGHT_MARGIN, TOP_MARGIN, BOTTOM_MARGIN, table); @@ -119,16 +117,7 @@ view.addSelectionListener(selectionListener = new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent e) { - selectionArray = view.getSelectionRanges(); - //Added this part for start and end of text selection - for (int i = 0; i < selectionArray.length-1; i++) { - startSelection=selectionArray[i]; - endSelection=selectionArray[i]+selectionArray[i+1]; - - - } - System.out.println(startSelection+" "+endSelection); if(selectionArray[1] > 0){ setSelection(selectionArray[0], selectionArray[1]); currentChar = ' '; ============================================================================ == Revision: d5bb11f3fb3b Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 15:34:17 2014 UTC Log: Adding multi select style http://code.google.com/p/brailleblaster/source/detail?r=d5bb11f3fb3b Modified: /src/main/org/brailleblaster/perspectives/braille/Manager.java /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java ======================================= --- /src/main/org/brailleblaster/perspectives/braille/Manager.java Thu Jul 24 19:35:48 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/Manager.java Thu Jul 31 15:34:17 2014 UTC @@ -36,6 +36,11 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +60,8 @@ import org.brailleblaster.perspectives.braille.document.BBSemanticsTable.Styles; import org.brailleblaster.perspectives.braille.document.BBSemanticsTable.StylesType ; import org.brailleblaster.perspectives.braille.document.BrailleDocument; +import org.brailleblaster.perspectives.braille.mapping.elements.BrlOnlyMapElement; +import org.brailleblaster.perspectives.braille.mapping.elements.PageMapElement; import org.brailleblaster.perspectives.braille.mapping.elements.Range; import org.brailleblaster.perspectives.braille.mapping.elements.SectionElement; import org.brailleblaster.perspectives.braille.mapping.elements.TextMapElement; @@ -806,52 +813,126 @@ else braille.positionScrollbar(text.view.getTopIndex()); } + /*** + * Get parent style of the current TextMapElement + * @param current + * @param message + * @return + */ + private Element parentStyle(TextMapElement current, Message message) { + Element parent = document.getParent(current.n, true); + message.put("previousStyle", styles.get(styles.getKeyFromAttribute(parent))); + document.changeSemanticAction(message, current.parentElement()); + message.put("style", styles.get(styles.getKeyFromAttribute(parent))); + return parent; + + } + /*** + * Handle style for all cases + * @param message + */ - private void handleUpdateStyle(Message message){ - if(document.getDOM() != null && text.view.getText().length() > 0){ + private void handleUpdateStyle(Message message) { + if (document.getDOM() != null && text.view.getText().length() > 0) { group.setRedraw(false); - Element parent = document.getParent(list.getCurrent().n, true); + if (message.getValue("multiSelect").equals(false)) { + handleStyleCursorSelected(message); - message.put("previousStyle", styles.get(styles.getKeyFromAttribute(parent))); - document.changeSemanticAction(message, list.getCurrent().parentElement()); - message.put("style", styles.get(styles.getKeyFromAttribute(parent))); - ArrayList<TextMapElement> itemList = list.findTextMapElements(list.getCurrentIndex(), parent, true); + } else { + handleStyleMultiSelected(message); + } + + } else + new Notify(lh.localValue("nothingToApply")); + } + /*** + * Handle style if user just move cursor + * @param message + */ + private void handleStyleCursorSelected(Message message) { + Element parent = parentStyle(list.getCurrent(), message); + ArrayList<TextMapElement> itemList = list.findTextMapElements( + list.getCurrentIndex(), parent, true); + adjustStyle(itemList, message); + + } + /*** + * Apply styles to selected text for multiple elements + * @param start + * @param end + * @param message + */ + private void handleStyleMultiSelected(Message message){ - int start = list.indexOf(itemList.get(0)); - int end = list.indexOf(itemList.get(itemList.size() - 1)); - int origPos = list.get(list.getNodeIndex(itemList.get(0))).start; - if(start > 0){ - message.put("prev", list.get(start - 1).end); - message.put("braillePrev", list.get(start - 1).brailleList.getLast().end); + int start=text.getSelectedText()[0]; + int end=text.getSelectedText()[1]; + + Set<TextMapElement> itemSet = getElementSelected(start, end); + + Iterator<TextMapElement> itr = itemSet.iterator(); + while (itr.hasNext()) + { + TextMapElement tempElement= itr.next(); + + if(tempElement.parentElement().getAttributeValue("semantics").contains("styl e") || tempElement.parentElement().getAttributeValue("semantics").contains("action" )) + { + Message styleMessage = new Message(null); + styleMessage.put("Style", message.getValue("Style")); + Element parent = parentStyle(tempElement, styleMessage); + + ArrayList<TextMapElement> itemList = list.findTextMapElements(list.getNodeIndex(tempElement), parent, true); + adjustStyle( itemList,styleMessage); } - else { - message.put("prev", -1); - message.put("braillePrev", -1); - } - - if(end < list.size() - 1){ - message.put("next", list.get(end + 1).start); - message.put("brailleNext", list.get(end + 1).brailleList.getFirst().start); - } - else { - message.put("next", -1); - message.put("brailleNext", -1); - } - - text.adjustStyle(message, itemList); - braille.adjustStyle(message, itemList); - - if(message.contains("linesBeforeOffset")) - list.shiftOffsetsFromIndex(start, (Integer)message.getValue("linesBeforeOffset"), (Integer)message.getValue("linesBeforeOffset"), origPos); - if(message.contains("linesAfterOffset") && list.size() > 1 && end < list.size() - 1) - list.shiftOffsetsFromIndex(end + 1, (Integer)message.getValue("linesAfterOffset"), (Integer)message.getValue("linesAfterOffset"), origPos); + } + + } + /*** + * Adjust style of elements in the list base on previous and next element + * @param itemList : all selected items which we want style to be applied + * @param message : passing information regarding styles + */ - treeView.adjustItemStyle(list.getCurrent()); - group.setRedraw(true); + private void adjustStyle(ArrayList<TextMapElement> itemList, Message message) { + int start = list.indexOf(itemList.get(0)); + int end = list.indexOf(itemList.get(itemList.size() - 1)); + int origPos = list.get(list.getNodeIndex(itemList.get(0))).start; + if (start > 0) { + message.put("prev", list.get(start - 1).end); + message.put("braillePrev", + list.get(start - 1).brailleList.getLast().end); + } else { + message.put("prev", -1); + message.put("braillePrev", -1); } - else - new Notify(lh.localValue("nothingToApply")); + + if (end < list.size() - 1) { + message.put("next", list.get(end + 1).start); + message.put("brailleNext", + list.get(end + 1).brailleList.getFirst().start); + } else { + message.put("next", -1); + message.put("brailleNext", -1); + } + + text.adjustStyle(message, itemList); + braille.adjustStyle(message, itemList); + + if (message.contains("linesBeforeOffset")) + list.shiftOffsetsFromIndex(start, + (Integer) message.getValue("linesBeforeOffset"), + (Integer) message.getValue("linesBeforeOffset"), origPos); + if (message.contains("linesAfterOffset") && list.size() > 1 + && end < list.size() - 1) + list.shiftOffsetsFromIndex(end + 1, + (Integer) message.getValue("linesAfterOffset"), + (Integer) message.getValue("linesAfterOffset"), origPos); + + treeView.adjustItemStyle(list.getCurrent()); + group.setRedraw(true); + } + + public void saveAs(){ BBFileDialog dialog = new BBFileDialog(wp.getShell(), SWT.SAVE, arch.getFileTypes(), arch.getFileExtensions()); @@ -1199,6 +1280,37 @@ else return null; } + /*** + * Return all elements that selected in text + * @param start :start location of where text selected + * @param end: where selection ended + * @return: Set of all element where in selection + */ + public Set<TextMapElement> getElementSelected(int start, int end) { + + Set<TextMapElement> elementSelectedSet = new LinkedHashSet<TextMapElement>(); + Set<Element> parentElement = new LinkedHashSet<Element>(); + int j=start; + while( j < end) { + TextMapElement t = getElementInRange(j); + + if ((t != null) && (!((t instanceof BrlOnlyMapElement )||(t instanceof PageMapElement)))) { + Element currentParent = document.getParent(t.n, true); + if(!(parentElement.contains(currentParent))){ + parentElement.add(currentParent); + elementSelectedSet.add(t); + } + + j=t.end+1; + + } + else + { + j=j+1; + } + } + return elementSelectedSet; + } public TextMapElement getElementInBrailleRange(int offset){ Message m = new Message(null); ======================================= --- /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 24 20:04:42 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 31 15:34:17 2014 UTC @@ -103,6 +103,7 @@ private PaintObjectListener paintObjListener; private int originalStart, originalEnd; private TextMapElement currentElement; + private boolean multiSelected; public TextView (Manager manager, Group documentWindow, BBSemanticsTable table) { super (manager, documentWindow, LEFT_MARGIN, RIGHT_MARGIN, TOP_MARGIN, BOTTOM_MARGIN, table); @@ -110,6 +111,7 @@ this.spaceBeforeText = 0; this.spaceAfterText = 0; this.manager = manager; + multiSelected=false; } @Override @@ -119,7 +121,7 @@ public void widgetSelected(SelectionEvent e) { selectionArray = view.getSelectionRanges(); if(selectionArray[1] > 0){ - setSelection(selectionArray[0], selectionArray[1]); + multiSelected=true; currentChar = ' '; if(currentChanges > 0) sendUpdate(); @@ -1755,4 +1757,19 @@ spaceBeforeText = 0; spaceBeforeText = 0; } + public int[] getSelectedText() + { + int [] temp=new int[2]; + if(selectionArray!=null){ + temp[0]=selectionArray[0]; + temp[1]=selectionArray[0]+selectionArray[1]; + } + return temp; + } + + public boolean isMultiSelected() { + return multiSelected; + } + + } ============================================================================ == Revision: b1edff6fec3e Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 15:38:44 2014 UTC Log: commited before mereging http://code.google.com/p/brailleblaster/source/detail?r=b1edff6fec3e Modified: /src/main/org/brailleblaster/archiver/NimasArchiver.java /src/main/org/brailleblaster/perspectives/braille/stylepanel/StyleManager.ja va ======================================= --- /src/main/org/brailleblaster/archiver/NimasArchiver.java Thu Jul 24 19:10:40 2014 UTC +++ /src/main/org/brailleblaster/archiver/NimasArchiver.java Thu Jul 31 15:38:44 2014 UTC @@ -85,7 +85,7 @@ // Segment the single NIMAS file. This will make rendering // faster in certain perspectives. - writeNimasSegments(); + //writeNimasSegments(); currentConfig = getAutoCfg("nimas"); // Nimas document. filterNames = new String[] {"XML", "XML Zip", "BRF", "UTDML"}; ======================================= --- /src/main/org/brailleblaster/perspectives/braille/stylepanel/StyleManager.ja va Thu Jul 3 16:07:57 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/stylepanel/StyleManager.ja va Thu Jul 31 15:38:44 2014 UTC @@ -102,8 +102,18 @@ public void apply(String item){ Message m = new Message(BBEvent.UPDATE_STYLE); Styles style = semanticsTable.get(item); + if(style != null){ m.put("Style", style); + if(dm.getText().isMultiSelected()==true) + { + m.put("multiSelect", true); + } + else + { + m.put("multiSelect", false); + + } dm.dispatch(m); } } ============================================================================ == Revision: 30910e3d2f45 Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 18:51:41 2014 UTC Log: Fixed merge conflicts http://code.google.com/p/brailleblaster/source/detail?r=30910e3d2f45 Modified: /src/main/org/brailleblaster/archiver/NimasArchiver.java /src/main/org/brailleblaster/perspectives/braille/Manager.java /src/main/org/brailleblaster/perspectives/braille/stylepanel/StyleManager.ja va /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java ======================================= --- /src/main/org/brailleblaster/archiver/NimasArchiver.java Thu Jul 31 15:38:44 2014 UTC +++ /src/main/org/brailleblaster/archiver/NimasArchiver.java Thu Jul 31 18:51:41 2014 UTC @@ -30,26 +30,12 @@ package org.brailleblaster.archiver; -import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Set; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - import nu.xom.Attribute; import nu.xom.Builder; import nu.xom.Document; @@ -58,17 +44,12 @@ import nu.xom.Nodes; import nu.xom.ParsingException; import nu.xom.ValidityException; -import nu.xom.XPathContext; -import nu.xom.converters.DOMConverter; -import nu.xom.xslt.XSLException; -import nu.xom.xslt.XSLTransform; import org.brailleblaster.BBIni; import org.brailleblaster.document.BBDocument; import org.brailleblaster.util.FileUtils; import org.brailleblaster.util.Notify; import org.brailleblaster.util.Zipper; -import org.w3c.dom.DOMImplementation; //////////////////////////////////////////////////////////////////////////// ////// // Prepares Nimas Archive for opening. @@ -76,21 +57,27 @@ Set <String> allPaths; - + // The number of documents we COULD have if wrote them all to disk. + int numPotentialFiles = 0; NimasArchiver(String docToPrepare) { + super(docToPrepare); + + currentConfig = getAutoCfg("nimas"); // Nimas document. + filterNames = new String[] {"XML", "XML Zip", "BRF", "UTDML"}; + filterExtensions = new String[] {"*.xml", "*.zip", "*.brf", "*.utd"}; + allPaths = new HashSet<String>(); + + // Unzip file if needed. if(docToPrepare.endsWith(".zip")) unzip(docToPrepare); // Segment the single NIMAS file. This will make rendering // faster in certain perspectives. - //writeNimasSegments(); - - currentConfig = getAutoCfg("nimas"); // Nimas document. - filterNames = new String[] {"XML", "XML Zip", "BRF", "UTDML"}; - filterExtensions = new String[] {"*.xml", "*.zip", "*.brf", "*.utd"}; - allPaths=new HashSet<String>(); + + // Write the first file to disk. + wrtieToDisk(0); } @Override @@ -100,7 +87,7 @@ path = workingDocPath; if(fu.createXMLFile(doc.getNewXML(), path)){ - String tempSemFile = BBIni.getTempFilesPath() + BBIni.getFileSep() + fu.getFileName(path) + ".sem"; + String tempSemFile = BBIni.getTempFilesPath() + BBIni.getFileSep() + fu.getFileName(path) + ".sem"; copySemanticsFile(tempSemFile, fu.getPath(path) + BBIni.getFileSep() + fu.getFileName(path) + ".sem"); } else { @@ -131,6 +118,7 @@ String sp = BBIni.getFileSep(); String tempOutPath = BBIni.getTempFilesPath() + filePath.substring(filePath.lastIndexOf(sp), filePath.lastIndexOf(".")) + sp; workingDocPath = unzipr.Unzip(filePath, tempOutPath); + // Store paths. zippedPath = filePath; } @@ -194,7 +182,30 @@ arch.save(doc, path); return arch; } + + //////////////////////////////////////////////////////////////////////////// ///// + // Clears the list of path indices so we can once again create them on the fly. + // Needed when we save a nimas file. We have to delete all of the temp files, + // zip, then recreate them for the user. + public void resetDuplicatePathList() { + allPaths.clear(); + } + //////////////////////////////////////////////////////////////////////////// ///// + // Resets the path list(resetDuplicatePathList()), and writes a + // chunked document to disk using the specified index. + public void resetThenWrite(int idx) { + resetDuplicatePathList(); + wrtieToDisk(idx); + } + + //////////////////////////////////////////////////////////////////////////// ///// + // Returns the number of potential files we would have + // if all of them were written to disk. + public int getNumPotentialFiles() { + return numPotentialFiles; + } + /*** * Write to the disk once at time if the file is not there already * @param index @@ -203,20 +214,23 @@ public String wrtieToDisk(int index){ // Build string path. String outPath = workingDocPath.substring(0, workingDocPath.lastIndexOf(BBIni.getFileSep())) + BBIni.getFileSep() + Integer.toString(index) + ".xml"; - if(!(allPaths.contains(Integer.toString(index)))){ + if( !(allPaths.contains(Integer.toString(index))) ){ - Document curDoc=manageNimas(index); + // Break up document by level1 elements and retrieve the current one. + Document curDoc = manageNimas(index); + // Create file utility for saving our xml files. FileUtils fu = new FileUtils(); // Write file. fu.createXMLFile( curDoc, outPath ); allPaths.add(Integer.toString(index)); + + // Add this file to the temp list so it will be deleted later. + tempList.add(outPath); } return outPath; - - } /*** @@ -231,14 +245,39 @@ File temp = new File(sourcePath); //get all level1 element Nodes allNode=getLevel1(); + + // Store the number of files we would create if we + // ran through all of the indices. + numPotentialFiles = allNode.size(); + if (index<allNode.size()){ Node node=allNode.get(index); currentDoc=breakDocument(temp,node); + } + + // Get the number of <img> elements. + if(getImgCountList().size() == 0) + { + // Go through every <level1> element, and count the + // images. + for(int curLvl1 = 0; curLvl1 < allNode.size(); curLvl1++) + { + // Add the count. + Node nd = allNode.get(curLvl1); + addToNumImgsList( new Document((Element)nd.copy()), curLvl1); + } + // Save paths to files that we may create. + // Fill list. + if(epubFileList.size() == 0) { + for(int curF = 0; curF < numPotentialFiles; curF++) { + epubFileList.add(workingDocPath.substring(0, workingDocPath.lastIndexOf(BBIni.getFileSep())) + BBIni.getFileSep() + Integer.toString(curF) + ".xml"); + } + } } - return currentDoc; + return currentDoc; } @@ -359,60 +398,60 @@ } //////////////////////////////////////////////////////////////////////////// / - // Writes segmented NIMAS documents to disc and returns a list of their + // Writes segmented NIMAS documents to disk and returns a list of their // paths. - public ArrayList<String> writeNimasSegments() - { - // Grab list of documents after breaking them up by level1's. - ArrayList<Document> docs = manageNimas(); - - // Create file utility for saving our xml files. - FileUtils fu = new FileUtils(); - - // Path to xsl file. Add three slashes to avoid BS. - String xslPath = "file:///" + BBIni.getProgramDataPath() + BBIni.getFileSep() + "xsl" + BBIni.getFileSep() + "dtb2005html.xsl"; +// public ArrayList<String> writeNimasSegments() +// { +// // Grab list of documents after breaking them up by level1's. +// ArrayList<Document> docs = manageNimas(); +// +// // Create file utility for saving our xml files. +// FileUtils fu = new FileUtils(); +// +// // Path to xsl file. Add three slashes to avoid BS. +// String xslPath = "file:///" + BBIni.getProgramDataPath() + BBIni.getFileSep() + "xsl" + BBIni.getFileSep() + "dtb2005html.xsl"; +//// +//// // Build the xsl document. +// Document xslDoc = null; +// Builder builder = new Builder(); +// try { xslDoc = builder.build(xslPath); } +// catch (ValidityException e1) { e1.printStackTrace(); } +// catch (ParsingException e1) { e1.printStackTrace(); } +// catch (IOException e1) { e1.printStackTrace(); } +// +// // Create the transform. +// XSLTransform xslt = null; +// try { xslt = new XSLTransform(xslDoc); } +// catch (XSLException e1) { e1.printStackTrace(); } // -// // Build the xsl document. - Document xslDoc = null; - Builder builder = new Builder(); - try { xslDoc = builder.build(xslPath); } - catch (ValidityException e1) { e1.printStackTrace(); } - catch (ParsingException e1) { e1.printStackTrace(); } - catch (IOException e1) { e1.printStackTrace(); } - - // Create the transform. - XSLTransform xslt = null; - try { xslt = new XSLTransform(xslDoc); } - catch (XSLException e1) { e1.printStackTrace(); } - - // Loop through the documents, write to file, count images in each. - for(int curDoc = 0; curDoc < docs.size(); curDoc++) - { - // Finally transform the document. - Nodes newDocNodes = null; - try { newDocNodes = xslt.transform( docs.get(curDoc) ); } - catch (XSLException e) { e.printStackTrace(); } - Document transformedDoc = XSLTransform.toDocument(newDocNodes); - - // Build string path. - String outPath = workingDocPath.substring(0, workingDocPath.lastIndexOf(BBIni.getFileSep())) + BBIni.getFileSep() + Integer.toString(curDoc) + ".xhtml"; - - // Add path to list. - epubFileList.add(outPath); - - // Count the images in this document. - addToNumImgsList(docs.get(curDoc)); - - // Write file. - fu.createXMLFile( transformedDoc, outPath ); -// fu.createXMLFile( docs.get(curDoc), outPath ); - - } // for(int curDoc... - - // Create the opf file. - return epubFileList; - - } // writeNimasSegments() +// // Loop through the documents, write to file, count images in each. +// for(int curDoc = 0; curDoc < docs.size(); curDoc++) +// { +// // Finally transform the document. +// Nodes newDocNodes = null; +// try { newDocNodes = xslt.transform( docs.get(curDoc) ); } +// catch (XSLException e) { e.printStackTrace(); } +// Document transformedDoc = XSLTransform.toDocument(newDocNodes); +// +// // Build string path. +// String outPath = workingDocPath.substring(0, workingDocPath.lastIndexOf(BBIni.getFileSep())) + BBIni.getFileSep() + Integer.toString(curDoc) + ".xhtml"; +// +// // Add path to list. +// epubFileList.add(outPath); +// +// // Count the images in this document. +// addToNumImgsList(docs.get(curDoc)); +// +// // Write file. +// fu.createXMLFile( transformedDoc, outPath ); +//// fu.createXMLFile( docs.get(curDoc), outPath ); +// +// } // for(int curDoc... +// +// // Create the opf file. +// return epubFileList; +// +// } // writeNimasSegments() //////////////////////////////////////////////////////////////////////////// / // Helper: Uses list created with manageNimas() to create an OPF file for ======================================= --- /src/main/org/brailleblaster/perspectives/braille/Manager.java Thu Jul 31 15:34:17 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/Manager.java Thu Jul 31 18:51:41 2014 UTC @@ -749,8 +749,7 @@ if (arch.getCurrentConfig().equals("epub.cfg")){ text.insertNewNode(list.get(posList.get(posList.size() - 1)).end,"aside"); } - else{ - + else{ text.insertNewNode(list.get(posList.get(posList.size() - 1)).end,"prodnote"); } @@ -837,12 +836,11 @@ group.setRedraw(false); if (message.getValue("multiSelect").equals(false)) { handleStyleCursorSelected(message); - } else { handleStyleMultiSelected(message); } - - } else + } + else new Notify(lh.localValue("nothingToApply")); } /*** @@ -853,7 +851,7 @@ Element parent = parentStyle(list.getCurrent(), message); ArrayList<TextMapElement> itemList = list.findTextMapElements( list.getCurrentIndex(), parent, true); - adjustStyle(itemList, message); + adjustStyle(itemList, message,parent); } /*** @@ -881,7 +879,7 @@ Element parent = parentStyle(tempElement, styleMessage); ArrayList<TextMapElement> itemList = list.findTextMapElements(list.getNodeIndex(tempElement), parent, true); - adjustStyle( itemList,styleMessage); + adjustStyle( itemList,styleMessage,parent); } } @@ -892,7 +890,7 @@ * @param message : passing information regarding styles */ - private void adjustStyle(ArrayList<TextMapElement> itemList, Message message) { + private void adjustStyle(ArrayList<TextMapElement> itemList, Message message,Element parent) { int start = list.indexOf(itemList.get(0)); int end = list.indexOf(itemList.get(itemList.size() - 1)); int origPos = list.get(list.getNodeIndex(itemList.get(0))).start; @@ -928,11 +926,84 @@ (Integer) message.getValue("linesAfterOffset"), origPos); treeView.adjustItemStyle(list.getCurrent()); + if(((Styles)message.getValue("Style")).getName().equals("boxline")) + createBoxline(parent, message, itemList); group.setRedraw(true); } + + /** Wraps a block level element in the appropriate tag then translates and adds boxline brl top and bottom nodes + * @param p: parent of text nodes, the block element to be wrapped in a boxline + * @param m: message passed to views containing offset positions + * @param itemList: arraylist containing text nodes of the block element + */ + private void createBoxline(Element p, Message m, ArrayList<TextMapElement> itemList){ + Element wrapper = document.wrapElement(p, "boxline"); + if(wrapper != null){ + Element boxline = document.translateElement((Element)wrapper.copy()); + System.out.println(boxline.toXML().toString()); + int startPos = list.indexOf(itemList.get(0)); + + //find start position + int start, brailleStart; + if(m.contains("previousStyle") && ((Styles)m.getValue("previousStyle")).contains(StylesType.linesBefore)){ + start = (Integer)m.getValue("prev"); + brailleStart = (Integer)m.getValue("braillePrev"); + } + else { + start = itemList.get(0).start; + brailleStart = itemList.get(0).brailleList.getFirst().start; + } + + //insert top boxline + wrapper.insertChild(boxline.removeChild(0), 0); + BrlOnlyMapElement b1 = new BrlOnlyMapElement(wrapper.getChild(0), (Element)wrapper); + b1.setOffsets(start, start + b1.textLength()); + b1.setBrailleOffsets(brailleStart, brailleStart + b1.getText().length()); + vi.addElementToSection(list, b1, startPos); + + //set text + text.insertText(start, list.get(startPos).getText() + "\n"); + braille.insertText(brailleStart, list.get(startPos).brailleList.getFirst().value() + "\n"); + list.shiftOffsetsFromIndex(startPos + 1, list.get(startPos).getText().length() + 1, list.get(startPos).brailleList.getFirst().value().length() + 1, list.get(startPos + 1).start); + + //find end position + int endPos = list.indexOf(itemList.get(itemList.size() - 1)) + 1; + int end, brailleEnd; + if(m.contains("previousStyle") && ((Styles)m.getValue("previousStyle")).contains(StylesType.linesAfter)){ + end = (Integer)m.getValue("next") + b1.getText().length() + 1; + brailleEnd = (Integer)m.getValue("brailleNext") + b1.getText().length() + 1; + } + else { + end = list.get(endPos - 1).end; + brailleEnd = itemList.get(itemList.size() - 1).brailleList.getLast().end; + } + + //insert bottom boxline + wrapper.appendChild(boxline.removeChild(boxline.getChildCount() - 1)); + BrlOnlyMapElement b2 = new BrlOnlyMapElement(wrapper.getChild(wrapper.getChildCount() - 1), (Element)wrapper); + b2.setOffsets(end + 1, end + 1 + b2.textLength()); + b2.setBrailleOffsets(brailleEnd + 1, brailleEnd + 1 + b2.getText().length()); + vi.addElementToSection(list, b2, endPos); + + //set text + text.insertText(end, "\n" + list.get(endPos).getText()); + braille.insertText(brailleEnd, "\n" + list.get(endPos).brailleList.getFirst().value()); + list.shiftOffsetsFromIndex(endPos + 1, list.get(endPos).getText().length() + 1, list.get(endPos).brailleList.getFirst().value().length() + 1, list.get(endPos).start); + + //remove items from tree + for(int i = 0; i < itemList.size(); i++){ + treeView.removeItem(itemList.get(i), new Message(null)); + } + + //add aside or sidebar to tree + treeView.newTreeItem(list.get(startPos), treeView.getSelectionIndex(), 0); + handleSetCurrent(Message.createSetCurrentMessage(Sender.TREE, list.get(list.getCurrentIndex() + 1).start, false)); + dispatch(Message.createUpdateCursorsMessage(Sender.TREE)); + } + } public void saveAs(){ BBFileDialog dialog = new BBFileDialog(wp.getShell(), SWT.SAVE, arch.getFileTypes(), arch.getFileExtensions()); ======================================= --- /src/main/org/brailleblaster/perspectives/braille/stylepanel/StyleManager.ja va Thu Jul 31 15:38:44 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/stylepanel/StyleManager.ja va Thu Jul 31 18:51:41 2014 UTC @@ -50,7 +50,7 @@ public class StyleManager{ private StyleTable table; - private EditPanel editor; + private StylePanel editor; private String configFile; Manager dm; TextMapElement t; @@ -83,7 +83,10 @@ lastSelection = table.getTable().getSelectionIndex(); String style = table.getTable().getSelection()[0].getText(1); this.table.dispose(); - editor = new EditStyleView(this, dm.getGroup(), semanticsTable.get(style)); + if(semanticsTable.get(style).getName().equals("boxline")) + editor = new EditBoxLineView(this, dm.getGroup(), semanticsTable.get(style)); + else + editor = new EditStyleView(this, dm.getGroup(), semanticsTable.get(style)); dm.setTabList(); } @@ -102,7 +105,7 @@ public void apply(String item){ Message m = new Message(BBEvent.UPDATE_STYLE); Styles style = semanticsTable.get(item); - + if(style != null){ m.put("Style", style); if(dm.getText().isMultiSelected()==true) ======================================= --- /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 31 15:34:17 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 31 18:51:41 2014 UTC @@ -826,7 +826,7 @@ handleLineWrap(start, reformattedText, margin, style.contains(StylesType.firstLineIndent)); } - if(isFirst(n) && style.contains(StylesType.firstLineIndent)) + if(!(list.get(listIndex) instanceof BrlOnlyMapElement) && isFirst(n) && style.contains(StylesType.firstLineIndent)) setFirstLineIndent(start, style); if(style.contains(StylesType.format)) @@ -1515,86 +1515,89 @@ //Get previous style for comparison on adding or removing lines before or after Styles style = (Styles)m.getValue("style"); Styles previousStyle = (Styles)m.getValue("previousStyle"); - + boolean boxline = style.getName().equals("boxline"); + setListenerLock(true); //Reset indent, alignment, and emphasis - view.setLineIndent(view.getLineAtOffset(start), getLineNumber(start, view.getTextRange(start, (end - start))), 0); - view.setLineAlignment(view.getLineAtOffset(start), getLineNumber(start, view.getTextRange(start, (end - start))), SWT.LEFT); - setFontStyleRange(start, end - start, new StyleRange()); + if(!boxline){ + view.setLineIndent(view.getLineAtOffset(start), getLineNumber(start, view.getTextRange(start, (end - start))), 0); + view.setLineAlignment(view.getLineAtOffset(start), getLineNumber(start, view.getTextRange(start, (end - start))), SWT.LEFT); + setFontStyleRange(start, end - start, new StyleRange()); - if(!style.contains(StylesType.linesBefore) && previousStyle.contains(StylesType.linesBefore)) - removeLinesBefore(m); + if(!style.contains(StylesType.linesBefore) && previousStyle.contains(StylesType.linesBefore)) + removeLinesBefore(m); - if(!style.contains(StylesType.linesAfter) && previousStyle.contains(StylesType.linesAfter)) - removeLinesAfter(m); + if(!style.contains(StylesType.linesAfter) && previousStyle.contains(StylesType.linesAfter)) + removeLinesAfter(m); + } + start = (Integer)m.getValue("start"); end = (Integer)m.getValue("end"); int prev = (Integer)m.getValue("prev"); int next = (Integer)m.getValue("next"); - - for (Entry<StylesType, Object> entry : style.getEntrySet()) { - switch(entry.getKey()){ - case linesBefore: - int linesBeforeOffset; - if(start != prev){ - view.replaceTextRange(prev, (start - prev), ""); - length = start - prev; - } - spaces = Integer.valueOf((String)entry.getValue()); + if(!boxline){ + for (Entry<StylesType, Object> entry : style.getEntrySet()) { + switch(entry.getKey()){ + case linesBefore: + int linesBeforeOffset; + if(start != prev){ + view.replaceTextRange(prev, (start - prev), ""); + length = start - prev; + } + spaces = Integer.valueOf((String)entry.getValue()); - textBefore = makeInsertionString(spaces,'\n'); - linesBeforeOffset = spaces - length; + textBefore = makeInsertionString(spaces,'\n'); + linesBeforeOffset = spaces - length; - insertBefore(start - (start - prev), textBefore); - m.put("linesBeforeOffset", linesBeforeOffset); - start += linesBeforeOffset; - end += linesBeforeOffset; - if(next != -1) - next += linesBeforeOffset; - break; - case linesAfter: - length = 0; - int linesAfterOffset; - if(end != next && next != 0){ - view.replaceTextRange(end, (next - end), ""); - length = next - end; - } + insertBefore(start - (start - prev), textBefore); + m.put("linesBeforeOffset", linesBeforeOffset); + start += linesBeforeOffset; + end += linesBeforeOffset; + if(next != -1) + next += linesBeforeOffset; + break; + case linesAfter: + length = 0; + int linesAfterOffset; + if(end != next && next != 0){ + view.replaceTextRange(end, (next - end), ""); + length = next - end; + } - spaces = Integer.valueOf((String)entry.getValue()); - textBefore = makeInsertionString(spaces,'\n'); - insertBefore(end, textBefore); - linesAfterOffset = spaces - length; - m.put("linesAfterOffset", linesAfterOffset); - break; - case format: - setAlignment(start, end, style); - break; - case firstLineIndent: - if(Integer.valueOf((String)entry.getValue()) > 0 || style.contains(StylesType.leftMargin)) - setFirstLineIndent(start, style); - break; - case leftMargin: - if(style.contains(StylesType.firstLineIndent)) - handleLineWrap(start, view.getTextRange(start, (end - start)), Integer.valueOf((String)entry.getValue()), true); - else - handleLineWrap(start, view.getTextRange(start, (end - start)), Integer.valueOf((String)entry.getValue()), false); - break; + spaces = Integer.valueOf((String)entry.getValue()); + textBefore = makeInsertionString(spaces,'\n'); + insertBefore(end, textBefore); + linesAfterOffset = spaces - length; + m.put("linesAfterOffset", linesAfterOffset); + break; + case format: + setAlignment(start, end, style); + break; + case firstLineIndent: + if(Integer.valueOf((String)entry.getValue()) > 0 || style.contains(StylesType.leftMargin)) + setFirstLineIndent(start, style); + break; + case leftMargin: + if(style.contains(StylesType.firstLineIndent)) + handleLineWrap(start, view.getTextRange(start, (end - start)), Integer.valueOf((String)entry.getValue()), true); + else + handleLineWrap(start, view.getTextRange(start, (end - start)), Integer.valueOf((String)entry.getValue()), false); + break; + default: + break; + } - default: - break; - } - - int offset = (Integer)m.getValue("offset"); + int offset = (Integer)m.getValue("offset"); - //inline elements may have different emphasis, so all must be check seperately - for(int i = 0; i < list.size(); i++){ - Styles nodeStyle = stylesTable.makeStylesElement(list.get(i).parentElement(), list.get(i).n); - if(nodeStyle.contains(StylesType.emphasis)) - setFontStyleRange(list.get(i).start + offset, (list.get(i).end + offset) - (list.get(i).start + offset), (StyleRange)nodeStyle.get(StylesType.emphasis)); + //inline elements may have different emphasis, so all must be check seperately + for(int i = 0; i < list.size(); i++){ + Styles nodeStyle = stylesTable.makeStylesElement(list.get(i).parentElement(), list.get(i).n); + if(nodeStyle.contains(StylesType.emphasis)) + setFontStyleRange(list.get(i).start + offset, (list.get(i).end + offset) - (list.get(i).start + offset), (StyleRange)nodeStyle.get(StylesType.emphasis)); + } } - + setListenerLock(false); } - setListenerLock(false); } //private helper method used by adjust style ============================================================================ == Revision: 1e17b7a92010 Branch: default Author: Sahel "sahel.mastoureshgh@xxxxxxxxx" Date: Thu Jul 31 18:54:23 2014 UTC Log: Fixed merge conflicts second http://code.google.com/p/brailleblaster/source/detail?r=1e17b7a92010 Modified: /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java ======================================= --- /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 31 18:51:41 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Thu Jul 31 18:54:23 2014 UTC @@ -103,7 +103,12 @@ private PaintObjectListener paintObjListener; private int originalStart, originalEnd; private TextMapElement currentElement; + + int startSelection; + int endSelection; + private boolean multiSelected; + public TextView (Manager manager, Group documentWindow, BBSemanticsTable table) { super (manager, documentWindow, LEFT_MARGIN, RIGHT_MARGIN, TOP_MARGIN, BOTTOM_MARGIN, table); @@ -119,7 +124,16 @@ view.addSelectionListener(selectionListener = new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent e) { + selectionArray = view.getSelectionRanges(); + //Added this part for start and end of text selection + for (int i = 0; i < selectionArray.length-1; i++) { + startSelection=selectionArray[i]; + endSelection=selectionArray[i]+selectionArray[i+1]; + + + } + System.out.println(startSelection+" "+endSelection); if(selectionArray[1] > 0){ multiSelected=true; currentChar = ' ';