📄 logindialog.java
字号:
setInitValue(login);
}
}
);
// 密码框的输入事件
text.addKeyListener(
new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.character == SWT.CR) {
doOk();
dialog.close();
}
}
}
);
// 密码框的改变事件
text.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
changed = true;
}
}
);
}
// 检查登陆历史信息文件的存在性,如果不存在在创建一个,如果创建也失败则返回false
private boolean checkLoginHistoryFile(File file) {
if(!file.exists()) {
try {
ModelUtils.createDefaultLoginXmlFile(file);
} catch (IOException e) {
log.error("无法创建登陆历史信息文件,历史信息将不被保存");
return false;
}
}
return true;
}
// 用户按了登陆按钮时调用这个方法
private void doOk() {
ok = true;
// 保存当前输入
saveInput();
// 得到登陆历史信息文件对象,如果不存在,创建一个
File loginHistory = new File(LumaQQ.LOGIN_HISTORY);
if(!checkLoginHistoryFile(loginHistory)) return;
// 检查是否当前登陆是新的记录
Login login = findLogin(combo.getText());
if(login == null) {
// 如果没有,把新的登陆信息加入
login = new LoginImpl();
logins.getLoginList().add(login);
// 排序所有的登陆信息,按照QQ号从小到大排
Collections.sort(logins.getLoginList(), new QQNumberComparator());
}
// 设置登陆信息
setLoginValue(login);
// 修改最后一次登陆的qq号信息
logins.setLastLogin(combo.getText());
// 写入文件
try {
logins.marshal(loginHistory);
} catch (IOException e) {
log.error("登陆历史信息写入失败,本次登陆将不记载");
}
}
/**
* 把当前信息存入Login对象中
* @param login Login对象
*/
private void setLoginValue(Login login) {
// 目前我采用了一个临时的办法,对于没有选择记住密码的人,把它的md5key做了base64之后
// 再做一次md5,再来一次base64,这样的话应该就安全了,即时它把字符串用base64解密
// 也没用了,但是对于我比较密码还是有用,就是在修改个人信息的时候那个密码,就是
// 那个地方还要比较一下密码,不然对于没有选择记住密码的人,我就不存了。当然了,选
// 择了记住密码的人肯定是不安全的
login.setQq(combo.getText());
login.setRememberPassword(String.valueOf(rememberPassword));
login.setLoginHidden(String.valueOf(loginHidden));
if(rememberPassword)
login.setPassword(new String(Base64.encode(md5pwd)));
else
login.setPassword(new String(Base64.encode(Utils.doMD5(new String(Base64.encode(md5pwd)).getBytes()))));
}
/**
* 初始化控件的值
*/
private void initValue() {
// 检查配置文件,如果不存在则创建一个
File loginHistory = new File(LumaQQ.LOGIN_HISTORY);
if(!checkLoginHistoryFile(loginHistory)) return;
// 读入登陆信息文件
try {
logins = LoginsUnmarshaller.unmarshal(loginHistory, false);
} catch (IOException e) {
log.error("无法读入登陆历史信息文件");
logins = null;
return;
}
// 得到上一次登陆的人的历史信息
Login login = findLogin(logins.getLastLogin());
// 把所有的QQ号都加到combo里面
addAllQq();
// 检查login,不应该为null,如果为null了,那文件有问题,采用第一项login
if(login == null) {
log.warn("登陆历史信息文件有错误");
List list = logins.getLoginList();
if(list == null || list.size() == 0) return;
login = (Login)list.get(0);
}
// 设置初始值
setInitValue(login);
}
/**
* 把所有的QQ号都加到combo里面
*/
private void addAllQq() {
List list = logins.getLoginList();
Iterator iter = list.iterator();
while(iter.hasNext()) {
Login l = (Login)iter.next();
combo.add(l.getQq());
}
}
/**
* @param qqStr 查找的QQ号
* @return 找到的Login对象,没有则为null
*/
private Login findLogin(String qqStr) {
List list = logins.getLoginList();
Iterator iter = list.iterator();
while(iter.hasNext()) {
Login login = (Login)iter.next();
if(login.getQq().equals(qqStr))
return login;
}
return null;
}
/**
* 设置初始值
* @param login Login对象
*/
private void setInitValue(Login login) {
combo.setText(login.getQq());
chkRemember.setSelection(login.getRememberPassword().equalsIgnoreCase("true"));
chkHidden.setSelection(login.getLoginHidden().equalsIgnoreCase("true"));
if(chkRemember.getSelection()) {
text.setText("xxxxxxxx");
md5pwd = Base64.decode(login.getPassword().toCharArray());
} else {
text.setText("");
md5pwd = new byte[16];
}
changed = false;
}
// 保存输入结果
private void saveInput() {
rememberPassword = chkRemember.getSelection();
loginHidden = chkHidden.getSelection();
qqNum = Utils.getInt(combo.getText(), 10001);
if(changed)
md5pwd = Utils.doMD5(Utils.doMD5(text.getText().getBytes()));
}
/**
* 打开对话框
*/
public boolean open() {
// create dialog
Shell parent = getParent();
Display display = parent.getDisplay();
dialog = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.MIN);
// init child controls
initLayout(dialog);
// 初始化控件的值
initValue();
// init event listeners
initListeners(dialog);
// set title and image
dialog.setImage(icons.getResource(IconHolder.icoQQ));
dialog.setText(LumaQQ.getResourceString("login.title"));
// set dialog to center of screen
Rectangle dialogRect = dialog.getBounds();
Rectangle displayRect = display.getBounds();
dialog.setLocation((displayRect.width-dialogRect.width)/2, (displayRect.height-dialogRect.height)/2);
// 设置密码框获得焦点
text.setFocus();
// event loop
dialog.open();
while(!dialog.isDisposed())
if(!display.readAndDispatch())
display.sleep();
return ok;
}
/**
* @return Returns the loginHidden.
*/
public boolean isLoginHidden() {
return loginHidden;
}
/**
* @return Returns the md5pwd.
*/
public byte[] getMd5pwd() {
return md5pwd;
}
/**
* @return Returns the qqNum.
*/
public int getQqNum() {
return qqNum;
}
/**
* @return Returns the rememberPassword.
*/
public boolean isRememberPassword() {
return rememberPassword;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent arg0) {
color.dispose();
loginButtonColor.dispose();
cancelButtonColor.dispose();
}
// 画Hover边界,就是鼠标移动到上面显示的边界
private void paintHoverBorder(GC gc, Rectangle r, boolean up) {
Display disp = dialog.getDisplay();
Color c1 = null;
Color c2 = null;
c1 = disp.getSystemColor(up?SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW:SWT.COLOR_WIDGET_BORDER);
c2 = disp.getSystemColor(up?SWT.COLOR_WIDGET_BORDER:SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);
if(c1 != null && c2 != null)
drawBevelRect(gc, r.x, r.y, r.width - 1, r.height - 1, c1, c2);
}
// 画一个Bevel矩形
private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright)
{
Color old = gc.getForeground();
gc.setForeground(bottomright);
gc.drawLine(x + w, y, x + w, y + h);
gc.drawLine(x, y + h, x + w, y + h);
gc.setForeground(topleft);
gc.drawLine(x, y, (x + w) - 1, y);
gc.drawLine(x, y, x, (y + h) - 1);
gc.setForeground(old);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -