📄 outlookbar.java
字号:
package com.hnjchina.example.outlook;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
public class OutlookBar extends Composite implements MouseListener,DisposeListener{
private Color background;
private Color foreground;
private Color beginColor;
private Color endColor;
private OutlookBarGroup selectedGroup;
private java.util.Map groups;
private java.util.Map groupsByControl;
private java.util.Map groupsByComposite;
private java.util.Map itemsByControl;
private java.util.List groupsList;
private OutlookBarLayout layout;
private int iconSize = 64;
class OutlookBarItemLayout extends Layout{
public OutlookBarItemLayout(OutlookBarGroup aGroup){group = aGroup;}
protected Point computeSize(Composite aComposite, int wHint, int hHint, boolean flushCache){
return group.getComposite().getSize();
}
protected void layout(Composite aComposite, boolean flushCache){
List itemList = group.getItemList();
Point size = group.getComposite().getSize();
int top = 4;
int width = size.x - 4;
int left = (width - getIconSize()) / 2;
for(int i = 0; i < itemList.size(); i++)
{
OutlookBarItem item = (OutlookBarItem)itemList.get(i);
Control control = item.getPeer();
control.setBounds(left, top, getIconSize(), getIconSize());
top += getIconSize() + 4;
Label itemLabel = item.getLabel();
itemLabel.setBounds(0, top, width, 16);
top = top + 16 + 12;
}
}
private OutlookBarGroup group;
}
class OutlookBarLayout extends Layout{
public OutlookBarLayout(){}
protected Point computeSize(Composite aComposite, int wHint, int hHint, boolean flushCache)
{
return getSize();//outlookBar.getSize();
}
protected void layout(Composite aComposite, boolean flushCache){
List groupList = getGroupsList();//outlookBar.getGroupsList();
Point barSize = getSize();//outlookBar.getSize();
int top = 0;
int left = 0;
for(int i = 0; i < groupList.size(); i++)
{
OutlookBarGroup group = (OutlookBarGroup)groupList.get(i);
ScrolledComposite groupContainer = group.getComposite();
Control control = group.getPeer();
if(group.isSelected())
{
control.setBounds(left, top, barSize.x, 24);
top += 24;
int controlBottom = layoutBottomUp(groupList, i, left, barSize.x, barSize.y);
groupContainer.setVisible(true);
groupContainer.setBounds(left, top, barSize.x, controlBottom - top);
groupContainer.getContent().setBounds(left,0,barSize.x,group.getItemList().size()*(getIconSize() + 32));
return;
}
control.setBounds(0, top, barSize.x, 24);
top += 24;
groupContainer.setVisible(false);
}
}
protected int layoutBottomUp(List aList, int aPosition, int aLeft, int aWidth, int aHeight){
int top = aHeight;
int width = aWidth;
for(int i = aList.size() - 1; i > aPosition; i--)
{
OutlookBarGroup group = (OutlookBarGroup)aList.get(i);
top -= 24;
Control control = group.getPeer();
control.setBounds(aLeft, top, width, 24);
ScrolledComposite groupContainer = group.getComposite();
groupContainer.setVisible(false);
}
return top;
}
}
public OutlookBar(Composite aComposite, int i){
super(aComposite, i);
selectedGroup = null;
groups = new HashMap();
groupsByControl = new HashMap();
groupsByComposite = new HashMap();
itemsByControl = new HashMap();
groupsList = new ArrayList();
layout = new OutlookBarLayout();
setLayout(layout);
if(background == null)
{
background = new Color(aComposite.getDisplay(), 125, 125, 125);
foreground = new Color(aComposite.getDisplay(), 255, 255, 255);
beginColor = new Color(aComposite.getDisplay(), 115,140,165);
endColor = new Color(aComposite.getDisplay(), 185,200,210);
}
setBackground(background);
addDisposeListener(this);
}
protected java.util.Map getGroups(){
return groups;
}
public void addGroup(OutlookBarGroup aGroup){
CLabel groupButton = new CLabel(this,SWT.FLAT | SWT.CENTER | SWT.BORDER);
groupButton.setBackground(new Color[]{beginColor,endColor},new int[] {100}, true);
aGroup.setPeer(groupButton);
groupButton.setText(aGroup.getName());
groupButton.addMouseListener(this);
ScrolledComposite groupContainer = new ScrolledComposite(this, SWT.V_SCROLL | SWT.BORDER);
groupContainer.setBackground(background);
Composite itemContainer = new Composite(groupContainer, SWT.NONE);
groupContainer.setContent(itemContainer);
groupContainer.setMinWidth(getIconSize());
itemContainer.setLayout(new OutlookBarItemLayout(aGroup));
aGroup.setComposite(groupContainer);
itemContainer.setBackground(background);
groups.put(aGroup.getId(), aGroup);
groupsByControl.put(groupButton, aGroup);
groupsByComposite.put(groupContainer, aGroup);
groupsList.add(aGroup);
aGroup.setPosition(groups.size());
if(selectedGroup == null)
{
selectedGroup = aGroup;
aGroup.setSelected(true);
}
}
public boolean isSelected(OutlookBarGroup aGroup){
if(selectedGroup != null)
{
return aGroup.getId().equals(selectedGroup.getId());
} else
{
selectedGroup = aGroup;
aGroup.setSelected(true);
return true;
}
}
public void addItem(String aGroup, OutlookBarItem aItem){
OutlookBarGroup group = (OutlookBarGroup)groups.get(aGroup);
aItem.setGroup(group);
Button itemButton = new Button((Composite)(group.getComposite().getContent()), SWT.FLAT);
aItem.setPeer(itemButton);
itemButton.setImage(aItem.getImage());
Label itemLabel = new Label((Composite)(group.getComposite().getContent()), 0);
aItem.setLabel(itemLabel);
itemLabel.setText(aItem.getName());
itemLabel.setAlignment(0x1000000);
itemLabel.setBackground(background);
itemLabel.setForeground(foreground);
group.addItem(aItem);
itemsByControl.put(itemButton, aItem);
}
public OutlookBarGroup getGroupByControl(Control aControl){
return (OutlookBarGroup)groupsByControl.get(aControl);
}
public OutlookBarGroup getGroupByComposite(Control aControl){
return (OutlookBarGroup)groupsByComposite.get(aControl);
}
public java.util.List getGroupsList(){return groupsList;}
public int getIconSize() {return iconSize;}
public void setIconSize(int iconSize) {
this.iconSize = iconSize;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
*/
public void mouseDoubleClick(MouseEvent arg0) {}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
*/
public void mouseDown(MouseEvent arg0) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
*/
public void mouseUp(MouseEvent event) {
// TODO Auto-generated method stub
Control vControl = (Control)event.widget;
OutlookBarGroup group = getGroupByControl(vControl);
if(group != null){
if(group.isSelected())
return;
selectedGroup.setSelected(false);
group.setSelected(true);
selectedGroup = group;
}
layout();
}
public void widgetDisposed(DisposeEvent arg0) {
background.dispose();
foreground.dispose();
beginColor.dispose();
endColor.dispose();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -