Ticket #2443: text_performance_r1.patch
File text_performance_r1.patch, 9.2 KB (added by boyanl, 15 years ago) |
---|
-
modules/org.sophie2.main.func.text/src/main/java/org/sophie2/main/func/text/TextFuncModule.java
### Eclipse Workspace Patch 1.0 #P sophie
100 100 ResourceR4.registerAsExtension(res, HotTextResourceR4.class); 101 101 102 102 // Logics 103 SimpleOperation.fillExtensions(res, TextModelLogic.class);104 103 SimpleOperation.fillExtensions(res, HotTextLogic.class); 105 104 SimpleOperation.fillExtensions(res, TextFrameLogic.class); 106 105 SimpleOperation.fillExtensions(res, TextChainingLogic.class); -
modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/mvc/TextModelLogic.java
96 96 HotLayoutPoint layoutPoint = new HotLayoutPoint(point, source.getIndex()); 97 97 int pos = textLayout.getHitIndex(layoutPoint); 98 98 99 if ( eventID == InputEventR3.MOUSE_PRESSED ||100 (eventID == InputEventR3.MOUSE_CLICKED && clickCount % 3 == 1) ) {99 if ( eventID == InputEventR3.MOUSE_PRESSED /*|| 100 (eventID == InputEventR3.MOUSE_CLICKED && clickCount % 3 == 1)*/) { 101 101 setSelection(source, pos, pos, true, source.getIndex()); 102 102 return false; 103 103 } -
modules/org.sophie2.main.func.text/src/main/java/org/sophie2/main/func/text/links/TextLinkProcessor.java
6 6 import org.sophie2.base.commons.util.ImmColor; 7 7 import org.sophie2.base.commons.util.ImmMap; 8 8 import org.sophie2.base.model.text.HotAttr; 9 import org.sophie2.base.model.text.TextChange; 9 10 import org.sophie2.base.model.text.TextReplaceChange; 10 11 import org.sophie2.base.model.text.elements.CommonAttr; 11 12 import org.sophie2.base.model.text.model.ImmTextInterval; … … 130 131 131 132 public DefaultTextEffect applyChange(TextProcessorEffect prevEffect, ImmText oldSource, 132 133 ImmText oldResult, TextLinkOptions procOptions) { 133 // TextChange change = prevEffect.getChange(); 134 // ImmText sourceText = prevEffect.getText(); 135 // ImmText toProcess = sourceText.subText(change.getTargetDamage(sourceText)); 136 // 137 // TextReplaceChange effect = new TextReplaceChange( 138 // change.getSourceDamage(oldSource), process(toProcess, procOptions)); 139 // 140 // ImmText result = effect.applyTo(oldResult); 141 // assert result.getEnd() == sourceText.getEnd() : result.getEnd() + " : " + sourceText.getEnd(); 142 // 143 // return new DefaultTextEffect(effect, result); 134 TextChange change = prevEffect.getChange(); 135 ImmText sourceText = prevEffect.getText(); 144 136 145 ImmText res = process(prevEffect.getText(), procOptions); 146 return new DefaultTextEffect(ImmTextUtils.getChange(oldResult, res), res); 137 ImmTextInterval targetDamage = change.getTargetDamage (sourceText); 138 ImmTextInterval sourceDamage = change.getSourceDamage(oldSource); 139 140 //check if the change is within the text, and if there is anything to process 141 if (targetDamage.getBegin() >= sourceText.getBegin() && 142 targetDamage.getEnd() <= sourceText.getEnd() && 143 ((sourceDamage.getBegin() < sourceDamage.getEnd ()) || 144 targetDamage.getBegin() < targetDamage.getEnd() ) 145 ) { 146 ImmText toProcess = sourceText.subText(change.getTargetDamage(sourceText)); 147 148 TextReplaceChange effect = new TextReplaceChange( 149 sourceDamage, process(toProcess, procOptions)); 150 151 ImmText result = effect.applyTo(oldResult); 152 // assert result.getEnd() == sourceText.getEnd() : result.getEnd() + " : " + sourceText.getEnd(); 153 154 return new DefaultTextEffect(effect, result); 155 } 156 //else { 157 int textBegin = sourceText.getBegin(); 158 TextReplaceChange effect = new TextReplaceChange(new ImmTextInterval(textBegin, textBegin), 159 ImmTextUtils.createEmptyText()); 160 return new DefaultTextEffect(effect, sourceText); 161 // } 147 162 } 148 163 149 164 public ImmText process(ImmText sourceText, TextLinkOptions procOptions) { … … 163 178 if (fgColor != null) { 164 179 165 180 values.put(CommonAttr.FOREGROUND_COLOR, fgColor); 166 unitStyle = unitStyle.derive(values); 167 168 // TODO performance could be better if the style is applied for a whole interval. 169 result = result.applyStyle(unitStyle, new ImmTextInterval(i, i+1)); 181 HotStyleDef style = HotStyleDef.getEmpty().derive (values); 182 183 /* 184 * Navigate until the end of the link in the text, then set the style for the whole interval 185 */ 186 int end = i+1; 187 while (end < sourceTextEnd) { 188 HotStyleDef nextStyle = sourceText.unitAt(end).getStyle(); 189 String nextLinkId = nextStyle.getValue (CommonAttr.LINK_ATTRIBUTE); 190 191 if (!nextLinkId.equals(linkId)) 192 break; 193 ++end; 194 } 195 196 result = result.applyStyle(style, new ImmTextInterval(i, end)); 197 i = end - 1; 170 198 } 171 199 } 172 200 } … … 193 221 } 194 222 195 223 } 224 -
modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/mvc/BaseTextModel.java
296 296 * The list of changes to be applied. 297 297 */ 298 298 protected void update(List<TextChange> changes) { 299 ImmText processed = null; 299 300 for (TextChange change : changes) { 300 301 301 302 SelectionInfo info = caretInfo().get(); … … 310 311 } 311 312 312 313 lastChange().set(change); 314 processed = getProcessed (); 313 315 } 314 processedText().set(getProcessed()); 316 317 if (processed != null) { 318 processedText().set(getProcessed()); 319 } 315 320 } 316 321 317 322 public void setSelectionInfo(int caretIndex, int markIndex) { -
modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/model/ImmHotText.java
114 114 newTextUnits = newTextUnits.remove(index); 115 115 } 116 116 117 int endRunIndex = getRunEnd(0);118 117 HotStyleDef newStyle = newStyles; 119 if (newText.getEnd() >= 1) { 120 TextUnit unit = newText.unitAt(0); 121 HotStyleDef style = unit.getStyle(); 122 newStyle = newStyle.derive(style); 123 } 124 118 125 119 for (int i = 0; i < newText.getEnd(); ++i, ++index) { 126 120 TextUnit unit = newText.unitAt(i); 127 if (i >= endRunIndex) { 128 HotStyleDef style = unit.getStyle(); 129 newStyle = newStyle.replaceDerive(style); 130 endRunIndex = getRunEnd(endRunIndex + 1); 131 } 132 121 newStyle = unit.getStyle(); 122 133 123 newTextUnits = 134 124 newTextUnits.add(index, new TextUnit(unit.getChar(), newStyle)); 135 125 } … … 242 232 return new ImmHotText(this.textUnits.concat(otherHotText.textUnits)); 243 233 } 244 234 235 @SuppressWarnings("unused") 245 236 private int getRunEnd(int i) { 246 237 if (this.getEnd() <= i) { 247 238 return i; -
modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/events/SceneInteractionLogic.java
145 145 boolean handled = false; 146 146 iterator = elementPath.listIterator(elementPath.size()); 147 147 while (iterator.hasPrevious() && !handled) { 148 element = iterator.previous(); 148 149 if (SceneHelper.getElementPath(scene, element).isEmpty()) { 149 150 // the scene has been changed and the element is no longer there 150 151 break; … … 163 164 164 165 handled = LogicR3.fire(new EventR3(fields)); 165 166 } 166 167 element = iterator.previous();168 167 } 169 168 170 169 // fire for top controller … … 260 259 fields.set(EventR3.ID_INDEX, eventId); 261 260 boolean handled = false; 262 261 while (iterator.hasPrevious() && !handled) { 262 element = iterator.previous(); 263 263 if (SceneHelper.getElementPath(scene, element).isEmpty()) { 264 264 // the scene has been changed and the element is no longer there 265 265 break; … … 282 282 283 283 handled = LogicR3.fire(eventR3); 284 284 } 285 286 element = iterator.previous();287 285 } 288 286 289 287 // fire for top controller