29
29
import java .util .Arrays ;
30
30
import java .util .HashMap ;
31
31
import java .util .Iterator ;
32
+ import java .util .LinkedList ;
32
33
import java .util .List ;
33
34
import java .util .Map ;
34
35
import java .util .ResourceBundle ;
154
155
import org .eclipse .jface .text .ITextViewerExtension8 .EnrichMode ;
155
156
import org .eclipse .jface .text .IUndoManager ;
156
157
import org .eclipse .jface .text .IUndoManagerExtension ;
158
+ import org .eclipse .jface .text .MultiTextSelection ;
157
159
import org .eclipse .jface .text .Position ;
158
160
import org .eclipse .jface .text .Region ;
159
161
import org .eclipse .jface .text .TabsToSpacesConverter ;
@@ -291,7 +293,8 @@ public abstract class AbstractTextEditor extends EditorPart implements ITextEdit
291
293
protected static final String TAG_SELECTION_OFFSET = "selectionOffset" ; //$NON-NLS-1$
292
294
293
295
/**
294
- * Tag used in the {@link IMemento} when saving and restoring the editor's selection length.
296
+ * Tag used in the {@link IMemento} when saving and restoring the editor's
297
+ * selection length.
295
298
*
296
299
* @see #saveState(IMemento)
297
300
* @see #restoreState(IMemento)
@@ -7049,9 +7052,15 @@ public void restoreState(IMemento memento) {
7049
7052
@ Override
7050
7053
public void saveState (IMemento memento ) {
7051
7054
ISelection selection = doGetSelection ();
7052
- if (selection instanceof ITextSelection ) {
7053
- memento .putInteger (TAG_SELECTION_OFFSET , ((ITextSelection )selection ).getOffset ());
7054
- memento .putInteger (TAG_SELECTION_LENGTH , ((ITextSelection )selection ).getLength ());
7055
+ if (selection instanceof IMultiTextSelection multiSelect && multiSelect .getRegions ().length > 1 ) {
7056
+ for (int i = 0 ; i < multiSelect .getRegions ().length ; i ++) {
7057
+ memento .putInteger (TAG_SELECTION_OFFSET + i , multiSelect .getRegions ()[i ].getOffset ());
7058
+ memento .putInteger (TAG_SELECTION_LENGTH + i , multiSelect .getRegions ()[i ].getLength ());
7059
+ }
7060
+
7061
+ } else if (selection instanceof ITextSelection singleSelect ) {
7062
+ memento .putInteger (TAG_SELECTION_OFFSET , singleSelect .getOffset ());
7063
+ memento .putInteger (TAG_SELECTION_LENGTH , singleSelect .getLength ());
7055
7064
}
7056
7065
final StyledText textWidget = fSourceViewer .getTextWidget ();
7057
7066
memento .putInteger (TAG_SELECTION_TOP_PIXEL , textWidget .getTopPixel ());
@@ -7068,6 +7077,9 @@ public void saveState(IMemento memento) {
7068
7077
* @since 3.3
7069
7078
*/
7070
7079
protected boolean containsSavedState (IMemento memento ) {
7080
+ if (memento .getInteger (TAG_SELECTION_OFFSET + "0" ) != null ) { //$NON-NLS-1$
7081
+ return true ;
7082
+ }
7071
7083
return memento .getInteger (TAG_SELECTION_OFFSET ) != null && memento .getInteger (TAG_SELECTION_LENGTH ) != null ;
7072
7084
}
7073
7085
@@ -7080,15 +7092,11 @@ protected boolean containsSavedState(IMemento memento) {
7080
7092
* @since 3.3
7081
7093
*/
7082
7094
protected void doRestoreState (IMemento memento ) {
7083
- Integer offset = memento .getInteger (TAG_SELECTION_OFFSET );
7084
- if (offset == null )
7085
- return ;
7086
-
7087
- Integer length = memento .getInteger (TAG_SELECTION_LENGTH );
7088
- if (length == null )
7095
+ ISelection savedSelection = readSelectionFromMemento (memento );
7096
+ if (savedSelection == null ) {
7089
7097
return ;
7090
-
7091
- doSetSelection (new TextSelection ( offset . intValue (), length . intValue ()) );
7098
+ }
7099
+ doSetSelection (savedSelection );
7092
7100
7093
7101
final StyledText textWidget = fSourceViewer .getTextWidget ();
7094
7102
@@ -7101,6 +7109,40 @@ protected void doRestoreState(IMemento memento) {
7101
7109
textWidget .setHorizontalPixel (horizontalPixel .intValue ());
7102
7110
}
7103
7111
7112
+ @ SuppressWarnings ("boxing" )
7113
+ private ISelection readSelectionFromMemento (IMemento memento ) {
7114
+ if (memento .getInteger (TAG_SELECTION_OFFSET + "0" ) != null ) { //$NON-NLS-1$
7115
+ LinkedList <IRegion > regions = new LinkedList <>();
7116
+ int regionCounter = 0 ;
7117
+ while (memento .getInteger (TAG_SELECTION_OFFSET + regionCounter ) != null ) {
7118
+ Integer offset = memento .getInteger (TAG_SELECTION_OFFSET + regionCounter );
7119
+ if (offset == null ) {
7120
+ continue ;
7121
+ }
7122
+
7123
+ Integer length = memento .getInteger (TAG_SELECTION_LENGTH + regionCounter );
7124
+ if (length == null ) {
7125
+ continue ;
7126
+ }
7127
+ regions .add (new Region (offset , length ));
7128
+ regionCounter ++;
7129
+ }
7130
+ return new MultiTextSelection (getDocumentProvider ().getDocument (getEditorInput ()),
7131
+ regions .toArray (new IRegion [0 ]));
7132
+ } else {
7133
+ Integer offset = memento .getInteger (TAG_SELECTION_OFFSET );
7134
+ if (offset == null ) {
7135
+ return null ;
7136
+ }
7137
+
7138
+ Integer length = memento .getInteger (TAG_SELECTION_LENGTH );
7139
+ if (length == null ) {
7140
+ return null ;
7141
+ }
7142
+ return new TextSelection (offset , length );
7143
+ }
7144
+ }
7145
+
7104
7146
@ Override
7105
7147
public Saveable [] getSaveables () {
7106
7148
if (fSavable == null )
0 commit comments