blob: a2b9d1fe42ea108e68a4687559d536441cb23683 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Lucas Koehler - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.fx.internal.projects;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.emfstore.client.ESLocalProject;
import org.eclipse.emf.emfstore.client.ESWorkspace;
import org.eclipse.emf.emfstore.client.ESWorkspaceProvider;
import org.eclipse.emf.emfstore.client.observer.ESCheckoutObserver;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.ModelPackage;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESWorkspaceImpl;
import org.eclipse.emf.emfstore.internal.common.model.IdEObjectCollection;
import org.eclipse.emf.emfstore.internal.common.model.util.IdEObjectCollectionChangeObserver;
import org.eclipse.fx.emf.edit.ui.AdapterFactoryTreeItem;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.MultipleSelectionModel;
import javafx.scene.control.SelectionModel;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
class EmfStoreLocalTreeItem extends TreeItem<Object> {
private final ProjectsView projectsView;
private final ObservableList<TreeItem<Object>> children;
private final TreeView<Object> view;
EmfStoreLocalTreeItem(ProjectsView projectsView, final ESWorkspace root,
TreeView<Object> view) {
super(root);
this.projectsView = projectsView;
this.view = view;
children = FXCollections
.unmodifiableObservableList(super.getChildren());
ESWorkspaceImpl.class.cast(root).toInternalAPI().eAdapters()
.add(new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
super.notifyChanged(msg);
if (ModelPackage.eINSTANCE.getWorkspace_ProjectSpaces()
.equals(msg.getFeature())) {
updatedWorkspace(root, getExpandedItems(),
getSelectedItems(getSelectionModel()), getSelectionModel());
}
}
});
updatedWorkspace(root, getExpandedItems(),
getSelectedItems(getSelectionModel()), getSelectionModel());
}
@SuppressWarnings("restriction")
EmfStoreLocalTreeItem(ProjectsView projectsView, final ESLocalProject root,
TreeView<Object> view) {
super(root);
this.projectsView = projectsView;
this.view = view;
children = FXCollections
.unmodifiableObservableList(super.getChildren());
updateProject(root, getExpandedItems(),
getSelectedItems(getSelectionModel()), getSelectionModel());
ESWorkspaceProviderImpl.getObserverBus().register(
new ESCheckoutObserver() {
@Override
public void checkoutDone(ESLocalProject project) {
updatedWorkspace(ESWorkspaceProvider.INSTANCE.getWorkspace(), getExpandedItems(),
getSelectedItems(getSelectionModel()), getSelectionModel());
}
});
ESLocalProjectImpl.class.cast(root).toInternalAPI().getProject()
.addIdEObjectCollectionChangeObserver(new IdEObjectCollectionChangeObserver() {
@Override
public void notify(Notification notification,
IdEObjectCollection collection, EObject modelElement) {
// TODO Auto-generated method stub
}
@Override
public void modelElementRemoved(IdEObjectCollection collection,
EObject eObject) {
updateProject(root, getExpandedItems(), getSelectedItems(getSelectionModel()), getSelectionModel());
}
@Override
public void modelElementAdded(IdEObjectCollection collection,
EObject eObject) {
updateProject(root, getExpandedItems(), getSelectedItems(getSelectionModel()), getSelectionModel());
}
@Override
public void collectionDeleted(IdEObjectCollection collection) {
// TODO Auto-generated method stub
}
});
}
@Override
public ObservableList<TreeItem<Object>> getChildren() {
return children;
}
private MultipleSelectionModel<?> getSelectionModel() {
return view.getSelectionModel();
}
private List<Object> getExpandedItems() {
// ObservableList<TreeItem<Object>> childTreeItems = super.getChildren();
final ArrayList<Object> expandedItems = new ArrayList<>();
// // remember the expanded items
// for (TreeItem<Object> childTreeItem : childTreeItems) {
// if (childTreeItem.isExpanded())
// expandedItems.add(childTreeItem.getValue());
// }
return expandedItems;
}
//
private List<Object> getSelectedItems(MultipleSelectionModel<?> selectionModel) {
// ObservableList<TreeItem<Object>> childTreeItems = super.getChildren();
// List<?> selection = selectionModel.getSelectedItems();
//
final ArrayList<Object> selectedItems = new ArrayList<>();
// ArrayList<TreeItem<?>> selectedTreeItems = new ArrayList<>();
//
// // remember the selected items
// for (Object selectedTreeItem : selection) {
// for (TreeItem<Object> childTreeItem : childTreeItems) {
// if (selectedTreeItem == childTreeItem) {
// selectedTreeItems.add(childTreeItem);
// selectedItems.add(childTreeItem.getValue());
// }
// }
// }
//
// // clear the selection
// for (TreeItem<?> selectedTreeItem : selectedTreeItems) {
// int treeItemIndex = selectionModel.getSelectedItems().indexOf(
// selectedTreeItem);
// int selectionIndex = selectionModel.getSelectedIndices().get(
// treeItemIndex);
// selectionModel.clearSelection(selectionIndex);
// }
//
return selectedItems;
}
// private void updateTree(Object child, TreeItem<?> treeItem,
// List<Object> expandedItems, List<Object> selectedItems,
// SelectionModel<?> selectionModel) {
// // expand the new tree items
// if (expandedItems.contains(child))
// treeItem.setExpanded(true);
//
// // restore the selection
// if (selectedItems.contains(child)
// && "javafx.scene.control.TreeView$TreeViewBitSetSelectionModel"
// .equals(selectionModel.getClass().getName())) {
// try {
// Method m = selectionModel.getClass().getDeclaredMethod(
// "select", new Class[] { TreeItem.class });
// m.setAccessible(true);
// m.invoke(selectionModel, treeItem);
// } catch (Exception e) {
// // do nothing
// }
// }
// }
private void updatedWorkspace(ESWorkspace selectedValue,
List<Object> expandedItems, List<Object> selectedItems,
SelectionModel<?> selectionModel) {
final ObservableList<TreeItem<Object>> childTreeItems = super.getChildren();
childTreeItems.clear();
for (final ESLocalProject localProject : selectedValue.getLocalProjects()) {
final EmfStoreLocalTreeItem treeItem = new EmfStoreLocalTreeItem(
projectsView, localProject, view);
childTreeItems.add(treeItem);
// updateTree(localProject, treeItem, expandedItems, selectedItems,
// selectionModel);
}
}
// private void updateEObjects(Object selectedValue,
// ArrayList<Object> expandedItems, ArrayList<Object> selectedItems,
// MultipleSelectionModel<?> selectionModel) {
// Object adapter = this.projectsView.adapterFactory.adapt(selectedValue,
// ITreeItemContentProvider.class);
// ITreeItemContentProvider provider = (adapter instanceof ITreeItemContentProvider) ? (ITreeItemContentProvider)
// adapter
// : null;
//
// ObservableList<TreeItem<Object>> childTreeItems = super.getChildren();
// for (Object child : provider.getChildren(getValue())) {
// AdapterFactoryTreeItem treeItem = new AdapterFactoryTreeItem(child,
// view, this.projectsView.adapterFactory);
//
// childTreeItems.add(treeItem);
// // updateTree(child, treeItem, expandedItems, selectedItems,
// // selectionModel);
// }
// }
private void updateProject(ESLocalProject selectedValue,
List<Object> expandedItems, List<Object> selectedItems,
MultipleSelectionModel<?> selectionModel) {
final ObservableList<TreeItem<Object>> childTreeItems = super.getChildren();
childTreeItems.clear();
for (final Object child : selectedValue.getModelElements()) {
final AdapterFactoryTreeItem treeItem = new AdapterFactoryTreeItem(child,
projectsView.adapterFactory);
childTreeItems.add(treeItem);
// updateTree(child, treeItem, expandedItems, selectedItems,
// selectionModel);
}
}
}