帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

262 lines
7.3 KiB

/**
*
*/
package com.fr.design.mainframe.bbs;
import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager;
import com.fr.design.extra.LoginCheckContext;
import com.fr.design.extra.LoginCheckListener;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.mainframe.DesignerContext;
import com.fr.general.ComparatorUtils;
import com.fr.general.DateUtils;
import com.fr.general.http.HttpClient;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
/**
* @author neil
*
* @date: 2015-3-4-上午9:05:52
*/
public class UserInfoLabel extends UILabel{
//默认查询消息时间, 30s
private static final long CHECK_MESSAGE_TIME = 30 * 1000L;
//默认论坛检测到更新后的弹出延迟时间
private static final long DELAY_TIME = 2 * 1000L;
private static final String MESSAGE_KEY = "messageCount";
private static final int MIN_MESSAGE_COUNT = 1;
//用户名
private String userName;
//消息条数
private int messageCount;
private UserInfoPane userInfoPane;
private BBSLoginDialog bbsLoginDialog;
public UserInfoPane getUserInfoPane() {
return userInfoPane;
}
public void setUserInfoPane(UserInfoPane userInfoPane) {
this.userInfoPane = userInfoPane;
}
public BBSLoginDialog getBbsLoginDialog() {
return bbsLoginDialog;
}
public void setBbsLoginDialog(BBSLoginDialog bbsLoginDialog) {
this.bbsLoginDialog = bbsLoginDialog;
}
public UserInfoLabel(UserInfoPane userInfoPane) {
this.userInfoPane = userInfoPane;
String userName = DesignerEnvManager.getEnvManager().getBBSName();
this.addMouseListener(userInfoAdapter);
this.setHorizontalAlignment(SwingConstants.CENTER);
this.setText(userName);
setUserName(userName);
LoginCheckContext.addLoginCheckListener(new LoginCheckListener() {
@Override
public void loginChecked() {
if (bbsLoginDialog == null) {
bbsLoginDialog = new BBSLoginDialog(DesignerContext.getDesignerFrame(), UserInfoLabel.this);
}
bbsLoginDialog.clearLoginInformation();
bbsLoginDialog.tipForDownloadPluginWithoutLogin();
bbsLoginDialog.setModal(true);
bbsLoginDialog.showWindow();
}
});
}
/**
* showBBSDialog 弹出BBS资讯框
*/
public static void showBBSDialog(){
Thread showBBSThread = new Thread(new Runnable() {
@Override
public void run() {
if(!FRContext.isChineseEnv()){
return;
}
String lastBBSNewsTime = DesignerEnvManager.getEnvManager().getLastShowBBSNewsTime();
try {
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
if (ComparatorUtils.equals(lastBBSNewsTime, today)) {
return;
}
Thread.sleep(DELAY_TIME);
} catch (InterruptedException e) {
FRContext.getLogger().error(e.getMessage());
}
HttpClient hc = new HttpClient(BBSConstants.UPDATE_INFO_URL);
if (!hc.isServerAlive()){
return;
}
String res = hc.getResponseText();
if (res.indexOf(BBSConstants.UPDATE_KEY) == -1){
return;
}
try {
BBSDialog bbsLabel = new BBSDialog(DesignerContext.getDesignerFrame());
bbsLabel.showWindow(BBSConstants.UPDATE_INFO_URL);
DesignerEnvManager.getEnvManager().setLastShowBBSNewsTime(DateUtils.DATEFORMAT2.format(new Date()));
} catch (Throwable e) {
}
}
});
showBBSThread.start();
}
private void sleep(long millis){
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
FRContext.getLogger().error(e.getMessage());
}
}
public String getUserName() {
return userName;
}
/**
* 重置当前用户名
*
*/
public void resetUserName(){
this.userName = StringUtils.EMPTY;
}
public void setUserName(String userName) {
if(StringUtils.isEmpty(userName)){
return;
}
if(StringUtils.isEmpty(this.userName)){
updateMessageCount();
}
//往designerenvmanger里写一下
DesignerEnvManager.getEnvManager().setBBSName(userName);
this.userName = userName;
}
private void updateMessageCount(){
//启动获取消息更新的线程
//登陆状态, 根据存起来的用户名密码, 每1分钟发起一次请求, 更新消息条数.
Thread updateMessageThread = new Thread(new Runnable() {
@Override
public void run() {
sleep(CHECK_MESSAGE_TIME);
//从env中获取username, 因为如果注销的话, env的里username会被清空.
while(StringUtils.isNotEmpty(DesignerEnvManager.getEnvManager().getBBSName())){
HashMap<String, String> para = new HashMap<String, String>();
para.put("username", encode(encode(userName)));
HttpClient getMessage = new HttpClient(BBSConstants.GET_MESSAGE_URL, para);
getMessage.asGet();
if(getMessage.isServerAlive()){
try {
String res = getMessage.getResponseText();
if (StringUtils.isNotEmpty(res)) {
setMessageCount(Integer.parseInt(res));
}
} catch (Exception e) {
}
}
sleep(CHECK_MESSAGE_TIME);
}
}
});
updateMessageThread.start();
}
private String encode(String str){
try {
return URLEncoder.encode(str, EncodeConstants.ENCODING_UTF_8);
} catch (UnsupportedEncodingException e) {
return str;
}
}
public int getMessageCount() {
return messageCount;
}
public void setMessageCount(int messageCount) {
// 当只有一条消息时,阅读之后,消息面板重置为只含用户名的状态
if(this.messageCount == MIN_MESSAGE_COUNT && messageCount < MIN_MESSAGE_COUNT){
this.setText(this.userName);
return;
}
if(this.messageCount == messageCount || messageCount < MIN_MESSAGE_COUNT){
return;
}
this.messageCount = messageCount;
StringBuilder sb = new StringBuilder();
//内容eg: aaa(11)
sb.append(StringUtils.BLANK).append(this.userName)
.append("(").append(this.messageCount)
.append(")").append(StringUtils.BLANK);
//更新面板Text
this.setText(sb.toString());
}
private MouseAdapter userInfoAdapter = new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
UserInfoLabel.this.setCursor(new Cursor(Cursor.HAND_CURSOR));
};
@Override
public void mouseClicked(MouseEvent e) {
if(StringUtils.isNotEmpty(userName)){
try {
Desktop.getDesktop().browse(new URI(BBSConstants.DEFAULT_URL));
} catch (Exception exp) {
}
return;
}
if(bbsLoginDialog == null){
bbsLoginDialog = new BBSLoginDialog(DesignerContext.getDesignerFrame(),UserInfoLabel.this);
}
bbsLoginDialog.clearLoginInformation();
bbsLoginDialog.setModal(true);
bbsLoginDialog.showWindow();
}
};
}