networkitem.java

来自「SANCHO」· Java 代码 · 共 184 行

JAVA
184
字号
/* * Copyright (C) 2004-2005 Rutger M. Ovidius for use with the sancho project. * See LICENSE.txt for license information. */package sancho.view.statusline;import java.util.Arrays;import java.util.Comparator;import java.util.Observable;import org.eclipse.jface.action.IMenuListener;import org.eclipse.jface.action.IMenuManager;import org.eclipse.jface.action.MenuManager;import org.eclipse.jface.action.Separator;import org.eclipse.swt.SWT;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.graphics.Rectangle;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Menu;import org.eclipse.swt.widgets.ToolBar;import org.eclipse.swt.widgets.ToolItem;import sancho.core.Sancho;import sancho.model.mldonkey.Network;import sancho.view.StatusLine;import sancho.view.statusline.actions.NetworkConnectMoreAction;import sancho.view.statusline.actions.NetworkDisableAction;import sancho.view.statusline.actions.NetworkEnableAction;import sancho.view.utility.WidgetFactory;public class NetworkItem implements IStatusItem {  private Composite composite = null;  private Composite parentComposite;  private ToolBar toolBar;  public NetworkItem(StatusLine statusline) {    this.parentComposite = new Composite(statusline.getStatusline(), SWT.NONE);    this.parentComposite.setLayout(WidgetFactory.createGridLayout(1, 0, 0, 0, 0, false));    this.parentComposite.setLayoutData(new GridData(GridData.FILL_VERTICAL));    setConnected(Sancho.getCoreFactory().isConnected());  }  private void createContent() {    if (composite != null)      composite.dispose();    composite = new Composite(parentComposite, SWT.NONE);    composite.setLayout(WidgetFactory.createGridLayout(1, 0, 0, 0, 0, false));    composite.setLayoutData(new GridData(GridData.FILL_VERTICAL));    toolBar = new ToolBar(composite, SWT.FLAT);    if (!Sancho.hasCollectionFactory())      return;    Network[] networks = Sancho.getCore().getNetworkCollection().getNetworks();    Arrays.sort(networks, new NetworkComparator());    ToolItem toolItem;    for (int i = 0; i < networks.length; i++) {      Network network = networks[i];      if (!network.isVirtual()) {        toolItem = new ToolItem(toolBar, SWT.NONE);        toolItem.setData(network);        final MenuManager popupMenu = new MenuManager();        popupMenu.setRemoveAllWhenShown(true);        popupMenu.addMenuListener(new NetworkMenuListener(network));        toolItem.addSelectionListener(new SelectionAdapter() {          public void widgetSelected(SelectionEvent event) {            Rectangle bounds = ((ToolItem) event.widget).getBounds();            Menu menu = popupMenu.createContextMenu(toolBar);            Point point = new Point(bounds.x, bounds.y + bounds.height);            point = toolBar.toDisplay(point);            menu.setLocation(point.x, point.y);            menu.setVisible(true);          }        });        toolItem.addDisposeListener(new DisposeListener() {          public void widgetDisposed(DisposeEvent e) {            if (Sancho.hasCollectionFactory())              Sancho.getCore().getNetworkCollection().deleteObserver(NetworkItem.this);          }        });        toolItem.setToolTipText(network.getToolTip());        toolItem.setImage(network.getImage());      }    }    parentComposite.layout();    parentComposite.getParent().layout();  }  private ToolItem getToolItemByNetwork(Network network) {    if (toolBar == null || toolBar.isDisposed())      return null;    ToolItem[] toolItems = toolBar.getItems();    ToolItem toolItem;    for (int i = 0; i < toolItems.length; i++) {      toolItem = toolItems[i];      if (toolItem != null && !toolItem.isDisposed() && toolItem.getData() == network)        return toolItem;    }    return null;  }  public void setConnected(boolean connected) {    if (connected && Sancho.hasCollectionFactory()) {      createContent();      Sancho.getCore().getNetworkCollection().addObserver(this);    } else {      if (composite != null)        composite.dispose();      composite = new Composite(parentComposite, SWT.NONE);      composite.setLayoutData(WidgetFactory.createGridData(SWT.NONE, 1, 1));      parentComposite.layout();    }  }  public void update(Observable o, Object arg) {    if (arg == null || !(arg instanceof Network) || toolBar == null || toolBar.isDisposed())      return;    final Network network = (Network) arg;    composite.getDisplay().asyncExec(new Runnable() {      public void run() {        if (toolBar == null || toolBar.isDisposed())          return;        ToolItem toolItem = getToolItemByNetwork(network);        if (toolItem != null && !toolItem.isDisposed()) {          toolItem.setImage(network.getImage());          toolItem.setToolTipText(network.getToolTip());        }      }    });  }  static class NetworkComparator implements Comparator {    public int compare(Object o1, Object o2) {      Network network1 = (Network) o1;      Network network2 = (Network) o2;      if (network1.getName().equalsIgnoreCase("g2") && network2.getName().equalsIgnoreCase("gnutella"))        return 1;      if (network2.getName().equalsIgnoreCase("g2") && network1.getName().equalsIgnoreCase("gnutella"))        return -1;      return network1.getName().compareToIgnoreCase(network2.getName());    }  }  static class NetworkMenuListener implements IMenuListener {    Network network;    public NetworkMenuListener(Network network) {      this.network = network;    }    public void menuAboutToShow(IMenuManager manager) {      if (!network.isVirtual()) {        if (network.isEnabled())          manager.add(new NetworkDisableAction(network));        else          manager.add(new NetworkEnableAction(network));      }      if (network.isEnabled() && (network.hasServers() || network.hasSupernodes())) {        manager.add(new Separator());        manager.add(new NetworkConnectMoreAction(network));      }    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?