Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
7c73f2bf
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7c73f2bf
编写于
11月 26, 2014
作者:
J
jurgen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Tree manager
上级
d112c753
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
113 addition
and
54 deletion
+113
-54
plugins/org.jkiss.dbeaver.core.application/src/org/jkiss/dbeaver/ui/search/DatabaseSearchDialog.java
...src/org/jkiss/dbeaver/ui/search/DatabaseSearchDialog.java
+1
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNModel.java
....core/src/org/jkiss/dbeaver/model/navigator/DBNModel.java
+17
-15
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java
.../src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java
+1
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/CheckboxTreeManager.java
...aver/ui/views/navigator/database/CheckboxTreeManager.java
+94
-37
未找到文件。
plugins/org.jkiss.dbeaver.core.application/src/org/jkiss/dbeaver/ui/search/DatabaseSearchDialog.java
浏览文件 @
7c73f2bf
...
...
@@ -149,7 +149,7 @@ public class DatabaseSearchDialog extends HelpEnabledDialog implements IObjectSe
// Buttons
searchButton
=
createButton
(
parent
,
SEARCH_ID
,
"Search"
,
true
);
searchButton
.
setEnabled
(
searchEnabled
);
createButton
(
parent
,
IDialogConstants
.
CANCEL_ID
,
IDialogConstants
.
C
ANCEL
_LABEL
,
false
);
createButton
(
parent
,
IDialogConstants
.
CANCEL_ID
,
IDialogConstants
.
C
LOSE
_LABEL
,
false
);
}
@Override
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNModel.java
浏览文件 @
7c73f2bf
...
...
@@ -246,25 +246,27 @@ public class DBNModel implements IResourceChangeListener {
String
item
=
items
.
get
(
i
);
List
<?
extends
DBNNode
>
children
=
curNode
.
getChildren
(
monitor
);
DBNNode
nextChild
=
null
;
for
(
DBNNode
child
:
children
)
{
if
(
child
instanceof
DBNDatabaseFolder
)
{
DBXTreeFolder
meta
=
((
DBNDatabaseFolder
)
child
).
getMeta
();
if
(
meta
!=
null
&&
!
CommonUtils
.
isEmpty
(
meta
.
getType
())
&&
meta
.
getType
().
equals
(
item
))
{
if
(
children
!=
null
&&
!
children
.
isEmpty
())
{
for
(
DBNNode
child
:
children
)
{
if
(
child
instanceof
DBNDatabaseFolder
)
{
DBXTreeFolder
meta
=
((
DBNDatabaseFolder
)
child
).
getMeta
();
if
(
meta
!=
null
&&
!
CommonUtils
.
isEmpty
(
meta
.
getType
())
&&
meta
.
getType
().
equals
(
item
))
{
nextChild
=
child
;
}
}
if
(
child
.
getNodeName
().
equals
(
item
))
{
nextChild
=
child
;
}
}
if
(
child
.
getNodeName
().
equals
(
item
))
{
nextChild
=
child
;
}
if
(
nextChild
!=
null
)
{
if
(
i
<
itemsSize
-
1
)
{
nextChild
=
findNodeByPath
(
monitor
,
items
,
nextChild
,
i
+
1
);
if
(
nextChild
!=
null
)
{
return
nextChild
;
if
(
nextChild
!=
null
)
{
if
(
i
<
itemsSize
-
1
)
{
nextChild
=
findNodeByPath
(
monitor
,
items
,
nextChild
,
i
+
1
);
if
(
nextChild
!=
null
)
{
return
nextChild
;
}
continue
;
}
continue
;
break
;
}
break
;
}
}
curNode
=
nextChild
;
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java
浏览文件 @
7c73f2bf
...
...
@@ -215,8 +215,8 @@ public class SearchDataPage extends AbstractSearchPage {
if
(!
checkedNodes
.
isEmpty
())
{
for
(
DBNNode
node
:
checkedNodes
)
{
((
CheckboxTreeViewer
)
dataSourceTree
.
getViewer
()).
setChecked
(
node
,
true
);
checkboxTreeManager
.
checkStateChanged
(
new
CheckStateChangedEvent
((
CheckboxTreeViewer
)
dataSourceTree
.
getViewer
(),
node
,
true
));
}
checkboxTreeManager
.
updateCheckStates
();
}
updateEnablement
();
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/CheckboxTreeManager.java
浏览文件 @
7c73f2bf
...
...
@@ -21,77 +21,123 @@ package org.jkiss.dbeaver.ui.views.navigator.database;
import
org.eclipse.jface.viewers.CheckStateChangedEvent
;
import
org.eclipse.jface.viewers.CheckboxTreeViewer
;
import
org.eclipse.jface.viewers.ICheckStateListener
;
import
org.eclipse.jface.viewers.ViewerFilter
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.core.DBeaverUI
;
import
org.jkiss.dbeaver.model.navigator.DBNDataSource
;
import
org.jkiss.dbeaver.model.navigator.DBNDatabaseNode
;
import
org.jkiss.dbeaver.model.navigator.DBNNode
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress
;
import
org.jkiss.dbeaver.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.ui.UIUtils
;
import
org.jkiss.utils.ArrayUtils
;
import
org.jkiss.utils.CommonUtils
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
java.lang.reflect.InvocationTargetException
;
import
java.util.*
;
public
class
CheckboxTreeManager
implements
ICheckStateListener
{
private
final
CheckboxTreeViewer
viewer
;
private
final
Class
<?>[]
targetTypes
;
private
Object
[]
checkedElements
;
private
final
ViewerFilter
[]
filters
;
public
CheckboxTreeManager
(
CheckboxTreeViewer
viewer
,
Class
<?>[]
targetTypes
)
{
this
.
viewer
=
viewer
;
this
.
targetTypes
=
targetTypes
;
this
.
filters
=
viewer
.
getFilters
();
}
@Override
public
void
checkStateChanged
(
CheckStateChangedEvent
event
)
{
try
{
VoidProgressMonitor
monitor
=
VoidProgressMonitor
.
INSTANCE
;
Object
element
=
event
.
getElement
();
boolean
checked
=
event
.
getChecked
();
public
void
checkStateChanged
(
final
CheckStateChangedEvent
event
)
{
updateElementsCheck
(
new
Object
[]
{
event
.
getElement
()},
event
.
getChecked
(),
true
);
}
updateElementHierarchy
(
monitor
,
element
,
checked
,
true
);
private
void
updateElementsCheck
(
final
Object
[]
elements
,
final
boolean
checked
,
final
boolean
change
)
{
checkedElements
=
viewer
.
getCheckedElements
();
try
{
DBeaverUI
.
runInProgressService
(
new
DBRRunnableWithProgress
()
{
@Override
public
void
run
(
DBRProgressMonitor
monitor
)
throws
InvocationTargetException
,
InterruptedException
{
monitor
.
beginTask
(
"Load sources tree"
,
100
*
elements
.
length
);
try
{
for
(
Object
element
:
elements
)
{
updateElementHierarchy
(
monitor
,
element
,
checked
,
change
);
if
(
element
instanceof
DBNDatabaseNode
)
{
for
(
DBNNode
node
=
((
DBNDatabaseNode
)
element
).
getParentNode
();
node
!=
null
;
node
=
node
.
getParentNode
())
{
if
(
node
instanceof
DBNDatabaseNode
)
{
updateElementHierarchy
(
monitor
,
node
,
checked
,
false
);
}
if
(
node
instanceof
DBNDataSource
)
{
break
;
if
(
change
)
{
// Update parent state
if
(
element
instanceof
DBNDatabaseNode
)
{
for
(
DBNNode
node
=
((
DBNDatabaseNode
)
element
).
getParentNode
();
node
!=
null
;
node
=
node
.
getParentNode
())
{
if
(
node
instanceof
DBNDatabaseNode
)
{
updateElementHierarchy
(
monitor
,
node
,
checked
,
false
);
}
if
(
node
instanceof
DBNDataSource
)
{
break
;
}
}
}
}
}
}
catch
(
DBException
e
)
{
throw
new
InvocationTargetException
(
e
);
}
finally
{
monitor
.
done
();
}
}
}
}
catch
(
DBException
e
)
{
UIUtils
.
showErrorDialog
(
viewer
.
getControl
().
getShell
(),
"Error"
,
"Can't collect child nodes"
,
e
);
});
}
catch
(
InvocationTargetException
e
)
{
UIUtils
.
showErrorDialog
(
viewer
.
getControl
().
getShell
(),
"Error"
,
"Can't collect child nodes"
,
e
.
getTargetException
());
}
catch
(
InterruptedException
e
)
{
// ignore
}
}
private
void
updateElementHierarchy
(
VoidProgressMonitor
monitor
,
Object
element
,
boolean
checked
,
boolean
change
)
throws
DBException
{
List
<
DBNDatabaseNode
>
targetChildren
=
new
ArrayList
<
DBNDatabaseNode
>();
List
<
DBNDatabaseNode
>
targetContainers
=
new
ArrayList
<
DBNDatabaseNode
>();
private
void
updateElementHierarchy
(
final
DBRProgressMonitor
monitor
,
final
Object
element
,
final
boolean
checked
,
final
boolean
change
)
throws
DBException
{
final
List
<
DBNDatabaseNode
>
targetChildren
=
new
ArrayList
<
DBNDatabaseNode
>();
final
List
<
DBNDatabaseNode
>
targetContainers
=
new
ArrayList
<
DBNDatabaseNode
>();
collectChildren
(
monitor
,
element
,
targetChildren
,
targetContainers
,
!
change
);
if
(
change
)
{
for
(
DBNDatabaseNode
child
:
targetChildren
)
{
viewer
.
setChecked
(
child
,
checked
);
}
}
for
(
DBNDatabaseNode
container
:
change
?
targetContainers
:
Collections
.
singletonList
((
DBNDatabaseNode
)
element
))
{
List
<
DBNDatabaseNode
>
directChildren
=
CommonUtils
.
safeList
(
container
.
getChildren
(
monitor
));
boolean
missing
=
Collections
.
disjoint
(
directChildren
,
targetChildren
);
viewer
.
setChecked
(
container
,
change
?
checked
:
!
missing
||
!
Collections
.
disjoint
(
directChildren
,
targetContainers
));
viewer
.
setGrayed
(
container
,
missing
);
}
// Run ui
viewer
.
getControl
().
getDisplay
().
syncExec
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
change
)
{
for
(
DBNDatabaseNode
child
:
targetChildren
)
{
viewer
.
setChecked
(
child
,
checked
);
}
}
for
(
DBNDatabaseNode
container
:
change
?
targetContainers
:
Collections
.
singletonList
((
DBNDatabaseNode
)
element
))
{
try
{
List
<
DBNDatabaseNode
>
directChildren
=
CommonUtils
.
safeList
(
container
.
getChildren
(
VoidProgressMonitor
.
INSTANCE
));
boolean
missing
=
Collections
.
disjoint
(
directChildren
,
targetChildren
);
viewer
.
setChecked
(
container
,
change
?
checked
:
!
missing
||
!
Collections
.
disjoint
(
directChildren
,
targetContainers
));
viewer
.
setGrayed
(
container
,
missing
);
}
catch
(
DBException
e
)
{
// shouldn't be here
}
}
}
});
}
private
boolean
collectChildren
(
DBRProgressMonitor
monitor
,
final
Object
element
,
List
<
DBNDatabaseNode
>
targetChildren
,
List
<
DBNDatabaseNode
>
targetContainers
,
boolean
onlyChecked
)
throws
DBException
{
if
(
element
instanceof
DBNDatabaseNode
)
{
for
(
ViewerFilter
filter
:
filters
)
{
if
(!
filter
.
select
(
viewer
,
((
DBNDatabaseNode
)
element
).
getParentNode
(),
element
))
{
return
false
;
}
}
boolean
isChecked
=
ArrayUtils
.
contains
(
checkedElements
,
element
);
for
(
Class
<?>
type
:
targetTypes
)
{
if
(
type
.
isInstance
(((
DBNDatabaseNode
)
element
).
getObject
()))
{
if
(!
onlyChecked
||
viewer
.
getChecked
(
element
)
)
{
if
(!
onlyChecked
||
isChecked
)
{
targetChildren
.
add
((
DBNDatabaseNode
)
element
);
}
return
true
;
...
...
@@ -107,7 +153,7 @@ public class CheckboxTreeManager implements ICheckStateListener {
}
}
if
(
foundChild
)
{
if
(!
onlyChecked
||
viewer
.
getChecked
(
element
)
)
{
if
(!
onlyChecked
||
isChecked
)
{
targetContainers
.
add
((
DBNDatabaseNode
)
element
);
}
}
...
...
@@ -117,5 +163,16 @@ public class CheckboxTreeManager implements ICheckStateListener {
return
false
;
}
public
void
updateCheckStates
()
{
Set
<
DBNDatabaseNode
>
parentList
=
new
LinkedHashSet
<
DBNDatabaseNode
>();
for
(
Object
element
:
viewer
.
getCheckedElements
())
{
for
(
DBNNode
node
=
((
DBNDatabaseNode
)
element
).
getParentNode
();
node
!=
null
;
node
=
node
.
getParentNode
())
{
if
(
node
instanceof
DBNDatabaseNode
)
{
parentList
.
add
((
DBNDatabaseNode
)
node
);
viewer
.
setChecked
(
node
,
true
);
}
}
}
updateElementsCheck
(
parentList
.
toArray
(),
true
,
false
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录