提交 22faa186 编写于 作者: S Serge Rider

#91 Navigator nodes reorder. Events model refactoring.

上级 314c02c9
......@@ -31,6 +31,7 @@ import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNEvent;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -134,7 +135,7 @@ public class NavigatorHandlerRefresh extends AbstractHandler {
}
setName("Refresh '" + node.getNodeName() + "'...");
try {
DBNNode refreshed = node.refreshNode(monitor, DBNNode.FORCE_REFRESH);
DBNNode refreshed = node.refreshNode(monitor, DBNEvent.FORCE_REFRESH);
if (refreshed != null) {
refreshedSet.add(refreshed);
}
......
......@@ -112,7 +112,7 @@ public class ItemListControl extends NodeListControl
break;
}
}
if (hasReorder && false) {
if (hasReorder) {
contributionManager.add(new Separator());
contributionManager.add(ActionUtils.makeCommandContribution(
workbenchSite,
......
......@@ -85,7 +85,7 @@ public class DatabaseEditorListener implements INavigatorListener
databaseEditor.refreshPart(
event,
event.getNodeChange() == DBNEvent.NodeChange.REFRESH &&
event.getSource() == DBNNode.FORCE_REFRESH);
event.getSource() == DBNEvent.FORCE_REFRESH);
}
};
}
......
......@@ -43,6 +43,7 @@ import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.impl.edit.DBECommandAdapter;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseFolder;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNEvent;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.*;
import org.jkiss.dbeaver.model.sql.SQLUtils;
......@@ -291,7 +292,7 @@ public class EntityEditor extends MultiPageDatabaseEditor
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
try {
treeNode.refreshNode(monitor, DBNNode.FORCE_REFRESH);
treeNode.refreshNode(monitor, DBNEvent.FORCE_REFRESH);
} catch (DBException e) {
throw new InvocationTargetException(e);
}
......
......@@ -33,6 +33,8 @@ public class DBPEvent
OBJECT_SELECT,
}
public static final Object REORDER = new Object();
private Action action;
private DBSObject object;
......
......@@ -452,7 +452,7 @@ public abstract class SQLObjectEditor<OBJECT_TYPE extends DBSObject, CONTAINER_T
sibling.setOrdinalPosition(siblingPosition + 1);
}
} else {
if (siblingPosition < command.newPosition && siblingPosition > command.oldPosition) {
if (siblingPosition <= command.newPosition && siblingPosition > command.oldPosition) {
sibling.setOrdinalPosition(siblingPosition - 1);
}
}
......@@ -462,8 +462,11 @@ public abstract class SQLObjectEditor<OBJECT_TYPE extends DBSObject, CONTAINER_T
// Update target object position
((DBPOrderedObject) object).setOrdinalPosition(command.newPosition);
// Refresh object AND parent
DBUtils.fireObjectUpdate(object);
DBUtils.fireObjectUpdate(object.getParentObject());
final DBSObject parentObject = object.getParentObject();
if (parentObject != null) {
// We need to update order in navigator model
DBUtils.fireObjectUpdate(parentObject, DBPEvent.REORDER);
}
}
@Override
......
......@@ -186,7 +186,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
if (childNodes == null && hasChildren(false)) {
if (this.initializeNode(monitor, null)) {
final List<DBNDatabaseNode> tmpList = new ArrayList<>();
loadChildren(monitor, getMeta(), null, tmpList);
loadChildren(monitor, getMeta(), null, tmpList, true);
if (!monitor.isCanceled()) {
if (tmpList.isEmpty()) {
this.childNodes = EMPTY_NODES;
......@@ -261,6 +261,13 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
clearChildren(reflect);
}
/**
* Reorder children nodes
*/
public void updateChildrenOrder(DBRProgressMonitor monitor, boolean reflect) throws DBException {
refreshNodeContent(monitor, getObject(), this, reflect);
}
public boolean needsInitialization()
{
return childNodes == null && hasChildren(false);
......@@ -309,7 +316,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
}
return null;
} else {
refreshNodeContent(monitor, newObject, source);
refreshNodeContent(monitor, newObject, source, true);
return this;
}
} else {
......@@ -322,7 +329,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
}
}
private void refreshNodeContent(final DBRProgressMonitor monitor, DBSObject newObject, Object source)
private void refreshNodeContent(final DBRProgressMonitor monitor, DBSObject newObject, Object source, boolean reflect)
throws DBException
{
if (isDisposed()) {
......@@ -334,18 +341,17 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
if (newObject != getObject()) {
reloadObject(monitor, newObject);
}
model.fireNodeUpdate(source, this, DBNEvent.NodeChange.LOCK);
if (reflect) model.fireNodeUpdate(source, this, DBNEvent.NodeChange.LOCK);
this.reloadChildren(monitor);
this.reloadChildren(monitor, reflect);
model.fireNodeUpdate(source, this, DBNEvent.NodeChange.REFRESH);
if (reflect) model.fireNodeUpdate(source, this, DBNEvent.NodeChange.REFRESH);
} finally {
this.locked = false;
// Unlock node
model.fireNodeUpdate(source, this, DBNEvent.NodeChange.UNLOCK);
if (reflect) model.fireNodeUpdate(source, this, DBNEvent.NodeChange.UNLOCK);
}
//new RefreshJob("Refresh node " + getNodeName()).schedule();
}
protected void clearChildren(boolean reflect)
......@@ -366,7 +372,8 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
DBRProgressMonitor monitor,
final DBXTreeNode meta,
final DBNDatabaseNode[] oldList,
final List<DBNDatabaseNode> toList)
final List<DBNDatabaseNode> toList,
boolean reflect)
throws DBException
{
if (monitor.isCanceled()) {
......@@ -387,11 +394,11 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
monitor.subTask(ModelMessages.model_navigator_load_ + " " + child.getChildrenType(getObject().getDataSource()));
if (child instanceof DBXTreeItem) {
final DBXTreeItem item = (DBXTreeItem) child;
boolean isLoaded = loadTreeItems(monitor, item, oldList, toList);
boolean isLoaded = loadTreeItems(monitor, item, oldList, toList, reflect);
if (!isLoaded && item.isOptional() && item.getRecursiveLink() == null) {
// This may occur only if no child nodes was read
// Then we try to go on next DBX level
loadChildren(monitor, item, oldList, toList);
loadChildren(monitor, item, oldList, toList, reflect);
}
} else if (child instanceof DBXTreeFolder) {
if (oldList == null) {
......@@ -401,7 +408,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
} else {
for (DBNDatabaseNode oldFolder : oldList) {
if (oldFolder.getMeta() == child) {
oldFolder.reloadChildren(monitor);
oldFolder.reloadChildren(monitor, reflect);
toList.add(oldFolder);
break;
}
......@@ -415,7 +422,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
} else {
for (DBNDatabaseNode oldObject : oldList) {
if (oldObject.getMeta() == child) {
oldObject.reloadChildren(monitor);
oldObject.reloadChildren(monitor, reflect);
toList.add(oldObject);
break;
}
......@@ -428,7 +435,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
}
monitor.done();
if (filtered) {
if (reflect && filtered) {
getModel().fireNodeUpdate(this, this, DBNEvent.NodeChange.REFRESH);
}
}
......@@ -440,6 +447,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
* @param meta items meta info
* @param oldList previous child items
* @param toList list ot add new items @return true on success
* @param reflect
* @return true on success
* @throws DBException on any DB error
*/
......@@ -447,7 +455,8 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
DBRProgressMonitor monitor,
DBXTreeItem meta,
final DBNDatabaseNode[] oldList,
final List<DBNDatabaseNode> toList)
final List<DBNDatabaseNode> toList,
boolean reflect)
throws DBException
{
if (this.isDisposed()) {
......@@ -515,9 +524,11 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
if (oldChild.hasChildren(false) && !oldChild.needsInitialization()) {
// Refresh children recursive
oldChild.reloadChildren(monitor);
oldChild.reloadChildren(monitor, reflect);
}
if (reflect) {
getModel().fireNodeUpdate(this, oldChild, DBNEvent.NodeChange.REFRESH);
}
getModel().fireNodeUpdate(this, oldChild, DBNEvent.NodeChange.REFRESH);
toList.add(oldChild);
added = true;
......@@ -656,7 +667,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
return pathName.toString();
}
protected void reloadChildren(DBRProgressMonitor monitor)
protected void reloadChildren(DBRProgressMonitor monitor, boolean reflect)
throws DBException
{
DBNDatabaseNode[] oldChildren;
......@@ -668,7 +679,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP
oldChildren = Arrays.copyOf(childNodes, childNodes.length);
}
List<DBNDatabaseNode> newChildren = new ArrayList<>();
loadChildren(monitor, getMeta(), oldChildren, newChildren);
loadChildren(monitor, getMeta(), oldChildren, newChildren, reflect);
synchronized (this) {
childNodes = newChildren.toArray(new DBNDatabaseNode[newChildren.size()]);
}
......
......@@ -23,6 +23,9 @@ import org.jkiss.code.NotNull;
* Navigator model event
*/
public class DBNEvent {
public static final Object FORCE_REFRESH = new Object();
public enum Action
{
ADD,
......
......@@ -39,8 +39,6 @@ public abstract class DBNNode implements DBPNamedObject, DBPPersistedObject, IAd
{
static final Log log = Log.getLog(DBNNode.class);
public static final Object FORCE_REFRESH = new Object();
public enum NodePathType {
resource,
folder,
......
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.model.navigator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
......@@ -26,6 +27,7 @@ import org.jkiss.dbeaver.model.messages.ModelMessages;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.utils.GeneralUtils;
import java.util.*;
......@@ -301,14 +303,14 @@ public class DBNProjectDatabases extends DBNNode implements DBNContainer, DBPEve
case OBJECT_UPDATE:
case OBJECT_SELECT:
{
DBNNode dbmNode = model.getNodeByObject(event.getObject());
DBNDatabaseNode dbmNode = model.getNodeByObject(event.getObject());
if (dbmNode != null) {
DBNEvent.NodeChange nodeChange;
Boolean enabled = event.getEnabled();
Object source = this;
if (event.getAction() == DBPEvent.Action.OBJECT_SELECT) {
nodeChange = DBNEvent.NodeChange.REFRESH;
if (enabled != null && enabled) source = FORCE_REFRESH;
if (enabled != null && enabled) source = DBNEvent.FORCE_REFRESH;
} else {
if (enabled != null) {
if (enabled) {
......@@ -319,6 +321,13 @@ public class DBNProjectDatabases extends DBNNode implements DBNContainer, DBPEve
} else {
nodeChange = DBNEvent.NodeChange.REFRESH;
}
if (event.getData() == DBPEvent.REORDER) {
try {
dbmNode.updateChildrenOrder(VoidProgressMonitor.INSTANCE, false);
} catch (DBException e) {
log.error(e);
}
}
}
model.fireNodeUpdate(
source,
......@@ -329,10 +338,12 @@ public class DBNProjectDatabases extends DBNNode implements DBNContainer, DBPEve
// Clear disabled node
dbmNode.clearNode(false);
} else {
if (event.getAction() == DBPEvent.Action.OBJECT_UPDATE && event.getObject() instanceof DBPDataSourceContainer) {
// Force reorder
children = null;
getModel().fireNodeEvent(new DBNEvent(this, DBNEvent.Action.UPDATE, this));
if (event.getAction() == DBPEvent.Action.OBJECT_UPDATE) {
if (event.getObject() instanceof DBPDataSourceContainer) {
// Force reorder
children = null;
getModel().fireNodeEvent(new DBNEvent(this, DBNEvent.Action.UPDATE, this));
}
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册