package com.topsun.posclient.application;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.topsun.posclient.common.POSClientApp;
import com.topsun.posclient.common.ProjectUtil;
import com.topsun.posclient.common.service.IBaseService;
import com.topsun.posclient.common.service.impl.BaseServiceImpl;
import com.topsun.posclient.datamodel.User;
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
private CoolBar coolBar;
private Composite titleBar;
private Composite titleBar2;
private Composite statusLine;
private int coolBarBgImgHeight;
public ApplicationWorkbenchWindowAdvisor(
IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
public ActionBarAdvisor createActionBarAdvisor(
IActionBarConfigurer configurer) {
return new ApplicationActionBarAdvisor(configurer);
}
@Override
public boolean preWindowShellClose() {
boolean flag = MessageDialog.openConfirm(this.getWindowConfigurer().getWindow().getShell(), "关闭", "确认是否关闭系统吗?");
if(!flag){
return false;
}else{
return super.preWindowShellClose();
}
}
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setShowCoolBar(true);// 显示工具条区域
configurer.setShowStatusLine(true);// 显示状态栏区域
configurer.setShowProgressIndicator(false); // 显示进度条区域
configurer.setTitle("豫园POS客户端");
// configurer.setShellStyle(SWT.CLOSE | SWT.MIN |SWT.MAX);
configurer.setShowMenuBar(false);// 显示菜单区域
configurer.setShowFastViewBars(false);
TopSunApplicationActivator.getCustomization().getWindowListener()
.preWindowOpen(getWindowConfigurer());
// PlatformUI.getWorkbench().getDisplay().addFilter(SWT.MouseUp, new
// Listener() {
// public void handleEvent(final Event event) {
// int hwndCursor = OS.GetCapture();
// OS.PostMessage(hwndCursor, OS.WM_LBUTTONDOWN, hwndCursor, OS.HTCLIENT
// | (OS.WM_MOUSEMOVE << 16));
// }
// });
}
@Override
public void postWindowCreate() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
Shell shell = configurer.getWindow().getShell();
customizationWindow(shell);
coolBar = (CoolBar) getWindowConfigurer().createCoolBarControl(shell);
statusLine = (Composite) getWindowConfigurer().createStatusLineControl(
shell);
customizationWindow(shell);
customizationCoolBar(coolBar, shell);
// customizationStatusLine(statusLine, shell);
TopSunApplicationActivator.getDefault().createTitleBarManager(titleBar);
// TopSunApplicationActivator.getDefault().createStatusLineManager(statusLine);
TopSunApplicationActivator.getDefault().createToolBarManager(coolBar);
TopSunApplicationActivator.getDefault().setTitleBar2(titleBar2);
TopSunApplicationActivator.getCustomization().getWindowListener()
.postWindowCreate(getWindowConfigurer());
IStatusLineManager statusLine = configurer.getActionBarConfigurer()
.getStatusLineManager();
User user = POSClientApp.get().getLoginUser();
String userName = "";
if(user != null){
userName = user.getUserName();
}else{
return;
}
String luts = "";
String lastUpdateTimeStr = POSClientApp.get().getSysConfig().getLastUpdateTime();
if(null != lastUpdateTimeStr && lastUpdateTimeStr.length() > 0){
long lastUpdateTime = Long.valueOf(lastUpdateTimeStr);
luts = ProjectUtil.getDateTime(new Date(lastUpdateTime));
}
IBaseService baseService = new BaseServiceImpl();
int shopId = Integer.valueOf(POSClientApp.get().getSysConfig().getOwnerShop());
try {
String shopname = baseService.getShopNameById(shopId);
statusLine.setMessage("姓名:" + userName + " 店铺:"
+ shopname
+ " 登录时间:" + ProjectUtil.getDateTime(Calendar.getInstance().getTime())
+ " 最后更新:"
+ luts);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//}
// statusLine.setMessage("姓名:" + userName + " 店铺:"
// + POSClientApp.get().getSysConfig().getOwnerShop()
// + " 登录时间:" + ProjectUtil.getDateTime(Calendar.getInstance().getTime())
// + " 最后更新:"
// + luts);
}
private void customizationWindow(Shell shell) {
shell.setMaximized(true);
// frozenWindow(shell);
}
private void frozenWindow(final Shell shell) {
final AtomicBoolean windowOpened = new AtomicBoolean(false);
final AtomicInteger frozenWidth = new AtomicInteger();
final AtomicInteger frozenHeight = new AtomicInteger();
final AtomicInteger frozenX = new AtomicInteger();
final AtomicInteger frozenY = new AtomicInteger();
getWindowConfigurer().getWorkbenchConfigurer().getWorkbench()
.addWindowListener(new WindowListenerAdaptor() {
public void windowOpened(IWorkbenchWindow window) {
Rectangle bounds = shell.getBounds();
windowOpened.set(true);
frozenX.set(bounds.x);
frozenY.set(bounds.y);
frozenWidth.set(bounds.width);
frozenHeight.set(bounds.height);
}
});
shell.addControlListener(new ControlListener() {
public void controlResized(ControlEvent e) {
if (windowOpened.get()) {
if (!shell.getMinimized() && !shell.getMaximized()) {
shell.setLocation(frozenX.get(), frozenY.get());
shell.setSize(frozenWidth.get(), frozenHeight.get());
}
}
}
public void controlMoved(ControlEvent e) {
if (windowOpened.get()) {
if (shell.getLocation().x != frozenX.get()
|| shell.getLocation().y != frozenY.get()) {
shell.setLocation(frozenX.get(), frozenY.get());
shell.setSize(frozenWidth.get(), frozenHeight.get());
}
}
}
});
}
@Override
public void postWindowOpen() {
/* 重画titleBar */
titleBar.layout(true);
/* 重画coolBar,用于让coolBar的GridLayout.marginWidth生效 */
coolBar.layout(true);
/* 根据coolBarParent的背景图片,重设置coolBar的高度以完全展现图片,再重画 */
if (coolBarBgImgHeight > 0) {
((FormData) coolBar.getLayoutData()).height = coolBarBgImgHeight
- titleBar.getBounds().height;
// ((FormData) coolBar.getLayoutData()).width = 300;
coolBar.getParent().layout(true);
}
/* 重画statusLine */
statusLine.layout(true);
super.postWindowOpen();
}
private void customizationCoolBar(CoolBar coolBar, Shell shell) {
FormLayout formLayout = new FormLayout();
Composite coolBarParent = coolBar.getParent();
coolBarParent.setLayout(formLayout);
titleBar = new Composite(coolBarParent, SWT.NONE);
{
// 创建一个titleBar,将它放在coolbar的第一行
FormData formData = new FormData();
formData.top = new FormAttachment(0, 0);
formData.left = new FormAttachment(0, 0);
formData.right = new FormAttachment(100, 0);
formData.bottom = new FormAttachment(0, 20); /* 设置titleBar的高度为20 */
titleBar.setLayoutData(formData);
// 设置titleBar的layout
GridLayout gridLayout = new GridLayout();
gridLayout.horizontalSpacing = gridLayout.marginWidth = 0;
gridLayout.verticalSpacing = gridLayout.marginHeight = 0;
titleBar.setLayout(gridLayout);
}
{
// 将coolBar放在titleBar的下一行
FormData formData = new FormData();
formData.top = new FormAttachment(titleBar, 0, SWT.BOTTOM);
formData.left = new FormAttachment(0, -10);
formData.right = new FormAttachment(100, 0);
// formData.bottom = new FormAttachment(0, 70); /*设置titleBar的高度为20*/
coolBar.setLayoutData(formData);
coolBar.setLocked(true);
// 设置coolBar的layout
/*
* 不能给coolbar设置gridlayout,否则当view最大化之后,coolbar会移动位置
* 这里给coolbar设置gridlayout只是想让第一个tool
* item更靠近左边,现在这个通过上面的formData.left = new FormAttachment(0, -10);
* GridLayout gridLayout = new GridLayout();
* gridLayout.horizontalSpacing = gridLayout.marginWidth = 2;
* gridLayout.verticalSpacing = gridLayout.marginHeight = 0;
* coolBar.setLayout(gridLayout);
*/
}
titleBar2 = new Composite(coolBarParent, SWT.NONE);
{
FormData formData = new FormData();
formData.top = new FormAttachment(coolBar, 0, SWT.BOTTOM);
formData.left = new FormAttachment(0, 0);
formData.right = new FormAttachment(100, 0);
titleBar2.setLayoutData(formData);
Image image = AbstractUIPlugin.imageDescriptorFromPlugin(
TopSunApplicationActivator.PLUGIN_ID,
"icons/title-bar2-bg.png").createImage();
titleBar2.setBackgroundImage(image);
formData.height = titleBar2.getBackgroundImage().getBounds().height;
titleBar2.setLayout(new FillLayout());
titleBar2.setBackgroundMode(SWT.INHERIT_FORCE);
}
TopSunApplicationActivator.getDefault().setTitleBar2(titleBar2);
customizationTitleBar(titleBar, shell);
setCoolbarBackgroundImage(coolBar, shell);
}
private void customizationTitleBar(Composite titleBar, Shell shell) {
int expectedChildrenNum = calculateContributionItemsNum(IContributionItemService.CATEGORY_TITLE_BAR);
Composite titleBarToUse = createTitleBarToUse(titleBar, SWT.NONE,
expectedChildrenNum);
boolean filledItems = fillCompositeWithContributionItems(titleBarToUse,
IContributionItemService.CATEGORY_TITLE_BAR);
if (!filledItems) {
((FormData) titleBar.getLayoutData()).height = 0;
}
}
private void setCoolbarBackgroundImage(CoolBar coolBar, Shell shell) {
Image image = AbstractUIPlugin.imageDescriptorFromPlugin(
TopSunApplicationActivator.PLUGIN_ID,
"icons/coolbar-high-bg.png").createImage();
// kBgImgHeight = 80;
// Image image =
// TopSunApplicationActivator.getCustomization().getToolBarBackgroundImage();
if (image != null) {
coolBar.getParent().setBackgroundImage(image);
coolBar.getParent().setBackgroundMode(SWT.INHERIT_FORCE);
coolBarBgImgHeight = 80;
}
}
private int calculateContributionItemsNum(String itemCategroy) {
IContributionItemService itemService = TopSunApplicationActivator
.getContributionItemService();
IContributionItem[] items = itemService.getItems(itemCategroy);
int length = 0;
if (items != null) {
for (int i = 0; i < items.length; i++) {
if (items[i] != null && items[i].isVisible()) {
length++;
}
}
}
return length;
}
private Composite createTitleBarToUse(Composite composite, int style,
int expectedChildrenNum) {
return TopSunApplicationActivator.getCustomization()
.getTitleBarCreator()
.createComposite(composite, style, expectedChildrenNum);
}
private boolean fillCompositeWithContributionItems(Composite parent,
String itemCategroy) {
IContributionItemService itemService = TopSunApplicationActivator
.getContributionItemService();
IContributionItem[] items = itemService.getItems(itemCategroy);
if (items != null) {
for (IContributionItem item : items) {
if (item != null && item.isVisible()) {
item.fill(parent);
}
}
}
return items.length > 0;
}
}