Package org.gudy.azureus2.ui.swt.components

Source Code of org.gudy.azureus2.ui.swt.components.Legend

/*
* Created on 13-Sep-2005
* Created by Paul Gardner
* Copyright (C) 2005, 2006 Aelitis, 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; either version 2
* of the License, or (at your option) any later version.
* 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.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/

package org.gudy.azureus2.ui.swt.components;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.config.impl.ConfigurationManager;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.Utils;

import com.aelitis.azureus.ui.swt.utils.ColorCache;

/**
*
* TODO: have a callback when color changes
*/
public class Legend {
  /**
   * Create a legend containing a modifyable color box and description
   *
   * @param panel Where to add legend to
   * @param blockColors array of colors for each legend entry.  This
   *                     array WILL BE modified if the user changes the color
   * @param keys array of keys for each legend entry
   * @return The composite containing the legend
   */
  public static Composite createLegendComposite(Composite panel,
      Color[] blockColors, String[] keys) {
    Object layout = panel.getLayout();
    Object layoutData = null;
    if (layout instanceof GridLayout)
      layoutData = new GridData(GridData.FILL_HORIZONTAL);

    return createLegendComposite(panel, blockColors, keys, layoutData);
  }


  /**
   * Create a legend containing a modifyable color box and description
   *
   * @param panel Where to add legend to
   * @param blockColors array of colors for each legend entry.  This
   *                     array WILL BE modified if the user changes the color
   * @param keys array of keys for each legend entry
   * @param layoutData How to layout the legend (ie. GridData, LayoutData, etc)
   * @return The composite containing the legend
   */
  public static Composite createLegendComposite(final Composite panel,
      final Color[] blockColors, final String[] keys, Object layoutData) {
   
    final ConfigurationManager config = ConfigurationManager.getInstance();

    if (blockColors.length != keys.length)
      return null;

    final Color[] defaultColors = new Color[blockColors.length];
    final ParameterListener[] paramListeners = new ParameterListener[keys.length];
    System.arraycopy(blockColors, 0, defaultColors, 0, blockColors.length);

    Composite legend = new Composite(panel, SWT.NONE);
    if (layoutData != null)
      legend.setLayoutData(layoutData);

    RowLayout layout = new RowLayout(SWT.HORIZONTAL);
    layout.wrap = true;
    layout.marginBottom = 0;
    layout.marginTop = 0;
    layout.marginLeft = 0;
    layout.marginRight = 0;
    layout.spacing = 0;
    legend.setLayout(layout);

    RowData data;
    for (int i = 0; i < blockColors.length; i++) {
      int r = config.getIntParameter(keys[i] + ".red", -1);
      if (r >= 0) {
        int g = config.getIntParameter(keys[i] + ".green");
        int b = config.getIntParameter(keys[i] + ".blue");
       
        Color color = ColorCache.getColor(panel.getDisplay(), r, g, b);
        blockColors[i] = color;
      }

      Composite colorSet = new Composite(legend, SWT.NONE);

      colorSet.setLayout(new RowLayout(SWT.HORIZONTAL));

      final Canvas cColor = new Canvas(colorSet, SWT.BORDER);
      cColor.setData("Index", new Integer(i));
      // XXX Use paint instead of setBackgrond, because OSX does translucent
      // crap
      cColor.addPaintListener(new PaintListener() {
        public void paintControl(PaintEvent e) {
          int i = ((Integer)cColor.getData("Index")).intValue();
          e.gc.setBackground(blockColors[i]);
          e.gc.fillRectangle(e.x, e.y, e.width, e.height);
        }
      });

      cColor.addMouseListener(new MouseAdapter() {
        public void mouseUp(MouseEvent e) {
          Integer iIndex = (Integer)cColor.getData("Index");
          if (iIndex == null)
            return;
          int index = iIndex.intValue();

          if (e.button == 1) {
            ColorDialog cd = new ColorDialog(panel.getShell());
            cd.setRGB(blockColors[index].getRGB());
           
            RGB rgb = cd.open();
            if (rgb != null)
              config.setRGBParameter(keys[index], rgb.red, rgb.green, rgb.blue);
          } else {
            config.removeRGBParameter(keys[index]);
          }
        }
      });

      Label lblDesc = new Label(colorSet, SWT.NULL);
      Messages.setLanguageText(lblDesc, keys[i]);

      data = new RowData();
      data.width = 20;
      data.height = lblDesc.computeSize(SWT.DEFAULT, SWT.DEFAULT).y - 3;
      cColor.setLayoutData(data);
     
      // If color changes, update our legend
      config.addParameterListener(keys[i],paramListeners[i] = new ParameterListener() {
        public void parameterChanged(String parameterName) {
          for (int j = 0; j < keys.length; j++) {
            if (keys[j].equals(parameterName)) {
              final int index = j;

              final int r = config.getIntParameter(keys[j] + ".red", -1);
              if (r >= 0) {
                final int g = config.getIntParameter(keys[j] + ".green");
                final int b = config.getIntParameter(keys[j] + ".blue");
               
                final RGB rgb = new RGB(r, g, b);
                if (blockColors[j].isDisposed()
                    || !rgb.equals(blockColors[j].getRGB())) {

                  Utils.execSWTThread(new AERunnable() {
                    public void runSupport() {
                      if (panel == null || panel.isDisposed())
                        return;
                      Color color = ColorCache.getColor(panel.getDisplay(), r, g, b);
                      blockColors[index] = color;
                      cColor.redraw();
                    }
                  });
                }
              } else {
                if (blockColors[j].isDisposed()
                    || !blockColors[j].equals(defaultColors[j])) {
                  Utils.execSWTThread(new AERunnable() {
                    public void runSupport() {
                      if (panel == null || panel.isDisposed())
                        return;
                      blockColors[index] = defaultColors[index];
                      cColor.redraw();
                    }
                  });
                }
              }
            }
          }
        }
      });
    }
   
    legend.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent e) {
        // We don't want to give them disposed colors
        // Restore defaults in case blockColors is a static or is used
        // afterwards, or if the view wants to dispose of the old colors.
        for (int i = 0; i < blockColors.length; i++)
          blockColors[i] = defaultColors[i];
        for (int i = 0; i < keys.length;i++)
          config.removeParameterListener(keys[i], paramListeners[i]);
      }
    });

    return legend;
  }
}
TOP

Related Classes of org.gudy.azureus2.ui.swt.components.Legend

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.