package com.vci.client.logon.client;
|
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Cursor;
|
import java.awt.Frame;
|
import java.awt.Insets;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseEvent;
|
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeListener;
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.LinkedHashMap;
|
import java.util.LinkedList;
|
import java.util.concurrent.Callable;
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
import java.util.concurrent.TimeUnit;
|
|
import javax.swing.JProgressBar;
|
import javax.swing.SwingUtilities;
|
import javax.swing.SwingWorker;
|
import javax.swing.Timer;
|
|
import org.jdesktop.swingx.JXStatusBar;
|
import org.jdesktop.swingx.plaf.basic.BasicStatusBarUI;
|
|
import com.vci.client.common.ConfigUtils;
|
import com.vci.client.framework.util.RightControlUtil;
|
import com.vci.client.ui.swing.VCISwingUtil;
|
import com.vci.client.ui.swing.components.VCIJButton;
|
import com.vci.client.ui.swing.components.VCIJDialog;
|
import com.vci.client.ui.swing.components.VCIJLabel;
|
import com.vci.client.ui.swing.components.VCIJPanel;
|
import com.vci.client.ui.swing.components.table.AbstractVCIJTableDataProvider;
|
import com.vci.client.ui.swing.components.table.VCIJTableNode;
|
import com.vci.client.ui.swing.components.table.VCIJTablePanel;
|
import com.vci.mw.ClientContextVariable;
|
|
public class StatusBar extends JXStatusBar implements PropertyChangeListener{
|
|
/**
|
*
|
*/
|
private static final long serialVersionUID = -8839998684796112327L;
|
|
private static StatusBar _instance = null;
|
public static StatusBar getInstance(){
|
if(_instance == null){
|
synchronized(StatusBar.class){
|
if(_instance == null){
|
_instance = new StatusBar();
|
}
|
}
|
}
|
return _instance;
|
}
|
|
private VCIJLabel lblStatus = new VCIJLabel();
|
private VCIJLabel lightIcon = new VCIJLabel();
|
private JProgressBar progressBar = new JProgressBar(0, 100);
|
private VCIJLabel lblDate = new VCIJLabel();
|
private StatusBar(){
|
super();
|
init();
|
}
|
|
private void init(){
|
boolean autoAddSeparator = true;
|
boolean isWindowPlatform = System.getProperty("os.name").toLowerCase().contains("windows");
|
if(isWindowPlatform){
|
double osVersion = Double.valueOf(System.getProperty("os.version"));
|
if(osVersion >= 6){
|
autoAddSeparator = false;
|
}
|
}
|
putClientProperty(BasicStatusBarUI.AUTO_ADD_SEPARATOR, autoAddSeparator);
|
lightIcon.setIcon(VCISwingUtil.createImageIcon("lightbulb.png"));
|
Insets insets = new Insets(0, 5, 0, 5);
|
Constraint c1 = new Constraint(insets);
|
c1.setFixedWidth(32);
|
add(lightIcon, c1);
|
|
lblStatus.setForeground(Color.BLUE);
|
Constraint c2 = new Constraint(insets);
|
c2.setFixedWidth(400);
|
add(lblStatus, c2);
|
lblStatus.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
lblStatus.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent e) {
|
if(e.getButton() == MouseEvent.BUTTON1){
|
showHistoryMessage();
|
}
|
}
|
});
|
|
Constraint c3 = new Constraint(JXStatusBar.Constraint.ResizeBehavior.FILL, insets);
|
progressBar.setStringPainted(true);
|
progressBar.setValue(100);
|
add(progressBar, c3);
|
|
Constraint c4 = new Constraint(insets);
|
c4.setFixedWidth(200);
|
String displayTime = ConfigUtils.getConfigValue("statusbar.display.time");
|
if (displayTime != null && displayTime.equalsIgnoreCase("true")) {
|
lblDate.setText(getNowDateString());
|
timerNowDate.start();
|
add(lblDate, c4);
|
}
|
|
Constraint c5 = new Constraint(insets);
|
c5.setFixedWidth(200);
|
add(new VCIJLabel(""), c5);
|
}
|
|
private Timer timerNowDate = new Timer(1000, new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
lblDate.setText(getNowDateString());
|
}
|
});
|
|
|
private String getNowDateString(){
|
String res = "";
|
try{
|
Calendar cal = Calendar.getInstance();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
|
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
|
res = sdf.format(cal.getTime()) + " " + getDayOfWeekString(dayOfWeek);
|
}catch(Exception ex){
|
ex.printStackTrace();
|
}
|
return res;
|
}
|
|
private String getDayOfWeekString(int dayOfWeek){
|
String res = "";
|
if(dayOfWeek == Calendar.MONDAY) res = "星期一";
|
else if(dayOfWeek == Calendar.TUESDAY) res = "星期二";
|
else if(dayOfWeek == Calendar.WEDNESDAY) res = "星期三";
|
else if(dayOfWeek == Calendar.THURSDAY) res = "星期四";
|
else if(dayOfWeek == Calendar.FRIDAY) res = "星期五";
|
else if(dayOfWeek == Calendar.SATURDAY) res = "星期六";
|
else if(dayOfWeek == Calendar.SUNDAY) res = "星期日";
|
return res;
|
}
|
|
private Timer timer = new Timer(5000, new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
lblStatus.setText("点击查看更多历史消息!");
|
}
|
});
|
/**
|
* 设置状态栏消息内容
|
* @param message 消息内容
|
* @param toHistory 是否需要将消息内容追加到HistoryTable列表中,true:追加 false:追加
|
*/
|
public void setStatusMessage(String message, boolean toHistory){
|
if(message == null) return;
|
histMsgList.clear();
|
if(toHistory && !"".equals(message.trim())){
|
histMsgList.add(new HistoryMessage(getNowDateString(), message));
|
}
|
lblStatus.setText(message);
|
timer.setRepeats(false);
|
timer.start();
|
}
|
/**
|
* 设置状态栏消息内容,默认将内容添加HistoryTable列表中,以便延迟查看
|
* @param message 消息内容
|
*/
|
public void setStatusMessage(String message){
|
setStatusMessage(message, true);
|
}
|
|
public void clearStatusMessage(){
|
histMsgList.clear();
|
lblStatus.setText("");
|
tablePanel.refreshTableData();
|
}
|
|
private void showHistoryMessage(){
|
SwingUtilities.invokeLater(new Runnable() {
|
@Override
|
public void run() {
|
showHistoryMessageDialog();
|
}
|
});
|
}
|
|
VCIJDialog dialogHistMsg = null;
|
private void showHistoryMessageDialog(){
|
Frame frame = ClientContextVariable.getFrame();
|
if(dialogHistMsg == null){
|
dialogHistMsg = new VCIJDialog(frame);
|
dialogHistMsg.setModal(true);;
|
dialogHistMsg.setTitle("消息列表");
|
dialogHistMsg.setSize(800, 600);
|
if(tablePanel == null){
|
tablePanel = getHistoryMessageDataPanel();
|
}
|
VCIJPanel pal = new VCIJPanel(new BorderLayout());
|
pal.add(tablePanel, BorderLayout.CENTER);
|
pal.add(getDialogSouthButtonPanel(), BorderLayout.SOUTH);
|
dialogHistMsg.getContentPane().add(pal);
|
}
|
tablePanel.refreshTableData();
|
dialogHistMsg.setLocationRelativeTo(frame);
|
dialogHistMsg.setVisible(true);
|
}
|
|
private VCIJPanel getDialogSouthButtonPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
VCIJButton btnClose = VCISwingUtil.createVCIJButton("close", "关闭", "关闭", "close.png", new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
if(dialogHistMsg != null){
|
dialogHistMsg.setVisible(false);
|
}
|
}
|
});
|
VCIJButton btnClear = VCISwingUtil.createVCIJButton("clearn", "清空", "清空", "clear.gif", new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
clearStatusMessage();
|
}
|
});
|
pal.add(btnClear);
|
pal.add(btnClose);
|
return pal;
|
}
|
|
private VCIJTablePanel<HistoryMessage> tablePanel = null;
|
private VCIJTablePanel<HistoryMessage> getHistoryMessageDataPanel(){
|
HistoryMessageDataProvider dataProvider = new HistoryMessageDataProvider();
|
tablePanel = new VCIJTablePanel<StatusBar.HistoryMessage>(dataProvider);
|
tablePanel.setShowExport(false);
|
tablePanel.setShowPaging(false);
|
tablePanel.setShowProgressBar(false);
|
LinkedHashMap<Integer, Integer> columnWidthMap = new LinkedHashMap<Integer, Integer>();
|
int index = dataProvider.getDataColumnStartIndex();
|
columnWidthMap.put(index++, 200);
|
columnWidthMap.put(index++, 450);
|
tablePanel.setColumnDefaultWidthMax(1000);
|
tablePanel.setColumnWidthMaps(columnWidthMap);
|
tablePanel.buildTablePanel();
|
tablePanel.refreshTableData();
|
return tablePanel;
|
}
|
|
private class HistoryMessageDataProvider extends AbstractVCIJTableDataProvider<HistoryMessage>{
|
@Override
|
public String[] getSpecialColumns() {
|
return "时间,消息内容".split(",");
|
}
|
|
@Override
|
public int getTotal() {
|
return histMsgList.size();
|
}
|
|
@Override
|
public VCIJTableNode<HistoryMessage> getNewRowNode(
|
HistoryMessage dataObj) {
|
VCIJTableNode<HistoryMessage> tableNode = new VCIJTableNode<StatusBar.HistoryMessage>(dataObj);
|
int index = 0;
|
String[] names = getSpecialColumns();
|
tableNode.setPropertyValue(names[index++], dataObj.getAddTime());
|
tableNode.setPropertyValue(names[index++], dataObj.getMessageContent());
|
return tableNode;
|
}
|
|
@Override
|
public HistoryMessage[] getDatas(int pageIndex, int pageSize) {
|
return histMsgList.toArray(new HistoryMessage[]{});
|
}
|
}
|
|
private LinkedList<HistoryMessage> histMsgList = new LinkedList<StatusBar.HistoryMessage>();
|
private class HistoryMessage{
|
private String addTime = "";
|
private String messageContent = "";
|
public HistoryMessage(String addTime, String messageContent) {
|
super();
|
this.addTime = addTime;
|
this.messageContent = messageContent;
|
}
|
public String getAddTime() {
|
return addTime;
|
}
|
public void setAddTime(String addTime) {
|
this.addTime = addTime;
|
}
|
public String getMessageContent() {
|
return messageContent;
|
}
|
public void setMessageContent(String messageContent) {
|
this.messageContent = messageContent;
|
}
|
}
|
|
public void launchFinished(String message){
|
setStatusMessage(message);
|
setProgressBarVisiable(false, 3);
|
}
|
public void setProgressBarVisiable(final boolean visiable){
|
setProgressBarVisiable(visiable, 3);
|
}
|
public void setProgressBarVisiable(final boolean visiable, final int lazySeconds){
|
new ScheduledThreadPoolExecutor(10).schedule(new Callable<Void>() {
|
@Override
|
public Void call() throws Exception {
|
progressBar.setVisible(visiable);
|
return null;
|
}
|
}, lazySeconds, TimeUnit.SECONDS);
|
}
|
|
|
@SuppressWarnings("rawtypes")
|
public void launchModuleAndShowProgressBar(SwingWorker worker,
|
boolean indeterminate){
|
launchModuleAndShowProgressBar(worker, indeterminate, true);
|
}
|
@SuppressWarnings("rawtypes")
|
public void launchModuleAndShowProgressBar(SwingWorker worker,
|
boolean indeterminate, boolean addProgressPropertyChange){
|
setProgressBarVisiable(true, 0);
|
setStatusMessage("", false);
|
// 进度条确定&非确定模式
|
this.progressBar.setIndeterminate(indeterminate);
|
if(addProgressPropertyChange){
|
worker.addPropertyChangeListener(this);
|
}
|
worker.execute();
|
}
|
|
@Override
|
public void propertyChange(PropertyChangeEvent evt) {
|
if ("progress".equals(evt.getPropertyName())) {
|
Object newValue = evt.getNewValue();
|
if(newValue instanceof Integer){
|
int progress = (Integer)newValue;
|
this.progressBar.setValue(progress);
|
}
|
}
|
}
|
public void setProgressBarValue(int value){
|
this.progressBar.setValue(value);
|
}
|
}
|