Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
33a430b2
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,发现更多精彩内容 >>
提交
33a430b2
编写于
6月 24, 2015
作者:
J
jurgen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Value handlers code cleanup.
UI callbacks model. Utils refactoring.
上级
b163df2d
变更
29
隐藏空白更改
内联
并排
Showing
29 changed file
with
383 addition
and
262 deletion
+383
-262
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java
...ss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java
+38
-2
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java
...iss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java
+0
-27
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/access/DBAAuthInfo.java
....core/src/org/jkiss/dbeaver/model/access/DBAAuthInfo.java
+60
-0
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/data/DateTimeValueHandler.java
...g/jkiss/dbeaver/model/impl/data/DateTimeValueHandler.java
+3
-6
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/data/formatters/BinaryFormatterHex.java
...beaver/model/impl/data/formatters/BinaryFormatterHex.java
+2
-2
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java
...model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java
+6
-51
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/net/GlobalProxyAuthenticator.java
...kiss/dbeaver/model/impl/net/GlobalProxyAuthenticator.java
+12
-35
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/net/DBWHandlerConfiguration.java
.../org/jkiss/dbeaver/model/net/DBWHandlerConfiguration.java
+1
-3
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/SQLDialect.java
...aver.core/src/org/jkiss/dbeaver/model/sql/SQLDialect.java
+15
-2
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/ui/DBUICallback.java
...ver.core/src/org/jkiss/dbeaver/model/ui/DBUICallback.java
+13
-8
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/ui/DBUserInterface.java
....core/src/org/jkiss/dbeaver/model/ui/DBUserInterface.java
+62
-0
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java
...src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java
+1
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java
....jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java
+1
-15
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java
.../jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java
+2
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetPresentation.java
...ntrols/resultset/spreadsheet/SpreadsheetPresentation.java
+2
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/editors/NumberInlineEditor.java
...org/jkiss/dbeaver/ui/data/editors/NumberInlineEditor.java
+2
-51
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/BaseValueManager.java
.../org/jkiss/dbeaver/ui/data/managers/BaseValueManager.java
+33
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/BaseAuthDialog.java
...g/jkiss/dbeaver/ui/dialogs/connection/BaseAuthDialog.java
+21
-25
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionAuthDialog.java
...s/dbeaver/ui/dialogs/connection/ConnectionAuthDialog.java
+2
-2
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/data/ValueViewDialog.java
...rc/org/jkiss/dbeaver/ui/dialogs/data/ValueViewDialog.java
+2
-1
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/ControlPropertyCommandListener.java
...ss/dbeaver/ui/editors/ControlPropertyCommandListener.java
+3
-2
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/binary/HexEditControl.java
...c/org/jkiss/dbeaver/ui/editors/binary/HexEditControl.java
+5
-6
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/binary/dialogs/FindReplaceDialog.java
.../dbeaver/ui/editors/binary/dialogs/FindReplaceDialog.java
+2
-2
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java
...e/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java
+15
-5
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/utils/GeneralUtils.java
...beaver.core/src/org/jkiss/dbeaver/utils/GeneralUtils.java
+66
-0
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/utils/TextUtils.java
...s.dbeaver.core/src/org/jkiss/dbeaver/utils/TextUtils.java
+0
-10
plugins/org.jkiss.dbeaver.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java
...d/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java
+12
-1
plugins/org.jkiss.dbeaver.mysql/src/org/jkiss/dbeaver/ext/mysql/editors/MySQLUserEditorGeneral.java
...iss/dbeaver/ext/mysql/editors/MySQLUserEditorGeneral.java
+1
-1
plugins/org.jkiss.dbeaver.mysql/src/org/jkiss/dbeaver/ext/mysql/tools/MySQLDatabaseWizardPageSettings.java
...aver/ext/mysql/tools/MySQLDatabaseWizardPageSettings.java
+1
-1
未找到文件。
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java
浏览文件 @
33a430b2
...
...
@@ -20,6 +20,7 @@ package org.jkiss.dbeaver.core;
import
org.eclipse.core.runtime.IProgressMonitor
;
import
org.eclipse.core.runtime.IStatus
;
import
org.eclipse.core.runtime.Status
;
import
org.eclipse.jface.dialogs.IDialogConstants
;
import
org.eclipse.jface.dialogs.ProgressMonitorDialog
;
import
org.eclipse.jface.operation.IRunnableContext
;
import
org.eclipse.jface.operation.IRunnableWithProgress
;
...
...
@@ -30,16 +31,24 @@ import org.eclipse.ui.IWorkbench;
import
org.eclipse.ui.IWorkbenchWindow
;
import
org.eclipse.ui.PlatformUI
;
import
org.eclipse.ui.services.IDisposable
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBeaverPreferences
;
import
org.jkiss.dbeaver.model.access.DBAAuthInfo
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.DBRRunnableContext
;
import
org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress
;
import
org.jkiss.dbeaver.model.ui.DBUICallback
;
import
org.jkiss.dbeaver.model.ui.DBUserInterface
;
import
org.jkiss.dbeaver.runtime.RunnableContextDelegate
;
import
org.jkiss.dbeaver.runtime.RunnableWithResult
;
import
org.jkiss.dbeaver.runtime.RuntimeUtils
;
import
org.jkiss.dbeaver.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.ui.AbstractUIJob
;
import
org.jkiss.dbeaver.ui.SharedTextColors
;
import
org.jkiss.dbeaver.ui.TrayIconHandler
;
import
org.jkiss.dbeaver.ui.UIUtils
;
import
org.jkiss.dbeaver.ui.dialogs.connection.BaseAuthDialog
;
import
java.lang.reflect.InvocationTargetException
;
import
java.util.ArrayList
;
...
...
@@ -49,7 +58,7 @@ import java.util.List;
/**
* DBeaver UI core
*/
public
class
DBeaverUI
{
public
class
DBeaverUI
implements
DBUICallback
{
static
final
Log
log
=
Log
.
getLog
(
DBeaverUI
.
class
);
...
...
@@ -104,8 +113,8 @@ public class DBeaverUI {
private
void
initialize
()
{
this
.
sharedTextColors
=
new
SharedTextColors
();
this
.
trayItem
=
new
TrayIconHandler
();
DBUserInterface
.
setInstance
(
this
);
}
public
static
AbstractUIJob
runUIJob
(
String
jobName
,
final
DBRRunnableWithProgress
runnableWithProgress
)
...
...
@@ -272,4 +281,31 @@ public class DBeaverUI {
public
void
addDisposeListener
(
IDisposable
disposable
)
{
globalDisposables
.
add
(
disposable
);
}
@Override
public
void
showError
(
@NotNull
String
title
,
@Nullable
String
message
,
@NotNull
IStatus
status
)
{
UIUtils
.
showErrorDialog
(
null
,
title
,
message
,
status
);
}
@Override
public
DBAAuthInfo
promptUserCredentials
(
String
prompt
,
String
userName
,
String
userPassword
)
{
// Ask user
final
Shell
shell
=
DBeaverUI
.
getActiveWorkbenchShell
();
final
BaseAuthDialog
authDialog
=
new
BaseAuthDialog
(
shell
,
prompt
);
authDialog
.
setUserName
(
userName
);
authDialog
.
setUserPassword
(
userPassword
);
final
RunnableWithResult
<
Boolean
>
binder
=
new
RunnableWithResult
<
Boolean
>()
{
@Override
public
void
run
()
{
result
=
(
authDialog
.
open
()
==
IDialogConstants
.
OK_ID
);
}
};
UIUtils
.
runInUI
(
shell
,
binder
);
if
(
binder
.
getResult
()
!=
null
&&
binder
.
getResult
())
{
return
authDialog
.
getAuthInfo
();
}
else
{
return
null
;
}
}
}
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/DBUtils.java
浏览文件 @
33a430b2
...
...
@@ -22,7 +22,6 @@ import org.jkiss.code.NotNull;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.DBeaverPreferences
;
import
org.jkiss.dbeaver.core.CoreMessages
;
import
org.jkiss.dbeaver.core.Log
;
import
org.jkiss.dbeaver.model.data.*
;
import
org.jkiss.dbeaver.model.edit.DBEPersistAction
;
...
...
@@ -35,9 +34,7 @@ import org.jkiss.dbeaver.model.struct.rdb.*;
import
org.jkiss.dbeaver.registry.DataSourceProviderRegistry
;
import
org.jkiss.dbeaver.registry.DataTypeProviderDescriptor
;
import
org.jkiss.dbeaver.runtime.RuntimeUtils
;
import
org.jkiss.dbeaver.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.runtime.sql.SQLConstants
;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
org.jkiss.dbeaver.utils.GeneralUtils
;
import
org.jkiss.utils.ArrayUtils
;
import
org.jkiss.utils.CommonUtils
;
...
...
@@ -442,30 +439,6 @@ public final class DBUtils {
return
valueHandler
.
getValueFromObject
(
session
,
type
,
null
,
false
);
}
@Nullable
public
static
Object
makeNullValue
(
@NotNull
final
IValueController
valueController
)
{
try
{
DBCExecutionContext
executionContext
=
valueController
.
getExecutionContext
();
if
(
executionContext
==
null
)
{
throw
new
DBCException
(
CoreMessages
.
editors_sql_status_not_connected_to_database
);
}
// We are going to create NULL value - it shouldn't result in any DB roundtrips so let's use dummy monitor
DBCSession
session
=
executionContext
.
openSession
(
VoidProgressMonitor
.
INSTANCE
,
DBCExecutionPurpose
.
UTIL
,
"Set NULL value"
);
try
{
return
DBUtils
.
makeNullValue
(
session
,
valueController
.
getValueHandler
(),
valueController
.
getValueType
());
}
finally
{
session
.
close
();
}
}
catch
(
DBCException
e
)
{
log
.
error
(
"Can't make NULL value"
,
e
);
return
null
;
}
}
@NotNull
public
static
DBDAttributeBindingMeta
getAttributeBinding
(
DBCSession
session
,
DBCAttributeMetaData
attributeMeta
)
{
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/
ui/data/editors/NumberEditorHelper
.java
→
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/
model/access/DBAAuthInfo
.java
浏览文件 @
33a430b2
...
...
@@ -15,22 +15,46 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package
org.jkiss.dbeaver.
ui.data.editor
s
;
package
org.jkiss.dbeaver.
model.acces
s
;
import
org.jkiss.dbeaver.model.data.DBDDataFormatter
;
import
org.jkiss.dbeaver.model.struct.DBSTypedObject
;
/**
* Auth info
*/
public
class
DBAAuthInfo
{
private
String
userName
;
private
String
userPassword
;
private
boolean
savePassword
;
import
java.util.Locale
;
public
DBAAuthInfo
()
{
}
/**
* NumberEditorHelper
*/
public
interface
NumberEditorHelper
{
public
DBAAuthInfo
(
String
userName
,
String
userPassword
,
boolean
savePassword
)
{
this
.
userName
=
userName
;
this
.
userPassword
=
userPassword
;
this
.
savePassword
=
savePassword
;
}
public
String
getUserName
()
{
return
userName
;
}
public
void
setUserName
(
String
userName
)
{
this
.
userName
=
userName
;
}
Locale
getLocale
();
public
String
getUserPassword
()
{
return
userPassword
;
}
DBDDataFormatter
getFormatter
();
public
void
setUserPassword
(
String
userPassword
)
{
this
.
userPassword
=
userPassword
;
}
Class
<?
extends
Number
>
getNumberType
(
DBSTypedObject
type
,
Object
originalValue
);
public
boolean
isSavePassword
()
{
return
savePassword
;
}
public
void
setSavePassword
(
boolean
savePassword
)
{
this
.
savePassword
=
savePassword
;
}
}
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/data/DateTimeValueHandler.java
浏览文件 @
33a430b2
...
...
@@ -20,12 +20,13 @@ package org.jkiss.dbeaver.model.impl.data;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.core.Log
;
import
org.jkiss.dbeaver.model.data.*
;
import
org.jkiss.dbeaver.model.data.DBDDataFormatter
;
import
org.jkiss.dbeaver.model.data.DBDDataFormatterProfile
;
import
org.jkiss.dbeaver.model.data.DBDDisplayFormat
;
import
org.jkiss.dbeaver.model.exec.DBCException
;
import
org.jkiss.dbeaver.model.exec.DBCSession
;
import
org.jkiss.dbeaver.model.impl.data.formatters.DefaultDataFormatter
;
import
org.jkiss.dbeaver.model.struct.DBSTypedObject
;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
java.text.ParseException
;
import
java.util.Date
;
...
...
@@ -182,8 +183,4 @@ public abstract class DateTimeValueHandler extends BaseValueHandler {
return
formatter
;
}
private
boolean
isTimestamp
(
IValueController
valueController
)
{
return
valueController
.
getValueType
().
getTypeID
()
==
java
.
sql
.
Types
.
TIMESTAMP
;
}
}
\ No newline at end of file
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/data/formatters/BinaryFormatterHex.java
浏览文件 @
33a430b2
...
...
@@ -18,7 +18,7 @@
package
org.jkiss.dbeaver.model.impl.data.formatters
;
import
org.jkiss.dbeaver.model.data.DBDBinaryFormatter
;
import
org.jkiss.dbeaver.utils.
Text
Utils
;
import
org.jkiss.dbeaver.utils.
General
Utils
;
/**
* Hex formatter
...
...
@@ -42,7 +42,7 @@ public class BinaryFormatterHex implements DBDBinaryFormatter {
{
char
[]
chars
=
new
char
[
length
*
2
];
for
(
int
i
=
offset
;
i
<
offset
+
length
;
i
++)
{
String
hex
=
Text
Utils
.
byteToHex
[
bytes
[
i
]
&
0x0ff
];
String
hex
=
General
Utils
.
byteToHex
[
bytes
[
i
]
&
0x0ff
];
chars
[
i
*
2
]
=
hex
.
charAt
(
0
);
chars
[
i
*
2
+
1
]
=
hex
.
charAt
(
1
);
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java
浏览文件 @
33a430b2
...
...
@@ -20,34 +20,32 @@ package org.jkiss.dbeaver.model.impl.jdbc.data.handlers;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.model.DBUtils
;
import
org.jkiss.dbeaver.model.data.*
;
import
org.jkiss.dbeaver.model.data.DBDDataFormatter
;
import
org.jkiss.dbeaver.model.data.DBDDataFormatterProfile
;
import
org.jkiss.dbeaver.model.data.DBDDisplayFormat
;
import
org.jkiss.dbeaver.model.exec.DBCException
;
import
org.jkiss.dbeaver.model.exec.DBCSession
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCSession
;
import
org.jkiss.dbeaver.model.impl.data.formatters.DefaultDataFormatter
;
import
org.jkiss.dbeaver.ui.data.editors.NumberEditorHelper
;
import
org.jkiss.dbeaver.ui.data.editors.NumberInlineEditor
;
import
org.jkiss.dbeaver.model.struct.DBSTypedObject
;
import
org.jkiss.dbeaver.utils.GeneralUtils
;
import
java.math.BigDecimal
;
import
java.math.BigInteger
;
import
java.sql.SQLException
;
import
java.util.Locale
;
/**
* JDBC number value handler
*/
public
class
JDBCNumberValueHandler
extends
JDBCAbstractValueHandler
implements
NumberEditorHelper
{
public
class
JDBCNumberValueHandler
extends
JDBCAbstractValueHandler
{
private
Locale
locale
;
private
DBDDataFormatter
formatter
;
public
JDBCNumberValueHandler
(
DBDDataFormatterProfile
formatterProfile
)
{
try
{
locale
=
formatterProfile
.
getLocale
();
formatter
=
formatterProfile
.
createFormatter
(
DBDDataFormatter
.
TYPE_NAME_NUMBER
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Can't create formatter for number value handler"
,
e
);
//$NON-NLS-1$
...
...
@@ -230,56 +228,13 @@ public class JDBCNumberValueHandler extends JDBCAbstractValueHandler implements
}
else
if
(
object
instanceof
Number
)
{
return
object
;
}
else
if
(
object
instanceof
String
)
{
return
NumberInlineEditor
.
convertStringToNumber
((
String
)
object
,
getNumberType
(
type
,
null
),
formatter
);
return
GeneralUtils
.
convertStringToNumber
((
String
)
object
,
getNumberType
(
type
),
formatter
);
}
else
{
log
.
warn
(
"Unrecognized type '"
+
object
.
getClass
().
getName
()
+
"' - can't convert to numeric"
);
return
null
;
}
}
@Override
public
Locale
getLocale
()
{
return
locale
;
}
@Override
public
DBDDataFormatter
getFormatter
()
{
return
formatter
;
}
@Override
public
Class
<?
extends
Number
>
getNumberType
(
DBSTypedObject
type
,
Object
originalValue
)
{
if
(
originalValue
instanceof
Number
)
{
return
((
Number
)
originalValue
).
getClass
();
}
else
{
switch
(
type
.
getTypeID
())
{
case
java
.
sql
.
Types
.
BIGINT
:
return
Long
.
class
;
case
java
.
sql
.
Types
.
DECIMAL
:
case
java
.
sql
.
Types
.
DOUBLE
:
case
java
.
sql
.
Types
.
REAL
:
return
Double
.
class
;
case
java
.
sql
.
Types
.
FLOAT
:
return
Float
.
class
;
case
java
.
sql
.
Types
.
INTEGER
:
return
Integer
.
class
;
case
java
.
sql
.
Types
.
SMALLINT
:
case
java
.
sql
.
Types
.
TINYINT
:
return
Short
.
class
;
case
java
.
sql
.
Types
.
BIT
:
return
Byte
.
class
;
case
java
.
sql
.
Types
.
NUMERIC
:
return
BigDecimal
.
class
;
default
:
if
(
type
.
getScale
()
>
0
)
{
return
Double
.
class
;
}
else
{
return
Long
.
class
;
}
}
}
}
public
Class
<?
extends
Number
>
getNumberType
(
DBSTypedObject
type
)
{
switch
(
type
.
getTypeID
())
{
case
java
.
sql
.
Types
.
BIGINT
:
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/impl/net/GlobalProxyAuthenticator.java
浏览文件 @
33a430b2
...
...
@@ -17,24 +17,18 @@
*/
package
org.jkiss.dbeaver.model.impl.net
;
import
org.eclipse.jface.dialogs.IDialogConstants
;
import
org.eclipse.swt.widgets.Shell
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBeaverPreferences
;
import
org.jkiss.dbeaver.core.DBeaverCore
;
import
org.jkiss.dbeaver.core.DBeaverUI
;
import
org.jkiss.dbeaver.model.DBIcon
;
import
org.jkiss.dbeaver.model.DBPPreferenceStore
;
import
org.jkiss.dbeaver.model.access.DBAAuthInfo
;
import
org.jkiss.dbeaver.model.exec.DBCExecutionContext
;
import
org.jkiss.dbeaver.model.net.DBWHandlerConfiguration
;
import
org.jkiss.dbeaver.model.net.DBWHandlerType
;
import
org.jkiss.dbeaver.model.struct.DBSDataSourceContainer
;
import
org.jkiss.dbeaver.model.ui.DBUserInterface
;
import
org.jkiss.dbeaver.registry.encode.EncryptionException
;
import
org.jkiss.dbeaver.registry.encode.SecuredPasswordEncrypter
;
import
org.jkiss.dbeaver.runtime.RunnableWithResult
;
import
org.jkiss.dbeaver.ui.DBeaverIcons
;
import
org.jkiss.dbeaver.ui.UIUtils
;
import
org.jkiss.dbeaver.ui.dialogs.connection.BaseAuthDialog
;
import
org.jkiss.utils.CommonUtils
;
import
java.net.Authenticator
;
...
...
@@ -61,11 +55,11 @@ public class GlobalProxyAuthenticator extends Authenticator {
String
userName
=
store
.
getString
(
DBeaverPreferences
.
UI_PROXY_USER
);
String
userPassword
=
decryptPassword
(
store
.
getString
(
DBeaverPreferences
.
UI_PROXY_PASSWORD
));
if
(
CommonUtils
.
isEmpty
(
userName
)
||
CommonUtils
.
isEmpty
(
userPassword
))
{
BaseAuthDialog
.
AuthInfo
authInfo
=
readCredentialsInUI
(
"Auth proxy '"
+
proxyHost
+
"'"
,
userName
,
userPassword
);
DBA
AuthInfo
authInfo
=
readCredentialsInUI
(
"Auth proxy '"
+
proxyHost
+
"'"
,
userName
,
userPassword
);
if
(
authInfo
!=
null
)
{
userName
=
authInfo
.
userName
;
userPassword
=
authInfo
.
userPassword
;
if
(
authInfo
.
savePassword
)
{
userName
=
authInfo
.
getUserName
()
;
userPassword
=
authInfo
.
getUserPassword
()
;
if
(
authInfo
.
isSavePassword
()
)
{
// Save in preferences
store
.
setValue
(
DBeaverPreferences
.
UI_PROXY_USER
,
userName
);
store
.
setValue
(
DBeaverPreferences
.
UI_PROXY_PASSWORD
,
encryptPassword
(
userPassword
));
...
...
@@ -90,11 +84,11 @@ public class GlobalProxyAuthenticator extends Authenticator {
String
userName
=
networkHandler
.
getUserName
();
String
userPassword
=
networkHandler
.
getPassword
();
if
(
CommonUtils
.
isEmpty
(
userName
)
||
CommonUtils
.
isEmpty
(
userPassword
))
{
BaseAuthDialog
.
AuthInfo
authInfo
=
readCredentialsInUI
(
getRequestingPrompt
(),
userName
,
userPassword
);
DBA
AuthInfo
authInfo
=
readCredentialsInUI
(
getRequestingPrompt
(),
userName
,
userPassword
);
if
(
authInfo
!=
null
)
{
userName
=
authInfo
.
userName
;
userPassword
=
authInfo
.
userPassword
;
if
(
authInfo
.
savePassword
)
{
userName
=
authInfo
.
getUserName
()
;
userPassword
=
authInfo
.
getUserPassword
()
;
if
(
authInfo
.
isSavePassword
()
)
{
// Save DS config
networkHandler
.
setUserName
(
userName
);
networkHandler
.
setPassword
(
userPassword
);
...
...
@@ -140,26 +134,9 @@ public class GlobalProxyAuthenticator extends Authenticator {
}
}
private
BaseAuthDialog
.
AuthInfo
readCredentialsInUI
(
String
prompt
,
String
userName
,
String
userPassword
)
private
DBA
AuthInfo
readCredentialsInUI
(
String
prompt
,
String
userName
,
String
userPassword
)
{
// Ask user
final
Shell
shell
=
DBeaverUI
.
getActiveWorkbenchShell
();
final
BaseAuthDialog
authDialog
=
new
BaseAuthDialog
(
shell
,
prompt
,
DBeaverIcons
.
getImage
(
DBIcon
.
CONNECTIONS
));
authDialog
.
setUserName
(
userName
);
authDialog
.
setUserPassword
(
userPassword
);
final
RunnableWithResult
<
Boolean
>
binder
=
new
RunnableWithResult
<
Boolean
>()
{
@Override
public
void
run
()
{
result
=
(
authDialog
.
open
()
==
IDialogConstants
.
OK_ID
);
}
};
UIUtils
.
runInUI
(
shell
,
binder
);
if
(
binder
.
getResult
()
!=
null
&&
binder
.
getResult
())
{
return
authDialog
.
getAuthInfo
();
}
else
{
return
null
;
}
return
DBUserInterface
.
getInstance
().
promptUserCredentials
(
prompt
,
userName
,
userPassword
);
}
}
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/net/DBWHandlerConfiguration.java
浏览文件 @
33a430b2
...
...
@@ -19,7 +19,6 @@ package org.jkiss.dbeaver.model.net;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.ui.IObjectPropertyConfiguration
;
import
org.jkiss.dbeaver.model.DBPDriver
;
import
org.jkiss.dbeaver.registry.NetworkHandlerDescriptor
;
...
...
@@ -29,7 +28,7 @@ import java.util.Map;
/**
* Network handler configuration
*/
public
class
DBWHandlerConfiguration
implements
IObjectPropertyConfiguration
{
public
class
DBWHandlerConfiguration
{
private
final
NetworkHandlerDescriptor
descriptor
;
private
final
DBPDriver
driver
;
...
...
@@ -131,7 +130,6 @@ public class DBWHandlerConfiguration implements IObjectPropertyConfiguration {
this
.
savePassword
=
savePassword
;
}
@Override
public
Map
<
String
,
String
>
getProperties
()
{
return
properties
;
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/SQLDialect.java
浏览文件 @
33a430b2
...
...
@@ -20,11 +20,11 @@ package org.jkiss.dbeaver.model.sql;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.ui.ICommentsSupport
;
import
org.jkiss.dbeaver.model.DBPDataSource
;
import
org.jkiss.dbeaver.model.DBPIdentifierCase
;
import
org.jkiss.dbeaver.model.DBPKeywordType
;
import
org.jkiss.dbeaver.model.data.DBDDataFilter
;
import
org.jkiss.utils.Pair
;
import
java.util.Collection
;
import
java.util.List
;
...
...
@@ -33,7 +33,7 @@ import java.util.Set;
/**
* SQL dialect
*/
public
interface
SQLDialect
extends
ICommentsSupport
{
public
interface
SQLDialect
{
int
USAGE_NONE
=
0
;
int
USAGE_DML
=
1
;
...
...
@@ -200,4 +200,17 @@ public interface SQLDialect extends ICommentsSupport {
String
addFiltersToQuery
(
DBPDataSource
dataSource
,
String
query
,
DBDDataFilter
filter
)
throws
DBException
;
/**
* Two-item array containing begin and end of multi-line comments.
* @return string array or null if multi-line comments are not supported
*/
@Nullable
Pair
<
String
,
String
>
getMultiLineComments
();
/**
* List of possible single-line comment prefixes
* @return comment prefixes or null if single line comments are nto supported
*/
String
[]
getSingleLineComments
();
}
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/
ui/IObjectPropertyConfiguration
.java
→
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/
model/ui/DBUICallback
.java
浏览文件 @
33a430b2
...
...
@@ -15,16 +15,21 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package
org.jkiss.dbeaver.ui
;
import
java.util.Map
;
package
org.jkiss.dbeaver.model.ui
;
import
org.eclipse.core.runtime.IStatus
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.model.access.DBAAuthInfo
;
/**
*
IDataSourceConnectionEditor
*
User interface interactions
*/
public
interface
IObjectPropertyConfiguration
{
public
interface
DBUICallback
{
void
showError
(
@NotNull
final
String
title
,
@Nullable
final
String
message
,
@NotNull
final
IStatus
status
);
DBAAuthInfo
promptUserCredentials
(
String
prompt
,
String
userName
,
String
userPassword
);
Map
<
String
,
String
>
getProperties
();
}
}
\ No newline at end of file
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/ui/DBUserInterface.java
0 → 100644
浏览文件 @
33a430b2
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2015 Serge Rieder (serge@jkiss.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License (version 2)
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package
org.jkiss.dbeaver.model.ui
;
import
org.eclipse.core.runtime.IStatus
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.model.access.DBAAuthInfo
;
/**
* User interface interactions
*/
public
class
DBUserInterface
{
private
static
DBUICallback
instance
=
new
DBUICallback
()
{
@Override
public
void
showError
(
@NotNull
String
title
,
@Nullable
String
message
,
@NotNull
IStatus
status
)
{
System
.
out
.
println
(
title
+
(
message
==
null
?
""
:
": "
+
message
));
printStatus
(
status
,
0
);
}
private
void
printStatus
(
@NotNull
IStatus
status
,
int
level
)
{
char
[]
indent
=
new
char
[
level
*
4
];
for
(
int
i
=
0
;
i
<
indent
.
length
;
i
++)
indent
[
i
]
=
' '
;
if
(
status
.
getMessage
()
!=
null
)
{
System
.
out
.
println
(
""
+
indent
+
status
.
getMessage
());
}
if
(
status
.
getException
()
!=
null
)
{
status
.
getException
().
printStackTrace
(
System
.
out
);
}
}
@Override
public
DBAAuthInfo
promptUserCredentials
(
String
prompt
,
String
userName
,
String
userPassword
)
{
return
null
;
}
};
public
static
DBUICallback
getInstance
()
{
return
instance
;
}
public
static
void
setInstance
(
DBUICallback
instance
)
{
DBUserInterface
.
instance
=
instance
;
}
}
\ No newline at end of file
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java
浏览文件 @
33a430b2
...
...
@@ -22,7 +22,7 @@ import org.eclipse.swt.widgets.Composite;
/**
* IDataSourceConnectionEditor
*/
public
interface
IObjectPropertyConfigurator
<
T
extends
IObjectPropertyConfiguration
>
public
interface
IObjectPropertyConfigurator
<
T
>
{
void
createControl
(
Composite
parent
);
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/UIUtils.java
浏览文件 @
33a430b2
...
...
@@ -765,21 +765,7 @@ public class UIUtils {
showErrorDialog
(
shell
,
title
,
message
,
(
Throwable
)
null
);
}
public
static
void
showErrorDialog
(
@Nullable
Shell
shell
,
@NotNull
String
title
,
@Nullable
String
message
,
@NotNull
Collection
<
String
>
errorMessages
)
{
// log.debug(message);
java
.
util
.
List
<
Status
>
messageStatuses
=
new
ArrayList
<
Status
>(
errorMessages
.
size
());
for
(
String
error
:
errorMessages
)
{
messageStatuses
.
add
(
new
Status
(
Status
.
ERROR
,
DBeaverCore
.
getCorePluginID
(),
error
));
}
MultiStatus
status
=
new
MultiStatus
(
DBeaverCore
.
getCorePluginID
(),
0
,
messageStatuses
.
toArray
(
new
IStatus
[
messageStatuses
.
size
()]),
message
,
null
);
showErrorDialog
(
shell
,
title
,
message
,
status
);
}
public
static
void
showErrorDialog
(
@Nullable
final
Shell
shell
,
@NotNull
final
String
title
,
@Nullable
final
String
message
,
@NotNull
final
IStatus
status
)
public
static
void
showErrorDialog
(
@Nullable
final
Shell
shell
,
@NotNull
final
String
title
,
@Nullable
final
String
message
,
@NotNull
final
IStatus
status
)
{
for
(
IStatus
s
=
status
;
s
!=
null
;
)
{
if
(
s
.
getException
()
instanceof
DBException
)
{
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java
浏览文件 @
33a430b2
...
...
@@ -73,6 +73,7 @@ import org.jkiss.dbeaver.ui.controls.CImageCombo;
import
org.jkiss.dbeaver.ui.controls.resultset.view.EmptyPresentation
;
import
org.jkiss.dbeaver.ui.controls.resultset.view.StatisticsPresentation
;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
org.jkiss.dbeaver.ui.data.managers.BaseValueManager
;
import
org.jkiss.dbeaver.ui.dialogs.ActiveWizardDialog
;
import
org.jkiss.dbeaver.ui.dialogs.ConfirmationDialog
;
import
org.jkiss.dbeaver.ui.dialogs.EditTextDialog
;
...
...
@@ -1196,7 +1197,7 @@ public class ResultSetViewer extends Viewer
public
void
run
()
{
valueController
.
updateValue
(
DBUtils
.
makeNullValue
(
valueController
));
BaseValueManager
.
makeNullValue
(
valueController
));
}
});
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetPresentation.java
浏览文件 @
33a430b2
...
...
@@ -92,6 +92,7 @@ import org.jkiss.dbeaver.ui.controls.resultset.*;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
org.jkiss.dbeaver.ui.data.IValueEditor
;
import
org.jkiss.dbeaver.ui.data.IValueEditorStandalone
;
import
org.jkiss.dbeaver.ui.data.managers.BaseValueManager
;
import
org.jkiss.dbeaver.ui.dialogs.ConfirmationDialog
;
import
org.jkiss.dbeaver.runtime.properties.PropertyCollector
;
import
org.jkiss.dbeaver.ui.properties.PropertySourceDelegate
;
...
...
@@ -448,7 +449,7 @@ public class SpreadsheetPresentation extends AbstractPresentation implements IRe
IValueController
valueController
=
new
SpreadsheetValueController
(
controller
,
column
,
row
,
IValueController
.
EditType
.
NONE
,
null
);
if
(!
valueController
.
isReadOnly
())
{
valueController
.
updateValue
(
DBUtils
.
makeNullValue
(
valueController
));
valueController
.
updateValue
(
BaseValueManager
.
makeNullValue
(
valueController
));
}
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/editors/NumberInlineEditor.java
浏览文件 @
33a430b2
...
...
@@ -28,11 +28,10 @@ import org.jkiss.dbeaver.model.data.DBDDataFormatterProfile;
import
org.jkiss.dbeaver.model.data.DBDDisplayFormat
;
import
org.jkiss.dbeaver.ui.UIUtils
;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
org.jkiss.dbeaver.utils.GeneralUtils
;
import
org.jkiss.utils.CommonUtils
;
import
java.math.BigDecimal
;
import
java.math.BigInteger
;
import
java.text.ParseException
;
import
java.util.Locale
;
/**
...
...
@@ -42,7 +41,6 @@ public class NumberInlineEditor extends BaseValueEditor<Text> {
static
final
Log
log
=
Log
.
getLog
(
NumberInlineEditor
.
class
);
private
static
final
int
MAX_NUMBER_LENGTH
=
100
;
private
static
final
String
BAD_DOUBLE_VALUE
=
"2.2250738585072012e-308"
;
//$NON-NLS-1$
private
DBDDataFormatterProfile
formatterProfile
;
...
...
@@ -96,58 +94,11 @@ public class NumberInlineEditor extends BaseValueEditor<Text> {
curValue
.
getClass
()
:
valueController
.
getValueHandler
().
getValueObjectType
(
valueController
.
getValueType
());
try
{
return
convertStringToNumber
(
text
,
hintType
,
formatterProfile
.
createFormatter
(
DBDDataFormatter
.
TYPE_NAME_NUMBER
));
return
GeneralUtils
.
convertStringToNumber
(
text
,
hintType
,
formatterProfile
.
createFormatter
(
DBDDataFormatter
.
TYPE_NAME_NUMBER
));
}
catch
(
Exception
e
)
{
log
.
error
(
e
);
return
null
;
}
}
@Nullable
public
static
Number
convertStringToNumber
(
String
text
,
Class
<?
extends
Number
>
hintType
,
DBDDataFormatter
formatter
)
{
if
(
text
==
null
||
text
.
length
()
==
0
)
{
return
null
;
}
try
{
if
(
hintType
==
Long
.
class
)
{
try
{
return
Long
.
valueOf
(
text
);
}
catch
(
NumberFormatException
e
)
{
return
new
BigInteger
(
text
);
}
}
else
if
(
hintType
==
Integer
.
class
)
{
return
Integer
.
valueOf
(
text
);
}
else
if
(
hintType
==
Short
.
class
)
{
return
Short
.
valueOf
(
text
);
}
else
if
(
hintType
==
Byte
.
class
)
{
return
Byte
.
valueOf
(
text
);
}
else
if
(
hintType
==
Float
.
class
)
{
return
Float
.
valueOf
(
text
);
}
else
if
(
hintType
==
Double
.
class
)
{
return
toDouble
(
text
);
}
else
if
(
hintType
==
BigInteger
.
class
)
{
return
new
BigInteger
(
text
);
}
else
{
return
new
BigDecimal
(
text
);
}
}
catch
(
NumberFormatException
e
)
{
log
.
debug
(
"Bad numeric value '"
+
text
+
"' - "
+
e
.
getMessage
());
//$NON-NLS-1$ //$NON-NLS-2$
try
{
return
(
Number
)
formatter
.
parseValue
(
text
,
hintType
);
}
catch
(
ParseException
e1
)
{
log
.
debug
(
"Can't parse numeric value ["
+
text
+
"] using formatter"
,
e
);
return
null
;
}
}
}
private
static
Number
toDouble
(
String
text
)
{
if
(
text
.
equals
(
BAD_DOUBLE_VALUE
))
{
return
Double
.
MIN_VALUE
;
}
return
Double
.
valueOf
(
text
);
}
}
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/BaseValueManager.java
浏览文件 @
33a430b2
...
...
@@ -19,8 +19,16 @@ package org.jkiss.dbeaver.ui.data.managers;
import
org.eclipse.jface.action.IContributionManager
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.core.CoreMessages
;
import
org.jkiss.dbeaver.core.Log
;
import
org.jkiss.dbeaver.model.DBPPropertyManager
;
import
org.jkiss.dbeaver.model.DBUtils
;
import
org.jkiss.dbeaver.model.exec.DBCException
;
import
org.jkiss.dbeaver.model.exec.DBCExecutionContext
;
import
org.jkiss.dbeaver.model.exec.DBCExecutionPurpose
;
import
org.jkiss.dbeaver.model.exec.DBCSession
;
import
org.jkiss.dbeaver.runtime.VoidProgressMonitor
;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
org.jkiss.dbeaver.ui.data.IValueManager
;
...
...
@@ -29,7 +37,31 @@ import org.jkiss.dbeaver.ui.data.IValueManager;
*/
public
abstract
class
BaseValueManager
implements
IValueManager
{
public
static
final
String
PROP_CATEGORY_COMPLEX
=
"Complex"
;
static
final
Log
log
=
Log
.
getLog
(
BaseValueManager
.
class
);
@Nullable
public
static
Object
makeNullValue
(
@NotNull
final
IValueController
valueController
)
{
try
{
DBCExecutionContext
executionContext
=
valueController
.
getExecutionContext
();
if
(
executionContext
==
null
)
{
throw
new
DBCException
(
CoreMessages
.
editors_sql_status_not_connected_to_database
);
}
// We are going to create NULL value - it shouldn't result in any DB roundtrips so let's use dummy monitor
DBCSession
session
=
executionContext
.
openSession
(
VoidProgressMonitor
.
INSTANCE
,
DBCExecutionPurpose
.
UTIL
,
"Set NULL value"
);
try
{
return
DBUtils
.
makeNullValue
(
session
,
valueController
.
getValueHandler
(),
valueController
.
getValueType
());
}
finally
{
session
.
close
();
}
}
catch
(
DBCException
e
)
{
log
.
error
(
"Can't make NULL value"
,
e
);
return
null
;
}
}
@Override
public
void
contributeActions
(
@NotNull
IContributionManager
manager
,
@NotNull
IValueController
controller
)
throws
DBCException
{
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/BaseAuthDialog.java
浏览文件 @
33a430b2
...
...
@@ -17,13 +17,15 @@
*/
package
org.jkiss.dbeaver.ui.dialogs.connection
;
import
org.eclipse.jface.dialogs.Dialog
;
import
org.eclipse.swt.SWT
;
import
org.eclipse.swt.graphics.Image
;
import
org.eclipse.swt.layout.GridData
;
import
org.eclipse.swt.layout.GridLayout
;
import
org.eclipse.swt.widgets.*
;
import
org.jkiss.dbeaver.core.CoreMessages
;
import
org.jkiss.dbeaver.model.DBIcon
;
import
org.jkiss.dbeaver.model.access.DBAAuthInfo
;
import
org.jkiss.dbeaver.ui.DBeaverIcons
;
import
org.jkiss.dbeaver.ui.dialogs.BaseDialog
;
import
org.jkiss.utils.CommonUtils
;
...
...
@@ -33,50 +35,44 @@ import org.jkiss.utils.CommonUtils;
public
class
BaseAuthDialog
extends
BaseDialog
{
public
static
class
AuthInfo
{
public
String
userName
;
public
String
userPassword
;
public
boolean
savePassword
;
}
private
AuthInfo
authInfo
=
new
AuthInfo
();
private
DBAAuthInfo
authInfo
=
new
DBAAuthInfo
();
private
Text
usernameText
;
private
Text
passwordText
;
private
Button
savePasswordCheck
;
public
BaseAuthDialog
(
Shell
parentShell
,
String
title
,
Image
icon
)
public
BaseAuthDialog
(
Shell
parentShell
,
String
title
)
{
super
(
parentShell
,
title
,
icon
);
super
(
parentShell
,
title
,
DBeaverIcons
.
getImage
(
DBIcon
.
CONNECTIONS
)
);
}
public
AuthInfo
getAuthInfo
()
public
DBA
AuthInfo
getAuthInfo
()
{
return
authInfo
;
}
public
String
getUserName
()
{
return
authInfo
.
userName
;
return
authInfo
.
getUserName
()
;
}
public
void
setUserName
(
String
userName
)
{
this
.
authInfo
.
userName
=
userName
;
this
.
authInfo
.
setUserName
(
userName
)
;
}
public
String
getUserPassword
()
{
return
authInfo
.
userPassword
;
return
authInfo
.
getUserPassword
()
;
}
public
void
setUserPassword
(
String
userPassword
)
{
this
.
authInfo
.
userPassword
=
userPassword
;
this
.
authInfo
.
setUserPassword
(
userPassword
)
;
}
public
boolean
isSavePassword
()
{
return
authInfo
.
savePassword
;
return
authInfo
.
isSavePassword
()
;
}
public
void
setSavePassword
(
boolean
savePassword
)
{
this
.
authInfo
.
s
avePassword
=
savePassword
;
this
.
authInfo
.
s
etSavePassword
(
savePassword
)
;
}
@Override
...
...
@@ -110,8 +106,8 @@ public class BaseAuthDialog extends BaseDialog
gd
.
widthHint
=
120
;
//gd.horizontalSpan = 3;
usernameText
.
setLayoutData
(
gd
);
if
(
authInfo
.
userName
!=
null
)
{
usernameText
.
setText
(
authInfo
.
userName
);
if
(
authInfo
.
getUserName
()
!=
null
)
{
usernameText
.
setText
(
authInfo
.
getUserName
()
);
}
Label
passwordLabel
=
new
Label
(
credGroup
,
SWT
.
NONE
);
...
...
@@ -122,8 +118,8 @@ public class BaseAuthDialog extends BaseDialog
gd
=
new
GridData
(
GridData
.
FILL_HORIZONTAL
);
gd
.
grabExcessHorizontalSpace
=
true
;
passwordText
.
setLayoutData
(
gd
);
if
(
authInfo
.
userPassword
!=
null
)
{
passwordText
.
setText
(
authInfo
.
userPassword
);
if
(
authInfo
.
getUserPassword
()
!=
null
)
{
passwordText
.
setText
(
authInfo
.
getUserPassword
()
);
}
}
...
...
@@ -131,7 +127,7 @@ public class BaseAuthDialog extends BaseDialog
savePasswordCheck
.
setText
(
CoreMessages
.
dialog_connection_auth_checkbox_save_password
);
gd
=
new
GridData
(
GridData
.
HORIZONTAL_ALIGN_BEGINNING
);
savePasswordCheck
.
setLayoutData
(
gd
);
savePasswordCheck
.
setSelection
(
authInfo
.
savePassword
);
savePasswordCheck
.
setSelection
(
authInfo
.
isSavePassword
()
);
if
(!
CommonUtils
.
isEmpty
(
usernameText
.
getText
()))
{
passwordText
.
setFocus
();
...
...
@@ -142,9 +138,9 @@ public class BaseAuthDialog extends BaseDialog
@Override
protected
void
okPressed
()
{
authInfo
.
userName
=
usernameText
.
getText
(
);
authInfo
.
userPassword
=
passwordText
.
getText
(
);
authInfo
.
s
avePassword
=
savePasswordCheck
.
getSelection
(
);
authInfo
.
setUserName
(
usernameText
.
getText
()
);
authInfo
.
setUserPassword
(
passwordText
.
getText
()
);
authInfo
.
s
etSavePassword
(
savePasswordCheck
.
getSelection
()
);
super
.
okPressed
();
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionAuthDialog.java
浏览文件 @
33a430b2
...
...
@@ -40,8 +40,8 @@ public class ConnectionAuthDialog extends BaseAuthDialog
super
(
parentShell
,
networkHandler
!=
null
?
NLS
.
bind
(
CoreMessages
.
dialog_connection_auth_title_for_handler
,
networkHandler
.
getTitle
())
:
"'"
+
dataSource
.
getName
()
+
CoreMessages
.
dialog_connection_auth_title
,
//$NON-NLS-1$
DBeaverIcons
.
getImage
(
dataSource
.
getDriver
().
getIcon
())
);
"'"
+
dataSource
.
getName
()
+
CoreMessages
.
dialog_connection_auth_title
//$NON-NLS-1$
);
this
.
dataSource
=
dataSource
;
this
.
networkHandler
=
networkHandler
;
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/data/ValueViewDialog.java
浏览文件 @
33a430b2
...
...
@@ -63,6 +63,7 @@ import org.jkiss.dbeaver.ui.controls.ColumnInfoPanel;
import
org.jkiss.dbeaver.ui.data.*
;
import
org.jkiss.dbeaver.ui.data.IAttributeController
;
import
org.jkiss.dbeaver.ui.data.IValueController
;
import
org.jkiss.dbeaver.ui.data.managers.BaseValueManager
;
import
org.jkiss.dbeaver.ui.dialogs.struct.EditDictionaryDialog
;
import
org.jkiss.dbeaver.ui.editors.data.DatabaseDataEditor
;
import
org.jkiss.utils.CommonUtils
;
...
...
@@ -384,7 +385,7 @@ public abstract class ValueViewDialog extends Dialog implements IValueEditorStan
if
(
buttonId
==
IDialogConstants
.
IGNORE_ID
)
{
if
(!
valueController
.
isReadOnly
())
{
editedValue
=
DBUtils
.
makeNullValue
(
valueController
);
editedValue
=
BaseValueManager
.
makeNullValue
(
valueController
);
}
super
.
okPressed
();
}
else
{
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/
model/edit/prop
/ControlPropertyCommandListener.java
→
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/
ui/editors
/ControlPropertyCommandListener.java
浏览文件 @
33a430b2
...
...
@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package
org.jkiss.dbeaver.
model.edit.prop
;
package
org.jkiss.dbeaver.
ui.editors
;
import
org.jkiss.dbeaver.core.Log
;
import
org.eclipse.swt.SWT
;
...
...
@@ -23,8 +23,9 @@ import org.eclipse.swt.events.DisposeEvent;
import
org.eclipse.swt.events.DisposeListener
;
import
org.eclipse.swt.widgets.*
;
import
org.jkiss.dbeaver.model.edit.DBECommandReflector
;
import
org.jkiss.dbeaver.model.edit.prop.DBECommandProperty
;
import
org.jkiss.dbeaver.model.edit.prop.DBEPropertyHandler
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
import
org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor
;
import
org.jkiss.utils.CommonUtils
;
import
java.util.Calendar
;
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/binary/HexEditControl.java
浏览文件 @
33a430b2
...
...
@@ -28,7 +28,6 @@ import org.eclipse.swt.layout.GridData;
import
org.eclipse.swt.layout.GridLayout
;
import
org.eclipse.swt.widgets.*
;
import
org.jkiss.dbeaver.utils.GeneralUtils
;
import
org.jkiss.dbeaver.utils.TextUtils
;
import
org.jkiss.utils.CommonUtils
;
import
java.io.IOException
;
...
...
@@ -79,7 +78,7 @@ public class HexEditControl extends Composite {
// Compose header row
StringBuilder
rowChars
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
maxScreenResolution
/
minCharSize
/
3
;
++
i
)
rowChars
.
append
(
Text
Utils
.
byteToHex
[
i
&
0x0ff
]).
append
(
' '
);
rowChars
.
append
(
General
Utils
.
byteToHex
[
i
&
0x0ff
]).
append
(
' '
);
headerRow
=
rowChars
.
toString
().
toUpperCase
();
}
...
...
@@ -842,10 +841,10 @@ public class HexEditControl extends Composite {
else
theText
.
append
(
'0'
);
}
else
{
theText
.
append
(
Text
Utils
.
nibbleToHex
[
nibble
]);
theText
.
append
(
General
Utils
.
nibbleToHex
[
nibble
]);
}
}
theText
.
append
(
Text
Utils
.
nibbleToHex
[((
int
)
address
)
&
0x0f
]).
append
(
':'
);
theText
.
append
(
General
Utils
.
nibbleToHex
[((
int
)
address
)
&
0x0f
]).
append
(
':'
);
}
return
theText
;
...
...
@@ -860,7 +859,7 @@ public class HexEditControl extends Composite {
if
(
isHexOutput
)
{
result
=
new
StringBuilder
(
length
*
3
);
for
(
int
i
=
0
;
i
<
length
;
++
i
)
{
result
.
append
(
Text
Utils
.
byteToHex
[
tmpRawBuffer
[
i
]
&
0x0ff
]).
append
(
' '
);
result
.
append
(
General
Utils
.
byteToHex
[
tmpRawBuffer
[
i
]
&
0x0ff
]).
append
(
' '
);
}
}
else
{
result
=
new
StringBuilder
(
length
);
...
...
@@ -935,7 +934,7 @@ public class HexEditControl extends Composite {
}
content
.
get
(
ByteBuffer
.
wrap
(
tmpRawBuffer
,
0
,
1
),
null
,
getCaretPos
());
int
offset
=
(
int
)
(
getCaretPos
()
-
textAreasStart
);
hexText
.
replaceTextRange
(
offset
*
3
,
2
,
Text
Utils
.
byteToHex
[
tmpRawBuffer
[
0
]
&
0x0ff
]);
hexText
.
replaceTextRange
(
offset
*
3
,
2
,
General
Utils
.
byteToHex
[
tmpRawBuffer
[
0
]
&
0x0ff
]);
hexText
.
setStyleRange
(
new
StyleRange
(
offset
*
3
,
2
,
COLOR_BLUE
,
null
));
previewText
.
replaceTextRange
(
offset
,
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/binary/dialogs/FindReplaceDialog.java
浏览文件 @
33a430b2
...
...
@@ -28,7 +28,7 @@ import org.jkiss.dbeaver.core.CoreMessages;
import
org.jkiss.dbeaver.ui.editors.binary.BinaryTextFinder
;
import
org.jkiss.dbeaver.ui.editors.binary.HexEditControl
;
import
org.jkiss.dbeaver.ui.editors.binary.HexManager
;
import
org.jkiss.dbeaver.utils.
Text
Utils
;
import
org.jkiss.dbeaver.utils.
General
Utils
;
import
java.io.IOException
;
import
java.nio.ByteBuffer
;
...
...
@@ -352,7 +352,7 @@ public class FindReplaceDialog extends Dialog {
throw
new
RuntimeException
(
e
);
}
for
(
int
i
=
0
;
i
<
selectionLength
;
++
i
)
{
selectedText
.
append
(
Text
Utils
.
byteToHex
[
selection
[
i
]
&
0x0ff
]);
selectedText
.
append
(
General
Utils
.
byteToHex
[
selection
[
i
]
&
0x0ff
]);
}
findGroup
.
textCombo
.
setText
(
selectedText
.
toString
());
findGroup
.
selectText
();
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java
浏览文件 @
33a430b2
...
...
@@ -53,10 +53,7 @@ import org.jkiss.dbeaver.core.Log;
import
org.jkiss.dbeaver.model.DBPDataSource
;
import
org.jkiss.dbeaver.model.DBPPreferenceStore
;
import
org.jkiss.dbeaver.model.exec.DBCExecutionContext
;
import
org.jkiss.dbeaver.model.sql.SQLDataSource
;
import
org.jkiss.dbeaver.model.sql.SQLQuery
;
import
org.jkiss.dbeaver.model.sql.SQLQueryParameter
;
import
org.jkiss.dbeaver.model.sql.SQLUtils
;
import
org.jkiss.dbeaver.model.sql.*
;
import
org.jkiss.dbeaver.runtime.sql.SQLConstants
;
import
org.jkiss.dbeaver.ui.ICommandIds
;
import
org.jkiss.dbeaver.ui.ICommentsSupport
;
...
...
@@ -69,6 +66,7 @@ import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
import
org.jkiss.dbeaver.ui.preferences.PreferenceStoreDelegate
;
import
org.jkiss.dbeaver.utils.TextUtils
;
import
org.jkiss.utils.CommonUtils
;
import
org.jkiss.utils.Pair
;
import
java.util.*
;
...
...
@@ -686,7 +684,19 @@ public abstract class SQLEditorBase extends BaseTextEditor {
DBCExecutionContext
context
=
getExecutionContext
();
DBPDataSource
dataSource
=
context
==
null
?
null
:
context
.
getDataSource
();
if
(
dataSource
instanceof
SQLDataSource
)
{
return
((
SQLDataSource
)
dataSource
).
getSQLDialect
();
final
SQLDialect
dialect
=
((
SQLDataSource
)
dataSource
).
getSQLDialect
();
return
new
ICommentsSupport
()
{
@Nullable
@Override
public
Pair
<
String
,
String
>
getMultiLineComments
()
{
return
dialect
.
getMultiLineComments
();
}
@Override
public
String
[]
getSingleLineComments
()
{
return
dialect
.
getSingleLineComments
();
}
};
}
else
{
return
null
;
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/utils/GeneralUtils.java
浏览文件 @
33a430b2
...
...
@@ -18,15 +18,22 @@
package
org.jkiss.dbeaver.utils
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBeaverPreferences
;
import
org.jkiss.dbeaver.core.DBeaverCore
;
import
org.jkiss.dbeaver.core.Log
;
import
org.jkiss.dbeaver.model.DBPDataSource
;
import
org.jkiss.dbeaver.model.DBPPreferenceStore
;
import
org.jkiss.dbeaver.model.data.DBDDataFormatter
;
import
org.jkiss.dbeaver.ui.data.editors.NumberInlineEditor
;
import
org.jkiss.utils.CommonUtils
;
import
java.io.IOException
;
import
java.io.Writer
;
import
java.math.BigDecimal
;
import
java.math.BigInteger
;
import
java.nio.charset.Charset
;
import
java.text.ParseException
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -35,11 +42,14 @@ import java.util.Map;
*/
public
class
GeneralUtils
{
static
final
Log
log
=
Log
.
getLog
(
GeneralUtils
.
class
);
public
static
final
String
DEFAULT_FILE_CHARSET_NAME
=
"UTF-8"
;
public
static
final
Charset
UTF8_CHARSET
=
Charset
.
forName
(
"UTF-8"
);
public
static
final
Charset
DEFAULT_FILE_CHARSET
=
UTF8_CHARSET
;
public
static
final
Charset
ASCII_CHARSET
=
Charset
.
forName
(
"US-ASCII"
);
public
static
final
String
[]
byteToHex
=
new
String
[
256
];
public
static
final
char
[]
nibbleToHex
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
static
final
Map
<
String
,
byte
[]>
BOM_MAP
=
new
HashMap
<
String
,
byte
[]>();
static
final
char
[]
HEX_CHAR_TABLE
=
{
'0'
,
'1'
,
'2'
,
'3'
,
...
...
@@ -47,6 +57,15 @@ public class GeneralUtils {
'8'
,
'9'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
};
private
static
final
String
BAD_DOUBLE_VALUE
=
"2.2250738585072012e-308"
;
//$NON-NLS-1$
static
{
// Compose byte to hex map
for
(
int
i
=
0
;
i
<
256
;
++
i
)
{
byteToHex
[
i
]
=
Character
.
toString
(
nibbleToHex
[
i
>>>
4
])
+
nibbleToHex
[
i
&
0x0f
];
}
}
public
static
String
getDefaultFileEncoding
()
{
...
...
@@ -137,4 +156,51 @@ public class GeneralUtils {
}
return
bytes
;
}
@Nullable
public
static
Number
convertStringToNumber
(
String
text
,
Class
<?
extends
Number
>
hintType
,
DBDDataFormatter
formatter
)
{
if
(
text
==
null
||
text
.
length
()
==
0
)
{
return
null
;
}
try
{
if
(
hintType
==
Long
.
class
)
{
try
{
return
Long
.
valueOf
(
text
);
}
catch
(
NumberFormatException
e
)
{
return
new
BigInteger
(
text
);
}
}
else
if
(
hintType
==
Integer
.
class
)
{
return
Integer
.
valueOf
(
text
);
}
else
if
(
hintType
==
Short
.
class
)
{
return
Short
.
valueOf
(
text
);
}
else
if
(
hintType
==
Byte
.
class
)
{
return
Byte
.
valueOf
(
text
);
}
else
if
(
hintType
==
Float
.
class
)
{
return
Float
.
valueOf
(
text
);
}
else
if
(
hintType
==
Double
.
class
)
{
return
toDouble
(
text
);
}
else
if
(
hintType
==
BigInteger
.
class
)
{
return
new
BigInteger
(
text
);
}
else
{
return
new
BigDecimal
(
text
);
}
}
catch
(
NumberFormatException
e
)
{
log
.
debug
(
"Bad numeric value '"
+
text
+
"' - "
+
e
.
getMessage
());
//$NON-NLS-1$ //$NON-NLS-2$
try
{
return
(
Number
)
formatter
.
parseValue
(
text
,
hintType
);
}
catch
(
ParseException
e1
)
{
log
.
debug
(
"Can't parse numeric value ["
+
text
+
"] using formatter"
,
e
);
return
null
;
}
}
}
private
static
Number
toDouble
(
String
text
)
{
if
(
text
.
equals
(
BAD_DOUBLE_VALUE
))
{
return
Double
.
MIN_VALUE
;
}
return
Double
.
valueOf
(
text
);
}
}
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/utils/TextUtils.java
浏览文件 @
33a430b2
...
...
@@ -37,18 +37,8 @@ import java.util.regex.Pattern;
public
class
TextUtils
{
public
static
final
char
PARAGRAPH_CHAR
=
(
char
)
182
;
public
static
final
String
[]
byteToHex
=
new
String
[
256
];
public
static
final
char
[]
nibbleToHex
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
public
static
Pattern
VAR_PATTERN
=
Pattern
.
compile
(
"(\\$\\{([\\w\\.\\-]+)\\})"
,
Pattern
.
CASE_INSENSITIVE
);
static
{
// Compose byte to hex map
for
(
int
i
=
0
;
i
<
256
;
++
i
)
{
TextUtils
.
byteToHex
[
i
]
=
Character
.
toString
(
TextUtils
.
nibbleToHex
[
i
>>>
4
])
+
TextUtils
.
nibbleToHex
[
i
&
0x0f
];
}
}
public
static
boolean
isEmptyLine
(
IDocument
document
,
int
line
)
throws
BadLocationException
{
IRegion
region
=
document
.
getLineInformation
(
line
);
...
...
plugins/org.jkiss.dbeaver.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java
浏览文件 @
33a430b2
...
...
@@ -18,6 +18,9 @@
package
org.jkiss.dbeaver.ext.erd.editor
;
import
org.eclipse.core.runtime.IProgressMonitor
;
import
org.eclipse.core.runtime.IStatus
;
import
org.eclipse.core.runtime.MultiStatus
;
import
org.eclipse.core.runtime.Status
;
import
org.eclipse.draw2d.*
;
import
org.eclipse.draw2d.geometry.Dimension
;
import
org.eclipse.draw2d.geometry.Insets
;
...
...
@@ -60,6 +63,7 @@ import org.eclipse.ui.model.WorkbenchAdapter;
import
org.eclipse.ui.views.contentoutline.IContentOutlinePage
;
import
org.eclipse.ui.views.properties.IPropertySheetPage
;
import
org.eclipse.ui.views.properties.PropertySheetPage
;
import
org.jkiss.dbeaver.core.DBeaverCore
;
import
org.jkiss.dbeaver.core.Log
;
import
org.jkiss.dbeaver.ext.erd.Activator
;
import
org.jkiss.dbeaver.ext.erd.ERDConstants
;
...
...
@@ -960,11 +964,18 @@ public abstract class ERDEditorPart extends GraphicalEditorWithFlyoutPalette
if
(
entityDiagram
!=
null
)
{
List
<
String
>
errorMessages
=
entityDiagram
.
getErrorMessages
();
if
(!
errorMessages
.
isEmpty
())
{
// log.debug(message);
List
<
Status
>
messageStatuses
=
new
ArrayList
<
Status
>(
errorMessages
.
size
());
for
(
String
error
:
errorMessages
)
{
messageStatuses
.
add
(
new
Status
(
Status
.
ERROR
,
DBeaverCore
.
getCorePluginID
(),
error
));
}
MultiStatus
status
=
new
MultiStatus
(
DBeaverCore
.
getCorePluginID
(),
0
,
messageStatuses
.
toArray
(
new
IStatus
[
messageStatuses
.
size
()]),
null
,
null
);
UIUtils
.
showErrorDialog
(
control
.
getShell
(),
"Diagram loading errors"
,
"Error(s) occurred during diagram loading. If these errors are recoverable then fix errors and then refresh/reopen diagram"
,
errorMessage
s
);
statu
s
);
}
setInfo
(
entityDiagram
.
getEntityCount
()
+
" objects"
);
}
else
{
...
...
plugins/org.jkiss.dbeaver.mysql/src/org/jkiss/dbeaver/ext/mysql/editors/MySQLUserEditorGeneral.java
浏览文件 @
33a430b2
...
...
@@ -30,7 +30,7 @@ import org.jkiss.dbeaver.ext.mysql.model.MySQLGrant;
import
org.jkiss.dbeaver.ext.mysql.model.MySQLPrivilege
;
import
org.jkiss.dbeaver.ext.mysql.model.MySQLUser
;
import
org.jkiss.dbeaver.model.edit.DBECommandReflector
;
import
org.jkiss.dbeaver.
model.edit.prop
.ControlPropertyCommandListener
;
import
org.jkiss.dbeaver.
ui.editors
.ControlPropertyCommandListener
;
import
org.jkiss.dbeaver.model.impl.edit.DBECommandAdapter
;
import
org.jkiss.dbeaver.runtime.load.DatabaseLoadService
;
import
org.jkiss.dbeaver.runtime.load.LoadingUtils
;
...
...
plugins/org.jkiss.dbeaver.mysql/src/org/jkiss/dbeaver/ext/mysql/tools/MySQLDatabaseWizardPageSettings.java
浏览文件 @
33a430b2
...
...
@@ -82,7 +82,7 @@ public abstract class MySQLDatabaseWizardPageSettings<WIZARD extends AbstractToo
@Override
public
void
widgetSelected
(
SelectionEvent
e
)
{
BaseAuthDialog
authDialog
=
new
BaseAuthDialog
(
getShell
(),
"Authentication"
,
null
);
BaseAuthDialog
authDialog
=
new
BaseAuthDialog
(
getShell
(),
"Authentication"
);
authDialog
.
setUserName
(
wizard
.
getToolUserName
());
authDialog
.
setUserPassword
(
wizard
.
getToolUserPassword
());
authDialog
.
setSavePassword
(
savePassword
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录