Package com.aelitis.azureus.ui.swt.views

Source Code of com.aelitis.azureus.ui.swt.views.TopBarView

/**
* Created on Jun 27, 2008
*
* Copyright 2008 Vuze, Inc.  All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

package com.aelitis.azureus.ui.swt.views;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTInstanceImpl;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewImpl;
import org.gudy.azureus2.ui.swt.views.IView;
import org.gudy.azureus2.ui.swt.views.stats.VivaldiView;

import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.skin.SkinConstants;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.skin.*;
import com.aelitis.azureus.ui.swt.skin.SWTSkinButtonUtility.ButtonListenerAdapter;
import com.aelitis.azureus.ui.swt.views.skin.SkinView;

/**
* @author TuxPaper
* @created Jun 27, 2008
*
*/
public class TopBarView
  extends SkinView
{
  private List topbarViews = new ArrayList();

  private IView activeTopBar;

  private SWTSkin skin;

  private org.eclipse.swt.widgets.List listPlugins;

  private Composite cPluginArea;

 
  public Object skinObjectInitialShow(SWTSkinObject skinObject, Object params) {
    this.skin = skinObject.getSkin();
   
    skin.addListener("topbar-plugins", new SWTSkinObjectListener() {
      public Object eventOccured(SWTSkinObject skinObject, int eventType,
          Object params) {
        if (eventType == SWTSkinObjectListener.EVENT_SHOW) {
          skin.removeListener("topbar-plugins", this);
          // building needs UISWTInstance, which needs core.
          AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
            public void azureusCoreRunning(AzureusCore core) {
              Utils.execSWTThreadLater(0, new AERunnable() {
                public void runSupport() {
                  buildTopBarViews();
                }
              });
            }
          });
        }
        return null;
      }
    });
    // trigger autobuild
    skin.getSkinObject("topbar-area-plugin");
    return null;
  }

  /**
   * @param skinObject
   *
   * @since 3.0.1.1
   */
  public void buildTopBarViews() {
    // TODO actually use plugins..
    SWTSkinObject skinObject = skin.getSkinObject("topbar-plugins");
    if (skinObject == null) {
      return;
    }

    try {
      IView[] coreTopBarViews = {
        new ViewDownSpeedGraph(),
        new ViewUpSpeedGraph(),
        new VivaldiView(false)
      };

      cPluginArea = (Composite) skinObject.getControl();

      final UIUpdatable updatable = new UIUpdatable() {
        public void updateUI() {
          Object[] views = topbarViews.toArray();
          for (int i = 0; i < views.length; i++) {
            try {
              IView view = (IView) views[i];
              if (view.getComposite().isVisible()) {
                view.refresh();
              }
            } catch (Exception e) {
              Debug.out(e);
            }
          }
        }

        public String getUpdateUIName() {
          return "TopBar";
        }
      };
      try {
        UIFunctionsManager.getUIFunctions().getUIUpdater().addUpdater(updatable);
      } catch (Exception e) {
        Debug.out(e);
      }

      skinObject.getControl().addDisposeListener(new DisposeListener() {
        public void widgetDisposed(DisposeEvent e) {
          try {
            UIFunctionsManager.getUIFunctions().getUIUpdater().removeUpdater(
                updatable);
          } catch (Exception ex) {
            Debug.out(ex);
          }
          Object[] views = topbarViews.toArray();
          topbarViews.clear();
          for (int i = 0; i < views.length; i++) {
            IView view = (IView) views[i];
            view.delete();
          }
        }
      });

      SWTSkinObject soPrev = skin.getSkinObject("topbar-plugin-prev");
      if (soPrev != null) {
        SWTSkinButtonUtility btnPrev = new SWTSkinButtonUtility(soPrev);
        btnPrev.addSelectionListener(new ButtonListenerAdapter() {
          public void pressed(SWTSkinButtonUtility buttonUtility,
              SWTSkinObject skinObject, int stateMask) {
            //System.out.println("prev click " + activeTopBar + " ; "
            //    + topbarViews.size());
            if (activeTopBar == null || topbarViews.size() <= 1) {
              return;
            }
            int i = topbarViews.indexOf(activeTopBar) - 1;
            if (i < 0) {
              i = topbarViews.size() - 1;
            }
            activateTopBar((IView) topbarViews.get(i));
          }
        });
      }

      SWTSkinObject soNext = skin.getSkinObject("topbar-plugin-next");
      if (soNext != null) {
        SWTSkinButtonUtility btnNext = new SWTSkinButtonUtility(soNext);
        btnNext.addSelectionListener(new ButtonListenerAdapter() {
          public void pressed(SWTSkinButtonUtility buttonUtility,
              SWTSkinObject skinObject, int stateMask) {
            //System.out.println("next click");
            if (activeTopBar == null || topbarViews.size() <= 1) {
              return;
            }
            int i = topbarViews.indexOf(activeTopBar) + 1;
            if (i >= topbarViews.size()) {
              i = 0;
            }
            activateTopBar((IView) topbarViews.get(i));
          }
        });
      }

      SWTSkinObject soTitle = skin.getSkinObject("topbar-plugin-title");
      if (soTitle != null) {
        final Composite cTitle = (Composite) soTitle.getControl();
        cTitle.addPaintListener(new PaintListener() {
          public void paintControl(PaintEvent e) {
            e.gc.setAdvanced(true);
            //Font font = new Font(e.gc.getDevice(), "Sans", 8, SWT.NORMAL);
            //e.gc.setFont(font);
            if (e.gc.getAdvanced() && activeTopBar != null) {
              try {
                e.gc.setTextAntialias(SWT.ON);
              } catch (Exception ex) {
                // Ignore ERROR_NO_GRAPHICS_LIBRARY error or any others
              }

              try {
                Transform transform = new Transform(e.gc.getDevice());
                transform.rotate(270);
                e.gc.setTransform(transform);

                String s = activeTopBar.getShortTitle();
                Point size = e.gc.textExtent(s);
                e.gc.drawText(s, -size.x, 0, true);
                //e.gc.drawText(s, 0,0, true);
                transform.dispose();
              } catch (Exception ex) {
                // setTransform can trhow a ERROR_NO_GRAPHICS_LIBRARY error
                // no use trying to draw.. it would look weird
              }
              //font.dispose();
            }
          }
        });
      }

      SWTSkinObject soList = skin.getSkinObject("topbar-plugin-list");
      if (soList != null) {
        final Composite cList = (Composite) soList.getControl();
        listPlugins = new org.eclipse.swt.widgets.List(cList, SWT.None);
        listPlugins.setLayoutData(Utils.getFilledFormData());
        listPlugins.setBackground(cList.getBackground());
        listPlugins.setForeground(cList.getForeground());
        listPlugins.addSelectionListener(new SelectionListener() {
          public void widgetSelected(SelectionEvent e) {
            int i = listPlugins.getSelectionIndex();
            if (i >= 0 && i < topbarViews.size()) {
              activateTopBar((IView) topbarViews.get(i));
              COConfigurationManager.setParameter("topbar.viewindex", i);
            }
          }

          public void widgetDefaultSelected(SelectionEvent e) {
          }
        });
      }

      skinObject = skin.getSkinObject(SkinConstants.VIEWID_PLUGINBAR);
      if (skinObject != null) {
        Listener l = new Listener() {
          private int mouseDownAt = 0;

          public void handleEvent(Event event) {
            Composite c = (Composite) event.widget;
            if (event.type == SWT.MouseDown) {
              Rectangle clientArea = c.getClientArea();
              if (event.y > clientArea.height - 10) {
                mouseDownAt = event.y;
              }
            } else if (event.type == SWT.MouseUp && mouseDownAt > 0) {
              int diff = event.y - mouseDownAt;
              mouseDownAt = 0;
              FormData formData = (FormData) c.getLayoutData();
              formData.height += diff;
              if (formData.height < 50) {
                formData.height = 50;
              } else {
                Rectangle clientArea = c.getShell().getClientArea();
                int max = clientArea.height - 350;
                if (formData.height > max) {
                  formData.height = max;
                }
              }
              COConfigurationManager.setParameter("v3.topbar.height",
                  formData.height);
              Utils.relayout(c);
            } else if (event.type == SWT.MouseMove) {
              Rectangle clientArea = c.getClientArea();
              boolean draggable = (event.y > clientArea.height - 10);
              c.setCursor(draggable ? c.getDisplay().getSystemCursor(
                  SWT.CURSOR_SIZENS) : null);
            } else if (event.type == SWT.MouseExit) {
              c.setCursor(null);
            }
          }
        };
        Control control = skinObject.getControl();
        control.addListener(SWT.MouseDown, l);
        control.addListener(SWT.MouseUp, l);
        control.addListener(SWT.MouseMove, l);
        control.addListener(SWT.MouseExit, l);

        skinObject.addListener(new SWTSkinObjectListener() {
          public Object eventOccured(SWTSkinObject skinObject, int eventType,
              Object params) {
            if (eventType == EVENT_SHOW) {
              int h = COConfigurationManager.getIntParameter("v3.topbar.height");
              Control control = skinObject.getControl();
              FormData formData = (FormData) control.getLayoutData();
              formData.height = h;
              control.setLayoutData(formData);
              Utils.relayout(control);
            }
            return null;
          }
        });
      }

      int toActiveView = COConfigurationManager.getIntParameter(
          "topbar.viewindex", 0);
      int viewIndex = toActiveView;
      for (int i = 0; i < coreTopBarViews.length; i++) {
        IView view = coreTopBarViews[i];
        addTopBarView(view, cPluginArea);
        if (toActiveView-- == 0) {
          activateTopBar(view);
          if (listPlugins != null) {
            listPlugins.setSelection(viewIndex);
          }
        }
      }

      UISWTInstanceImpl uiSWTinstance = (UISWTInstanceImpl) UIFunctionsManagerSWT.getUIFunctionsSWT().getUISWTInstance();
      Map pluginViews = null;
      pluginViews = uiSWTinstance.getViewListeners(UISWTInstance.VIEW_TOPBAR);
      if (pluginViews != null) {
        String[] sNames = (String[]) pluginViews.keySet().toArray(new String[0]);
        for (int i = 0; i < sNames.length; i++) {
          UISWTViewEventListener l = (UISWTViewEventListener) pluginViews.get(sNames[i]);
          if (l != null) {
            try {
              UISWTViewImpl view = new UISWTViewImpl(UISWTInstance.VIEW_TOPBAR,
                  sNames[i], l);
              addTopBarView(view, cPluginArea);
              if (toActiveView-- == 0) {
                activateTopBar(view);
                if (listPlugins != null) {
                  listPlugins.setSelection(viewIndex);
                }
              }
            } catch (Exception e) {
              e.printStackTrace();
              // skip, plugin probably specifically asked to not be added
            }
          }
        }
      }

      if (toActiveView >= 0 && topbarViews.size() > 0) {
        activeTopBar = (IView) topbarViews.get(0);
        activeTopBar.getComposite().setVisible(true);
      }

      skinObject.getControl().getParent().layout(true);
    } catch (Exception e) {
      Debug.out(e);
    }
  }

  /**
   * @param view
   *
   * @since 3.0.1.1
   */
  protected void activateTopBar(IView view) {
    if (activeTopBar != null) {
      Composite c = activeTopBar.getComposite();
      while (c.getParent() != cPluginArea) {
        c = c.getParent();
      }
      c.setVisible(false);
    }
    activeTopBar = view;
    Composite c = activeTopBar.getComposite();
    while (c.getParent() != cPluginArea) {
      c = c.getParent();
    }
    c.setVisible(true);

    SWTSkinObject soTitle = skin.getSkinObject("topbar-plugin-title");
    //System.out.println("Hello" + soTitle);
    if (soTitle != null) {
      soTitle.getControl().redraw();
    }
  }

  /**
   * @param view
   *
   * @since 3.0.1.1
   */
  private void addTopBarView(IView view, Composite composite) {
    Composite parent = new Composite(composite, SWT.None);
    parent.setLayoutData(Utils.getFilledFormData());
    parent.setLayout(new FormLayout());

    view.initialize(parent);
    parent.setVisible(false);

    Control[] children = parent.getChildren();
    for (int i = 0; i < children.length; i++) {
      Control control = children[i];
      Object ld = control.getLayoutData();
      boolean useGridLayout = ld != null && (ld instanceof GridData);
      if (useGridLayout) {
        GridLayout gridLayout = new GridLayout();
        gridLayout.horizontalSpacing = 0;
        gridLayout.marginHeight = 0;
        gridLayout.marginWidth = 0;
        gridLayout.verticalSpacing = 0;
        parent.setLayout(gridLayout);
        break;
      } else if (ld == null) {
        control.setLayoutData(Utils.getFilledFormData());
      }
    }

    topbarViews.add(view);
    if (listPlugins != null) {
      String s = view.getFullTitle();
      if (MessageText.keyExists(s)) {
        s = MessageText.getString(s);
      }
      listPlugins.add(s);
    }
  }

}
TOP

Related Classes of com.aelitis.azureus.ui.swt.views.TopBarView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.