Skip to content

Commit c9fb338

Browse files
committed
Implemented storing state of resource tree.
1 parent de45de3 commit c9fb338

File tree

8 files changed

+238
-20
lines changed

8 files changed

+238
-20
lines changed

src/com/ss/editor/model/workspace/Workspace.java

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,18 @@
1919
import java.nio.file.LinkOption;
2020
import java.nio.file.Path;
2121
import java.nio.file.StandardOpenOption;
22+
import java.util.ArrayList;
2223
import java.util.HashMap;
24+
import java.util.List;
2325
import java.util.Map;
2426
import java.util.concurrent.atomic.AtomicInteger;
2527
import java.util.function.Supplier;
2628

2729
import rlib.logging.Logger;
2830
import rlib.logging.LoggerManager;
31+
import rlib.util.StringUtils;
32+
import rlib.util.array.Array;
33+
import rlib.util.array.ArrayFactory;
2934

3035
/**
3136
* The workspace.
@@ -34,7 +39,7 @@
3439
*/
3540
public class Workspace implements Serializable {
3641

37-
public static final long serialVersionUID = 61;
42+
public static final long serialVersionUID = 63;
3843

3944
private static final Logger LOGGER = LoggerManager.getLogger(Workspace.class);
4045

@@ -48,6 +53,11 @@ public class Workspace implements Serializable {
4853
*/
4954
private transient Path assetFolder;
5055

56+
/**
57+
* The list of expanded folders.
58+
*/
59+
private volatile List<String> expandedFolders;
60+
5161
/**
5262
* The table of opened files.
5363
*/
@@ -78,6 +88,12 @@ public void notifyRestored() {
7888

7989
if (editorStateMap == null) {
8090
editorStateMap = new HashMap<>();
91+
} else {
92+
editorStateMap.forEach((key, editorState) -> editorState.setChangeHandler(this::incrementChanges));
93+
}
94+
95+
if (expandedFolders == null) {
96+
expandedFolders = new ArrayList<>();
8197
}
8298
}
8399

@@ -113,6 +129,31 @@ private Map<String, EditorState> getEditorStateMap() {
113129
return editorStateMap;
114130
}
115131

132+
/**
133+
* @return the list of expanded folders.
134+
*/
135+
public synchronized Array<Path> getExpandedFolders() {
136+
137+
final Array<Path> result = ArrayFactory.newArray(Path.class);
138+
final Path assetFolder = getAssetFolder();
139+
140+
expandedFolders.forEach(path -> result.add(assetFolder.resolve(path)));
141+
142+
return result;
143+
}
144+
145+
/**
146+
* Update the list of expanded folders.
147+
*/
148+
public synchronized void updateExpandedFolders(final Array<Path> folders) {
149+
expandedFolders.clear();
150+
151+
final Path assetFolder = getAssetFolder();
152+
folders.forEach(path -> expandedFolders.add(assetFolder.relativize(path).toString()));
153+
154+
incrementChanges();
155+
}
156+
116157
/**
117158
* Get the editor state for the file.
118159
*
@@ -138,7 +179,10 @@ public synchronized <T extends EditorState> T getEditorState(@NotNull final Path
138179
final Map<String, EditorState> editorStateMap = getEditorStateMap();
139180

140181
if (stateFactory != null && !editorStateMap.containsKey(assetPath)) {
141-
editorStateMap.put(assetPath, stateFactory.get());
182+
final EditorState editorState = stateFactory.get();
183+
editorState.setChangeHandler(this::incrementChanges);
184+
editorStateMap.put(assetPath, editorState);
185+
incrementChanges();
142186
}
143187

144188
return unsafeCast(editorStateMap.get(assetPath));
@@ -161,14 +205,33 @@ public synchronized void updateEditorState(@NotNull final Path file, @NotNull fi
161205
/**
162206
* Remove the editor state.
163207
*/
164-
public synchronized void removeEditorState(@NotNull final Path file, @NotNull final EditorState editorState) {
208+
public synchronized void removeEditorState(@NotNull final Path file) {
165209

166210
final Path assetFile = EditorUtil.getAssetFile(getAssetFolder(), file);
167211
final String assetPath = EditorUtil.toAssetPath(assetFile);
168212

169213
final Map<String, EditorState> editorStateMap = getEditorStateMap();
170-
editorStateMap.remove(assetPath);
214+
if (editorStateMap.remove(assetPath) == null) return;
215+
216+
incrementChanges();
217+
}
218+
219+
/**
220+
* Update the editor state for moved/renamed file.
221+
*/
222+
public synchronized void updateEditorState(@NotNull final Path prevFile, @NotNull final Path newFile) {
223+
224+
final Path prevAssetFile = EditorUtil.getAssetFile(getAssetFolder(), prevFile);
225+
final String prevAssetPath = EditorUtil.toAssetPath(prevAssetFile);
226+
227+
final Map<String, EditorState> editorStateMap = getEditorStateMap();
228+
final EditorState editorState = editorStateMap.remove(prevAssetPath);
229+
if (editorState == null) return;
171230

231+
final Path newAssetFile = EditorUtil.getAssetFile(getAssetFolder(), newFile);
232+
final String newAssetPath = EditorUtil.toAssetPath(newAssetFile);
233+
234+
editorStateMap.put(newAssetPath, editorState);
172235
incrementChanges();
173236
}
174237

@@ -201,7 +264,8 @@ public synchronized void addOpenedFile(@NotNull final Path file, @NotNull final
201264
final EditorDescription description = fileEditor.getDescription();
202265

203266
final Map<String, String> openedFiles = getOpenedFiles();
204-
openedFiles.put(assetPath, description.getEditorId());
267+
final String previous = openedFiles.put(assetPath, description.getEditorId());
268+
if (StringUtils.equals(previous, description.getEditorId())) return;
205269

206270
incrementChanges();
207271
}
@@ -286,7 +350,7 @@ public void save() {
286350

287351
channel.write(buffer);
288352

289-
} catch (IOException e) {
353+
} catch (final IOException e) {
290354
LOGGER.warning(e);
291355
}
292356
}

src/com/ss/editor/ui/component/asset/AssetComponent.java

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.ss.editor.ui.component.asset;
22

33
import com.ss.editor.config.EditorConfig;
4+
import com.ss.editor.manager.ExecutorManager;
5+
import com.ss.editor.manager.WorkspaceManager;
6+
import com.ss.editor.model.workspace.Workspace;
47
import com.ss.editor.ui.component.ScreenComponent;
58
import com.ss.editor.ui.component.asset.tree.ResourceTree;
9+
import com.ss.editor.ui.component.asset.tree.resource.FolderElement;
610
import com.ss.editor.ui.component.asset.tree.resource.ResourceElement;
711
import com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory;
812
import com.ss.editor.ui.css.CSSIds;
@@ -36,6 +40,7 @@ public class AssetComponent extends VBox implements ScreenComponent {
3640

3741
private static final Insets TREE_OFFSET = new Insets(6, 3, 0, 0);
3842

43+
private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance();
3944
private static final FXEventManager FX_EVENT_MANAGER = FXEventManager.getInstance();
4045

4146
/**
@@ -53,6 +58,11 @@ public class AssetComponent extends VBox implements ScreenComponent {
5358
*/
5459
private ResourceTree resourceTree;
5560

61+
/**
62+
* The flag for ignoring expand changes.
63+
*/
64+
private boolean ignoreExpanded;
65+
5666
public AssetComponent() {
5767
this.waitedFilesToSelect = ArrayFactory.newArray(Path.class);
5868
setId(CSSIds.ASSET_COMPONENT);
@@ -102,6 +112,11 @@ private void processEvent(final MovedFileEvent event) {
102112

103113
final ResourceTree resourceTree = getResourceTree();
104114
resourceTree.notifyMoved(prevFile, newFile);
115+
116+
final WorkspaceManager workspaceManager = WorkspaceManager.getInstance();
117+
final Workspace workspace = workspaceManager.getCurrentWorkspace();
118+
if (workspace == null) return;
119+
workspace.updateEditorState(prevFile, newFile);
105120
}
106121

107122
/**
@@ -114,6 +129,11 @@ private void processEvent(final RenamedFileEvent event) {
114129

115130
final ResourceTree resourceTree = getResourceTree();
116131
resourceTree.notifyRenamed(prevFile, newFile);
132+
133+
final WorkspaceManager workspaceManager = WorkspaceManager.getInstance();
134+
final Workspace workspace = workspaceManager.getCurrentWorkspace();
135+
if (workspace == null) return;
136+
workspace.updateEditorState(prevFile, newFile);
117137
}
118138

119139
/**
@@ -142,6 +162,11 @@ private void processEvent(final DeletedFileEvent event) {
142162

143163
final ResourceTree resourceTree = getResourceTree();
144164
resourceTree.notifyDeleted(file);
165+
166+
final WorkspaceManager workspaceManager = WorkspaceManager.getInstance();
167+
final Workspace workspace = workspaceManager.getCurrentWorkspace();
168+
if (workspace == null) return;
169+
workspace.removeEditorState(file);
145170
}
146171

147172
/**
@@ -169,9 +194,12 @@ private void processRefresh() {
169194
* Create components.
170195
*/
171196
private void createComponents() {
197+
setIgnoreExpanded(true);
172198

173199
this.barComponent = new AssetBarComponent();
174200
this.resourceTree = new ResourceTree(false);
201+
this.resourceTree.setExpandHandler(this::updateExpanded);
202+
this.resourceTree.setOnLoadHandler(this::handleTreeLoading);
175203

176204
//FIXME пока он не нужен
177205
//FXUtils.addToPane(barComponent, this);
@@ -182,6 +210,62 @@ private void createComponents() {
182210
VBox.setMargin(resourceTree, TREE_OFFSET);
183211
}
184212

213+
/**
214+
* Handle changing loading state of the tree.
215+
*/
216+
private void handleTreeLoading(final Boolean finished) {
217+
218+
final WorkspaceManager workspaceManager = WorkspaceManager.getInstance();
219+
final Workspace workspace = workspaceManager.getCurrentWorkspace();
220+
221+
if (finished && workspace != null) {
222+
final Array<Path> expandedFolders = workspace.getExpandedFolders();
223+
expandedFolders.forEach(path -> resourceTree.expandTo(path, false));
224+
}
225+
226+
if (finished) {
227+
EXECUTOR_MANAGER.addFXTask(() -> setIgnoreExpanded(false));
228+
} else {
229+
setIgnoreExpanded(true);
230+
}
231+
}
232+
233+
/**
234+
* @return true if the expand listener is ignored.
235+
*/
236+
public boolean isIgnoreExpanded() {
237+
return ignoreExpanded;
238+
}
239+
240+
/**
241+
* @param ignoreExpanded the flag for ignoring expand changes.
242+
*/
243+
public void setIgnoreExpanded(final boolean ignoreExpanded) {
244+
this.ignoreExpanded = ignoreExpanded;
245+
}
246+
247+
/**
248+
* Handle changes count of expanded folders.
249+
*/
250+
private void updateExpanded(final int count, final ResourceTree tree) {
251+
if (isIgnoreExpanded()) return;
252+
253+
final WorkspaceManager workspaceManager = WorkspaceManager.getInstance();
254+
final Workspace workspace = workspaceManager.getCurrentWorkspace();
255+
if (workspace == null) return;
256+
257+
final Array<Path> expanded = ArrayFactory.newArray(Path.class);
258+
final Array<TreeItem<ResourceElement>> allItems = UIUtils.getAllItems(tree);
259+
allItems.stream().filter(TreeItem::isExpanded)
260+
.filter(treeItem -> !treeItem.isLeaf())
261+
.map(TreeItem::getValue)
262+
.filter(element -> element instanceof FolderElement)
263+
.map(ResourceElement::getFile)
264+
.forEach(expanded::add);
265+
266+
workspace.updateExpandedFolders(expanded);
267+
}
268+
185269
/**
186270
* @return the toolbar of this component.
187271
*/

0 commit comments

Comments
 (0)